blob: 8f3f5e2174b90e554c186d709f237817a4852604 [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
Mike Kleinc0bd9f92019-04-23 12:05:21 -05008#include "gm/gm.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -04009#include "include/core/SkBitmap.h"
10#include "include/core/SkBlendMode.h"
11#include "include/core/SkCanvas.h"
12#include "include/core/SkColor.h"
13#include "include/core/SkColorFilter.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050014#include "include/core/SkImage.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -040015#include "include/core/SkPaint.h"
16#include "include/core/SkPoint.h"
17#include "include/core/SkRect.h"
18#include "include/core/SkRefCnt.h"
19#include "include/core/SkScalar.h"
20#include "include/core/SkShader.h"
21#include "include/core/SkSize.h"
22#include "include/core/SkString.h"
23#include "include/core/SkTileMode.h"
24#include "include/core/SkTypes.h"
25#include "include/effects/SkColorMatrix.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050026#include "include/effects/SkGradientShader.h"
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000027
28#define WIDTH 500
Brian Osmane36d0302019-11-01 17:10:28 -040029#define HEIGHT 160
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000030
reed56179002015-07-07 06:11:19 -070031static void set_color_matrix(SkPaint* paint, const SkColorMatrix& matrix) {
Mike Reed50d79af2019-04-21 22:17:03 -040032 paint->setColorFilter(SkColorFilters::Matrix(matrix));
reed@google.com7b6c1932012-06-04 19:07:41 +000033}
34
Mike Reede869a1e2019-04-30 12:18:54 -040035static void set_array(SkPaint* paint, const float array[]) {
36 paint->setColorFilter(SkColorFilters::Matrix(array));
reed@google.com7b6c1932012-06-04 19:07:41 +000037}
38
reed56179002015-07-07 06:11:19 -070039class ColorMatrixGM : public skiagm::GM {
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000040public:
41 ColorMatrixGM() {
Mike Kleind46dce32018-08-16 10:17:03 -040042 this->setBGColor(0xFF808080);
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000043 }
rmistry@google.comd6176b02012-08-23 18:14:13 +000044
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000045protected:
reed56179002015-07-07 06:11:19 -070046 SkString onShortName() override {
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000047 return SkString("colormatrix");
48 }
49
reed56179002015-07-07 06:11:19 -070050 SkISize onISize() override {
tfarinaf5393182014-06-09 23:59:03 -070051 return SkISize::Make(WIDTH, HEIGHT);
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000052 }
halcanary9d524f22016-03-29 09:03:52 -070053
reed56179002015-07-07 06:11:19 -070054 void onOnceBeforeDraw() override {
reed9ce9d672016-03-17 10:51:11 -070055 fSolidImg = CreateSolidBitmap(64, 64);
56 fTransparentImg = CreateTransparentBitmap(64, 64);
reed56179002015-07-07 06:11:19 -070057 }
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000058
reed9ce9d672016-03-17 10:51:11 -070059 static sk_sp<SkImage> CreateSolidBitmap(int width, int height) {
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000060 SkBitmap bm;
reed@google.comeb9a46c2014-01-25 16:46:20 +000061 bm.allocN32Pixels(width, height);
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000062 SkCanvas canvas(bm);
senorblanco@chromium.org50bdad82012-01-03 20:51:57 +000063 canvas.clear(0x0);
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000064 for (int y = 0; y < height; ++y) {
65 for (int x = 0; x < width; ++x) {
66 SkPaint paint;
67 paint.setColor(SkColorSetARGB(255, x * 255 / width, y * 255 / height, 0));
tomhudson@google.com75589252012-04-10 17:42:21 +000068 canvas.drawRect(SkRect::MakeXYWH(SkIntToScalar(x),
69 SkIntToScalar(y), SK_Scalar1, SK_Scalar1), paint);
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000070 }
71 }
reed9ce9d672016-03-17 10:51:11 -070072 return SkImage::MakeFromBitmap(bm);
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000073 }
bsalomon@google.com12820092012-10-16 17:50:48 +000074
75 // creates a bitmap with shades of transparent gray.
reed9ce9d672016-03-17 10:51:11 -070076 static sk_sp<SkImage> CreateTransparentBitmap(int width, int height) {
bsalomon@google.com12820092012-10-16 17:50:48 +000077 SkBitmap bm;
reed@google.comeb9a46c2014-01-25 16:46:20 +000078 bm.allocN32Pixels(width, height);
bsalomon@google.com12820092012-10-16 17:50:48 +000079 SkCanvas canvas(bm);
80 canvas.clear(0x0);
81
82 SkPoint pts[] = {{0, 0}, {SkIntToScalar(width), SkIntToScalar(height)}};
83 SkColor colors[] = {0x00000000, 0xFFFFFFFF};
84 SkPaint paint;
reed2ad1aa62016-03-09 09:50:50 -080085 paint.setShader(SkGradientShader::MakeLinear(pts, colors, nullptr, 2,
Mike Reedfae8fce2019-04-03 10:27:45 -040086 SkTileMode::kClamp));
bsalomon@google.com12820092012-10-16 17:50:48 +000087 canvas.drawRect(SkRect::MakeWH(SkIntToScalar(width), SkIntToScalar(height)), paint);
reed9ce9d672016-03-17 10:51:11 -070088 return SkImage::MakeFromBitmap(bm);
bsalomon@google.com12820092012-10-16 17:50:48 +000089 }
90
reed56179002015-07-07 06:11:19 -070091 void onDraw(SkCanvas* canvas) override {
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000092 SkPaint paint;
93 SkColorMatrix matrix;
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000094
reed374772b2016-10-05 17:33:02 -070095 paint.setBlendMode(SkBlendMode::kSrc);
reed9ce9d672016-03-17 10:51:11 -070096 const SkImage* bmps[] = { fSolidImg.get(), fTransparentImg.get() };
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000097
bsalomon@google.com12820092012-10-16 17:50:48 +000098 for (size_t i = 0; i < SK_ARRAY_COUNT(bmps); ++i) {
bsalomon@google.com12820092012-10-16 17:50:48 +000099 matrix.setIdentity();
reed56179002015-07-07 06:11:19 -0700100 set_color_matrix(&paint, matrix);
101 canvas->drawImage(bmps[i], 0, 0, &paint);
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +0000102
Brian Osmane36d0302019-11-01 17:10:28 -0400103 ///////////////////////////////////////////////
104
105 matrix.setSaturation(0.0f);
reed56179002015-07-07 06:11:19 -0700106 set_color_matrix(&paint, matrix);
107 canvas->drawImage(bmps[i], 80, 0, &paint);
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +0000108
Brian Osmane36d0302019-11-01 17:10:28 -0400109 matrix.setSaturation(0.5f);
reed56179002015-07-07 06:11:19 -0700110 set_color_matrix(&paint, matrix);
111 canvas->drawImage(bmps[i], 160, 0, &paint);
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +0000112
commit-bot@chromium.org4b413c82013-11-25 19:44:07 +0000113 matrix.setSaturation(1.0f);
reed56179002015-07-07 06:11:19 -0700114 set_color_matrix(&paint, matrix);
Brian Osmane36d0302019-11-01 17:10:28 -0400115 canvas->drawImage(bmps[i], 240, 0, &paint);
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +0000116
commit-bot@chromium.org4b413c82013-11-25 19:44:07 +0000117 matrix.setSaturation(2.0f);
reed56179002015-07-07 06:11:19 -0700118 set_color_matrix(&paint, matrix);
Brian Osmane36d0302019-11-01 17:10:28 -0400119 canvas->drawImage(bmps[i], 320, 0, &paint);
senorblanco@chromium.orgb3a39b52012-01-05 18:28:56 +0000120
Brian Osmane36d0302019-11-01 17:10:28 -0400121 ///////////////////////////////////////////////
bsalomon@google.com12820092012-10-16 17:50:48 +0000122
bsalomon@google.com12820092012-10-16 17:50:48 +0000123 // Move red into alpha, set color to white
Mike Reede869a1e2019-04-30 12:18:54 -0400124 float data[20] = {
125 0, 0, 0, 0, 1,
126 0, 0, 0, 0, 1,
127 0, 0, 0, 0, 1,
128 1, 0, 0, 0, 0,
bsalomon@google.com12820092012-10-16 17:50:48 +0000129 };
130
reed56179002015-07-07 06:11:19 -0700131 set_array(&paint, data);
Brian Osmane36d0302019-11-01 17:10:28 -0400132 canvas->drawImage(bmps[i], 400, 0, &paint);
reed56179002015-07-07 06:11:19 -0700133 ///////////////////////////////////////////////
Brian Osmane36d0302019-11-01 17:10:28 -0400134 canvas->translate(0, 80);
bsalomon@google.com12820092012-10-16 17:50:48 +0000135 }
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +0000136 }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000137
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +0000138private:
reed9ce9d672016-03-17 10:51:11 -0700139 sk_sp<SkImage> fSolidImg;
140 sk_sp<SkImage> fTransparentImg;
reed56179002015-07-07 06:11:19 -0700141
142 typedef skiagm::GM INHERITED;
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +0000143};
reed56179002015-07-07 06:11:19 -0700144DEF_GM( return new ColorMatrixGM; )