aarectmodes.cpp revision a31082685544d0ae4c0b203d7f5ff960640ed8df
1/*
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
13static SkCanvas* create_canvas(int w, int h) {
14    SkBitmap bm;
15    bm.setConfig(SkBitmap::kARGB_8888_Config, w, h);
16    bm.allocPixels();
17    bm.eraseColor(0);
18    return new SkCanvas(bm);
19}
20
21static const SkBitmap& extract_bitmap(SkCanvas* canvas) {
22    return canvas->getDevice()->accessBitmap(false);
23}
24
25static const struct {
26    SkXfermode::Mode  fMode;
27    const char*         fLabel;
28} gModes[] = {
29    { SkXfermode::kClear_Mode,    "Clear"     },
30    { SkXfermode::kSrc_Mode,      "Src"       },
31    { SkXfermode::kDst_Mode,      "Dst"       },
32    { SkXfermode::kSrcOver_Mode,  "SrcOver"   },
33    { SkXfermode::kDstOver_Mode,  "DstOver"   },
34    { SkXfermode::kSrcIn_Mode,    "SrcIn"     },
35    { SkXfermode::kDstIn_Mode,    "DstIn"     },
36    { SkXfermode::kSrcOut_Mode,   "SrcOut"    },
37    { SkXfermode::kDstOut_Mode,   "DstOut"    },
38    { SkXfermode::kSrcATop_Mode,  "SrcATop"   },
39    { SkXfermode::kDstATop_Mode,  "DstATop"   },
40    { SkXfermode::kXor_Mode,      "Xor"       },
41};
42
43const int gWidth = 64;
44const int gHeight = 64;
45const SkScalar W = SkIntToScalar(gWidth);
46const SkScalar H = SkIntToScalar(gHeight);
47
48static SkScalar drawCell(SkCanvas* canvas, SkXfermode* mode,
49                         SkAlpha a0, SkAlpha a1) {
50
51    SkPaint paint;
52    paint.setAntiAlias(true);
53
54    SkRect r = SkRect::MakeWH(W, H);
55    r.inset(W/10, H/10);
56
57    paint.setColor(SK_ColorBLUE);
58    paint.setAlpha(a0);
59    canvas->drawOval(r, paint);
60
61    paint.setColor(SK_ColorRED);
62    paint.setAlpha(a1);
63    paint.setXfermode(mode);
64
65    SkScalar offset = SK_Scalar1 / 3;
66    SkRect rect = SkRect::MakeXYWH(W / 4 + offset,
67                                   H / 4 + offset,
68                                   W / 2, H / 2);
69    canvas->drawRect(rect, paint);
70
71    return H;
72}
73
74static SkShader* make_bg_shader() {
75    SkBitmap bm;
76    bm.setConfig(SkBitmap::kARGB_8888_Config, 2, 2);
77    bm.allocPixels();
78    *bm.getAddr32(0, 0) = *bm.getAddr32(1, 1) = 0xFFFFFFFF;
79    *bm.getAddr32(1, 0) = *bm.getAddr32(0, 1) = SkPackARGB32(0xFF, 0xCC,
80                                                             0xCC, 0xCC);
81
82    SkShader* s = SkShader::CreateBitmapShader(bm,
83                                               SkShader::kRepeat_TileMode,
84                                               SkShader::kRepeat_TileMode);
85
86    SkMatrix m;
87    m.setScale(SkIntToScalar(6), SkIntToScalar(6));
88    s->setLocalMatrix(m);
89    return s;
90}
91
92namespace skiagm {
93
94    class AARectModesGM : public GM {
95        SkPaint fBGPaint;
96    public:
97        AARectModesGM () {
98            fBGPaint.setShader(make_bg_shader())->unref();
99        }
100
101    protected:
102
103        virtual SkString onShortName() {
104            return SkString("aarectmodes");
105        }
106
107        virtual SkISize onISize() { return make_isize(640, 480); }
108
109        virtual void onDraw(SkCanvas* canvas) {
110            canvas->drawColor(SK_ColorWHITE);
111
112            const SkRect bounds = SkRect::MakeWH(W, H);
113            static const SkAlpha gAlphaValue[] = { 0xFF, 0x88, 0x88 };
114
115            canvas->translate(SkIntToScalar(4), SkIntToScalar(4));
116
117            for (int alpha = 0; alpha < 4; ++alpha) {
118                canvas->save();
119                canvas->save();
120                for (size_t i = 0; i < SK_ARRAY_COUNT(gModes); ++i) {
121                    if (6 == i) {
122                        canvas->restore();
123                        canvas->translate(W * 5, 0);
124                        canvas->save();
125                    }
126                    SkXfermode* mode = SkXfermode::Create(gModes[i].fMode);
127
128                    canvas->drawRect(bounds, fBGPaint);
129                    canvas->saveLayer(&bounds, NULL);
130                    SkScalar dy = drawCell(canvas, mode,
131                                           gAlphaValue[alpha & 1],
132                                           gAlphaValue[alpha & 2]);
133                    canvas->restore();
134
135                    canvas->translate(0, dy * 5 / 4);
136                    SkSafeUnref(mode);
137                }
138                canvas->restore();
139                canvas->restore();
140                canvas->translate(W * 5 / 4, 0);
141            }
142        }
143
144        // disable pdf for now, since it crashes on mac
145        virtual uint32_t onGetFlags() const { return kSkipPDF_Flag; }
146
147    private:
148        typedef GM INHERITED;
149    };
150
151//////////////////////////////////////////////////////////////////////////////
152
153    static GM* MyFactory(void*) { return new AARectModesGM; }
154    static GMRegistry reg(MyFactory);
155
156}
157
158