aboutsummaryrefslogtreecommitdiff
path: root/gm/savelayer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'gm/savelayer.cpp')
-rw-r--r--gm/savelayer.cpp33
1 files changed, 23 insertions, 10 deletions
diff --git a/gm/savelayer.cpp b/gm/savelayer.cpp
index d6a33b2d96..1347cbc8cd 100644
--- a/gm/savelayer.cpp
+++ b/gm/savelayer.cpp
@@ -281,7 +281,8 @@ DEF_SIMPLE_GM(savelayer_coverage, canvas, 500, 500) {
#include "SkGradientShader.h"
#include "SkTextBlob.h"
-static void draw_cell(SkCanvas* canvas, sk_sp<SkTextBlob> blob, SkColor c, SkScalar w, SkScalar h) {
+static void draw_cell(SkCanvas* canvas, sk_sp<SkTextBlob> blob, SkColor c, SkScalar w, SkScalar h,
+ bool useDrawBehind) {
SkRect r = SkRect::MakeWH(w, h);
SkPaint p;
p.setColor(c);
@@ -309,7 +310,12 @@ static void draw_cell(SkCanvas* canvas, sk_sp<SkTextBlob> blob, SkColor c, SkSca
auto sh = SkGradientShader::MakeLinear(pts, colors, nullptr, 2, SkShader::kClamp_TileMode);
p.setShader(sh);
p.setBlendMode(SkBlendMode::kDstIn);
- canvas->drawRect(r, p);
+
+ if (useDrawBehind) {
+ SkCanvasPriv::DrawBehind(canvas, p);
+ } else {
+ canvas->drawRect(r, p);
+ }
// this should restore the behind image
canvas->restore();
@@ -320,10 +326,9 @@ static void draw_cell(SkCanvas* canvas, sk_sp<SkTextBlob> blob, SkColor c, SkSca
p.reset();
p.setStyle(SkPaint::kStroke_Style);
p.setAlphaf(0.25f);
- canvas->drawRect(r, p);
}
-static void draw_list(SkCanvas* canvas, sk_sp<SkTextBlob> blob) {
+static void draw_list(SkCanvas* canvas, sk_sp<SkTextBlob> blob, bool useDrawBehind) {
SkAutoCanvasRestore acr(canvas, true);
SkRandom rand;
@@ -332,19 +337,27 @@ static void draw_list(SkCanvas* canvas, sk_sp<SkTextBlob> blob) {
for (int i = 0; i < 8; ++i) {
SkColor c = rand.nextU(); // ensure we're opaque
c = (c & 0xFFFFFF) | 0x80000000;
- draw_cell(canvas, blob, c, w, h);
+ draw_cell(canvas, blob, c, w, h, useDrawBehind);
canvas->translate(0, h);
}
}
-DEF_SIMPLE_GM(save_behind, canvas, 400, 670) {
+DEF_SIMPLE_GM(save_behind, canvas, 830, 670) {
SkFont font;
font.setSize(30);
const char text[] = "This is a very long line of text";
auto blob = SkTextBlob::MakeFromText(text, strlen(text), font);
- draw_list(canvas, blob);
- canvas->translate(0, 350);
- canvas->saveLayer({0, 0, 400, 320}, nullptr);
- draw_list(canvas, blob);
+ for (bool useDrawBehind : {false, true}) {
+ canvas->save();
+
+ draw_list(canvas, blob, useDrawBehind);
+ canvas->translate(0, 350);
+ canvas->saveLayer({0, 0, 400, 320}, nullptr);
+ draw_list(canvas, blob, useDrawBehind);
+ canvas->restore();
+
+ canvas->restore();
+ canvas->translate(430, 0);
+ }
}