diff options
Diffstat (limited to 'gm/colormatrix.cpp')
-rw-r--r-- | gm/colormatrix.cpp | 139 |
1 files changed, 84 insertions, 55 deletions
diff --git a/gm/colormatrix.cpp b/gm/colormatrix.cpp index af305ee04f..16086f0346 100644 --- a/gm/colormatrix.cpp +++ b/gm/colormatrix.cpp @@ -7,6 +7,7 @@ #include "gm.h" #include "SkColorMatrixFilter.h" +#include "SkGradientShader.h" #define WIDTH 500 #define HEIGHT 500 @@ -41,7 +42,8 @@ class ColorMatrixGM : public GM { SkOnce fOnce; void init() { if (fOnce.once()) { - fBitmap = createBitmap(64, 64); + fSolidBitmap = this->createSolidBitmap(64, 64); + fTransparentBitmap = this->createTransparentBitmap(64, 64); } } @@ -59,7 +61,7 @@ protected: return make_isize(WIDTH, HEIGHT); } - SkBitmap createBitmap(int width, int height) { + SkBitmap createSolidBitmap(int width, int height) { SkBitmap bm; bm.setConfig(SkBitmap::kARGB_8888_Config, width, height); bm.allocPixels(); @@ -75,68 +77,95 @@ protected: } return bm; } + + // creates a bitmap with shades of transparent gray. + SkBitmap createTransparentBitmap(int width, int height) { + SkBitmap bm; + bm.setConfig(SkBitmap::kARGB_8888_Config, width, height); + bm.allocPixels(); + SkCanvas canvas(bm); + canvas.clear(0x0); + + SkPoint pts[] = {{0, 0}, {SkIntToScalar(width), SkIntToScalar(height)}}; + SkColor colors[] = {0x00000000, 0xFFFFFFFF}; + SkPaint paint; + paint.setShader(SkGradientShader::CreateLinear(pts, colors, NULL, 2, + SkShader::kClamp_TileMode))->unref(); + canvas.drawRect(SkRect::MakeWH(SkIntToScalar(width), SkIntToScalar(height)), paint); + return bm; + } + virtual void onDraw(SkCanvas* canvas) { this->init(); SkPaint paint; SkColorMatrix matrix; - matrix.setIdentity(); - setColorMatrix(&paint, matrix); - canvas->drawBitmap(fBitmap, 0, 0, &paint); - - matrix.setRotate(SkColorMatrix::kR_Axis, 90); - setColorMatrix(&paint, matrix); - canvas->drawBitmap(fBitmap, 80, 0, &paint); - - matrix.setRotate(SkColorMatrix::kG_Axis, 90); - setColorMatrix(&paint, matrix); - canvas->drawBitmap(fBitmap, 160, 0, &paint); - - matrix.setRotate(SkColorMatrix::kB_Axis, 90); - setColorMatrix(&paint, matrix); - canvas->drawBitmap(fBitmap, 240, 0, &paint); - - matrix.setSaturation(SkFloatToScalar(0.0f)); - setColorMatrix(&paint, matrix); - canvas->drawBitmap(fBitmap, 0, 80, &paint); - - matrix.setSaturation(SkFloatToScalar(0.5f)); - setColorMatrix(&paint, matrix); - canvas->drawBitmap(fBitmap, 80, 80, &paint); - - matrix.setSaturation(SkFloatToScalar(1.0f)); - setColorMatrix(&paint, matrix); - canvas->drawBitmap(fBitmap, 160, 80, &paint); - - matrix.setSaturation(SkFloatToScalar(2.0f)); - setColorMatrix(&paint, matrix); - canvas->drawBitmap(fBitmap, 240, 80, &paint); - - matrix.setRGB2YUV(); - setColorMatrix(&paint, matrix); - canvas->drawBitmap(fBitmap, 0, 160, &paint); - - matrix.setYUV2RGB(); - setColorMatrix(&paint, matrix); - canvas->drawBitmap(fBitmap, 80, 160, &paint); - - SkScalar s1 = SK_Scalar1; - SkScalar s255 = SkIntToScalar(255); - // Move red into alpha, set color to white - SkScalar data[20] = { - 0, 0, 0, 0, s255, - 0, 0, 0, 0, s255, - 0, 0, 0, 0, s255, - s1, 0, 0, 0, 0, - }; - - setArray(&paint, data); - canvas->drawBitmap(fBitmap, 160, 160, &paint); + paint.setXfermodeMode(SkXfermode::kSrc_Mode); + const SkBitmap bmps[] = { fSolidBitmap, fTransparentBitmap }; + + for (size_t i = 0; i < SK_ARRAY_COUNT(bmps); ++i) { + + matrix.setIdentity(); + setColorMatrix(&paint, matrix); + canvas->drawBitmap(bmps[i], 0, 0, &paint); + + matrix.setRotate(SkColorMatrix::kR_Axis, 90); + setColorMatrix(&paint, matrix); + canvas->drawBitmap(bmps[i], 80, 0, &paint); + + matrix.setRotate(SkColorMatrix::kG_Axis, 90); + setColorMatrix(&paint, matrix); + canvas->drawBitmap(bmps[i], 160, 0, &paint); + + matrix.setRotate(SkColorMatrix::kB_Axis, 90); + setColorMatrix(&paint, matrix); + canvas->drawBitmap(bmps[i], 240, 0, &paint); + + matrix.setSaturation(SkFloatToScalar(0.0f)); + setColorMatrix(&paint, matrix); + canvas->drawBitmap(bmps[i], 0, 80, &paint); + + matrix.setSaturation(SkFloatToScalar(0.5f)); + setColorMatrix(&paint, matrix); + canvas->drawBitmap(bmps[i], 80, 80, &paint); + + matrix.setSaturation(SkFloatToScalar(1.0f)); + setColorMatrix(&paint, matrix); + canvas->drawBitmap(bmps[i], 160, 80, &paint); + + matrix.setSaturation(SkFloatToScalar(2.0f)); + setColorMatrix(&paint, matrix); + canvas->drawBitmap(bmps[i], 240, 80, &paint); + + matrix.setRGB2YUV(); + setColorMatrix(&paint, matrix); + canvas->drawBitmap(bmps[i], 0, 160, &paint); + + matrix.setYUV2RGB(); + setColorMatrix(&paint, matrix); + canvas->drawBitmap(bmps[i], 80, 160, &paint); + + SkScalar s1 = SK_Scalar1; + SkScalar s255 = SkIntToScalar(255); + // Move red into alpha, set color to white + SkScalar data[20] = { + 0, 0, 0, 0, s255, + 0, 0, 0, 0, s255, + 0, 0, 0, 0, s255, + s1, 0, 0, 0, 0, + }; + + setArray(&paint, data); + canvas->drawBitmap(bmps[i], 160, 160, &paint); + + canvas->translate(0, 240); + } } private: - SkBitmap fBitmap; + SkBitmap fSolidBitmap; + SkBitmap fTransparentBitmap; typedef GM INHERITED; }; |