From d0814db633dbd76ecdec08806199d49654562d48 Mon Sep 17 00:00:00 2001 From: Matt Sarett Date: Thu, 13 Apr 2017 09:33:18 -0400 Subject: Add SkiaCanvas::captureCanvasState() Test: Verified bug is fixed. Wrote unit test. Bug: 37268771 Change-Id: I9deb7db353cd2129ad245e7f65419670463bb717 --- libs/hwui/SkiaCanvas.cpp | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) (limited to 'libs/hwui/SkiaCanvas.cpp') diff --git a/libs/hwui/SkiaCanvas.cpp b/libs/hwui/SkiaCanvas.cpp index c902a7333f2f..ece0b472c6bf 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 #include #include #include @@ -410,6 +411,30 @@ void SkiaCanvas::setDrawFilter(SkDrawFilter* drawFilter) { mCanvas->setDrawFilter(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 // ---------------------------------------------------------------------------- -- cgit v1.2.3-59-g8ed1b