diff options
author | Mike Reed <reed@google.com> | 2018-01-18 16:06:54 -0500 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2018-01-18 21:24:38 +0000 |
commit | 6e87eee2a0494e11610e5535427a9f86ccffa4bb (patch) | |
tree | d035bf913332edbcd746527cdc211c6938eb609d /gm/shadermaskfilter.cpp | |
parent | e97e792c79afd01fe1d83e5d1e94918145794c54 (diff) |
add shadermaskfilter
next steps:
- gpu impl (will look a lot like shader's asFragProcessor
- special-case rect-input (?)
- explore stages w/ mtklein
Bug: skia:7500
Change-Id: I71089e421d32443a3ddded6967b3e5bc67ed43f2
Reviewed-on: https://skia-review.googlesource.com/95104
Commit-Queue: Mike Reed <reed@google.com>
Reviewed-by: Florin Malita <fmalita@chromium.org>
Reviewed-by: Brian Salomon <bsalomon@google.com>
Diffstat (limited to 'gm/shadermaskfilter.cpp')
-rw-r--r-- | gm/shadermaskfilter.cpp | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/gm/shadermaskfilter.cpp b/gm/shadermaskfilter.cpp new file mode 100644 index 0000000000..35d8fd7040 --- /dev/null +++ b/gm/shadermaskfilter.cpp @@ -0,0 +1,57 @@ +/* + * Copyright 2018 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "gm.h" +#include "sk_tool_utils.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) { + SkMatrix matrix = SkMatrix::MakeScale(SkIntToScalar(image->width()) / mask->width(), + SkIntToScalar(image->height() / mask->height())); + SkPaint paint; + paint.setMaskFilter(SkShaderMaskFilter::Make(mask->makeShader(&matrix))); + canvas->drawImage(image, x, y, &paint); +} + +#include "SkGradientShader.h" +static sk_sp<SkShader> make_shader(const SkRect& r) { + const SkPoint pts[] = { + { r.fLeft, r.fTop }, { r.fRight, r.fBottom }, + }; + const SkColor colors[] = { 0, SK_ColorWHITE }; + return SkGradientShader::MakeLinear(pts, colors, nullptr, 2, SkShader::kRepeat_TileMode); +} + +DEF_SIMPLE_GM(shadermaskfilter_gradient, canvas, 512, 512) { + SkRect r = { 0, 0, 100, 150 }; + auto shader = make_shader(r); + auto mf = SkShaderMaskFilter::Make(shader); + + canvas->translate(20, 20); + canvas->scale(2, 2); + + SkPaint paint; + paint.setMaskFilter(mf); + paint.setColor(SK_ColorRED); + canvas->drawOval(r, paint); +} + +#include "Resources.h" +DEF_SIMPLE_GM(shadermaskfilter_image, canvas, 512, 512) { + canvas->scale(1.25f, 1.25f); + + auto image = GetResourceAsImage("images/mandrill_128.png"); + auto mask = GetResourceAsImage("images/color_wheel.png"); + + 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()); +} |