modecolorfilters.cpp revision 24c29d91caa4eaa31f9e77bad614627a252df35e
1/* 2 * Copyright 2012 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8#include "gm.h" 9#include "SkBitmapProcShader.h" 10#include "SkColorFilter.h" 11#include "SkGradientShader.h" 12 13#define WIDTH 512 14#define HEIGHT 1024 15 16namespace skiagm { 17 18// Using gradients because GPU doesn't currently have an implementation of SkColorShader (duh!) 19static SkShader* make_color_shader(SkColor color) { 20 static const SkPoint kPts[] = {{0, 0}, {1, 1}}; 21 SkColor colors[] = {color, color}; 22 23 return SkGradientShader::CreateLinear(kPts, colors, NULL, 2, SkShader::kClamp_TileMode); 24} 25 26static SkShader* make_solid_shader() { 27 return make_color_shader(SkColorSetARGB(0xFF, 0x40, 0x80, 0x20)); 28} 29 30static SkShader* make_transparent_shader() { 31 return make_color_shader(SkColorSetARGB(0x80, 0x10, 0x70, 0x20)); 32} 33 34static SkShader* make_trans_black_shader() { 35 return make_color_shader(0x0); 36} 37 38// draws a background behind each test rect to see transparency 39static SkShader* make_bg_shader(int checkSize) { 40 SkBitmap bmp; 41 bmp.setConfig(SkBitmap::kARGB_8888_Config, 2 * checkSize, 2 * checkSize); 42 bmp.allocPixels(); 43 SkCanvas canvas(bmp); 44 canvas.clear(0xFF800000); 45 SkPaint paint; 46 paint.setColor(0xFF000080); 47 SkRect rect0 = SkRect::MakeXYWH(0, 0, 48 SkIntToScalar(checkSize), SkIntToScalar(checkSize)); 49 SkRect rect1 = SkRect::MakeXYWH(SkIntToScalar(checkSize), SkIntToScalar(checkSize), 50 SkIntToScalar(checkSize), SkIntToScalar(checkSize)); 51 canvas.drawRect(rect1, paint); 52 canvas.drawRect(rect0, paint); 53 return SkNEW_ARGS(SkBitmapProcShader, (bmp, SkShader::kRepeat_TileMode, 54 SkShader::kRepeat_TileMode)); 55} 56 57class ModeColorFilterGM : public GM { 58public: 59 ModeColorFilterGM() { 60 this->setBGColor(0xFF303030); 61 } 62 63protected: 64 virtual SkString onShortName() { 65 return SkString("modecolorfilters"); 66 } 67 68 virtual SkISize onISize() { 69 return make_isize(WIDTH, HEIGHT); 70 } 71 72 virtual void onDraw(SkCanvas* canvas) { 73 // size of rect for each test case 74 static const int kRectWidth = 20; 75 static const int kRectHeight = 20; 76 77 static const int kCheckSize = 10; 78 79 if (!fBmpShader) { 80 fBmpShader.reset(make_bg_shader(kCheckSize)); 81 } 82 SkPaint bgPaint; 83 bgPaint.setShader(fBmpShader); 84 bgPaint.setXfermodeMode(SkXfermode::kSrc_Mode); 85 86 SkShader* shaders[] = { 87 NULL, // use a paint color instead of a shader 88 make_solid_shader(), 89 make_transparent_shader(), 90 make_trans_black_shader(), 91 }; 92 93 // used without shader 94 SkColor colors[] = { 95 SkColorSetARGB(0xFF, 0xFF, 0xFF, 0xFF), 96 SkColorSetARGB(0xFF, 0x00, 0x00, 0x00), 97 SkColorSetARGB(0x00, 0x00, 0x00, 0x00), 98 SkColorSetARGB(0xFF, 0x10, 0x20, 0x40), 99 SkColorSetARGB(0xA0, 0x20, 0x30, 0x90), 100 }; 101 102 // used with shaders 103 SkColor alphas[] = {0xFFFFFFFF, 0x80808080}; 104 105 SkXfermode::Mode modes[] = { // currently just doing the Modes expressible as Coeffs 106 SkXfermode::kClear_Mode, 107 SkXfermode::kSrc_Mode, 108 SkXfermode::kDst_Mode, 109 SkXfermode::kSrcOver_Mode, 110 SkXfermode::kDstOver_Mode, 111 SkXfermode::kSrcIn_Mode, 112 SkXfermode::kDstIn_Mode, 113 SkXfermode::kSrcOut_Mode, 114 SkXfermode::kDstOut_Mode, 115 SkXfermode::kSrcATop_Mode, 116 SkXfermode::kDstATop_Mode, 117 SkXfermode::kXor_Mode, 118 SkXfermode::kPlus_Mode, 119 SkXfermode::kMultiply_Mode, 120 }; 121 122 SkPaint paint; 123 int idx = 0; 124 static const int kRectsPerRow = SkMax32(this->getISize().fWidth / kRectWidth, 1); 125 for (size_t cfm = 0; cfm < SK_ARRAY_COUNT(modes); ++cfm) { 126 for (int cfc = 0; cfc < SK_ARRAY_COUNT(colors); ++cfc) { 127 SkAutoTUnref<SkColorFilter> cf(SkColorFilter::CreateModeFilter(colors[cfc], 128 modes[cfm])); 129 paint.setColorFilter(cf); 130 for (int s = 0; s < SK_ARRAY_COUNT(shaders); ++s) { 131 paint.setShader(shaders[s]); 132 bool hasShader = NULL == paint.getShader(); 133 int paintColorCnt = hasShader ? SK_ARRAY_COUNT(alphas) : SK_ARRAY_COUNT(colors); 134 SkColor* paintColors = hasShader ? alphas : colors; 135 for (int pc = 0; pc < paintColorCnt; ++pc) { 136 paint.setColor(paintColors[pc]); 137 SkScalar x = SkIntToScalar(idx % kRectsPerRow); 138 SkScalar y = SkIntToScalar(idx / kRectsPerRow); 139 SkRect rect = SkRect::MakeXYWH(x * kRectWidth, y * kRectHeight, 140 kRectWidth, kRectHeight); 141 canvas->drawRect(rect, bgPaint); 142 canvas->drawRect(rect, paint); 143 ++idx; 144 } 145 } 146 } 147 } 148 149 for (int i = 0; i < SK_ARRAY_COUNT(shaders); ++i) { 150 SkSafeUnref(shaders[i]); 151 } 152 } 153 154private: 155 SkAutoTUnref<SkShader> fBmpShader; 156 typedef GM INHERITED; 157}; 158 159////////////////////////////////////////////////////////////////////////////// 160 161static GM* MyFactory(void*) { return new ModeColorFilterGM; } 162static GMRegistry reg(MyFactory); 163 164} 165