Chromium Code Reviews| 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; ) |