aboutsummaryrefslogtreecommitdiffhomepage
path: root/gm/shadermaskfilter.cpp
diff options
context:
space:
mode:
authorGravatar Mike Reed <reed@google.com>2018-01-24 16:34:02 -0500
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2018-01-25 01:54:21 +0000
commit20dc672821d743a0c32f07dc6ec994f9deb478d7 (patch)
treee74946ccaf3a94b1e2bccb55528241b6d5481418 /gm/shadermaskfilter.cpp
parent868a68061ecf608ab7c2b353d5fe29325c3fddd7 (diff)
compose and combine maskfilters
Bug: skia: Change-Id: Id470124021d00ee25cf4ae392a4ee345ced84110 Reviewed-on: https://skia-review.googlesource.com/97760 Reviewed-by: Mike Klein <mtklein@chromium.org> Reviewed-by: Florin Malita <fmalita@chromium.org> Commit-Queue: Mike Reed <reed@google.com>
Diffstat (limited to 'gm/shadermaskfilter.cpp')
-rw-r--r--gm/shadermaskfilter.cpp93
1 files changed, 91 insertions, 2 deletions
diff --git a/gm/shadermaskfilter.cpp b/gm/shadermaskfilter.cpp
index 35d8fd7040..3545e557e5 100644
--- a/gm/shadermaskfilter.cpp
+++ b/gm/shadermaskfilter.cpp
@@ -7,16 +7,21 @@
#include "gm.h"
#include "sk_tool_utils.h"
+#include "SkBlurMaskFilter.h"
#include "SkCanvas.h"
#include "SkImage.h"
#include "SkShaderMaskFilter.h"
static void draw_masked_image(SkCanvas* canvas, const SkImage* image, SkScalar x, SkScalar y,
- const SkImage* mask) {
+ const SkImage* mask, sk_sp<SkMaskFilter> outer = nullptr) {
SkMatrix matrix = SkMatrix::MakeScale(SkIntToScalar(image->width()) / mask->width(),
SkIntToScalar(image->height() / mask->height()));
SkPaint paint;
- paint.setMaskFilter(SkShaderMaskFilter::Make(mask->makeShader(&matrix)));
+ auto mf = SkShaderMaskFilter::Make(mask->makeShader(&matrix));
+ if (outer) {
+ mf = SkMaskFilter::MakeCompose(outer, mf);
+ }
+ paint.setMaskFilter(mf);
canvas->drawImage(image, x, y, &paint);
}
@@ -49,9 +54,93 @@ DEF_SIMPLE_GM(shadermaskfilter_image, canvas, 512, 512) {
auto image = GetResourceAsImage("images/mandrill_128.png");
auto mask = GetResourceAsImage("images/color_wheel.png");
+ auto blurmf = SkBlurMaskFilter::Make(kNormal_SkBlurStyle, 5);
canvas->drawImage(image, 10, 10, nullptr);
canvas->drawImage(mask, 10 + image->width() + 10.f, 10, nullptr);
draw_masked_image(canvas, image.get(), 10, 10 + image->height() + 10.f, mask.get());
+ draw_masked_image(canvas, image.get(), 10 + image->width() + 10.f, 10 + image->height() + 10.f,
+ mask.get(), blurmf);
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+namespace {
+enum class SkAlphaBlendMode {
+ kClear, // 0
+ kSrc, // src
+ kDst, // dst
+ kOver, // src + dst - src*dst
+ kIn, // src * dst
+ kSrcOut, // src * (1 - dst)
+ kDstOut, // dst * (1 - src)
+ kXor, // src + dst - 2*src*dst
+ kPlus, // src + dst
+
+ kLast = kPlus,
+};
+
+const SkBlendMode gAlphaToBlendMode[] = {
+ SkBlendMode::kClear, // SkAlphaBlendMode::kClear
+ SkBlendMode::kSrc, // SkAlphaBlendMode::kSrc
+ SkBlendMode::kDst, // SkAlphaBlendMode::kDst
+ SkBlendMode::kSrcOver, // SkAlphaBlendMode::kOver
+ SkBlendMode::kSrcIn, // SkAlphaBlendMode::kIn
+ SkBlendMode::kSrcOut, // SkAlphaBlendMode::kSrcOut
+ SkBlendMode::kDstOut, // SkAlphaBlendMode::kDstOut
+ SkBlendMode::kXor, // SkAlphaBlendMode::kXor
+ SkBlendMode::kPlus, // SkAlphaBlendMode::kPlus
+};
+}
+
+#include "SkPictureRecorder.h"
+#include "SkPath.h"
+static sk_sp<SkMaskFilter> make_path_mf(const SkPath& path, unsigned alpha) {
+ SkPaint paint;
+ paint.setAntiAlias(true);
+ paint.setAlpha(alpha);
+
+ SkPictureRecorder recorder;
+ recorder.beginRecording(1000, 1000)->drawPath(path, paint);
+ auto shader = SkShader::MakePictureShader(recorder.finishRecordingAsPicture(),
+ SkShader::kClamp_TileMode, SkShader::kClamp_TileMode,
+ nullptr, nullptr);
+ return SkShaderMaskFilter::Make(shader);
+}
+
+DEF_SIMPLE_GM(combinemaskfilter, canvas, 340, 340) {
+ const SkRect r = { 0, 0, 100, 100 };
+
+ const SkRect r2 = r.makeOutset(1.5f, 1.5f);
+ SkPaint paint2;
+ paint2.setStyle(SkPaint::kStroke_Style);
+
+ SkPath pathA;
+ pathA.moveTo(r.fLeft, r.fBottom);
+ pathA.lineTo(r.fRight, r.fTop);
+ pathA.lineTo(r.fRight, r.fBottom);
+ auto mfA = make_path_mf(pathA, 1 * 0xFF / 3);
+
+ SkPath pathB;
+ pathB.moveTo(r.fLeft, r.fTop);
+ pathB.lineTo(r.fRight, r.fBottom);
+ pathB.lineTo(r.fLeft, r.fBottom);
+ auto mfB = make_path_mf(pathB, 2 * 0xFF / 3);
+
+ canvas->translate(10, 10);
+ canvas->save();
+ for (int i = 0; i < 9; ++i) {
+ SkPaint paint;
+ paint.setMaskFilter(SkMaskFilter::MakeCombine(mfA, mfB, gAlphaToBlendMode[i]));
+ canvas->drawRect(r2, paint2);
+ canvas->drawRect(r, paint);
+ canvas->translate(r.width() + 10, 0);
+ if ((i % 3) == 2) {
+ canvas->restore();
+ canvas->translate(0, r.height() + 10);
+ canvas->save();
+ }
+ }
+ canvas->restore();
}