1 /* 2 * Copyright 2011 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 "SkColorMatrixFilter.h" 10 #include "SkGradientShader.h" 11 12 #define WIDTH 500 13 #define HEIGHT 500 14 15 class SkDoOnce { 16 public: 17 SkDoOnce() : fOnce(false) {}; 18 19 bool once() const { 20 if (fOnce) { 21 return false; 22 } 23 fOnce = true; 24 return true; 25 } 26 27 private: 28 mutable bool fOnce; 29 }; 30 31 static void setColorMatrix(SkPaint* paint, const SkColorMatrix& matrix) { 32 paint->setColorFilter(SkColorMatrixFilter::Create(matrix))->unref(); 33 } 34 35 static void setArray(SkPaint* paint, const SkScalar array[]) { 36 paint->setColorFilter(SkColorMatrixFilter::Create(array))->unref(); 37 } 38 39 namespace skiagm { 40 41 class ColorMatrixGM : public GM { 42 SkDoOnce fOnce; 43 void init() { 44 if (fOnce.once()) { 45 fSolidBitmap = this->createSolidBitmap(64, 64); 46 fTransparentBitmap = this->createTransparentBitmap(64, 64); 47 } 48 } 49 50 public: 51 ColorMatrixGM() { 52 this->setBGColor(0xFF808080); 53 } 54 55 protected: 56 virtual SkString onShortName() { 57 return SkString("colormatrix"); 58 } 59 60 virtual SkISize onISize() { 61 return SkISize::Make(WIDTH, HEIGHT); 62 } 63 64 SkBitmap createSolidBitmap(int width, int height) { 65 SkBitmap bm; 66 bm.allocN32Pixels(width, height); 67 SkCanvas canvas(bm); 68 canvas.clear(0x0); 69 for (int y = 0; y < height; ++y) { 70 for (int x = 0; x < width; ++x) { 71 SkPaint paint; 72 paint.setColor(SkColorSetARGB(255, x * 255 / width, y * 255 / height, 0)); 73 canvas.drawRect(SkRect::MakeXYWH(SkIntToScalar(x), 74 SkIntToScalar(y), SK_Scalar1, SK_Scalar1), paint); 75 } 76 } 77 return bm; 78 } 79 80 // creates a bitmap with shades of transparent gray. 81 SkBitmap createTransparentBitmap(int width, int height) { 82 SkBitmap bm; 83 bm.allocN32Pixels(width, height); 84 SkCanvas canvas(bm); 85 canvas.clear(0x0); 86 87 SkPoint pts[] = {{0, 0}, {SkIntToScalar(width), SkIntToScalar(height)}}; 88 SkColor colors[] = {0x00000000, 0xFFFFFFFF}; 89 SkPaint paint; 90 paint.setShader(SkGradientShader::CreateLinear(pts, colors, NULL, 2, 91 SkShader::kClamp_TileMode))->unref(); 92 canvas.drawRect(SkRect::MakeWH(SkIntToScalar(width), SkIntToScalar(height)), paint); 93 return bm; 94 } 95 96 virtual void onDraw(SkCanvas* canvas) { 97 this->init(); 98 99 SkPaint paint; 100 SkColorMatrix matrix; 101 102 paint.setXfermodeMode(SkXfermode::kSrc_Mode); 103 const SkBitmap bmps[] = { fSolidBitmap, fTransparentBitmap }; 104 105 for (size_t i = 0; i < SK_ARRAY_COUNT(bmps); ++i) { 106 107 matrix.setIdentity(); 108 setColorMatrix(&paint, matrix); 109 canvas->drawBitmap(bmps[i], 0, 0, &paint); 110 111 matrix.setRotate(SkColorMatrix::kR_Axis, 90); 112 setColorMatrix(&paint, matrix); 113 canvas->drawBitmap(bmps[i], 80, 0, &paint); 114 115 matrix.setRotate(SkColorMatrix::kG_Axis, 90); 116 setColorMatrix(&paint, matrix); 117 canvas->drawBitmap(bmps[i], 160, 0, &paint); 118 119 matrix.setRotate(SkColorMatrix::kB_Axis, 90); 120 setColorMatrix(&paint, matrix); 121 canvas->drawBitmap(bmps[i], 240, 0, &paint); 122 123 matrix.setSaturation(0.0f); 124 setColorMatrix(&paint, matrix); 125 canvas->drawBitmap(bmps[i], 0, 80, &paint); 126 127 matrix.setSaturation(0.5f); 128 setColorMatrix(&paint, matrix); 129 canvas->drawBitmap(bmps[i], 80, 80, &paint); 130 131 matrix.setSaturation(1.0f); 132 setColorMatrix(&paint, matrix); 133 canvas->drawBitmap(bmps[i], 160, 80, &paint); 134 135 matrix.setSaturation(2.0f); 136 setColorMatrix(&paint, matrix); 137 canvas->drawBitmap(bmps[i], 240, 80, &paint); 138 139 matrix.setRGB2YUV(); 140 setColorMatrix(&paint, matrix); 141 canvas->drawBitmap(bmps[i], 0, 160, &paint); 142 143 matrix.setYUV2RGB(); 144 setColorMatrix(&paint, matrix); 145 canvas->drawBitmap(bmps[i], 80, 160, &paint); 146 147 SkScalar s1 = SK_Scalar1; 148 SkScalar s255 = SkIntToScalar(255); 149 // Move red into alpha, set color to white 150 SkScalar data[20] = { 151 0, 0, 0, 0, s255, 152 0, 0, 0, 0, s255, 153 0, 0, 0, 0, s255, 154 s1, 0, 0, 0, 0, 155 }; 156 157 setArray(&paint, data); 158 canvas->drawBitmap(bmps[i], 160, 160, &paint); 159 160 canvas->translate(0, 240); 161 } 162 } 163 164 private: 165 SkBitmap fSolidBitmap; 166 SkBitmap fTransparentBitmap; 167 typedef GM INHERITED; 168 }; 169 170 ////////////////////////////////////////////////////////////////////////////// 171 172 static GM* MyFactory(void*) { return new ColorMatrixGM; } 173 static GMRegistry reg(MyFactory); 174 175 } 176