Replaces SkDevice::setMatrixClip() with markMatrixDirty() and markClipDirty(),
which require no arguments and so may be called without requiring the matrix
and clip to be completely evaluated.

De-inlines virtual functions in SkDevice interface.



git-svn-id: http://skia.googlecode.com/svn/trunk@2250 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/include/core/SkDevice.h b/include/core/SkDevice.h
index d4afd69..30f0dec 100644
--- a/include/core/SkDevice.h
+++ b/include/core/SkDevice.h
@@ -73,14 +73,14 @@
         kVector_Capability = 0x2,  //!< mask indicating a vector representation
         kAll_Capabilities  = 0x3
     };
-    virtual uint32_t getDeviceCapabilities() { return 0; }
+    virtual uint32_t getDeviceCapabilities();
 
     /** Return the width of the device (in pixels).
     */
-    virtual int width() const { return fBitmap.width(); }
+    virtual int width() const;
     /** Return the height of the device (in pixels).
     */
-    virtual int height() const { return fBitmap.height(); }
+    virtual int height() const;
 
     /**
      *  Return the bounds of the device in the coordinate space of the root
@@ -154,25 +154,22 @@
     virtual bool filterTextFlags(const SkPaint& paint, TextFlags*);
 
     /**
-     *  Called with the correct matrix and clip before this device is drawn
-     *  to using those settings. If your subclass overrides this, be sure to
-     *  call through to the base class as well.
-     *
-     *  The clipstack is another view of the clip. It records the actual
-     *  geometry that went into building the region. It is present for devices
-     *  that want to parse it, but is not required: the region is a complete
-     *  picture of the current clip. (i.e. if you regionize all of the geometry
-     *  in the clipstack, you will arrive at an equivalent region to the one
-     *  passed in).
-    */
-    virtual void setMatrixClip(const SkMatrix&, const SkRegion&,
-                               const SkClipStack&);
+     * Let the device know that its matrix has changed; it can query the
+     * matrix when it needs it.
+     */
+    virtual void markMatrixDirty();
+
+    /**
+     * Let the device know that its clip has changed; it can query the
+     * clip (region or stack) when or if it needs it.
+     */
+    virtual void markClipDirty();
 
     /** Called when this device gains focus (i.e becomes the current device
         for drawing).
     */
     virtual void gainFocus(SkCanvas*, const SkMatrix&, const SkRegion&,
-                           const SkClipStack&) {}
+                           const SkClipStack&);
 
     /** Clears the entire device to the specified color (including alpha).
      *  Ignores the clip.
@@ -290,7 +287,7 @@
 
     /** Causes any deferred drawing to the device to be completed.
      */
-    virtual void flush() {}
+    virtual void flush();
 
     SkBitmap    fBitmap;
     SkIPoint    fOrigin;
diff --git a/include/gpu/SkGpuDevice.h b/include/gpu/SkGpuDevice.h
index f5613a7..181ea9f 100644
--- a/include/gpu/SkGpuDevice.h
+++ b/include/gpu/SkGpuDevice.h
@@ -71,8 +71,8 @@
     virtual bool readPixels(const SkIRect& srcRect, SkBitmap* bitmap);
     virtual void writePixels(const SkBitmap& bitmap, int x, int y);
 
-    virtual void setMatrixClip(const SkMatrix& matrix, const SkRegion& clip,
-                               const SkClipStack&);
+    virtual void markMatrixDirty();
+    virtual void markClipDirty();
 
     virtual void drawPaint(const SkDraw&, const SkPaint& paint);
     virtual void drawPoints(const SkDraw&, SkCanvas::PointMode mode, size_t count,
diff --git a/include/pdf/SkPDFDevice.h b/include/pdf/SkPDFDevice.h
index 395968b..4080d56 100644
--- a/include/pdf/SkPDFDevice.h
+++ b/include/pdf/SkPDFDevice.h
@@ -163,8 +163,6 @@
 
     // TODO(vandebo): Remove this as soon as Chrome's Platform device goes away.
     void setOrigin(int x, int y);
-    virtual void setMatrixClip(const SkMatrix& m, const SkRegion& r,
-                               const SkClipStack& c);
 
 private:
     typedef SkDevice INHERITED;
diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp
index 1f75aa9..4335f6e 100644
--- a/src/core/SkCanvas.cpp
+++ b/src/core/SkCanvas.cpp
@@ -118,7 +118,9 @@
                            SkRegion::kDifference_Op);
         }
 
-        fDevice->setMatrixClip(*fMatrix, fClip, clipStack);
+        //fDevice->setMatrixClip(*fMatrix, fClip, clipStack);
+        fDevice->markMatrixDirty();
+        fDevice->markClipDirty();
 
 #ifdef SK_DEBUG
         if (!fClip.isEmpty()) {
@@ -212,14 +214,19 @@
 
 class SkDrawIter : public SkDraw {
 public:
-    SkDrawIter(SkCanvas* canvas, bool skipEmptyClips = true) {
-        fCanvas = canvas;
+    SkDrawIter(SkCanvas* canvas, bool skipEmptyClips = true)
+        : fCanvas(canvas)
+        , fCurrLayer(NULL)
+        , fSkipEmptyClips(skipEmptyClips) {
+
+        if (!canvas) {
+            return;
+        }
         canvas->updateDeviceCMCache();
 
         fClipStack = &canvas->getTotalClipStack();
         fBounder = canvas->getBounder();
         fCurrLayer = canvas->fMCRec->fTopLayer;
-        fSkipEmptyClips = skipEmptyClips;
     }
 
     bool next() {
diff --git a/src/core/SkDevice.cpp b/src/core/SkDevice.cpp
index 69f86cc..ffde8de 100644
--- a/src/core/SkDevice.cpp
+++ b/src/core/SkDevice.cpp
@@ -63,6 +63,18 @@
     return *fMetaData;
 }
 
+uint32_t SkDevice::getDeviceCapabilities() {
+    return 0;
+}
+
+int SkDevice::width() const {
+    return fBitmap.width();
+}
+
+int SkDevice::height() const {
+    return fBitmap.height();
+}
+
 void SkDevice::lockPixels() {
     if (fBitmap.lockPixelsAreWritable()) {
         fBitmap.lockPixels();
@@ -94,10 +106,8 @@
     fBitmap.eraseColor(color);
 }
 
-void SkDevice::onAccessBitmap(SkBitmap* bitmap) {}
+void SkDevice::onAccessBitmap(SkBitmap* bitmap) {
 
-void SkDevice::setMatrixClip(const SkMatrix& matrix, const SkRegion& region,
-                             const SkClipStack& clipStack) {
 }
 
 ///////////////////////////////////////////////////////////////////////////////
@@ -242,3 +252,20 @@
     return false;
 }
 
+void SkDevice::markMatrixDirty() {
+
+}
+
+void SkDevice::markClipDirty() {
+
+}
+
+void SkDevice::gainFocus(SkCanvas*, const SkMatrix&, const SkRegion&,
+                        const SkClipStack&) {
+
+}
+
+void SkDevice::flush() {
+
+}
+
diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp
index ecdcd7a..32ac5af 100644
--- a/src/gpu/SkGpuDevice.cpp
+++ b/src/gpu/SkGpuDevice.cpp
@@ -338,10 +338,13 @@
     }
 }
 
-void SkGpuDevice::setMatrixClip(const SkMatrix& matrix, const SkRegion& clip,
-                                const SkClipStack& clipStack) {
-    this->INHERITED::setMatrixClip(matrix, clip, clipStack);
-    // We don't need to set them now because the context may not reflect this device.
+void SkGpuDevice::markMatrixDirty() {
+    INHERITED::markMatrixDirty();
+    fNeedPrepareRenderTarget = true;
+}
+
+void SkGpuDevice::markClipDirty() {
+    INHERITED::markClipDirty();
     fNeedPrepareRenderTarget = true;
 }
 
diff --git a/src/pdf/SkPDFDevice.cpp b/src/pdf/SkPDFDevice.cpp
index 8cf1eca..6cb7e4d 100644
--- a/src/pdf/SkPDFDevice.cpp
+++ b/src/pdf/SkPDFDevice.cpp
@@ -1135,11 +1135,6 @@
     INHERITED::setOrigin(x, y);
 }
 
-void SkPDFDevice::setMatrixClip(const SkMatrix& m, const SkRegion& r,
-                                const SkClipStack& c) {
-    INHERITED::setMatrixClip(m, r, c);
-}
-
 void SkPDFDevice::createFormXObjectFromDevice(
         SkRefPtr<SkPDFFormXObject>* xobject) {
     *xobject = new SkPDFFormXObject(this);