blob: 058d824041acedb458ed75dea27f66e98bdb1b61 [file] [log] [blame]
bsalomon@google.coma3108262011-10-10 14:08:47 +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"
9#include "SkCanvas.h"
10#include "SkColorPriv.h"
11#include "SkShader.h"
12
reed@google.com76166152011-11-14 13:14:58 +000013static void test4(SkCanvas* canvas) {
14 SkPaint paint;
15 paint.setAntiAlias(true);
16 SkPoint pts[] = {
17 {10, 160}, {610, 160},
18 {610, 160}, {10, 160},
19
20 {610, 160}, {610, 160},
21 {610, 199}, {610, 199},
22
23 {10, 198}, {610, 198},
24 {610, 199}, {10, 199},
25
26 {10, 160}, {10, 160},
27 {10, 199}, {10, 199}
28 };
29 char verbs[] = {
30 0, 1, 1, 1, 4,
31 0, 1, 1, 1, 4,
32 0, 1, 1, 1, 4,
33 0, 1, 1, 1, 4
34 };
35 SkPath path;
36 SkPoint* ptPtr = pts;
37 for (int i = 0; i < sizeof(verbs); ++i) {
38 switch ((SkPath::Verb) verbs[i]) {
39 case SkPath::kMove_Verb:
40 path.moveTo(ptPtr->fX, ptPtr->fY);
41 ++ptPtr;
42 break;
43 case SkPath::kLine_Verb:
44 path.lineTo(ptPtr->fX, ptPtr->fY);
45 ++ptPtr;
46 break;
47 case SkPath::kClose_Verb:
48 path.close();
49 break;
50 }
51 }
52 SkRect clip = {0, 130, 772, 531};
53 canvas->clipRect(clip);
54 canvas->drawPath(path, paint);
55}
56
bsalomon@google.coma3108262011-10-10 14:08:47 +000057static SkCanvas* create_canvas(int w, int h) {
58 SkBitmap bm;
59 bm.setConfig(SkBitmap::kARGB_8888_Config, w, h);
60 bm.allocPixels();
61 bm.eraseColor(0);
62 return new SkCanvas(bm);
63}
64
65static const SkBitmap& extract_bitmap(SkCanvas* canvas) {
66 return canvas->getDevice()->accessBitmap(false);
67}
68
69static const struct {
70 SkXfermode::Mode fMode;
71 const char* fLabel;
72} gModes[] = {
73 { SkXfermode::kClear_Mode, "Clear" },
74 { SkXfermode::kSrc_Mode, "Src" },
75 { SkXfermode::kDst_Mode, "Dst" },
76 { SkXfermode::kSrcOver_Mode, "SrcOver" },
77 { SkXfermode::kDstOver_Mode, "DstOver" },
78 { SkXfermode::kSrcIn_Mode, "SrcIn" },
79 { SkXfermode::kDstIn_Mode, "DstIn" },
80 { SkXfermode::kSrcOut_Mode, "SrcOut" },
81 { SkXfermode::kDstOut_Mode, "DstOut" },
82 { SkXfermode::kSrcATop_Mode, "SrcATop" },
83 { SkXfermode::kDstATop_Mode, "DstATop" },
84 { SkXfermode::kXor_Mode, "Xor" },
85};
86
87const int gWidth = 64;
88const int gHeight = 64;
89const SkScalar W = SkIntToScalar(gWidth);
90const SkScalar H = SkIntToScalar(gHeight);
91
92static SkScalar drawCell(SkCanvas* canvas, SkXfermode* mode,
93 SkAlpha a0, SkAlpha a1) {
94
95 SkPaint paint;
96 paint.setAntiAlias(true);
97
98 SkRect r = SkRect::MakeWH(W, H);
99 r.inset(W/10, H/10);
100
101 paint.setColor(SK_ColorBLUE);
102 paint.setAlpha(a0);
103 canvas->drawOval(r, paint);
104
105 paint.setColor(SK_ColorRED);
106 paint.setAlpha(a1);
107 paint.setXfermode(mode);
108
109 SkScalar offset = SK_Scalar1 / 3;
110 SkRect rect = SkRect::MakeXYWH(W / 4 + offset,
111 H / 4 + offset,
112 W / 2, H / 2);
113 canvas->drawRect(rect, paint);
114
115 return H;
116}
117
118static SkShader* make_bg_shader() {
119 SkBitmap bm;
120 bm.setConfig(SkBitmap::kARGB_8888_Config, 2, 2);
121 bm.allocPixels();
122 *bm.getAddr32(0, 0) = *bm.getAddr32(1, 1) = 0xFFFFFFFF;
123 *bm.getAddr32(1, 0) = *bm.getAddr32(0, 1) = SkPackARGB32(0xFF, 0xCC,
124 0xCC, 0xCC);
125
126 SkShader* s = SkShader::CreateBitmapShader(bm,
127 SkShader::kRepeat_TileMode,
128 SkShader::kRepeat_TileMode);
129
130 SkMatrix m;
131 m.setScale(SkIntToScalar(6), SkIntToScalar(6));
132 s->setLocalMatrix(m);
133 return s;
134}
135
136namespace skiagm {
137
138 class AARectModesGM : public GM {
139 SkPaint fBGPaint;
140 public:
141 AARectModesGM () {
142 fBGPaint.setShader(make_bg_shader())->unref();
143 }
144
145 protected:
146
147 virtual SkString onShortName() {
148 return SkString("aarectmodes");
149 }
150
151 virtual SkISize onISize() { return make_isize(640, 480); }
152
153 virtual void onDraw(SkCanvas* canvas) {
reed@google.com76166152011-11-14 13:14:58 +0000154// test4(canvas);
bsalomon@google.coma3108262011-10-10 14:08:47 +0000155 const SkRect bounds = SkRect::MakeWH(W, H);
156 static const SkAlpha gAlphaValue[] = { 0xFF, 0x88, 0x88 };
157
158 canvas->translate(SkIntToScalar(4), SkIntToScalar(4));
159
160 for (int alpha = 0; alpha < 4; ++alpha) {
161 canvas->save();
162 canvas->save();
163 for (size_t i = 0; i < SK_ARRAY_COUNT(gModes); ++i) {
164 if (6 == i) {
165 canvas->restore();
166 canvas->translate(W * 5, 0);
167 canvas->save();
168 }
169 SkXfermode* mode = SkXfermode::Create(gModes[i].fMode);
170
171 canvas->drawRect(bounds, fBGPaint);
172 canvas->saveLayer(&bounds, NULL);
173 SkScalar dy = drawCell(canvas, mode,
174 gAlphaValue[alpha & 1],
175 gAlphaValue[alpha & 2]);
176 canvas->restore();
177
178 canvas->translate(0, dy * 5 / 4);
179 SkSafeUnref(mode);
180 }
181 canvas->restore();
182 canvas->restore();
183 canvas->translate(W * 5 / 4, 0);
184 }
185 }
186
187 // disable pdf for now, since it crashes on mac
188 virtual uint32_t onGetFlags() const { return kSkipPDF_Flag; }
189
190 private:
191 typedef GM INHERITED;
192 };
193
194//////////////////////////////////////////////////////////////////////////////
195
196 static GM* MyFactory(void*) { return new AARectModesGM; }
197 static GMRegistry reg(MyFactory);
198
199}
200