diff options
Diffstat (limited to 'gm/imagefilterscropexpand.cpp')
-rw-r--r-- | gm/imagefilterscropexpand.cpp | 209 |
1 files changed, 100 insertions, 109 deletions
diff --git a/gm/imagefilterscropexpand.cpp b/gm/imagefilterscropexpand.cpp index 9b9f7ee817..57ff14b4a0 100644 --- a/gm/imagefilterscropexpand.cpp +++ b/gm/imagefilterscropexpand.cpp @@ -25,117 +25,114 @@ #include "SkPoint3.h" #include "SkSurface.h" -/////////////////////////////////////////////////////////////////////////////// - -class ImageFiltersCropExpandGM : public skiagm::GM { -public: - ImageFiltersCropExpandGM () {} +namespace { -protected: +void make_checkerboard(SkBitmap* bitmap); +sk_sp<SkImage> make_gradient_circle(int width, int height); +void draw(SkCanvas* canvas, const SkBitmap& bitmap, const SkRect& rect, + sk_sp<SkImageFilter> filter); - SkString onShortName() override { - return SkString("imagefilterscropexpand"); - } +}; - SkISize onISize() override { return SkISize::Make(730, 650); } - - void onDraw(SkCanvas* canvas) override { - SkImageFilter::CropRect cropRect( - SkRect::Make(SkIRect::MakeXYWH(10, 10, 44, 44)), - SkImageFilter::CropRect::kHasAll_CropEdge); - - sk_sp<SkImage> gradientCircle(MakeGradientCircle(64, 64)); - SkBitmap checkerboard; - MakeCheckerboard(&checkerboard); - - sk_sp<SkImageFilter> gradientCircleSource(SkImageSource::Make(std::move(gradientCircle))); - sk_sp<SkImageFilter> noopCropped(SkOffsetImageFilter::Make(0, 0, nullptr, &cropRect)); - // This color matrix saturates the green component but only partly increases the opacity. - // For the opaque checkerboard, the opacity boost doesn't matter but it does impact the - // area outside the checkerboard. - SkScalar matrix[20] = { 1, 0, 0, 0, 0, - 0, 1, 0, 0, 255, - 0, 0, 1, 0, 0, - 0, 0, 0, 1, 32 }; - sk_sp<SkColorFilter> cfAlphaTrans(SkColorFilter::MakeMatrixFilterRowMajor255(matrix)); - - SkRect r = SkRect::MakeWH(SkIntToScalar(64), SkIntToScalar(64)); - SkScalar MARGIN = SkIntToScalar(12); - - SkPoint3 pointLocation = SkPoint3::Make(0, 0, SkIntToScalar(10)); - SkScalar kd = SkIntToScalar(2); - SkScalar surfaceScale = SkIntToScalar(1); - SkIRect bounds; - r.roundOut(&bounds); +/////////////////////////////////////////////////////////////////////////////// - SkPaint paint; - canvas->translate(MARGIN, MARGIN); - for (int outset = -15; outset <= 20; outset += 5) { - canvas->save(); - SkRect rect = cropRect.rect(); - rect.outset(SkIntToScalar(outset), - SkIntToScalar(outset)); - SkImageFilter::CropRect bigRect(rect, SkImageFilter::CropRect::kHasAll_CropEdge); - - Draw(canvas, checkerboard, rect, SkColorFilterImageFilter::Make(cfAlphaTrans, - noopCropped, - &bigRect)); - - Draw(canvas, checkerboard, rect, SkBlurImageFilter::Make(0.3f, 0.3f, - noopCropped, - &bigRect)); - - Draw(canvas, checkerboard, rect, SkBlurImageFilter::Make(8.0f, 8.0f, - noopCropped, - &bigRect)); - - Draw(canvas, checkerboard, rect, SkDilateImageFilter::Make(2, 2, - noopCropped, - &bigRect)); - - Draw(canvas, checkerboard, rect, SkErodeImageFilter::Make(2, 2, - noopCropped, - &bigRect)); - - Draw(canvas, checkerboard, rect, - SkDropShadowImageFilter::Make( - SkIntToScalar(10), - SkIntToScalar(10), - SkIntToScalar(3), - SkIntToScalar(3), - SK_ColorBLUE, - SkDropShadowImageFilter::kDrawShadowAndForeground_ShadowMode, - noopCropped, - &bigRect)); - - Draw(canvas, checkerboard, rect, - SkDisplacementMapEffect::Make(SkDisplacementMapEffect::kR_ChannelSelectorType, - SkDisplacementMapEffect::kR_ChannelSelectorType, - SkIntToScalar(12), - gradientCircleSource, - noopCropped, - &bigRect)); - - Draw(canvas, checkerboard, rect, - SkOffsetImageFilter::Make(SkIntToScalar(-8), SkIntToScalar(16), +DEF_SIMPLE_GM(imagefilterscropexpand, canvas, 730, 650) { + SkImageFilter::CropRect cropRect( + SkRect::Make(SkIRect::MakeXYWH(10, 10, 44, 44)), + SkImageFilter::CropRect::kHasAll_CropEdge); + + sk_sp<SkImage> gradientCircle(make_gradient_circle(64, 64)); + SkBitmap checkerboard; + make_checkerboard(&checkerboard); + + sk_sp<SkImageFilter> gradientCircleSource(SkImageSource::Make(std::move(gradientCircle))); + sk_sp<SkImageFilter> noopCropped(SkOffsetImageFilter::Make(0, 0, nullptr, &cropRect)); + // This color matrix saturates the green component but only partly increases the opacity. + // For the opaque checkerboard, the opacity boost doesn't matter but it does impact the + // area outside the checkerboard. + SkScalar matrix[20] = { 1, 0, 0, 0, 0, + 0, 1, 0, 0, 255, + 0, 0, 1, 0, 0, + 0, 0, 0, 1, 32 }; + sk_sp<SkColorFilter> cfAlphaTrans(SkColorFilter::MakeMatrixFilterRowMajor255(matrix)); + + SkRect r = SkRect::MakeWH(SkIntToScalar(64), SkIntToScalar(64)); + SkScalar MARGIN = SkIntToScalar(12); + + SkPoint3 pointLocation = SkPoint3::Make(0, 0, SkIntToScalar(10)); + SkScalar kd = SkIntToScalar(2); + SkScalar surfaceScale = SkIntToScalar(1); + SkIRect bounds; + r.roundOut(&bounds); + + SkPaint paint; + canvas->translate(MARGIN, MARGIN); + for (int outset = -15; outset <= 20; outset += 5) { + canvas->save(); + SkRect rect = cropRect.rect(); + rect.outset(SkIntToScalar(outset), + SkIntToScalar(outset)); + SkImageFilter::CropRect bigRect(rect, SkImageFilter::CropRect::kHasAll_CropEdge); + + draw(canvas, checkerboard, rect, SkColorFilterImageFilter::Make(cfAlphaTrans, + noopCropped, + &bigRect)); + + draw(canvas, checkerboard, rect, SkBlurImageFilter::Make(0.3f, 0.3f, + noopCropped, + &bigRect)); + + draw(canvas, checkerboard, rect, SkBlurImageFilter::Make(8.0f, 8.0f, + noopCropped, + &bigRect)); + + draw(canvas, checkerboard, rect, SkDilateImageFilter::Make(2, 2, + noopCropped, + &bigRect)); + + draw(canvas, checkerboard, rect, SkErodeImageFilter::Make(2, 2, + noopCropped, + &bigRect)); + + draw(canvas, checkerboard, rect, + SkDropShadowImageFilter::Make( + SkIntToScalar(10), + SkIntToScalar(10), + SkIntToScalar(3), + SkIntToScalar(3), + SK_ColorBLUE, + SkDropShadowImageFilter::kDrawShadowAndForeground_ShadowMode, + noopCropped, + &bigRect)); + + draw(canvas, checkerboard, rect, + SkDisplacementMapEffect::Make(SkDisplacementMapEffect::kR_ChannelSelectorType, + SkDisplacementMapEffect::kR_ChannelSelectorType, + SkIntToScalar(12), + gradientCircleSource, noopCropped, &bigRect)); - Draw(canvas, checkerboard, rect, - SkLightingImageFilter::MakePointLitDiffuse(pointLocation, - SK_ColorWHITE, - surfaceScale, - kd, - noopCropped, - &bigRect)); + draw(canvas, checkerboard, rect, + SkOffsetImageFilter::Make(SkIntToScalar(-8), SkIntToScalar(16), + noopCropped, + &bigRect)); - canvas->restore(); - canvas->translate(0, SkIntToScalar(80)); - } + draw(canvas, checkerboard, rect, + SkLightingImageFilter::MakePointLitDiffuse(pointLocation, + SK_ColorWHITE, + surfaceScale, + kd, + noopCropped, + &bigRect)); + + canvas->restore(); + canvas->translate(0, SkIntToScalar(80)); } +} -private: - static void MakeCheckerboard(SkBitmap* bitmap) { +namespace { + void make_checkerboard(SkBitmap* bitmap) { bitmap->allocN32Pixels(64, 64); SkCanvas canvas(*bitmap); canvas.clear(0xFFFF0000); @@ -156,7 +153,7 @@ private: } } - static sk_sp<SkImage> MakeGradientCircle(int width, int height) { + sk_sp<SkImage> make_gradient_circle(int width, int height) { SkScalar x = SkIntToScalar(width / 2); SkScalar y = SkIntToScalar(height / 2); SkScalar radius = SkMinScalar(x, y) * 0.8f; @@ -174,7 +171,7 @@ private: return surface->makeImageSnapshot(); } - static void Draw(SkCanvas* canvas, const SkBitmap& bitmap, const SkRect& rect, + void draw(SkCanvas* canvas, const SkBitmap& bitmap, const SkRect& rect, sk_sp<SkImageFilter> filter) { SkPaint paint; paint.setImageFilter(std::move(filter)); @@ -189,10 +186,4 @@ private: canvas->translate(SkIntToScalar(80), 0); } - - typedef GM INHERITED; }; - -/////////////////////////////////////////////////////////////////////////////// - -DEF_GM( return new ImageFiltersCropExpandGM; ) |