diff options
author | Mike Reed <reed@google.com> | 2018-01-24 16:34:02 -0500 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2018-01-25 01:54:21 +0000 |
commit | 20dc672821d743a0c32f07dc6ec994f9deb478d7 (patch) | |
tree | e74946ccaf3a94b1e2bccb55528241b6d5481418 /gm/shadermaskfilter.cpp | |
parent | 868a68061ecf608ab7c2b353d5fe29325c3fddd7 (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.cpp | 93 |
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(); } |