summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libs/hwui/Canvas.h4
-rw-r--r--libs/hwui/DisplayListCanvas.cpp8
2 files changed, 12 insertions, 0 deletions
diff --git a/libs/hwui/Canvas.h b/libs/hwui/Canvas.h
index aa24673c4e30..562bb8041b95 100644
--- a/libs/hwui/Canvas.h
+++ b/libs/hwui/Canvas.h
@@ -47,6 +47,10 @@ public:
* It is useful for testing and clients (e.g. Picture/Movie) that expect to
* draw their contents into an SkCanvas.
*
+ * The SkCanvas returned is *only* valid until another Canvas call is made
+ * that would change state (e.g. matrix or clip). Clients of asSkCanvas()
+ * are responsible for *not* persisting this pointer.
+ *
* Further, the returned SkCanvas should NOT be unref'd and is valid until
* this canvas is destroyed or a new bitmap is set.
*/
diff --git a/libs/hwui/DisplayListCanvas.cpp b/libs/hwui/DisplayListCanvas.cpp
index 02a4877b0828..b08187be1f82 100644
--- a/libs/hwui/DisplayListCanvas.cpp
+++ b/libs/hwui/DisplayListCanvas.cpp
@@ -99,6 +99,14 @@ SkCanvas* DisplayListCanvas::asSkCanvas() {
if (!mSkiaCanvasProxy) {
mSkiaCanvasProxy.reset(new SkiaCanvasProxy(this));
}
+
+ // SkCanvas instances default to identity transform, but should inherit
+ // the state of this Canvas; if this code was in the SkiaCanvasProxy
+ // constructor, we couldn't cache mSkiaCanvasProxy.
+ SkMatrix parentTransform;
+ getMatrix(&parentTransform);
+ mSkiaCanvasProxy.get()->setMatrix(parentTransform);
+
return mSkiaCanvasProxy.get();
}