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 "sk_tool_utils.h" 10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkColorFilter.h" 11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkGradientShader.h" 12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define WIDTH 512 14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define HEIGHT 1024 15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotnamespace skiagm { 17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// Using gradients because GPU doesn't currently have an implementation of SkColorShader (duh!) 19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic sk_sp<SkShader> make_color_shader(SkColor color) { 20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot constexpr SkPoint kPts[] = {{0, 0}, {1, 1}}; 21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkColor colors[] = {color, color}; 22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return SkGradientShader::MakeLinear(kPts, colors, nullptr, 2, SkShader::kClamp_TileMode); 24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic sk_sp<SkShader> make_solid_shader() { 27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return make_color_shader(SkColorSetARGB(0xFF, 0x42, 0x82, 0x21)); 28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic sk_sp<SkShader> make_transparent_shader() { 31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return make_color_shader(SkColorSetARGB(0x80, 0x10, 0x70, 0x20)); 32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic sk_sp<SkShader> make_trans_black_shader() { 35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return make_color_shader(0x0); 36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// draws a background behind each test rect to see transparency 39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic sk_sp<SkShader> make_bg_shader(int checkSize) { 40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkBitmap bmp; 41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bmp.allocN32Pixels(2 * checkSize, 2 * checkSize); 42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkCanvas canvas(bmp); 43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas.clear(sk_tool_utils::color_to_565(0xFF800000)); 44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPaint paint; 45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setColor(sk_tool_utils::color_to_565(0xFF000080)); 46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkRect rect0 = SkRect::MakeXYWH(0, 0, 47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkIntToScalar(checkSize), SkIntToScalar(checkSize)); 48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkRect rect1 = SkRect::MakeXYWH(SkIntToScalar(checkSize), SkIntToScalar(checkSize), 49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkIntToScalar(checkSize), SkIntToScalar(checkSize)); 50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas.drawRect(rect1, paint); 51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas.drawRect(rect0, paint); 52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return SkShader::MakeBitmapShader(bmp, SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode); 53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass ModeColorFilterGM : public GM { 56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot ModeColorFilterGM() { 58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot this->setBGColor(sk_tool_utils::color_to_565(0xFF303030)); 59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected: 62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkString onShortName() override { 63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return SkString("modecolorfilters"); 64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkISize onISize() override { 67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return SkISize::Make(WIDTH, HEIGHT); 68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDraw(SkCanvas* canvas) override { 71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // size of rect for each test case 72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot constexpr int kRectWidth = 20; 73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot constexpr int kRectHeight = 20; 74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot constexpr int kCheckSize = 10; 76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (!fBmpShader) { 78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fBmpShader = make_bg_shader(kCheckSize); 79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPaint bgPaint; 81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bgPaint.setShader(fBmpShader); 82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bgPaint.setBlendMode(SkBlendMode::kSrc); 83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_sp<SkShader> shaders[] = { 85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot nullptr, // use a paint color instead of a shader 86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot make_solid_shader(), 87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot make_transparent_shader(), 88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot make_trans_black_shader(), 89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot }; 90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // used without shader 92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkColor colors[] = { 93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkColorSetARGB(0xFF, 0xFF, 0xFF, 0xFF), 94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkColorSetARGB(0xFF, 0x00, 0x00, 0x00), 95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkColorSetARGB(0x00, 0x00, 0x00, 0x00), 96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkColorSetARGB(0xFF, 0x10, 0x20, 0x42), 97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkColorSetARGB(0xA0, 0x20, 0x30, 0x90), 98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot }; 99fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // used with shaders 101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkColor alphas[] = {0xFFFFFFFF, 0x80808080}; 102fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 103fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkBlendMode modes[] = { // currently just doing the Modes expressible as Coeffs 104fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkBlendMode::kClear, 105fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkBlendMode::kSrc, 106fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkBlendMode::kDst, 107fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkBlendMode::kSrcOver, 108fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkBlendMode::kDstOver, 109fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkBlendMode::kSrcIn, 110fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkBlendMode::kDstIn, 111fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkBlendMode::kSrcOut, 112fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkBlendMode::kDstOut, 113fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkBlendMode::kSrcATop, 114fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkBlendMode::kDstATop, 115fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkBlendMode::kXor, 116fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkBlendMode::kPlus, 117fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkBlendMode::kModulate, 118fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot }; 119fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 120fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPaint paint; 121fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int idx = 0; 122fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const int kRectsPerRow = SkMax32(this->getISize().fWidth / kRectWidth, 1); 123fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (size_t cfm = 0; cfm < SK_ARRAY_COUNT(modes); ++cfm) { 124fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (size_t cfc = 0; cfc < SK_ARRAY_COUNT(colors); ++cfc) { 125fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setColorFilter(SkColorFilter::MakeModeFilter(colors[cfc], modes[cfm])); 126fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (size_t s = 0; s < SK_ARRAY_COUNT(shaders); ++s) { 127fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setShader(shaders[s]); 128fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool hasShader = nullptr == paint.getShader(); 129fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int paintColorCnt = hasShader ? SK_ARRAY_COUNT(alphas) : SK_ARRAY_COUNT(colors); 130fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkColor* paintColors = hasShader ? alphas : colors; 131fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int pc = 0; pc < paintColorCnt; ++pc) { 132fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setColor(paintColors[pc]); 133fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar x = SkIntToScalar(idx % kRectsPerRow); 134fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar y = SkIntToScalar(idx / kRectsPerRow); 135fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkRect rect = SkRect::MakeXYWH(x * kRectWidth, y * kRectHeight, 136fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkIntToScalar(kRectWidth), 137fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkIntToScalar(kRectHeight)); 138fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->saveLayer(&rect, nullptr); 139fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawRect(rect, bgPaint); 140fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawRect(rect, paint); 141fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->restore(); 142fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot ++idx; 143fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 144fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 145fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 146fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 147fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 148fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 149fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 150fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_sp<SkShader> fBmpShader; 151fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef GM INHERITED; 152fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 153fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 154fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot////////////////////////////////////////////////////////////////////////////// 155fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 156fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic GM* MyFactory(void*) { return new ModeColorFilterGM; } 157fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic GMRegistry reg(MyFactory); 158fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 159fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 160