OLD | NEW |
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" |
11 #include "SkXfermode.h" | 11 #include "SkXfermode.h" |
12 | 12 |
13 namespace skiagm { | 13 namespace skiagm { |
14 | 14 |
15 static void make_bitmaps(int w, int h, SkBitmap* src, SkBitmap* dst) { | 15 static void make_bitmaps(int w, int h, SkBitmap* src, SkBitmap* dst, |
| 16 SkBitmap* transparent) { |
16 src->setConfig(SkBitmap::kARGB_8888_Config, w, h); | 17 src->setConfig(SkBitmap::kARGB_8888_Config, w, h); |
17 src->allocPixels(); | 18 src->allocPixels(); |
18 src->eraseColor(SK_ColorTRANSPARENT); | 19 src->eraseColor(SK_ColorTRANSPARENT); |
19 | 20 |
20 SkPaint p; | 21 SkPaint p; |
21 p.setAntiAlias(true); | 22 p.setAntiAlias(true); |
22 | 23 |
23 SkRect r; | 24 SkRect r; |
24 SkScalar ww = SkIntToScalar(w); | 25 SkScalar ww = SkIntToScalar(w); |
25 SkScalar hh = SkIntToScalar(h); | 26 SkScalar hh = SkIntToScalar(h); |
26 | 27 |
27 { | 28 { |
28 SkCanvas c(*src); | 29 SkCanvas c(*src); |
29 p.setColor(0xFFFFCC44); | 30 p.setColor(0xFFFFCC44); |
30 r.set(0, 0, ww*3/4, hh*3/4); | 31 r.set(0, 0, ww*3/4, hh*3/4); |
31 c.drawOval(r, p); | 32 c.drawOval(r, p); |
32 } | 33 } |
33 | 34 |
34 dst->setConfig(SkBitmap::kARGB_8888_Config, w, h); | 35 dst->setConfig(SkBitmap::kARGB_8888_Config, w, h); |
35 dst->allocPixels(); | 36 dst->allocPixels(); |
36 dst->eraseColor(SK_ColorTRANSPARENT); | 37 dst->eraseColor(SK_ColorTRANSPARENT); |
37 | 38 |
38 { | 39 { |
39 SkCanvas c(*dst); | 40 SkCanvas c(*dst); |
40 p.setColor(0xFF66AAFF); | 41 p.setColor(0xFF66AAFF); |
41 r.set(ww/3, hh/3, ww*19/20, hh*19/20); | 42 r.set(ww/3, hh/3, ww*19/20, hh*19/20); |
42 c.drawRect(r, p); | 43 c.drawRect(r, p); |
43 } | 44 } |
| 45 |
| 46 transparent->setConfig(SkBitmap::kARGB_8888_Config, w, h); |
| 47 transparent->allocPixels(); |
| 48 transparent->eraseColor(SK_ColorTRANSPARENT); |
44 } | 49 } |
45 | 50 |
46 static uint16_t gData[] = { 0xFFFF, 0xCCCF, 0xCCCF, 0xFFFF }; | 51 static uint16_t gData[] = { 0xFFFF, 0xCCCF, 0xCCCF, 0xFFFF }; |
47 | 52 |
48 class XfermodesGM : public GM { | 53 class XfermodesGM : public GM { |
49 enum SrcType { | 54 enum SrcType { |
50 //! A WxH image with a rectangle in the lower right. | 55 //! A WxH image with a rectangle in the lower right. |
51 kRectangleImage_SrcType = 0x01, | 56 kRectangleImage_SrcType = 0x01, |
52 //! kRectangleImage_SrcType with an alpha of 34.5%. | 57 //! kRectangleImage_SrcType with an alpha of 34.5%. |
53 kRectangleImageWithAlpha_SrcType = 0x02, | 58 kRectangleImageWithAlpha_SrcType = 0x02, |
54 //! kRectnagleImageWithAlpha_SrcType scaled down by half. | 59 //! kRectnagleImageWithAlpha_SrcType scaled down by half. |
55 kSmallRectangleImageWithAlpha_SrcType = 0x04, | 60 kSmallRectangleImageWithAlpha_SrcType = 0x04, |
56 //! kRectangleImage_SrcType drawn directly instead in an image. | 61 //! kRectangleImage_SrcType drawn directly instead in an image. |
57 kRectangle_SrcType = 0x08, | 62 kRectangle_SrcType = 0x08, |
58 //! Two rectangles, first on the right half, second on the bottom half. | 63 //! Two rectangles, first on the right half, second on the bottom half. |
59 kQuarterClear_SrcType = 0x10, | 64 kQuarterClear_SrcType = 0x10, |
60 //! kQuarterClear_SrcType in a layer. | 65 //! kQuarterClear_SrcType in a layer. |
61 kQuarterClearInLayer_SrcType = 0x20, | 66 kQuarterClearInLayer_SrcType = 0x20, |
| 67 //! A W/2xH/2 transparent image. |
| 68 kSmallTransparentImage_SrcType = 0x40, |
62 | 69 |
63 kAll_SrcType = 0x3F, //!< All the source types. | 70 kAll_SrcType = 0x7F, //!< All the source types. |
64 kBasic_SrcType = 0x03, //!< Just basic source types. | 71 kBasic_SrcType = 0x03, //!< Just basic source types. |
65 }; | 72 }; |
66 | 73 |
67 SkBitmap fBG; | 74 SkBitmap fBG; |
68 SkBitmap fSrcB, fDstB; | 75 SkBitmap fSrcB, fDstB, fTransparent; |
69 | 76 |
70 /* The srcType argument indicates what to draw for the source part. Skia | 77 /* The srcType argument indicates what to draw for the source part. Skia |
71 * uses the implied shape of the drawing command and these modes | 78 * uses the implied shape of the drawing command and these modes |
72 * demonstrate that. | 79 * demonstrate that. |
73 */ | 80 */ |
74 void draw_mode(SkCanvas* canvas, SkXfermode* mode, SrcType srcType, | 81 void draw_mode(SkCanvas* canvas, SkXfermode* mode, SrcType srcType, |
75 SkScalar x, SkScalar y) { | 82 SkScalar x, SkScalar y) { |
76 SkPaint p; | 83 SkPaint p; |
77 SkMatrix m; | 84 SkMatrix m; |
78 bool restoreNeeded = false; | 85 bool restoreNeeded = false; |
79 m.setTranslate(x, y); | 86 m.setTranslate(x, y); |
80 | 87 |
81 canvas->drawBitmapMatrix(fSrcB, m, &p); | 88 canvas->drawBitmapMatrix(fSrcB, m, &p); |
82 p.setXfermode(mode); | 89 p.setXfermode(mode); |
83 switch (srcType) { | 90 switch (srcType) { |
| 91 case kSmallTransparentImage_SrcType: |
| 92 m.postScale(SK_ScalarHalf, SK_ScalarHalf, x, y); |
| 93 canvas->drawBitmapMatrix(fTransparent, m, &p); |
| 94 break; |
84 case kQuarterClearInLayer_SrcType: { | 95 case kQuarterClearInLayer_SrcType: { |
85 SkRect bounds = SkRect::MakeXYWH(x, y, SkIntToScalar(W), | 96 SkRect bounds = SkRect::MakeXYWH(x, y, SkIntToScalar(W), |
86 SkIntToScalar(H)); | 97 SkIntToScalar(H)); |
87 canvas->saveLayer(&bounds, &p); | 98 canvas->saveLayer(&bounds, &p); |
88 restoreNeeded = true; | 99 restoreNeeded = true; |
89 p.setXfermodeMode(SkXfermode::kSrcOver_Mode); | 100 p.setXfermodeMode(SkXfermode::kSrcOver_Mode); |
90 // Fall through. | 101 // Fall through. |
91 } | 102 } |
92 case kQuarterClear_SrcType: { | 103 case kQuarterClear_SrcType: { |
93 SkScalar halfW = SkIntToScalar(W) / 2; | 104 SkScalar halfW = SkIntToScalar(W) / 2; |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
125 | 136 |
126 if (restoreNeeded) { | 137 if (restoreNeeded) { |
127 canvas->restore(); | 138 canvas->restore(); |
128 } | 139 } |
129 } | 140 } |
130 | 141 |
131 virtual void onOnceBeforeDraw() SK_OVERRIDE { | 142 virtual void onOnceBeforeDraw() SK_OVERRIDE { |
132 fBG.setConfig(SkBitmap::kARGB_4444_Config, 2, 2, 4, kOpaque_SkAlphaType)
; | 143 fBG.setConfig(SkBitmap::kARGB_4444_Config, 2, 2, 4, kOpaque_SkAlphaType)
; |
133 fBG.setPixels(gData); | 144 fBG.setPixels(gData); |
134 | 145 |
135 make_bitmaps(W, H, &fSrcB, &fDstB); | 146 make_bitmaps(W, H, &fSrcB, &fDstB, &fTransparent); |
136 } | 147 } |
137 | 148 |
138 public: | 149 public: |
139 const static int W = 64; | 150 const static int W = 64; |
140 const static int H = 64; | 151 const static int H = 64; |
141 XfermodesGM() {} | 152 XfermodesGM() {} |
142 | 153 |
143 protected: | 154 protected: |
144 virtual SkString onShortName() { | 155 virtual SkString onShortName() { |
145 return SkString("xfermodes"); | 156 return SkString("xfermodes"); |
146 } | 157 } |
147 | 158 |
148 virtual SkISize onISize() { | 159 virtual SkISize onISize() { |
149 return make_isize(1590, 640); | 160 return make_isize(1990, 640); |
150 } | 161 } |
151 | 162 |
152 virtual void onDraw(SkCanvas* canvas) { | 163 virtual void onDraw(SkCanvas* canvas) { |
153 canvas->translate(SkIntToScalar(10), SkIntToScalar(20)); | 164 canvas->translate(SkIntToScalar(10), SkIntToScalar(20)); |
154 | 165 |
155 const struct { | 166 const struct { |
156 SkXfermode::Mode fMode; | 167 SkXfermode::Mode fMode; |
157 const char* fLabel; | 168 const char* fLabel; |
158 int fSourceTypeMask; // The source types to use this | 169 int fSourceTypeMask; // The source types to use this |
159 // mode with. See draw_mode for | 170 // mode with. See draw_mode for |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
263 private: | 274 private: |
264 typedef GM INHERITED; | 275 typedef GM INHERITED; |
265 }; | 276 }; |
266 | 277 |
267 ////////////////////////////////////////////////////////////////////////////// | 278 ////////////////////////////////////////////////////////////////////////////// |
268 | 279 |
269 static GM* MyFactory(void*) { return new XfermodesGM; } | 280 static GM* MyFactory(void*) { return new XfermodesGM; } |
270 static GMRegistry reg(MyFactory); | 281 static GMRegistry reg(MyFactory); |
271 | 282 |
272 } | 283 } |
OLD | NEW |