git-svn-id: http://skia.googlecode.com/svn/trunk@1292 2bbb7eff-a529-9590-31e7-b0007b4...
authortwiz@google.com <twiz@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>
Tue, 10 May 2011 23:10:26 +0000 (23:10 +0000)
committertwiz@google.com <twiz@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>
Tue, 10 May 2011 23:10:26 +0000 (23:10 +0000)
include/core/SkDevice.h
src/core/SkDevice.cpp

index d9a4fde4c28d657dbeb7e334c4f0d234bb6bd2ff..46bcf1a1050f7357582515cd16bd33cbea24c4cf 100644 (file)
@@ -155,6 +155,31 @@ public:
     virtual void setMatrixClip(const SkMatrix&, const SkRegion&,
                                const SkClipStack&);
 
+    /**
+     *  Observer interface for listening to the calls to
+     *  SkDevice::setMatrixClip(...).  Users of SkDevice instances should
+     *  implement matrixClipChanged(...) to receive notifications.
+     */
+    class SkMatrixClipObserver : public SkRefCnt {
+    public:
+        virtual void matrixClipChanged(const SkMatrix&, const SkRegion&,
+                                       const SkClipStack&) = 0;
+    };
+
+    /** Assign the clip observer.  Note that an extra reference is added to the
+      * observer, and removed at SkDevice construction, or re-assignment of a
+      * different observer.
+      */
+    void setMatrixClipObserver(SkMatrixClipObserver* observer);
+
+    /** Return the device's associated SkMatrixClipObserver, or NULL.
+      * If non-null is returned, the reference count of the object is not
+      * modified.
+      */
+    SkMatrixClipObserver* getMatrixClipObserver() const {
+        return fMatrixClipObserver;
+    }
+
     /** Called when this device gains focus (i.e becomes the current device
         for drawing).
     */
@@ -281,6 +306,8 @@ private:
     SkIPoint    fOrigin;
     SkMetaData* fMetaData;
 
+    SkMatrixClipObserver* fMatrixClipObserver;
+
     SkDeviceFactory* fCachedDeviceFactory;
 };
 
index 850a53fd167ebf896bb75e5c8ddaa90f5b6fcbbb..4a7693673f9768769a5ccf1599d1bb5e0d1ce499 100644 (file)
@@ -25,13 +25,13 @@ SkDeviceFactory::~SkDeviceFactory() {
 
 ///////////////////////////////////////////////////////////////////////////////
 
-SkDevice::SkDevice(SkCanvas* canvas) : fCanvas(canvas), fMetaData(NULL) {
+SkDevice::SkDevice(SkCanvas* canvas) : fCanvas(canvas), fMetaData(NULL), fMatrixClipObserver(NULL) {
     fOrigin.setZero();
     fCachedDeviceFactory = NULL;
 }
 
 SkDevice::SkDevice(SkCanvas* canvas, const SkBitmap& bitmap, bool isForLayer)
-        : fCanvas(canvas), fBitmap(bitmap), fMetaData(NULL) {
+        : fCanvas(canvas), fBitmap(bitmap), fMetaData(NULL), fMatrixClipObserver(NULL) {
     fOrigin.setZero();
     // auto-allocate if we're for offscreen drawing
     if (isForLayer) {
@@ -48,6 +48,7 @@ SkDevice::SkDevice(SkCanvas* canvas, const SkBitmap& bitmap, bool isForLayer)
 SkDevice::~SkDevice() {
     delete fMetaData;
     SkSafeUnref(fCachedDeviceFactory);
+    SkSafeUnref(fMatrixClipObserver);
 }
 
 SkDeviceFactory* SkDevice::onNewDeviceFactory() {
@@ -105,8 +106,16 @@ void SkDevice::clear(SkColor color) {
 
 void SkDevice::onAccessBitmap(SkBitmap* bitmap) {}
 
-void SkDevice::setMatrixClip(const SkMatrix&, const SkRegion&,
-                             const SkClipStack&) {}
+void SkDevice::setMatrixClip(const SkMatrix& matrix, const SkRegion& region,
+                             const SkClipStack& clipStack) {
+    if (fMatrixClipObserver) {
+        fMatrixClipObserver->matrixClipChanged(matrix, region, clipStack);
+    }
+}
+
+void SkDevice::setMatrixClipObserver(SkMatrixClipObserver* observer) {
+    SkRefCnt_SafeAssign(fMatrixClipObserver, observer);
+}
 
 ///////////////////////////////////////////////////////////////////////////////