summaryrefslogtreecommitdiff
path: root/libs/hwui/SkiaCanvas.cpp
diff options
context:
space:
mode:
author Matt Sarett <msarett@google.com> 2017-04-13 09:33:18 -0400
committer Matt Sarett <msarett@google.com> 2017-04-13 11:11:11 -0400
commit44dc270830758d5b0f5b099e7c0e308bdf027dfb (patch)
treef2c1aac8d0234485f555cd0cf1367f9947979d30 /libs/hwui/SkiaCanvas.cpp
parent061db23b79b0f07b3b843e081420fbbcc606b451 (diff)
Add SkiaCanvas::captureCanvasState()
Test: Verified bug is fixed. Wrote unit test. Bug: 37268771 Change-Id: I9deb7db353cd2129ad245e7f65419670463bb717
Diffstat (limited to 'libs/hwui/SkiaCanvas.cpp')
-rw-r--r--libs/hwui/SkiaCanvas.cpp25
1 files changed, 25 insertions, 0 deletions
diff --git a/libs/hwui/SkiaCanvas.cpp b/libs/hwui/SkiaCanvas.cpp
index c1cad7dd4923..ed6e52245243 100644
--- a/libs/hwui/SkiaCanvas.cpp
+++ b/libs/hwui/SkiaCanvas.cpp
@@ -23,6 +23,7 @@
#include "hwui/MinikinUtils.h"
#include "pipeline/skia/AnimatedDrawables.h"
+#include <SkCanvasStateUtils.h>
#include <SkColorSpaceXformCanvas.h>
#include <SkDrawable.h>
#include <SkDeque.h>
@@ -411,6 +412,30 @@ void SkiaCanvas::setDrawFilter(SkDrawFilter* drawFilter) {
}
// ----------------------------------------------------------------------------
+// Canvas state operations: Capture
+// ----------------------------------------------------------------------------
+
+SkCanvasState* SkiaCanvas::captureCanvasState() const {
+ SkCanvas* canvas = mCanvas;
+ if (mCanvasOwned) {
+ // Important to use the underlying SkCanvas, not the wrapper.
+ canvas = mCanvasOwned.get();
+ }
+
+ // Workarounds for http://crbug.com/271096: SW draw only supports
+ // translate & scale transforms, and a simple rectangular clip.
+ // (This also avoids significant wasted time in calling
+ // SkCanvasStateUtils::CaptureCanvasState when the clip is complex).
+ if (!canvas->isClipRect() ||
+ (canvas->getTotalMatrix().getType() &
+ ~(SkMatrix::kTranslate_Mask | SkMatrix::kScale_Mask))) {
+ return nullptr;
+ }
+
+ return SkCanvasStateUtils::CaptureCanvasState(canvas);
+}
+
+// ----------------------------------------------------------------------------
// Canvas draw operations
// ----------------------------------------------------------------------------