Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(732)

Side by Side Diff: gm/xfermodes.cpp

Issue 42473002: Resubmit r1705: "Add additional source types to xfer mode test." (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: ignore for rebaseline Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « expectations/gm/ignored-tests.txt ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 1
2 /* 2 /*
3 * Copyright 2011 Google Inc. 3 * Copyright 2011 Google Inc.
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 #include "gm.h" 8 #include "gm.h"
9 #include "SkBitmap.h" 9 #include "SkBitmap.h"
10 #include "SkShader.h" 10 #include "SkShader.h"
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
42 c.drawRect(r, p); 42 c.drawRect(r, p);
43 } 43 }
44 } 44 }
45 45
46 static uint16_t gData[] = { 0xFFFF, 0xCCCF, 0xCCCF, 0xFFFF }; 46 static uint16_t gData[] = { 0xFFFF, 0xCCCF, 0xCCCF, 0xFFFF };
47 47
48 class XfermodesGM : public GM { 48 class XfermodesGM : public GM {
49 SkBitmap fBG; 49 SkBitmap fBG;
50 SkBitmap fSrcB, fDstB; 50 SkBitmap fSrcB, fDstB;
51 51
52 void draw_mode(SkCanvas* canvas, SkXfermode* mode, int alpha, 52 /* The sourceType argument indicates what to draw for the source part. Skia
53 * uses the implied shape of the drawing command and these modes
54 * demonstrate that.
55 *
56 * 0x01: A WxH image with a rectangle in the lower right.
57 * 0x02: Same as 0x01, but with an alpha of 34.5%.
58 * 0x04: Same as 0x02, but scaled down by half.
59 * 0x08: The same rectangle as 0x01, but drawn directly instead in an image.
60 * 0x10: Two rectangles, first on the right half, second on the bottom half.
61 * 0x20: Same as 0x10, but on a layer.
62 */
63 void draw_mode(SkCanvas* canvas, SkXfermode* mode, int sourceType,
53 SkScalar x, SkScalar y) { 64 SkScalar x, SkScalar y) {
54 SkPaint p; 65 SkPaint p;
66 SkMatrix m;
67 bool restoreNeeded = false;
68 m.setTranslate(x, y);
55 69
56 canvas->drawBitmap(fSrcB, x, y, &p); 70 canvas->drawBitmapMatrix(fSrcB, m, &p);
57 p.setAlpha(alpha);
58 p.setXfermode(mode); 71 p.setXfermode(mode);
59 canvas->drawBitmap(fDstB, x, y, &p); 72 switch (sourceType) {
73 case 0x20: {
74 SkRect bounds = SkRect::MakeXYWH(x, y, W, H);
75 canvas->saveLayer(&bounds, &p);
76 restoreNeeded = true;
77 p.setXfermodeMode(SkXfermode::kSrcOver_Mode);
78 // Fall through.
79 }
80 case 0x10: {
81 SkScalar halfW = SkIntToScalar(W) / 2;
82 SkScalar halfH = SkIntToScalar(H) / 2;
83 p.setColor(0xFF66AAFF);
84 SkRect r = SkRect::MakeXYWH(x + halfW, y, halfW, H);
85 canvas->drawRect(r, p);
86 p.setColor(0xFFAA66FF);
87 r = SkRect::MakeXYWH(x, y + halfH, W, halfH);
88 canvas->drawRect(r, p);
89 break;
90 }
91 case 0x8: {
92 SkScalar w = SkIntToScalar(W);
93 SkScalar h = SkIntToScalar(H);
94 SkRect r = SkRect::MakeXYWH(x + w / 3, y + h / 3,
95 w * 37 / 60, h * 37 / 60);
96 p.setColor(0xFF66AAFF);
97 canvas->drawRect(r, p);
98 break;
99 }
100 case 0x4:
101 m.postScale(SK_ScalarHalf, SK_ScalarHalf, x, y);
102 // Fall through.
103 case 0x2:
104 p.setAlpha(0x88);
105 // Fall through.
106 case 0x1:
107 canvas->drawBitmapMatrix(fDstB, m, &p);
108 break;
109 default:
110 break;
111 }
112
113 if (restoreNeeded) {
114 canvas->restore();
115 }
60 } 116 }
61 117
62 virtual void onOnceBeforeDraw() SK_OVERRIDE { 118 virtual void onOnceBeforeDraw() SK_OVERRIDE {
63 fBG.setConfig(SkBitmap::kARGB_4444_Config, 2, 2, 4, kOpaque_SkAlphaType) ; 119 fBG.setConfig(SkBitmap::kARGB_4444_Config, 2, 2, 4, kOpaque_SkAlphaType) ;
64 fBG.setPixels(gData); 120 fBG.setPixels(gData);
65 121
66 make_bitmaps(W, H, &fSrcB, &fDstB); 122 make_bitmaps(W, H, &fSrcB, &fDstB);
67 } 123 }
68 124
69 public: 125 public:
70 const static int W = 64; 126 const static int W = 64;
71 const static int H = 64; 127 const static int H = 64;
72 XfermodesGM() {} 128 XfermodesGM() {}
73 129
74 protected: 130 protected:
75 virtual SkString onShortName() { 131 virtual SkString onShortName() {
76 return SkString("xfermodes"); 132 return SkString("xfermodes");
77 } 133 }
78 134
79 virtual SkISize onISize() { 135 virtual SkISize onISize() {
80 return make_isize(790, 640); 136 return make_isize(1590, 640);
81 } 137 }
82 138
83 virtual void onDraw(SkCanvas* canvas) { 139 virtual void onDraw(SkCanvas* canvas) {
84 canvas->translate(SkIntToScalar(10), SkIntToScalar(20)); 140 canvas->translate(SkIntToScalar(10), SkIntToScalar(20));
85 141
142 const int kMaxSourceType = 0x20;
86 const struct { 143 const struct {
87 SkXfermode::Mode fMode; 144 SkXfermode::Mode fMode;
88 const char* fLabel; 145 const char* fLabel;
146 int fSourceTypeMask; // The source types to use this
147 // mode with. See draw_mode for
148 // an explanation of each type.
149 // PDF has to play some tricks
150 // to support the base modes,
151 // test those more extensively.
89 } gModes[] = { 152 } gModes[] = {
90 { SkXfermode::kClear_Mode, "Clear" }, 153 { SkXfermode::kClear_Mode, "Clear", 0x3F },
91 { SkXfermode::kSrc_Mode, "Src" }, 154 { SkXfermode::kSrc_Mode, "Src", 0x3F },
92 { SkXfermode::kDst_Mode, "Dst" }, 155 { SkXfermode::kDst_Mode, "Dst", 0x3F },
93 { SkXfermode::kSrcOver_Mode, "SrcOver" }, 156 { SkXfermode::kSrcOver_Mode, "SrcOver", 0x3F },
94 { SkXfermode::kDstOver_Mode, "DstOver" }, 157 { SkXfermode::kDstOver_Mode, "DstOver", 0x3F },
95 { SkXfermode::kSrcIn_Mode, "SrcIn" }, 158 { SkXfermode::kSrcIn_Mode, "SrcIn", 0x3F },
96 { SkXfermode::kDstIn_Mode, "DstIn" }, 159 { SkXfermode::kDstIn_Mode, "DstIn", 0x3F },
97 { SkXfermode::kSrcOut_Mode, "SrcOut" }, 160 { SkXfermode::kSrcOut_Mode, "SrcOut", 0x3F },
98 { SkXfermode::kDstOut_Mode, "DstOut" }, 161 { SkXfermode::kDstOut_Mode, "DstOut", 0x3F },
99 { SkXfermode::kSrcATop_Mode, "SrcATop" }, 162 { SkXfermode::kSrcATop_Mode, "SrcATop", 0x3F },
100 { SkXfermode::kDstATop_Mode, "DstATop" }, 163 { SkXfermode::kDstATop_Mode, "DstATop", 0x3F },
101 { SkXfermode::kXor_Mode, "Xor" },
102 164
103 { SkXfermode::kPlus_Mode, "Plus" }, 165 { SkXfermode::kXor_Mode, "Xor", 0x03 },
104 { SkXfermode::kModulate_Mode, "Modulate" }, 166 { SkXfermode::kPlus_Mode, "Plus", 0x03 },
105 { SkXfermode::kScreen_Mode, "Screen" }, 167 { SkXfermode::kModulate_Mode, "Modulate", 0x3F },
106 { SkXfermode::kOverlay_Mode, "Overlay" }, 168 { SkXfermode::kScreen_Mode, "Screen", 0x03 },
107 { SkXfermode::kDarken_Mode, "Darken" }, 169 { SkXfermode::kOverlay_Mode, "Overlay", 0x03 },
108 { SkXfermode::kLighten_Mode, "Lighten" }, 170 { SkXfermode::kDarken_Mode, "Darken", 0x03 },
109 { SkXfermode::kColorDodge_Mode, "ColorDodge" }, 171 { SkXfermode::kLighten_Mode, "Lighten", 0x03 },
110 { SkXfermode::kColorBurn_Mode, "ColorBurn" }, 172 { SkXfermode::kColorDodge_Mode, "ColorDodge", 0x03 },
111 { SkXfermode::kHardLight_Mode, "HardLight" }, 173 { SkXfermode::kColorBurn_Mode, "ColorBurn", 0x03 },
112 { SkXfermode::kSoftLight_Mode, "SoftLight" }, 174 { SkXfermode::kHardLight_Mode, "HardLight", 0x03 },
113 { SkXfermode::kDifference_Mode, "Difference" }, 175 { SkXfermode::kSoftLight_Mode, "SoftLight", 0x03 },
114 { SkXfermode::kExclusion_Mode, "Exclusion" }, 176 { SkXfermode::kDifference_Mode, "Difference", 0x03 },
115 { SkXfermode::kMultiply_Mode, "Multiply" }, 177 { SkXfermode::kExclusion_Mode, "Exclusion", 0x03 },
116 { SkXfermode::kHue_Mode, "Hue" }, 178 { SkXfermode::kMultiply_Mode, "Multiply", 0x03 },
117 { SkXfermode::kSaturation_Mode, "Saturation" }, 179 { SkXfermode::kHue_Mode, "Hue", 0x03 },
118 { SkXfermode::kColor_Mode, "Color" }, 180 { SkXfermode::kSaturation_Mode, "Saturation", 0x03 },
119 { SkXfermode::kLuminosity_Mode, "Luminosity" }, 181 { SkXfermode::kColor_Mode, "Color", 0x03 },
182 { SkXfermode::kLuminosity_Mode, "Luminosity", 0x03 },
120 }; 183 };
121 184
122 const SkScalar w = SkIntToScalar(W); 185 const SkScalar w = SkIntToScalar(W);
123 const SkScalar h = SkIntToScalar(H); 186 const SkScalar h = SkIntToScalar(H);
124 SkShader* s = SkShader::CreateBitmapShader(fBG, 187 SkShader* s = SkShader::CreateBitmapShader(fBG,
125 SkShader::kRepeat_TileMode, 188 SkShader::kRepeat_TileMode,
126 SkShader::kRepeat_TileMode); 189 SkShader::kRepeat_TileMode);
127 SkMatrix m; 190 SkMatrix m;
128 m.setScale(SkIntToScalar(6), SkIntToScalar(6)); 191 m.setScale(SkIntToScalar(6), SkIntToScalar(6));
129 s->setLocalMatrix(m); 192 s->setLocalMatrix(m);
130 193
131 SkPaint labelP; 194 SkPaint labelP;
132 labelP.setAntiAlias(true); 195 labelP.setAntiAlias(true);
133 labelP.setTextAlign(SkPaint::kCenter_Align); 196 labelP.setTextAlign(SkPaint::kCenter_Align);
134 197
135 const int W = 5; 198 const int W = 5;
136 199
137 SkScalar x0 = 0; 200 SkScalar x0 = 0;
138 for (int twice = 0; twice < 2; twice++) { 201 SkScalar y0 = 0;
139 SkScalar x = x0, y = 0; 202 for (int sourceType = 1; sourceType <= kMaxSourceType; sourceType *=2) {
203 SkScalar x = x0, y = y0;
140 for (size_t i = 0; i < SK_ARRAY_COUNT(gModes); i++) { 204 for (size_t i = 0; i < SK_ARRAY_COUNT(gModes); i++) {
205 if ((gModes[i].fSourceTypeMask & sourceType) == 0) {
206 continue;
207 }
141 SkXfermode* mode = SkXfermode::Create(gModes[i].fMode); 208 SkXfermode* mode = SkXfermode::Create(gModes[i].fMode);
142 SkAutoUnref aur(mode); 209 SkAutoUnref aur(mode);
143 SkRect r; 210 SkRect r;
144 r.set(x, y, x+w, y+h); 211 r.set(x, y, x+w, y+h);
145 212
146 SkPaint p; 213 SkPaint p;
147 p.setStyle(SkPaint::kFill_Style); 214 p.setStyle(SkPaint::kFill_Style);
148 p.setShader(s); 215 p.setShader(s);
149 canvas->drawRect(r, p); 216 canvas->drawRect(r, p);
150 217
151 canvas->saveLayer(&r, NULL, SkCanvas::kARGB_ClipLayer_SaveFlag); 218 canvas->saveLayer(&r, NULL, SkCanvas::kARGB_ClipLayer_SaveFlag);
152 draw_mode(canvas, mode, twice ? 0x88 : 0xFF, r.fLeft, r.fTop); 219 draw_mode(canvas, mode, sourceType, r.fLeft, r.fTop);
153 canvas->restore(); 220 canvas->restore();
154 221
155 r.inset(-SK_ScalarHalf, -SK_ScalarHalf); 222 r.inset(-SK_ScalarHalf, -SK_ScalarHalf);
156 p.setStyle(SkPaint::kStroke_Style); 223 p.setStyle(SkPaint::kStroke_Style);
157 p.setShader(NULL); 224 p.setShader(NULL);
158 canvas->drawRect(r, p); 225 canvas->drawRect(r, p);
159 226
160 #if 1 227 #if 1
161 canvas->drawText(gModes[i].fLabel, strlen(gModes[i].fLabel), 228 canvas->drawText(gModes[i].fLabel, strlen(gModes[i].fLabel),
162 x + w/2, y - labelP.getTextSize()/2, labelP); 229 x + w/2, y - labelP.getTextSize()/2, labelP);
163 #endif 230 #endif
164 x += w + SkIntToScalar(10); 231 x += w + SkIntToScalar(10);
165 if ((i % W) == W - 1) { 232 if ((i % W) == W - 1) {
166 x = x0; 233 x = x0;
167 y += h + SkIntToScalar(30); 234 y += h + SkIntToScalar(30);
168 } 235 }
169 } 236 }
170 x0 += SkIntToScalar(400); 237 if (y < 320) {
238 if (x > x0) {
239 y += h + SkIntToScalar(30);
240 }
241 y0 = y;
242 } else {
243 x0 += SkIntToScalar(400);
244 y0 = 0;
245 }
171 } 246 }
172 s->unref(); 247 s->unref();
173 } 248 }
174 249
175 private: 250 private:
176 typedef GM INHERITED; 251 typedef GM INHERITED;
177 }; 252 };
178 253
179 ////////////////////////////////////////////////////////////////////////////// 254 //////////////////////////////////////////////////////////////////////////////
180 255
181 static GM* MyFactory(void*) { return new XfermodesGM; } 256 static GM* MyFactory(void*) { return new XfermodesGM; }
182 static GMRegistry reg(MyFactory); 257 static GMRegistry reg(MyFactory);
183 258
184 } 259 }
OLDNEW
« no previous file with comments | « expectations/gm/ignored-tests.txt ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698