blob: b466188c6a063c484a2899d6dc4ca3121508155f [file] [log] [blame]
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +00001/*
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"
bsalomon@google.com12820092012-10-16 17:50:48 +000010#include "SkGradientShader.h"
reed56179002015-07-07 06:11:19 -070011#include "SkImage.h"
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000012
13#define WIDTH 500
14#define HEIGHT 500
15
reed56179002015-07-07 06:11:19 -070016static void set_color_matrix(SkPaint* paint, const SkColorMatrix& matrix) {
commit-bot@chromium.org727a3522014-02-21 18:46:30 +000017 paint->setColorFilter(SkColorMatrixFilter::Create(matrix))->unref();
reed@google.com7b6c1932012-06-04 19:07:41 +000018}
19
reed56179002015-07-07 06:11:19 -070020static void set_array(SkPaint* paint, const SkScalar array[]) {
commit-bot@chromium.org727a3522014-02-21 18:46:30 +000021 paint->setColorFilter(SkColorMatrixFilter::Create(array))->unref();
reed@google.com7b6c1932012-06-04 19:07:41 +000022}
23
reed56179002015-07-07 06:11:19 -070024class ColorMatrixGM : public skiagm::GM {
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000025public:
26 ColorMatrixGM() {
caryclark65cdba62015-06-15 06:51:08 -070027 this->setBGColor(sk_tool_utils::color_to_565(0xFF808080));
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000028 }
rmistry@google.comd6176b02012-08-23 18:14:13 +000029
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000030protected:
reed56179002015-07-07 06:11:19 -070031 SkString onShortName() override {
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000032 return SkString("colormatrix");
33 }
34
reed56179002015-07-07 06:11:19 -070035 SkISize onISize() override {
tfarinaf5393182014-06-09 23:59:03 -070036 return SkISize::Make(WIDTH, HEIGHT);
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000037 }
reed56179002015-07-07 06:11:19 -070038
39 void onOnceBeforeDraw() override {
40 fSolidImg.reset(CreateSolidBitmap(64, 64));
41 fTransparentImg.reset(CreateTransparentBitmap(64, 64));
42 }
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000043
reed56179002015-07-07 06:11:19 -070044 static SkImage* CreateSolidBitmap(int width, int height) {
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000045 SkBitmap bm;
reed@google.comeb9a46c2014-01-25 16:46:20 +000046 bm.allocN32Pixels(width, height);
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000047 SkCanvas canvas(bm);
senorblanco@chromium.org50bdad82012-01-03 20:51:57 +000048 canvas.clear(0x0);
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000049 for (int y = 0; y < height; ++y) {
50 for (int x = 0; x < width; ++x) {
51 SkPaint paint;
52 paint.setColor(SkColorSetARGB(255, x * 255 / width, y * 255 / height, 0));
tomhudson@google.com75589252012-04-10 17:42:21 +000053 canvas.drawRect(SkRect::MakeXYWH(SkIntToScalar(x),
54 SkIntToScalar(y), SK_Scalar1, SK_Scalar1), paint);
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000055 }
56 }
reed56179002015-07-07 06:11:19 -070057 return SkImage::NewFromBitmap(bm);
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000058 }
bsalomon@google.com12820092012-10-16 17:50:48 +000059
60 // creates a bitmap with shades of transparent gray.
reed56179002015-07-07 06:11:19 -070061 static SkImage* CreateTransparentBitmap(int width, int height) {
bsalomon@google.com12820092012-10-16 17:50:48 +000062 SkBitmap bm;
reed@google.comeb9a46c2014-01-25 16:46:20 +000063 bm.allocN32Pixels(width, height);
bsalomon@google.com12820092012-10-16 17:50:48 +000064 SkCanvas canvas(bm);
65 canvas.clear(0x0);
66
67 SkPoint pts[] = {{0, 0}, {SkIntToScalar(width), SkIntToScalar(height)}};
68 SkColor colors[] = {0x00000000, 0xFFFFFFFF};
69 SkPaint paint;
halcanary96fcdcc2015-08-27 07:41:13 -070070 paint.setShader(SkGradientShader::CreateLinear(pts, colors, nullptr, 2,
bsalomon@google.com12820092012-10-16 17:50:48 +000071 SkShader::kClamp_TileMode))->unref();
72 canvas.drawRect(SkRect::MakeWH(SkIntToScalar(width), SkIntToScalar(height)), paint);
reed56179002015-07-07 06:11:19 -070073 return SkImage::NewFromBitmap(bm);
bsalomon@google.com12820092012-10-16 17:50:48 +000074 }
75
reed56179002015-07-07 06:11:19 -070076 void onDraw(SkCanvas* canvas) override {
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000077 SkPaint paint;
78 SkColorMatrix matrix;
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000079
bsalomon@google.com12820092012-10-16 17:50:48 +000080 paint.setXfermodeMode(SkXfermode::kSrc_Mode);
reed56179002015-07-07 06:11:19 -070081 const SkImage* bmps[] = { fSolidImg, fTransparentImg };
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000082
bsalomon@google.com12820092012-10-16 17:50:48 +000083 for (size_t i = 0; i < SK_ARRAY_COUNT(bmps); ++i) {
bsalomon@google.com12820092012-10-16 17:50:48 +000084 matrix.setIdentity();
reed56179002015-07-07 06:11:19 -070085 set_color_matrix(&paint, matrix);
86 canvas->drawImage(bmps[i], 0, 0, &paint);
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000087
bsalomon@google.com12820092012-10-16 17:50:48 +000088 matrix.setRotate(SkColorMatrix::kR_Axis, 90);
reed56179002015-07-07 06:11:19 -070089 set_color_matrix(&paint, matrix);
90 canvas->drawImage(bmps[i], 80, 0, &paint);
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000091
bsalomon@google.com12820092012-10-16 17:50:48 +000092 matrix.setRotate(SkColorMatrix::kG_Axis, 90);
reed56179002015-07-07 06:11:19 -070093 set_color_matrix(&paint, matrix);
94 canvas->drawImage(bmps[i], 160, 0, &paint);
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000095
bsalomon@google.com12820092012-10-16 17:50:48 +000096 matrix.setRotate(SkColorMatrix::kB_Axis, 90);
reed56179002015-07-07 06:11:19 -070097 set_color_matrix(&paint, matrix);
98 canvas->drawImage(bmps[i], 240, 0, &paint);
99 ///////////////////////////////////////////////
commit-bot@chromium.org4b413c82013-11-25 19:44:07 +0000100 matrix.setSaturation(0.0f);
reed56179002015-07-07 06:11:19 -0700101 set_color_matrix(&paint, matrix);
102 canvas->drawImage(bmps[i], 0, 80, &paint);
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +0000103
commit-bot@chromium.org4b413c82013-11-25 19:44:07 +0000104 matrix.setSaturation(0.5f);
reed56179002015-07-07 06:11:19 -0700105 set_color_matrix(&paint, matrix);
106 canvas->drawImage(bmps[i], 80, 80, &paint);
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +0000107
commit-bot@chromium.org4b413c82013-11-25 19:44:07 +0000108 matrix.setSaturation(1.0f);
reed56179002015-07-07 06:11:19 -0700109 set_color_matrix(&paint, matrix);
110 canvas->drawImage(bmps[i], 160, 80, &paint);
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +0000111
commit-bot@chromium.org4b413c82013-11-25 19:44:07 +0000112 matrix.setSaturation(2.0f);
reed56179002015-07-07 06:11:19 -0700113 set_color_matrix(&paint, matrix);
114 canvas->drawImage(bmps[i], 240, 80, &paint);
115 ///////////////////////////////////////////////
bsalomon@google.com12820092012-10-16 17:50:48 +0000116 matrix.setRGB2YUV();
reed56179002015-07-07 06:11:19 -0700117 set_color_matrix(&paint, matrix);
118 canvas->drawImage(bmps[i], 0, 160, &paint);
senorblanco@chromium.orgb3a39b52012-01-05 18:28:56 +0000119
bsalomon@google.com12820092012-10-16 17:50:48 +0000120 matrix.setYUV2RGB();
reed56179002015-07-07 06:11:19 -0700121 set_color_matrix(&paint, matrix);
122 canvas->drawImage(bmps[i], 80, 160, &paint);
bsalomon@google.com12820092012-10-16 17:50:48 +0000123
124 SkScalar s1 = SK_Scalar1;
125 SkScalar s255 = SkIntToScalar(255);
126 // Move red into alpha, set color to white
127 SkScalar data[20] = {
128 0, 0, 0, 0, s255,
129 0, 0, 0, 0, s255,
130 0, 0, 0, 0, s255,
131 s1, 0, 0, 0, 0,
132 };
133
reed56179002015-07-07 06:11:19 -0700134 set_array(&paint, data);
135 canvas->drawImage(bmps[i], 160, 160, &paint);
136 ///////////////////////////////////////////////
bsalomon@google.com12820092012-10-16 17:50:48 +0000137 canvas->translate(0, 240);
138 }
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +0000139 }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000140
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +0000141private:
reed56179002015-07-07 06:11:19 -0700142 SkAutoTUnref<SkImage> fSolidImg;
143 SkAutoTUnref<SkImage> fTransparentImg;
144
145 typedef skiagm::GM INHERITED;
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +0000146};
reed56179002015-07-07 06:11:19 -0700147DEF_GM( return new ColorMatrixGM; )
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +0000148