From 53f77bd4fdd76525b66b7f26d1c5c550858120df Mon Sep 17 00:00:00 2001 From: Florin Malita Date: Fri, 28 Apr 2017 13:48:37 -0400 Subject: Initial clip-mask-layer support SkBitmapDevice-only implementation. Will add A8 fast path specializations in a follow-up. Change-Id: I2ccb1ffba3689e92ac90a23e94737471dfb121a1 BUG=skia:6005 Change-Id: I2ccb1ffba3689e92ac90a23e94737471dfb121a1 Reviewed-on: https://skia-review.googlesource.com/14183 Reviewed-by: Mike Reed Commit-Queue: Florin Malita --- src/pipe/SkPipeCanvas.cpp | 13 +++++++++++++ src/pipe/SkPipeFormat.h | 2 ++ src/pipe/SkPipeReader.cpp | 11 ++++++++++- 3 files changed, 25 insertions(+), 1 deletion(-) (limited to 'src/pipe') diff --git a/src/pipe/SkPipeCanvas.cpp b/src/pipe/SkPipeCanvas.cpp index 1473b843f6..91e74eeca5 100644 --- a/src/pipe/SkPipeCanvas.cpp +++ b/src/pipe/SkPipeCanvas.cpp @@ -240,6 +240,12 @@ SkCanvas::SaveLayerStrategy SkPipeCanvas::getSaveLayerStrategy(const SaveLayerRe if (rec.fBackdrop) { extra |= kHasBackdrop_SaveLayerMask; } + if (rec.fClipMask) { + extra |= kHasClipMask_SaveLayerMask; + } + if (rec.fClipMatrix) { + extra |= kHasClipMatrix_SaveLayerMask; + } writer.write32(pack_verb(SkPipeVerb::kSaveLayer, extra)); if (rec.fBounds) { @@ -251,6 +257,13 @@ SkCanvas::SaveLayerStrategy SkPipeCanvas::getSaveLayerStrategy(const SaveLayerRe if (rec.fBackdrop) { writer.writeFlattenable(rec.fBackdrop); } + if (rec.fClipMask) { + writer.writeImage(rec.fClipMask.get()); + } + if (rec.fClipMatrix) { + writer.writeMatrix(*rec.fClipMatrix); + } + return kNoLayer_SaveLayerStrategy; } diff --git a/src/pipe/SkPipeFormat.h b/src/pipe/SkPipeFormat.h index 9a1d30c7be..a6521279d0 100644 --- a/src/pipe/SkPipeFormat.h +++ b/src/pipe/SkPipeFormat.h @@ -107,6 +107,8 @@ enum { kHasPaint_SaveLayerMask = 1 << 9, kHasBackdrop_SaveLayerMask = 1 << 10, kDontClipToLayer_SaveLayerMask = 1 << 11, + kHasClipMask_SaveLayerMask = 1 << 12, + kHasClipMatrix_SaveLayerMask = 1 << 13, }; enum { diff --git a/src/pipe/SkPipeReader.cpp b/src/pipe/SkPipeReader.cpp index 974e6b005d..73ef970c1b 100644 --- a/src/pipe/SkPipeReader.cpp +++ b/src/pipe/SkPipeReader.cpp @@ -244,6 +244,14 @@ static void saveLayer_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanva if (extra & kHasBackdrop_SaveLayerMask) { backdrop = reader.readImageFilter(); } + sk_sp clipMask; + if (extra & kHasClipMask_SaveLayerMask) { + clipMask = reader.readImage(); + } + SkMatrix clipMatrix; + if (extra & kHasClipMatrix_SaveLayerMask) { + reader.readMatrix(&clipMatrix); + } SkCanvas::SaveLayerFlags flags = (SkCanvas::SaveLayerFlags)(extra & kFlags_SaveLayerMask); // unremap this wacky flag @@ -251,7 +259,8 @@ static void saveLayer_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanva flags |= (1 << 31);//SkCanvas::kDontClipToLayer_PrivateSaveLayerFlag; } - canvas->saveLayer(SkCanvas::SaveLayerRec(bounds, paint, backdrop.get(), flags)); + canvas->saveLayer(SkCanvas::SaveLayerRec(bounds, paint, backdrop.get(), std::move(clipMask), + (extra & kHasClipMatrix_SaveLayerMask) ? &clipMatrix : nullptr, flags)); } static void restore_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas* canvas) { -- cgit v1.2.3