2 * Copyright 2013 Google Inc.
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
10 #include "SkXfermode.h"
11 #include "SkColorPriv.h"
15 class Xfermodes2GM : public GM {
20 SkString onShortName() override {
21 return SkString("xfermodes2");
24 SkISize onISize() override {
25 return SkISize::Make(455, 475);
28 void onDraw(SkCanvas* canvas) override {
29 canvas->translate(SkIntToScalar(10), SkIntToScalar(20));
31 const SkScalar w = SkIntToScalar(kSize);
32 const SkScalar h = SkIntToScalar(kSize);
35 labelP.setAntiAlias(true);
36 sk_tool_utils::set_portable_typeface(&labelP);
37 labelP.setTextAlign(SkPaint::kCenter_Align);
41 SkScalar x = 0, y = 0;
42 for (size_t m = 0; m <= SkXfermode::kLastMode; m++) {
43 SkBlendMode mode = static_cast<SkBlendMode>(m);
47 canvas->translate(x, y);
49 p.setAntiAlias(false);
50 p.setStyle(SkPaint::kFill_Style);
52 SkRect r = SkRect::MakeWH(w, h);
53 canvas->drawRect(r, p);
55 canvas->saveLayer(&r, nullptr);
58 canvas->drawRect(r, p);
61 canvas->drawRect(r, p);
65 r.inset(-SK_ScalarHalf, -SK_ScalarHalf);
66 p.setStyle(SkPaint::kStroke_Style);
68 p.setBlendMode(SkBlendMode::kSrcOver);
69 canvas->drawRect(r, p);
74 canvas->drawText(SkXfermode::ModeName(mode), strlen(SkXfermode::ModeName(mode)),
75 x + w/2, y - labelP.getTextSize()/2, labelP);
77 x += w + SkIntToScalar(10);
78 if ((m % W) == W - 1) {
80 y += h + SkIntToScalar(30);
86 void onOnceBeforeDraw() override {
87 const uint32_t kCheckData[] = {
88 SkPackARGB32(0xFF, 0x42, 0x41, 0x42),
89 SkPackARGB32(0xFF, 0xD6, 0xD3, 0xD6),
90 SkPackARGB32(0xFF, 0xD6, 0xD3, 0xD6),
91 SkPackARGB32(0xFF, 0x42, 0x41, 0x42)
94 bg.allocN32Pixels(2, 2, true);
95 memcpy(bg.getPixels(), kCheckData, sizeof(kCheckData));
98 lm.setScale(SkIntToScalar(16), SkIntToScalar(16));
99 fBG = SkShader::MakeBitmapShader(bg, SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode,
103 srcBmp.allocN32Pixels(kSize, kSize);
104 SkPMColor* pixels = reinterpret_cast<SkPMColor*>(srcBmp.getPixels());
106 for (int y = 0; y < kSize; ++y) {
107 int c = y * (1 << kShift);
108 SkPMColor rowColor = SkPackARGB32(c, c, 0, c/2);
109 for (int x = 0; x < kSize; ++x) {
110 pixels[kSize * y + x] = rowColor;
113 fSrc = SkShader::MakeBitmapShader(srcBmp, SkShader::kClamp_TileMode,
114 SkShader::kClamp_TileMode);
116 dstBmp.allocN32Pixels(kSize, kSize);
117 pixels = reinterpret_cast<SkPMColor*>(dstBmp.getPixels());
119 for (int x = 0; x < kSize; ++x) {
120 int c = x * (1 << kShift);
121 SkPMColor colColor = SkPackARGB32(c, 0, c, c/2);
122 for (int y = 0; y < kSize; ++y) {
123 pixels[kSize * y + x] = colColor;
126 fDst = SkShader::MakeBitmapShader(dstBmp, SkShader::kClamp_TileMode,
127 SkShader::kClamp_TileMode);
132 kSize = 256 >> kShift,
136 sk_sp<SkShader> fSrc;
137 sk_sp<SkShader> fDst;
139 typedef GM INHERITED;
142 //////////////////////////////////////////////////////////////////////////////
144 static GM* MyFactory(void*) { return new Xfermodes2GM; }
145 static GMRegistry reg(MyFactory);