diff options
author | Florin Malita <fmalita@chromium.org> | 2017-04-28 13:48:37 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-05-01 14:07:10 +0000 |
commit | 53f77bd4fdd76525b66b7f26d1c5c550858120df (patch) | |
tree | d7516fa1c29a35a3e6b62aae82f3bb6e72928cf4 /src/pipe | |
parent | 57061eea444a8d85189827f014a451de63b49d1a (diff) |
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 <reed@google.com>
Commit-Queue: Florin Malita <fmalita@chromium.org>
Diffstat (limited to 'src/pipe')
-rw-r--r-- | src/pipe/SkPipeCanvas.cpp | 13 | ||||
-rw-r--r-- | src/pipe/SkPipeFormat.h | 2 | ||||
-rw-r--r-- | src/pipe/SkPipeReader.cpp | 11 |
3 files changed, 25 insertions, 1 deletions
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<SkImage> 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) { |