Canvas size initializes correctly when drawing from a skia picture
authorchudy@google.com <chudy@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>
Mon, 30 Jul 2012 18:54:07 +0000 (18:54 +0000)
committerchudy@google.com <chudy@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>
Mon, 30 Jul 2012 18:54:07 +0000 (18:54 +0000)
Review URL: https://codereview.appspot.com/6450065

git-svn-id: http://skia.googlecode.com/svn/trunk@4837 2bbb7eff-a529-9590-31e7-b0007b416f81

debugger/QT/SkCanvasWidget.cpp
debugger/QT/SkRasterWidget.cpp
debugger/SkDebugCanvas.cpp
debugger/SkDebugCanvas.h

index ec6c0c8..47db709 100644 (file)
@@ -23,7 +23,7 @@ SkCanvasWidget::SkCanvasWidget(QWidget* parent) : QWidget(parent)
 
     fHorizontalLayout.addWidget(&fRasterWidget);
     fHorizontalLayout.addWidget(&fGLWidget);
-    fDebugCanvas = new SkDebugCanvas();
+    fDebugCanvas = NULL;
 
     fIndex = 0;
     fPreviousPoint.set(0,0);
@@ -31,6 +31,7 @@ SkCanvasWidget::SkCanvasWidget(QWidget* parent) : QWidget(parent)
     fScaleFactor = 1.0;
 
     setWidgetVisibility(kGPU_WidgetType, true);
+    this->setDisabled(true);
 }
 
 void SkCanvasWidget::drawTo(int index) {
@@ -45,18 +46,22 @@ void SkCanvasWidget::drawTo(int index) {
 }
 
 void SkCanvasWidget::loadPicture(QString filename) {
+    this->setDisabled(false);
     SkStream* stream = new SkFILEStream(filename.toAscii());
     SkPicture* picture = new SkPicture(stream);
 
     /* TODO(chudy): Implement function that doesn't require new
      * instantiation of debug canvas. */
     delete fDebugCanvas;
-    fDebugCanvas = new SkDebugCanvas();
-    fDebugCanvas->setBounds(this->width(), this->height());
+    fDebugCanvas = new SkDebugCanvas(picture->width(), picture->height());
+
     picture->draw(fDebugCanvas);
     fIndex = fDebugCanvas->getSize();
     fRasterWidget.setDebugCanvas(fDebugCanvas);
     fGLWidget.setDebugCanvas(fDebugCanvas);
+
+    // TODO(chudy): Remove bounds from debug canvas storage.
+    fDebugCanvas->setBounds(this->width(), this->height());
 }
 
 void SkCanvasWidget::mouseMoveEvent(QMouseEvent* event) {
@@ -69,11 +74,13 @@ void SkCanvasWidget::mouseMoveEvent(QMouseEvent* event) {
 
 void SkCanvasWidget::mousePressEvent(QMouseEvent* event) {
     fPreviousPoint.set(event->globalX(), event->globalY());
-    fDebugCanvas->getBoxClass()->setHitPoint(event->x(), event->y());
-    fDebugCanvas->isCalculatingHits(true);
-    drawTo(fIndex);
-    emit hitChanged(fDebugCanvas->getHitBoxPoint());
-    fDebugCanvas->isCalculatingHits(false);
+    if (fDebugCanvas) {
+        fDebugCanvas->getBoxClass()->setHitPoint(event->x(), event->y());
+        fDebugCanvas->isCalculatingHits(true);
+        drawTo(fIndex);
+        emit hitChanged(fDebugCanvas->getHitBoxPoint());
+        fDebugCanvas->isCalculatingHits(false);
+    }
 }
 
 void SkCanvasWidget::mouseDoubleClickEvent(QMouseEvent* event) {
index 0549649..8c6a284 100644 (file)
@@ -16,8 +16,7 @@ SkRasterWidget::SkRasterWidget(QWidget* parent) : QWidget(parent) {
     fTransform.set(0,0);
     fScaleFactor = 1.0;
     fIndex = 0;
-
-    fDebugCanvas = new SkDebugCanvas();
+    fDebugCanvas = NULL;
     this->setStyleSheet("QWidget {background-color: white; border: 1px solid #cccccc;}");
 }
 
@@ -31,34 +30,40 @@ void SkRasterWidget::resizeEvent(QResizeEvent* event) {
     fBitmap.allocPixels();
     delete fDevice;
     fDevice = new SkDevice(fBitmap);
-    fDebugCanvas->setBounds(event->size().width(), event->size().height());
-    this->update();
+    //TODO(chudy): Debug Canvas shouldn't store current size. The bitmap
+    //or texture backend should already have it. Refactor.
+    if (fDebugCanvas) {
+        fDebugCanvas->setBounds(event->size().width(), event->size().height());
+        this->update();
+    }
 }
 
 void SkRasterWidget::paintEvent(QPaintEvent* event) {
-    fBitmap.eraseColor(0);
-    SkCanvas canvas(fDevice);
-    canvas.translate(fTransform.fX, fTransform.fY);
-    if (fScaleFactor < 0) {
-        canvas.scale((1.0 / -fScaleFactor), (1.0 / -fScaleFactor));
-    } else if (fScaleFactor > 0) {
-        canvas.scale(fScaleFactor, fScaleFactor);
-    }
+    if (fDebugCanvas) {
+        fBitmap.eraseColor(0);
+        SkCanvas canvas(fDevice);
+        canvas.translate(fTransform.fX, fTransform.fY);
+        if (fScaleFactor < 0) {
+            canvas.scale((1.0 / -fScaleFactor), (1.0 / -fScaleFactor));
+        } else if (fScaleFactor > 0) {
+            canvas.scale(fScaleFactor, fScaleFactor);
+        }
 
-    fMatrix = canvas.getTotalMatrix();
-    fClip = canvas.getTotalClip().getBounds();
-    fDebugCanvas->drawTo(&canvas, fIndex+1, &fBitmap);
+        fMatrix = canvas.getTotalMatrix();
+        fClip = canvas.getTotalClip().getBounds();
+        fDebugCanvas->drawTo(&canvas, fIndex+1, &fBitmap);
 
-    QPainter painter(this);
-    QStyleOption opt;
-    opt.init(this);
+        QPainter painter(this);
+        QStyleOption opt;
+        opt.init(this);
 
-    style()->drawPrimitive(QStyle::PE_Widget, &opt, &painter, this);
+        style()->drawPrimitive(QStyle::PE_Widget, &opt, &painter, this);
 
-    QPoint origin(0,0);
-    QImage image((uchar *)fBitmap.getPixels(), fBitmap.width(),
-            fBitmap.height(), QImage::Format_ARGB32_Premultiplied);
+        QPoint origin(0,0);
+        QImage image((uchar *)fBitmap.getPixels(), fBitmap.width(),
+                fBitmap.height(), QImage::Format_ARGB32_Premultiplied);
 
-    painter.drawImage(origin, image);
-    painter.end();
+        painter.drawImage(origin, image);
+        painter.end();
+    }
 }
index 9510e65..12d7127 100644 (file)
 #include "SkDebugCanvas.h"
 #include "SkDrawCommand.h"
 
-SkDebugCanvas::SkDebugCanvas() {
+SkDebugCanvas::SkDebugCanvas(int width, int height) {
     // TODO(chudy): Free up memory from all draw commands in destructor.
-    fWidth = 100;
-    fHeight = 100;
+    fWidth = width;
+    fHeight = height;
     fBm.setConfig(SkBitmap::kNo_Config, fWidth, fHeight);
     this->setBitmapDevice(fBm);
     fFilter = false;
index 373ef5d..fa2d757 100644 (file)
@@ -18,7 +18,7 @@
 
 class SkDebugCanvas : public SkCanvas {
 public:
-    SkDebugCanvas();
+    SkDebugCanvas(int width, int height);
     ~SkDebugCanvas();
 
     void toggleFilter(bool toggle);