Let blitters be notified when they're done being used
authorkrajcevski <krajcevski@google.com>
Mon, 21 Jul 2014 16:54:23 +0000 (09:54 -0700)
committerCommit bot <commit-bot@chromium.org>
Mon, 21 Jul 2014 16:54:23 +0000 (09:54 -0700)
R=reed@google.com, robertphillips@google.com

Author: krajcevski@google.com

Review URL: https://codereview.chromium.org/399593007

src/core/SkBlitter.h
src/core/SkScan_AntiPath.cpp

index 0f1006f..992eb86 100644 (file)
@@ -76,6 +76,16 @@ public:
      */
     virtual int requestRowsPreserved() const { return 1; }
 
+    /**
+     * This function allocates memory for the blitter that the blitter then owns.
+     * The memory can be used by the calling function at will, but it will be
+     * released when the blitter's destructor is called. This function returns
+     * NULL if no persistent memory is needed by the blitter.
+     */
+    virtual void* allocBlitMemory(size_t sz) {
+        return fBlitMemory.reset(sz, SkAutoMalloc::kReuse_OnShrink);
+    }
+
     ///@name non-virtual helpers
     void blitMaskRegion(const SkMask& mask, const SkRegion& clip);
     void blitRectRegion(const SkIRect& rect, const SkRegion& clip);
@@ -98,6 +108,10 @@ public:
                                    SkTBlitterAllocator*);
     ///@}
 
+protected:
+
+    SkAutoMalloc fBlitMemory;
+    
 private:
 };
 
@@ -137,6 +151,10 @@ public:
     virtual void blitMask(const SkMask&, const SkIRect& clip) SK_OVERRIDE;
     virtual const SkBitmap* justAnOpaqueColor(uint32_t* value) SK_OVERRIDE;
 
+    virtual void* allocBlitMemory(size_t sz) SK_OVERRIDE {
+        return fBlitter->allocBlitMemory(sz);
+    }
+
 private:
     SkBlitter*  fBlitter;
     SkIRect     fClipRect;
@@ -164,6 +182,10 @@ public:
     virtual void blitMask(const SkMask&, const SkIRect& clip) SK_OVERRIDE;
     virtual const SkBitmap* justAnOpaqueColor(uint32_t* value) SK_OVERRIDE;
 
+    virtual void* allocBlitMemory(size_t sz) SK_OVERRIDE {
+        return fBlitter->allocBlitMemory(sz);
+    }
+
 private:
     SkBlitter*      fBlitter;
     const SkRegion* fRgn;
index 0943646..b7d4707 100644 (file)
@@ -108,7 +108,6 @@ public:
 
     virtual ~SuperBlitter() {
         this->flush();
-        sk_free(fRunsBuffer);
     }
 
     /// Once fRuns contains a complete supersampled row, flush() blits
@@ -154,7 +153,7 @@ SuperBlitter::SuperBlitter(SkBlitter* realBlitter, const SkIRect& ir,
                            const SkRegion& clip)
         : BaseSuperBlitter(realBlitter, ir, clip) {
     fRunsToBuffer = realBlitter->requestRowsPreserved();
-    fRunsBuffer = sk_malloc_throw(fRunsToBuffer * this->getRunsSz());
+    fRunsBuffer = realBlitter->allocBlitMemory(fRunsToBuffer * this->getRunsSz());
     fCurrentRun = -1;
 
     this->advanceRuns();