blob: e5d3b1f3be945eae95c62b8ae5234b000be520c1 [file] [log] [blame]
bsalomon@google.com8c463b02013-04-17 14:19:44 +00001/*
2 * Copyright 2013 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 */
Ben Wagner7fde8e12019-05-01 17:28:53 -04007
Mike Kleinc0bd9f92019-04-23 12:05:21 -05008#include "gm/gm.h"
9#include "include/core/SkBitmap.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -040010#include "include/core/SkBlendMode.h"
11#include "include/core/SkCanvas.h"
12#include "include/core/SkColor.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050013#include "include/core/SkColorPriv.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -040014#include "include/core/SkFont.h"
15#include "include/core/SkMatrix.h"
16#include "include/core/SkPaint.h"
17#include "include/core/SkRect.h"
18#include "include/core/SkRefCnt.h"
19#include "include/core/SkScalar.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050020#include "include/core/SkShader.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -040021#include "include/core/SkSize.h"
22#include "include/core/SkString.h"
23#include "include/core/SkTileMode.h"
24#include "include/core/SkTypeface.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050025#include "include/utils/SkTextUtils.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050026#include "tools/ToolUtils.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -040027#include <stdint.h>
28#include <string.h>
bsalomon@google.com8c463b02013-04-17 14:19:44 +000029
30namespace skiagm {
31
32class Xfermodes2GM : public GM {
33public:
34 Xfermodes2GM() {}
35
36protected:
mtklein36352bf2015-03-25 18:17:31 -070037 SkString onShortName() override {
bsalomon@google.com8c463b02013-04-17 14:19:44 +000038 return SkString("xfermodes2");
39 }
40
mtklein36352bf2015-03-25 18:17:31 -070041 SkISize onISize() override {
tfarinaf5393182014-06-09 23:59:03 -070042 return SkISize::Make(455, 475);
bsalomon@google.com8c463b02013-04-17 14:19:44 +000043 }
44
mtklein36352bf2015-03-25 18:17:31 -070045 void onDraw(SkCanvas* canvas) override {
bsalomon@google.com8c463b02013-04-17 14:19:44 +000046 canvas->translate(SkIntToScalar(10), SkIntToScalar(20));
47
48 const SkScalar w = SkIntToScalar(kSize);
49 const SkScalar h = SkIntToScalar(kSize);
50
Mike Kleinea3f0142019-03-20 11:12:10 -050051 SkFont font(ToolUtils::create_portable_typeface());
bsalomon@google.com8c463b02013-04-17 14:19:44 +000052
53 const int W = 6;
54
55 SkScalar x = 0, y = 0;
Mike Reedd4706732016-11-15 16:44:34 -050056 for (size_t m = 0; m <= (size_t)SkBlendMode::kLastMode; m++) {
reed374772b2016-10-05 17:33:02 -070057 SkBlendMode mode = static_cast<SkBlendMode>(m);
bsalomon@google.com8c463b02013-04-17 14:19:44 +000058
59 canvas->save();
60
61 canvas->translate(x, y);
62 SkPaint p;
63 p.setAntiAlias(false);
64 p.setStyle(SkPaint::kFill_Style);
65 p.setShader(fBG);
66 SkRect r = SkRect::MakeWH(w, h);
67 canvas->drawRect(r, p);
68
halcanary96fcdcc2015-08-27 07:41:13 -070069 canvas->saveLayer(&r, nullptr);
bsalomon@google.com8c463b02013-04-17 14:19:44 +000070
71 p.setShader(fDst);
72 canvas->drawRect(r, p);
73 p.setShader(fSrc);
reed374772b2016-10-05 17:33:02 -070074 p.setBlendMode(mode);
bsalomon@google.com8c463b02013-04-17 14:19:44 +000075 canvas->drawRect(r, p);
76
77 canvas->restore();
78
79 r.inset(-SK_ScalarHalf, -SK_ScalarHalf);
80 p.setStyle(SkPaint::kStroke_Style);
halcanary96fcdcc2015-08-27 07:41:13 -070081 p.setShader(nullptr);
reed374772b2016-10-05 17:33:02 -070082 p.setBlendMode(SkBlendMode::kSrcOver);
bsalomon@google.com8c463b02013-04-17 14:19:44 +000083 canvas->drawRect(r, p);
84
85 canvas->restore();
86
87#if 1
Mike Reedb579f072019-01-03 15:45:53 -050088 SkTextUtils::DrawString(canvas, SkBlendMode_Name(mode), x + w/2, y - font.getSize()/2, font, SkPaint(),
Mike Reed3a42ec02018-10-30 12:53:21 -040089 SkTextUtils::kCenter_Align);
bsalomon@google.com8c463b02013-04-17 14:19:44 +000090#endif
91 x += w + SkIntToScalar(10);
92 if ((m % W) == W - 1) {
93 x = 0;
94 y += h + SkIntToScalar(30);
95 }
96 }
97 }
98
99private:
mtklein36352bf2015-03-25 18:17:31 -0700100 void onOnceBeforeDraw() override {
mtkleindbfd7ab2016-09-01 11:24:54 -0700101 const uint32_t kCheckData[] = {
caryclark4ec1ac62015-07-21 07:42:45 -0700102 SkPackARGB32(0xFF, 0x42, 0x41, 0x42),
103 SkPackARGB32(0xFF, 0xD6, 0xD3, 0xD6),
104 SkPackARGB32(0xFF, 0xD6, 0xD3, 0xD6),
105 SkPackARGB32(0xFF, 0x42, 0x41, 0x42)
bsalomon@google.com8c463b02013-04-17 14:19:44 +0000106 };
107 SkBitmap bg;
reed@google.comeb9a46c2014-01-25 16:46:20 +0000108 bg.allocN32Pixels(2, 2, true);
bsalomon@google.com8c463b02013-04-17 14:19:44 +0000109 memcpy(bg.getPixels(), kCheckData, sizeof(kCheckData));
skia.committer@gmail.comcbbdab52013-04-18 07:01:48 +0000110
bsalomon@google.com8c463b02013-04-17 14:19:44 +0000111 SkMatrix lm;
112 lm.setScale(SkIntToScalar(16), SkIntToScalar(16));
Mike Reed50acf8f2019-04-08 13:20:23 -0400113 fBG = bg.makeShader(SkTileMode::kRepeat, SkTileMode::kRepeat, &lm);
skia.committer@gmail.comcbbdab52013-04-18 07:01:48 +0000114
cdaltond3e91912015-03-30 07:52:57 -0700115 SkBitmap srcBmp;
116 srcBmp.allocN32Pixels(kSize, kSize);
117 SkPMColor* pixels = reinterpret_cast<SkPMColor*>(srcBmp.getPixels());
skia.committer@gmail.comcbbdab52013-04-18 07:01:48 +0000118
bsalomon@google.com8c463b02013-04-17 14:19:44 +0000119 for (int y = 0; y < kSize; ++y) {
120 int c = y * (1 << kShift);
121 SkPMColor rowColor = SkPackARGB32(c, c, 0, c/2);
122 for (int x = 0; x < kSize; ++x) {
123 pixels[kSize * y + x] = rowColor;
124 }
125 }
Mike Reed50acf8f2019-04-08 13:20:23 -0400126 fSrc = srcBmp.makeShader();
cdaltond3e91912015-03-30 07:52:57 -0700127 SkBitmap dstBmp;
128 dstBmp.allocN32Pixels(kSize, kSize);
129 pixels = reinterpret_cast<SkPMColor*>(dstBmp.getPixels());
skia.committer@gmail.comcbbdab52013-04-18 07:01:48 +0000130
bsalomon@google.com8c463b02013-04-17 14:19:44 +0000131 for (int x = 0; x < kSize; ++x) {
132 int c = x * (1 << kShift);
133 SkPMColor colColor = SkPackARGB32(c, 0, c, c/2);
134 for (int y = 0; y < kSize; ++y) {
135 pixels[kSize * y + x] = colColor;
136 }
137 }
Mike Reed50acf8f2019-04-08 13:20:23 -0400138 fDst = dstBmp.makeShader();
bsalomon@google.com8c463b02013-04-17 14:19:44 +0000139 }
skia.committer@gmail.comcbbdab52013-04-18 07:01:48 +0000140
bsalomon@google.com8c463b02013-04-17 14:19:44 +0000141 enum {
142 kShift = 2,
143 kSize = 256 >> kShift,
144 };
skia.committer@gmail.comcbbdab52013-04-18 07:01:48 +0000145
reed1a9b9642016-03-13 14:13:58 -0700146 sk_sp<SkShader> fBG;
147 sk_sp<SkShader> fSrc;
148 sk_sp<SkShader> fDst;
bsalomon@google.com8c463b02013-04-17 14:19:44 +0000149
150 typedef GM INHERITED;
151};
152
153//////////////////////////////////////////////////////////////////////////////
154
Hal Canarye964c182019-01-23 10:22:01 -0500155DEF_GM( return new Xfermodes2GM; )
bsalomon@google.com8c463b02013-04-17 14:19:44 +0000156
157}