blob: 8f256bf250a3845ae2e338465f07b4cfdd2cf046 [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"
Mike Klein33d20552017-03-22 13:47:51 -04009#include "sk_tool_utils.h"
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000010#include "SkColorMatrixFilter.h"
bsalomon@google.com12820092012-10-16 17:50:48 +000011#include "SkGradientShader.h"
reed56179002015-07-07 06:11:19 -070012#include "SkImage.h"
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000013
14#define WIDTH 500
15#define HEIGHT 500
16
reed56179002015-07-07 06:11:19 -070017static void set_color_matrix(SkPaint* paint, const SkColorMatrix& matrix) {
reedd053ce92016-03-22 10:17:23 -070018 paint->setColorFilter(SkColorFilter::MakeMatrixFilterRowMajor255(matrix.fMat));
reed@google.com7b6c1932012-06-04 19:07:41 +000019}
20
reed56179002015-07-07 06:11:19 -070021static void set_array(SkPaint* paint, const SkScalar array[]) {
reedd053ce92016-03-22 10:17:23 -070022 paint->setColorFilter(SkColorFilter::MakeMatrixFilterRowMajor255(array));
reed@google.com7b6c1932012-06-04 19:07:41 +000023}
24
reed56179002015-07-07 06:11:19 -070025class ColorMatrixGM : public skiagm::GM {
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000026public:
27 ColorMatrixGM() {
caryclark65cdba62015-06-15 06:51:08 -070028 this->setBGColor(sk_tool_utils::color_to_565(0xFF808080));
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000029 }
rmistry@google.comd6176b02012-08-23 18:14:13 +000030
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000031protected:
reed56179002015-07-07 06:11:19 -070032 SkString onShortName() override {
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000033 return SkString("colormatrix");
34 }
35
reed56179002015-07-07 06:11:19 -070036 SkISize onISize() override {
tfarinaf5393182014-06-09 23:59:03 -070037 return SkISize::Make(WIDTH, HEIGHT);
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000038 }
halcanary9d524f22016-03-29 09:03:52 -070039
reed56179002015-07-07 06:11:19 -070040 void onOnceBeforeDraw() override {
reed9ce9d672016-03-17 10:51:11 -070041 fSolidImg = CreateSolidBitmap(64, 64);
42 fTransparentImg = CreateTransparentBitmap(64, 64);
reed56179002015-07-07 06:11:19 -070043 }
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000044
reed9ce9d672016-03-17 10:51:11 -070045 static sk_sp<SkImage> CreateSolidBitmap(int width, int height) {
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000046 SkBitmap bm;
reed@google.comeb9a46c2014-01-25 16:46:20 +000047 bm.allocN32Pixels(width, height);
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000048 SkCanvas canvas(bm);
senorblanco@chromium.org50bdad82012-01-03 20:51:57 +000049 canvas.clear(0x0);
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000050 for (int y = 0; y < height; ++y) {
51 for (int x = 0; x < width; ++x) {
52 SkPaint paint;
53 paint.setColor(SkColorSetARGB(255, x * 255 / width, y * 255 / height, 0));
tomhudson@google.com75589252012-04-10 17:42:21 +000054 canvas.drawRect(SkRect::MakeXYWH(SkIntToScalar(x),
55 SkIntToScalar(y), SK_Scalar1, SK_Scalar1), paint);
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000056 }
57 }
reed9ce9d672016-03-17 10:51:11 -070058 return SkImage::MakeFromBitmap(bm);
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000059 }
bsalomon@google.com12820092012-10-16 17:50:48 +000060
61 // creates a bitmap with shades of transparent gray.
reed9ce9d672016-03-17 10:51:11 -070062 static sk_sp<SkImage> CreateTransparentBitmap(int width, int height) {
bsalomon@google.com12820092012-10-16 17:50:48 +000063 SkBitmap bm;
reed@google.comeb9a46c2014-01-25 16:46:20 +000064 bm.allocN32Pixels(width, height);
bsalomon@google.com12820092012-10-16 17:50:48 +000065 SkCanvas canvas(bm);
66 canvas.clear(0x0);
67
68 SkPoint pts[] = {{0, 0}, {SkIntToScalar(width), SkIntToScalar(height)}};
69 SkColor colors[] = {0x00000000, 0xFFFFFFFF};
70 SkPaint paint;
reed2ad1aa62016-03-09 09:50:50 -080071 paint.setShader(SkGradientShader::MakeLinear(pts, colors, nullptr, 2,
72 SkShader::kClamp_TileMode));
bsalomon@google.com12820092012-10-16 17:50:48 +000073 canvas.drawRect(SkRect::MakeWH(SkIntToScalar(width), SkIntToScalar(height)), paint);
reed9ce9d672016-03-17 10:51:11 -070074 return SkImage::MakeFromBitmap(bm);
bsalomon@google.com12820092012-10-16 17:50:48 +000075 }
76
reed56179002015-07-07 06:11:19 -070077 void onDraw(SkCanvas* canvas) override {
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000078 SkPaint paint;
79 SkColorMatrix matrix;
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000080
reed374772b2016-10-05 17:33:02 -070081 paint.setBlendMode(SkBlendMode::kSrc);
reed9ce9d672016-03-17 10:51:11 -070082 const SkImage* bmps[] = { fSolidImg.get(), fTransparentImg.get() };
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000083
bsalomon@google.com12820092012-10-16 17:50:48 +000084 for (size_t i = 0; i < SK_ARRAY_COUNT(bmps); ++i) {
bsalomon@google.com12820092012-10-16 17:50:48 +000085 matrix.setIdentity();
reed56179002015-07-07 06:11:19 -070086 set_color_matrix(&paint, matrix);
87 canvas->drawImage(bmps[i], 0, 0, &paint);
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000088
bsalomon@google.com12820092012-10-16 17:50:48 +000089 matrix.setRotate(SkColorMatrix::kR_Axis, 90);
reed56179002015-07-07 06:11:19 -070090 set_color_matrix(&paint, matrix);
91 canvas->drawImage(bmps[i], 80, 0, &paint);
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000092
bsalomon@google.com12820092012-10-16 17:50:48 +000093 matrix.setRotate(SkColorMatrix::kG_Axis, 90);
reed56179002015-07-07 06:11:19 -070094 set_color_matrix(&paint, matrix);
95 canvas->drawImage(bmps[i], 160, 0, &paint);
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000096
bsalomon@google.com12820092012-10-16 17:50:48 +000097 matrix.setRotate(SkColorMatrix::kB_Axis, 90);
reed56179002015-07-07 06:11:19 -070098 set_color_matrix(&paint, matrix);
99 canvas->drawImage(bmps[i], 240, 0, &paint);
100 ///////////////////////////////////////////////
commit-bot@chromium.org4b413c82013-11-25 19:44:07 +0000101 matrix.setSaturation(0.0f);
reed56179002015-07-07 06:11:19 -0700102 set_color_matrix(&paint, matrix);
103 canvas->drawImage(bmps[i], 0, 80, &paint);
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +0000104
commit-bot@chromium.org4b413c82013-11-25 19:44:07 +0000105 matrix.setSaturation(0.5f);
reed56179002015-07-07 06:11:19 -0700106 set_color_matrix(&paint, matrix);
107 canvas->drawImage(bmps[i], 80, 80, &paint);
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +0000108
commit-bot@chromium.org4b413c82013-11-25 19:44:07 +0000109 matrix.setSaturation(1.0f);
reed56179002015-07-07 06:11:19 -0700110 set_color_matrix(&paint, matrix);
111 canvas->drawImage(bmps[i], 160, 80, &paint);
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +0000112
commit-bot@chromium.org4b413c82013-11-25 19:44:07 +0000113 matrix.setSaturation(2.0f);
reed56179002015-07-07 06:11:19 -0700114 set_color_matrix(&paint, matrix);
115 canvas->drawImage(bmps[i], 240, 80, &paint);
116 ///////////////////////////////////////////////
bsalomon@google.com12820092012-10-16 17:50:48 +0000117 matrix.setRGB2YUV();
reed56179002015-07-07 06:11:19 -0700118 set_color_matrix(&paint, matrix);
119 canvas->drawImage(bmps[i], 0, 160, &paint);
senorblanco@chromium.orgb3a39b52012-01-05 18:28:56 +0000120
bsalomon@google.com12820092012-10-16 17:50:48 +0000121 matrix.setYUV2RGB();
reed56179002015-07-07 06:11:19 -0700122 set_color_matrix(&paint, matrix);
123 canvas->drawImage(bmps[i], 80, 160, &paint);
bsalomon@google.com12820092012-10-16 17:50:48 +0000124
125 SkScalar s1 = SK_Scalar1;
126 SkScalar s255 = SkIntToScalar(255);
127 // Move red into alpha, set color to white
128 SkScalar data[20] = {
129 0, 0, 0, 0, s255,
130 0, 0, 0, 0, s255,
131 0, 0, 0, 0, s255,
132 s1, 0, 0, 0, 0,
133 };
134
reed56179002015-07-07 06:11:19 -0700135 set_array(&paint, data);
136 canvas->drawImage(bmps[i], 160, 160, &paint);
137 ///////////////////////////////////////////////
bsalomon@google.com12820092012-10-16 17:50:48 +0000138 canvas->translate(0, 240);
139 }
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +0000140 }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000141
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +0000142private:
reed9ce9d672016-03-17 10:51:11 -0700143 sk_sp<SkImage> fSolidImg;
144 sk_sp<SkImage> fTransparentImg;
reed56179002015-07-07 06:11:19 -0700145
146 typedef skiagm::GM INHERITED;
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +0000147};
reed56179002015-07-07 06:11:19 -0700148DEF_GM( return new ColorMatrixGM; )