aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/pipe
diff options
context:
space:
mode:
authorGravatar Florin Malita <fmalita@chromium.org>2017-04-28 13:48:37 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-05-01 14:07:10 +0000
commit53f77bd4fdd76525b66b7f26d1c5c550858120df (patch)
treed7516fa1c29a35a3e6b62aae82f3bb6e72928cf4 /src/pipe
parent57061eea444a8d85189827f014a451de63b49d1a (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.cpp13
-rw-r--r--src/pipe/SkPipeFormat.h2
-rw-r--r--src/pipe/SkPipeReader.cpp11
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) {