1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/*
2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2016 Google Inc.
3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *
4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be
5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file.
6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */
7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "gm.h"
9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "sk_tool_utils.h"
10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkBlurImageFilter.h"
11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkCanvas.h"
12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkColorFilter.h"
13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkColorFilterImageFilter.h"
14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkDropShadowImageFilter.h"
15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkSurface.h"
16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot///////////////////////////////////////////////////////////////////////////////
18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic void show_bounds(SkCanvas* canvas, const SkIRect& subset, const SkIRect& clip) {
20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkIRect rects[] { subset, clip };
21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkColor colors[] { SK_ColorRED, SK_ColorBLUE };
22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkPaint paint;
24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    paint.setStyle(SkPaint::kStroke_Style);
25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    for (size_t i = 0; i < SK_ARRAY_COUNT(rects); ++i) {
27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        paint.setColor(colors[i]);
28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        canvas->drawRect(SkRect::Make(rects[i]), paint);
29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// In this GM, we're going to feed the inner portion of a 100x100 checkboard
33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// (i.e., strip off a 25-wide border) through the makeWithFilter method.
34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// We'll then draw the appropriate subset of the result to the screen at the
35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// given offset.
36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass ImageMakeWithFilterGM : public skiagm::GM {
37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    ImageMakeWithFilterGM () {}
39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected:
41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkString onShortName() override {
42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return SkString("imagemakewithfilter");
43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkISize onISize() override { return SkISize::Make(440, 530); }
46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDraw(SkCanvas* canvas) override {
48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        auto cf = SkColorFilter::MakeModeFilter(SK_ColorGREEN, SkBlendMode::kSrc);
49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        sk_sp<SkImageFilter> filters[] = {
50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkColorFilterImageFilter::Make(std::move(cf), nullptr),
51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkBlurImageFilter::Make(2.0f, 2.0f, nullptr),
52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkDropShadowImageFilter::Make(
53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                10.0f, 5.0f, 3.0f, 3.0f, SK_ColorBLUE,
54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                SkDropShadowImageFilter::kDrawShadowAndForeground_ShadowMode,
55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                nullptr),
56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        };
57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkIRect clipBounds[] {
59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            { -20, -20, 100, 100 },
60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            {   0,   0,  75,  75 },
61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            {  20,  20, 100, 100 },
62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            { -20, -20,  50,  50 },
63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            {  20,  20,  50,  50 },
64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        };
65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkImageInfo info = SkImageInfo::MakeN32(100, 100, kPremul_SkAlphaType);
67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkScalar MARGIN = SkIntToScalar(40);
68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkScalar DX = info.width() + MARGIN;
69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkScalar DY = info.height() + MARGIN;
70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        canvas->translate(MARGIN, MARGIN);
72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        sk_sp<SkSurface> surface = sk_tool_utils::makeSurface(canvas, info);
74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        sk_tool_utils::draw_checkerboard(surface->getCanvas());
75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        sk_sp<SkImage> source = surface->makeImageSnapshot();
76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        for (auto clipBound : clipBounds) {
78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            canvas->save();
79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            for (size_t i = 0; i < SK_ARRAY_COUNT(filters); ++i) {
80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                SkIRect subset = SkIRect::MakeXYWH(25, 25, 50, 50);
81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                SkIRect outSubset;
82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                SkIPoint offset;
83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                sk_sp<SkImage> result = source->makeWithFilter(filters[i].get(), subset, clipBound,
84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                               &outSubset, &offset);
85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                SkASSERT(result);
86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                SkASSERT(source->isTextureBacked() == result->isTextureBacked());
87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                result = result->makeSubset(outSubset);
88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                canvas->drawImage(result.get(), SkIntToScalar(offset.fX), SkIntToScalar(offset.fY));
89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                show_bounds(canvas, SkIRect::MakeXYWH(offset.x(), offset.y(), outSubset.width(),
90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                      outSubset.height()), clipBound);
91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                canvas->translate(DX, 0);
92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            }
93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            canvas->restore();
94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            canvas->translate(0, DY);
95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
99fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef GM INHERITED;
100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_GM( return new ImageMakeWithFilterGM; )
102