1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/*
2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2012 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 "SkCanvas.h"
10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkColorMatrixFilter.h"
11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkColorPriv.h"
12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkShader.h"
13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkBlurImageFilter.h"
15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkColorFilterImageFilter.h"
16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkTDArray.h"
17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define FILTER_WIDTH    SkIntToScalar(30)
19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define FILTER_HEIGHT   SkIntToScalar(30)
20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define MARGIN          SkIntToScalar(10)
21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic sk_sp<SkColorFilter> cf_make_brightness(float brightness) {
23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkScalar amount255 = brightness * 255;
24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkScalar matrix[20] = {
25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        1, 0, 0, 0, amount255,
26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        0, 1, 0, 0, amount255,
27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        0, 0, 1, 0, amount255,
28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        0, 0, 0, 1, 0 };
29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    return SkColorFilter::MakeMatrixFilterRowMajor255(matrix);
30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic sk_sp<SkColorFilter> cf_make_grayscale() {
33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkScalar matrix[20];
34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    memset(matrix, 0, 20 * sizeof(SkScalar));
35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    matrix[0] = matrix[5] = matrix[10] = 0.2126f;
36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    matrix[1] = matrix[6] = matrix[11] = 0.7152f;
37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    matrix[2] = matrix[7] = matrix[12] = 0.0722f;
38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    matrix[18] = 1.0f;
39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    return SkColorFilter::MakeMatrixFilterRowMajor255(matrix);
40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic sk_sp<SkColorFilter> cf_make_colorize(SkColor color) {
43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    return SkColorFilter::MakeModeFilter(color, SkBlendMode::kSrc);
44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic void sk_gm_get_colorfilters(SkTArray<sk_sp<SkColorFilter>>* array) {
47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    array->push_back(cf_make_brightness(0.5f));
48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    array->push_back(cf_make_grayscale());
49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    array->push_back(cf_make_colorize(SK_ColorBLUE));
50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot///////////////////////////////////////////////////////////////////////////////////////////////////
53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkGradientShader.h"
54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkImage.h"
55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "Resources.h"
56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic sk_sp<SkShader> sh_make_lineargradient0() {
58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const SkPoint pts[] = { { 0, 0 }, { 100, 100 } };
59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const SkColor colors[] = { SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE };
60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    return SkGradientShader::MakeLinear(pts, colors, nullptr, 3, SkShader::kRepeat_TileMode);
61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic sk_sp<SkShader> sh_make_lineargradient1() {
64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const SkPoint pts[] = { { 0, 0 }, { 100, 100 } };
65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const SkColor colors[] = { SK_ColorRED, 0x0000FF00, SK_ColorBLUE };
66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    return SkGradientShader::MakeLinear(pts, colors, nullptr, 3, SkShader::kRepeat_TileMode);
67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic sk_sp<SkShader> sh_make_image() {
70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    sk_sp<SkImage> image(GetResourceAsImage("images/mandrill_128.png"));
71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    if (!image) {
72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return nullptr;
73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    return image->makeShader(SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode);
75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic void sk_gm_get_shaders(SkTDArray<SkShader*>* array) {
78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    if (auto shader = sh_make_lineargradient0()) {
79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        *array->append() = shader.release();
80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    if (auto shader = sh_make_lineargradient1()) {
82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        *array->append() = shader.release();
83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    if (auto shader = sh_make_image()) {
85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        *array->append() = shader.release();
86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot///////////////////////////////////////////////////////////////////////////////////////////////////
90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic sk_sp<SkImageFilter> make_blur(float amount, sk_sp<SkImageFilter> input) {
92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    return SkBlurImageFilter::Make(amount, amount, std::move(input));
93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic sk_sp<SkImageFilter> make_brightness(float amount, sk_sp<SkImageFilter> input) {
96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    return SkColorFilterImageFilter::Make(cf_make_brightness(amount), std::move(input));
97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
99fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic sk_sp<SkImageFilter> make_grayscale(sk_sp<SkImageFilter> input) {
100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    return SkColorFilterImageFilter::Make(cf_make_grayscale(), std::move(input));
101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
102fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
103fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic sk_sp<SkImageFilter> make_mode_blue(sk_sp<SkImageFilter> input) {
104fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    return SkColorFilterImageFilter::Make(cf_make_colorize(SK_ColorBLUE), std::move(input));
105fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
106fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
107fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic void draw_clipped_rect(SkCanvas* canvas,
108fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                              const SkRect& r,
109fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                              const SkPaint& paint,
110fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                              float outset = 0.0f) {
111fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    canvas->save();
112fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkRect clip(r);
113fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    clip.outset(outset, outset);
114fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    canvas->clipRect(clip);
115fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    canvas->drawRect(r, paint);
116fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    canvas->restore();
117fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
118fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
119fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_SIMPLE_GM(colorfilterimagefilter, canvas, 400, 100){
120fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkRect r = SkRect::MakeWH(FILTER_WIDTH, FILTER_HEIGHT);
121fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkPaint paint;
122fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        paint.setColor(SK_ColorRED);
123fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        canvas->save();
124fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        for (float brightness = -1.0f; brightness <= 1.0f; brightness += 0.2f) {
125fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            sk_sp<SkImageFilter> dim(make_brightness(-brightness, nullptr));
126fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            sk_sp<SkImageFilter> bright(make_brightness(brightness, std::move(dim)));
127fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            paint.setImageFilter(std::move(bright));
128fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            draw_clipped_rect(canvas, r, paint);
129fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            canvas->translate(FILTER_WIDTH + MARGIN, 0);
130fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
131fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        canvas->restore();
132fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        canvas->translate(0, FILTER_HEIGHT + MARGIN);
133fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        {
134fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            sk_sp<SkImageFilter> brightness(make_brightness(0.9f, nullptr));
135fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            sk_sp<SkImageFilter> grayscale(make_grayscale(std::move(brightness)));
136fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            paint.setImageFilter(std::move(grayscale));
137fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            draw_clipped_rect(canvas, r, paint);
138fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            canvas->translate(FILTER_WIDTH + MARGIN, 0);
139fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
140fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        {
141fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            sk_sp<SkImageFilter> grayscale(make_grayscale(nullptr));
142fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            sk_sp<SkImageFilter> brightness(make_brightness(0.9f, std::move(grayscale)));
143fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            paint.setImageFilter(std::move(brightness));
144fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            draw_clipped_rect(canvas, r, paint);
145fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            canvas->translate(FILTER_WIDTH + MARGIN, 0);
146fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
147fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        {
148fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            sk_sp<SkImageFilter> blue(make_mode_blue(nullptr));
149fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            sk_sp<SkImageFilter> brightness(make_brightness(1.0f, std::move(blue)));
150fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            paint.setImageFilter(std::move(brightness));
151fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            draw_clipped_rect(canvas, r, paint);
152fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            canvas->translate(FILTER_WIDTH + MARGIN, 0);
153fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
154fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        {
155fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            sk_sp<SkImageFilter> brightness(make_brightness(1.0f, nullptr));
156fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            sk_sp<SkImageFilter> blue(make_mode_blue(std::move(brightness)));
157fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            paint.setImageFilter(std::move(blue));
158fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            draw_clipped_rect(canvas, r, paint);
159fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            canvas->translate(FILTER_WIDTH + MARGIN, 0);
160fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
161fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        {
162fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            sk_sp<SkImageFilter> blur(make_blur(3.0f, nullptr));
163fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            sk_sp<SkImageFilter> brightness(make_brightness(0.5f, std::move(blur)));
164fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            paint.setImageFilter(std::move(brightness));
165fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            draw_clipped_rect(canvas, r, paint, 3);
166fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            canvas->translate(FILTER_WIDTH + MARGIN, 0);
167fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
168fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        {
169fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            sk_sp<SkImageFilter> blue(make_mode_blue(nullptr));
170fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            paint.setImageFilter(std::move(blue));
171fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            draw_clipped_rect(canvas, r, paint, 5);
172fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            canvas->translate(FILTER_WIDTH + MARGIN, 0);
173fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
174fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
175fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
176fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_SIMPLE_GM(colorfilterimagefilter_layer, canvas, 32, 32) {
177fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkAutoCanvasRestore autoCanvasRestore(canvas, false);
178fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkColorMatrix cm;
179fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    cm.setSaturation(0.0f);
180fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    sk_sp<SkColorFilter> cf(SkColorFilter::MakeMatrixFilterRowMajor255(cm.fMat));
181fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkPaint p;
182fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    p.setImageFilter(SkColorFilterImageFilter::Make(std::move(cf), nullptr));
183fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    canvas->saveLayer(nullptr, &p);
184fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    canvas->clear(SK_ColorRED);
185fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
186fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
187fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot///////////////////////////////////////////////////////////////////////////////////////////////////
188fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
189fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkGradientShader.h"
190fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robottemplate <typename T> class SkTRefArray : public SkTDArray<T> {
191fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
192fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    ~SkTRefArray() { this->unrefAll(); }
193fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
194fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
195fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_SIMPLE_GM(colorfiltershader, canvas, 610, 610) {
196fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkTArray<sk_sp<SkColorFilter>> filters;
197fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    sk_gm_get_colorfilters(&filters);
198fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
199fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkTRefArray<SkShader*> shaders;
200fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    sk_gm_get_shaders(&shaders);
201fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
202fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const SkColor colors[] = { SK_ColorRED, SK_ColorBLUE };
203fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    *shaders.append() = SkGradientShader::MakeTwoPointConical({0, 0}, 50, {0, 0}, 150,
204fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                              colors, nullptr, 2,
205fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                              SkShader::kClamp_TileMode).release();
206fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
207fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkPaint paint;
208fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkRect r = SkRect::MakeWH(120, 120);
209fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
210fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    canvas->translate(20, 20);
211fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    for (int y = 0; y < shaders.count(); ++y) {
212fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkShader* shader = shaders[y];
213fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
214fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        canvas->save();
215fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        for (int x = -1; x < filters.count(); ++x) {
216fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            sk_sp<SkColorFilter> filter = x >= 0 ? filters[x] : nullptr;
217fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
218fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            paint.setShader(shader->makeWithColorFilter(filter));
219fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            canvas->drawRect(r, paint);
220fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            canvas->translate(150, 0);
221fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
222fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        canvas->restore();
223fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        canvas->translate(0, 150);
224fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
225fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
226fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
227fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_SIMPLE_GM(mixershader, canvas, 800, 700) {
228fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    auto shaderA = GetResourceAsImage("images/mandrill_128.png")->makeShader(SkShader::kClamp_TileMode,
229fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                                      SkShader::kClamp_TileMode);
230fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const SkColor colors[] = { SK_ColorGREEN, 0 };
231fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    auto shaderB = SkGradientShader::MakeRadial({60, 60}, 55, colors, nullptr, 2,
232fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                SkShader::kClamp_TileMode,
233fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                SkGradientShader::kInterpolateColorsInPremul_Flag,
234fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                nullptr);
235fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const SkBlendMode modes[] = {
236fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkBlendMode::kSrc, SkBlendMode::kModulate, SkBlendMode::kColorBurn, SkBlendMode::kPlus,
237fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkBlendMode::kDstATop,
238fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    };
239fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkPaint paint;
240fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkRect r = SkRect::MakeWH(120, 120);
241fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
242fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    canvas->translate(10, 10);
243fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    for (auto mode : modes) {
244fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        canvas->save();
245fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        const int count = 6;
246fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        for (int x = 0; x < count; ++x) {
247fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            const float t = x * 1.0f / (count - 1);
248fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            paint.setShader(SkShader::MakeCompose(shaderA, shaderB, mode, t));
249fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            canvas->drawRect(r, paint);
250fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            canvas->translate(r.width() + 10, 0);
251fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
252fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        canvas->restore();
253fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        canvas->translate(0, r.height() + 20);
254fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
255fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
256