blob: 202f72ab12bc9530de8a744b3b983ae79e9ad491 [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) {
reedd053ce92016-03-22 10:17:23 -070017 paint->setColorFilter(SkColorFilter::MakeMatrixFilterRowMajor255(matrix.fMat));
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[]) {
reedd053ce92016-03-22 10:17:23 -070021 paint->setColorFilter(SkColorFilter::MakeMatrixFilterRowMajor255(array));
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 }
halcanary9d524f22016-03-29 09:03:52 -070038
reed56179002015-07-07 06:11:19 -070039 void onOnceBeforeDraw() override {
reed9ce9d672016-03-17 10:51:11 -070040 fSolidImg = CreateSolidBitmap(64, 64);
41 fTransparentImg = CreateTransparentBitmap(64, 64);
reed56179002015-07-07 06:11:19 -070042 }
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000043
reed9ce9d672016-03-17 10:51:11 -070044 static sk_sp<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 }
reed9ce9d672016-03-17 10:51:11 -070057 return SkImage::MakeFromBitmap(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.
reed9ce9d672016-03-17 10:51:11 -070061 static sk_sp<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;
reed2ad1aa62016-03-09 09:50:50 -080070 paint.setShader(SkGradientShader::MakeLinear(pts, colors, nullptr, 2,
71 SkShader::kClamp_TileMode));
bsalomon@google.com12820092012-10-16 17:50:48 +000072 canvas.drawRect(SkRect::MakeWH(SkIntToScalar(width), SkIntToScalar(height)), paint);
reed9ce9d672016-03-17 10:51:11 -070073 return SkImage::MakeFromBitmap(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);
reed9ce9d672016-03-17 10:51:11 -070081 const SkImage* bmps[] = { fSolidImg.get(), fTransparentImg.get() };
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:
reed9ce9d672016-03-17 10:51:11 -0700142 sk_sp<SkImage> fSolidImg;
143 sk_sp<SkImage> fTransparentImg;
reed56179002015-07-07 06:11:19 -0700144
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; )