aboutsummaryrefslogtreecommitdiffhomepage
path: root/gm
diff options
context:
space:
mode:
authorGravatar Mike Reed <reed@google.com>2018-02-02 14:36:05 -0500
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2018-02-02 20:05:09 +0000
commit27738e043a8eeeb8045397b7e1140a0b1bcb04a3 (patch)
treedf1959aae39665895025c363cff13baaba6bf813 /gm
parent553ca26136492fa31e08e9eed2c263e8af85d5e2 (diff)
add new gm for cmoposeshader
Bug: skia: Change-Id: I8f0925743ea3a7f5bb2af31d01da7d932827d256 Reviewed-on: https://skia-review.googlesource.com/103081 Reviewed-by: Mike Reed <reed@google.com> Commit-Queue: Mike Reed <reed@google.com>
Diffstat (limited to 'gm')
-rw-r--r--gm/composeshader.cpp97
1 files changed, 92 insertions, 5 deletions
diff --git a/gm/composeshader.cpp b/gm/composeshader.cpp
index 38069939fd..cbecc0b2e4 100644
--- a/gm/composeshader.cpp
+++ b/gm/composeshader.cpp
@@ -63,6 +63,7 @@ protected:
private:
typedef GM INHERITED ;
};
+DEF_GM( return new ComposeShaderGM; )
class ComposeShaderAlphaGM : public skiagm::GM {
public:
@@ -109,7 +110,7 @@ protected:
private:
typedef GM INHERITED ;
};
-
+DEF_GM( return new ComposeShaderAlphaGM; )
// creates a square bitmap with red background and a green circle in the center
static void draw_color_bm(SkBitmap* bm, int length) {
@@ -220,6 +221,7 @@ private:
typedef GM INHERITED;
};
+DEF_GM( return new ComposeShaderBitmapGM; )
DEF_SIMPLE_GM(composeshader_bitmap2, canvas, 200, 200) {
int width = 255;
@@ -255,8 +257,93 @@ DEF_SIMPLE_GM(composeshader_bitmap2, canvas, 200, 200) {
canvas->drawRect(r, paint);
}
-//////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////////////////////////
-DEF_GM( return new ComposeShaderGM; )
-DEF_GM( return new ComposeShaderAlphaGM; )
-DEF_GM( return new ComposeShaderBitmapGM; )
+static sk_sp<SkShader> make_src_shader(SkScalar size) {
+ const SkPoint pts[] = { { 0, 0 }, { 0, size } };
+ const SkColor colors[] = { 0xFF0000FF, 0x000000FF };
+ return SkGradientShader::MakeLinear(pts, colors, nullptr, 2, SkShader::kClamp_TileMode);
+}
+
+static sk_sp<SkShader> make_dst_shader(SkScalar size) {
+ const SkPoint pts[] = { { 0, 0 }, { size, 0 } };
+ const SkColor colors[] = { SK_ColorRED, 0x00FF0000 };
+ return SkGradientShader::MakeLinear(pts, colors, nullptr, 2, SkShader::kClamp_TileMode);
+}
+
+const SkScalar gCellSize = 100;
+
+static void draw_cell(SkCanvas* canvas, sk_sp<SkShader> src, sk_sp<SkShader> dst,
+ SkBlendMode mode, SkAlpha alpha) {
+ const SkRect r = SkRect::MakeWH(gCellSize, gCellSize);
+ SkPaint p;
+ p.setAlpha(alpha);
+
+ SkAutoCanvasRestore acr(canvas, false);
+ canvas->saveLayer(&r, &p);
+ p.setAlpha(0xFF);
+
+ p.setShader(dst);
+ p.setBlendMode(SkBlendMode::kSrc);
+ canvas->drawRect(r, p);
+
+ p.setShader(src);
+ p.setBlendMode(mode);
+ canvas->drawRect(r, p);
+}
+
+static void draw_composed(SkCanvas* canvas, sk_sp<SkShader> src, sk_sp<SkShader> dst,
+ SkBlendMode mode, SkAlpha alpha) {
+ SkPaint p;
+ p.setAlpha(alpha);
+ p.setShader(SkShader::MakeCompose(dst, src, mode));
+ canvas->drawRect(SkRect::MakeWH(gCellSize, gCellSize), p);
+}
+
+static void draw_pair(SkCanvas* canvas, sk_sp<SkShader> src, sk_sp<SkShader> dst,
+ SkBlendMode mode) {
+ SkAutoCanvasRestore acr(canvas, true);
+
+ const SkScalar gap = 4;
+ SkRect r = SkRect::MakeWH(2 * gCellSize + gap, 2 * gCellSize + gap);
+ r.outset(gap + 2, gap + 2);
+ SkPaint p;
+ p.setStyle(SkPaint::kStroke_Style);
+ canvas->drawRect(r, p); // border
+
+ SkAlpha alpha = 0xFF;
+ for (int y = 0; y < 2; ++y) {
+ draw_cell(canvas, src, dst, mode, alpha);
+ canvas->save();
+ canvas->translate(gCellSize + gap, 0);
+ draw_composed(canvas, src, dst, mode, alpha);
+ canvas->restore();
+
+ canvas->translate(0, gCellSize + gap);
+ alpha = 0x80;
+ }
+}
+
+DEF_SIMPLE_GM(composeshader_grid, canvas, 882, 882) {
+ auto src = make_src_shader(gCellSize);
+ auto dst = make_dst_shader(gCellSize);
+
+ const SkScalar margin = 16;
+ const SkScalar dx = 2*gCellSize + margin;
+ const SkScalar dy = 2*gCellSize + margin;
+
+ canvas->translate(margin, margin);
+ canvas->save();
+ for (int m = 0; m < 16; ++m) {
+ SkBlendMode mode = static_cast<SkBlendMode>(m);
+ draw_pair(canvas, src, dst, mode);
+ if ((m % 4) == 3) {
+ canvas->restore();
+ canvas->translate(0, dy);
+ canvas->save();
+ } else {
+ canvas->translate(dx, 0);
+ }
+ }
+ canvas->restore();
+}