summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLeon Scroggins III <scroggo@google.com>2014-12-17 11:30:31 -0500
committerLeon Scroggins III <scroggo@google.com>2014-12-17 13:20:33 -0500
commit18981294a58c411a4a33ebb22caf9c75ba639691 (patch)
tree95a659da2fb0df35f55122c60a205b2f47b70416
parent43cd1ddc81d45f9e1789486826c30358d8f92ef2 (diff)
downloadframeworks_base-18981294a58c411a4a33ebb22caf9c75ba639691.zip
frameworks_base-18981294a58c411a4a33ebb22caf9c75ba639691.tar.gz
frameworks_base-18981294a58c411a4a33ebb22caf9c75ba639691.tar.bz2
Make SkiaCanvas creation call ref() on SkCanvas.
There are two callers of SkiaCanvas::create_canvas(SkCanvas*). In both cases, we were calling ref() first. It is necessary to call ref() in both cases, since we have an SkCanvas returned by SkPictureRecorder::beginRecording, which does not increment the ref count to account for the caller. (i.e. the SkPictureRecorder has the only ref until you call ref()). Rather than leave the ref up to the caller, since the SkiaCanvas does the unref(), it should also do the ref(). Update it to do so and document its behavior. Also, make SkiaCanvas' constructors explicit. Change-Id: I894d0a71a87587cf8c2b26deb2384dc49ae090ef
-rw-r--r--core/jni/android/graphics/Picture.cpp4
-rw-r--r--core/jni/android/graphics/SkiaCanvas.cpp14
-rw-r--r--core/jni/android/graphics/pdf/PdfDocument.cpp5
-rw-r--r--include/private/graphics/Canvas.h10
4 files changed, 21 insertions, 12 deletions
diff --git a/core/jni/android/graphics/Picture.cpp b/core/jni/android/graphics/Picture.cpp
index d048a29..b0d943e 100644
--- a/core/jni/android/graphics/Picture.cpp
+++ b/core/jni/android/graphics/Picture.cpp
@@ -42,10 +42,6 @@ Canvas* Picture::beginRecording(int width, int height) {
mWidth = width;
mHeight = height;
SkCanvas* canvas = mRecorder->beginRecording(width, height, NULL, 0);
- // the java side will wrap this guy in a Canvas.java, which will call
- // unref in its finalizer, so we have to ref it here, so that both that
- // Canvas.java and our picture can both be owners
- canvas->ref();
return Canvas::create_canvas(canvas);
}
diff --git a/core/jni/android/graphics/SkiaCanvas.cpp b/core/jni/android/graphics/SkiaCanvas.cpp
index 793d177..7de54c4 100644
--- a/core/jni/android/graphics/SkiaCanvas.cpp
+++ b/core/jni/android/graphics/SkiaCanvas.cpp
@@ -44,10 +44,18 @@ namespace android {
// Holds an SkCanvas reference plus additional native data.
class SkiaCanvas : public Canvas {
public:
- SkiaCanvas(SkBitmap* bitmap);
-
- SkiaCanvas(SkCanvas* canvas) : mCanvas(canvas) {
+ explicit SkiaCanvas(SkBitmap* bitmap);
+
+ /**
+ * Create a new SkiaCanvas.
+ *
+ * @param canvas SkCanvas to handle calls made to this SkiaCanvas. Must
+ * not be NULL. This constructor will ref() the SkCanvas, and unref()
+ * it in its destructor.
+ */
+ explicit SkiaCanvas(SkCanvas* canvas) : mCanvas(canvas) {
SkASSERT(canvas);
+ canvas->ref();
}
virtual SkCanvas* getSkCanvas() {
diff --git a/core/jni/android/graphics/pdf/PdfDocument.cpp b/core/jni/android/graphics/pdf/PdfDocument.cpp
index be90612..8ba164f 100644
--- a/core/jni/android/graphics/pdf/PdfDocument.cpp
+++ b/core/jni/android/graphics/pdf/PdfDocument.cpp
@@ -73,11 +73,6 @@ public:
SkCanvas* canvas = page->mPictureRecorder->beginRecording(
contentRect.width(), contentRect.height(), NULL, 0);
- // We pass this canvas to Java where it is used to construct
- // a Java Canvas object which dereferences the pointer when it
- // is destroyed, so we have to bump up the reference count.
- canvas->ref();
-
return canvas;
}
diff --git a/include/private/graphics/Canvas.h b/include/private/graphics/Canvas.h
index 3cd57f4..2eda6a4 100644
--- a/include/private/graphics/Canvas.h
+++ b/include/private/graphics/Canvas.h
@@ -28,6 +28,16 @@ public:
virtual ~Canvas() {};
static Canvas* create_canvas(SkBitmap* bitmap);
+
+ /**
+ * Create a new Canvas object which delegates to an SkCanvas.
+ *
+ * @param skiaCanvas Must not be NULL. All drawing calls will be
+ * delegated to this object. This function will call ref() on the
+ * SkCanvas, and the returned Canvas will unref() it upon
+ * destruction.
+ * @return new Canvas object. Will not return NULL.
+ */
static Canvas* create_canvas(SkCanvas* skiaCanvas);
// TODO: enable HWUI to either create similar canvas wrapper or subclass