Index: gm/imagemakewithfilter.cpp |
diff --git a/gm/imagemakewithfilter.cpp b/gm/imagemakewithfilter.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..1180aff7d252173740122e38ddb84c7a3fe85312 |
--- /dev/null |
+++ b/gm/imagemakewithfilter.cpp |
@@ -0,0 +1,99 @@ |
+/* |
+ * Copyright 2016 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 "SkBlurImageFilter.h" |
+#include "SkCanvas.h" |
+#include "SkColorFilter.h" |
+#include "SkColorFilterImageFilter.h" |
+#include "SkDropShadowImageFilter.h" |
+#include "SkSurface.h" |
+ |
+/////////////////////////////////////////////////////////////////////////////// |
+ |
+static void show_bounds(SkCanvas* canvas, const SkIRect& subset, const SkIRect& clip) { |
+ const SkIRect rects[] { subset, clip }; |
+ const SkColor colors[] { SK_ColorRED, SK_ColorBLUE }; |
+ |
+ SkPaint paint; |
+ paint.setStyle(SkPaint::kStroke_Style); |
+ |
+ for (size_t i = 0; i < SK_ARRAY_COUNT(rects); ++i) { |
+ paint.setColor(colors[i]); |
+ canvas->drawRect(SkRect::Make(rects[i]), paint); |
+ } |
+} |
+ |
robertphillips
2016/05/19 16:35:19
// In this GM we're going to feed the inner portio
Stephen White
2016/05/19 17:44:03
Done.. (but isn't that what the code says? :) )
|
+class ImageMakeWithFilterGM : public skiagm::GM { |
+public: |
+ ImageMakeWithFilterGM () {} |
+ |
+protected: |
+ SkString onShortName() override { |
+ return SkString("imagemakewithfilter"); |
+ } |
+ |
+ SkISize onISize() override { return SkISize::Make(320, 100); } |
+ |
+ void onDraw(SkCanvas* canvas) override { |
+ auto cf = SkColorFilter::MakeModeFilter(SK_ColorGREEN, SkXfermode::kSrc_Mode); |
+ sk_sp<SkImageFilter> filters[] = { |
+ SkColorFilterImageFilter::Make(std::move(cf), nullptr), |
+ SkBlurImageFilter::Make(2.0f, 2.0f, nullptr), |
+ SkDropShadowImageFilter::Make( |
+ 10.0f, 5.0f, 3.0f, 3.0f, SK_ColorBLUE, |
+ SkDropShadowImageFilter::kDrawShadowAndForeground_ShadowMode, |
+ nullptr), |
+ }; |
+ |
+ const SkIRect clipBounds[] { |
+ { -20, -20, 100, 100 }, |
+ { 0, 0, 75, 75 }, |
+ { 20, 20, 100, 100 }, |
+ { -20, -20, 50, 50 }, |
+ { 20, 20, 50, 50 }, |
+ }; |
+ |
+ const SkImageInfo info = SkImageInfo::MakeN32(100, 100, kPremul_SkAlphaType); |
+ SkScalar MARGIN = SkIntToScalar(40); |
robertphillips
2016/05/19 16:35:19
constify DX too ?
maybe even MARGIN ?
Stephen White
2016/05/19 17:44:03
const POD local variables are a pet peeve of mine:
|
+ SkScalar DX = info.width() + MARGIN; |
+ const SkScalar DY = info.height() + MARGIN; |
+ |
+ canvas->translate(MARGIN, MARGIN); |
+ |
+ sk_sp<SkSurface> surface = canvas->makeSurface(info); |
+ if (!surface) { |
+ surface = SkSurface::MakeRaster(info); |
+ } |
+ sk_tool_utils::draw_checkerboard(surface->getCanvas()); |
+ sk_sp<SkImage> source = surface->makeImageSnapshot(); |
+ |
+ for (auto clipBound : clipBounds) { |
+ canvas->save(); |
+ for (size_t i = 0; i < SK_ARRAY_COUNT(filters); ++i) { |
+ SkIRect subset = SkIRect::MakeXYWH(25, 25, 50, 50); |
+ SkIRect outSubset; |
+ SkIPoint offset; |
+ sk_sp<SkImage> result = source->makeWithFilter(filters[i].get(), subset, clipBound, |
+ &outSubset, &offset); |
+ SkASSERT(result); |
+ SkASSERT(source->isTextureBacked() == result->isTextureBacked()); |
+ result = result->makeSubset(outSubset); |
+ canvas->drawImage(result.get(), SkIntToScalar(offset.fX), SkIntToScalar(offset.fY)); |
+ show_bounds(canvas, SkIRect::MakeXYWH(offset.x(), offset.y(), outSubset.width(), |
+ outSubset.height()), clipBound); |
+ canvas->translate(DX, 0); |
+ } |
+ canvas->restore(); |
+ canvas->translate(0, DY); |
+ } |
+ } |
+ |
+private: |
+ typedef GM INHERITED; |
+}; |
+DEF_GM( return new ImageMakeWithFilterGM; ) |