SampleXfermodesBlur.cpp revision 271cffc77bd2fcb3458559e509634442517ca1e9
1#include "SampleCode.h"
2#include "SkView.h"
3#include "SkCanvas.h"
4#include "Sk64.h"
5#include "SkCornerPathEffect.h"
6#include "SkGradientShader.h"
7#include "SkGraphics.h"
8#include "SkImageDecoder.h"
9#include "SkKernel33MaskFilter.h"
10#include "SkPath.h"
11#include "SkRandom.h"
12#include "SkRegion.h"
13#include "SkShader.h"
14#include "SkUtils.h"
15#include "SkColorPriv.h"
16#include "SkColorFilter.h"
17#include "SkTime.h"
18#include "SkTypeface.h"
19#include "SkXfermode.h"
20
21#include "SkStream.h"
22#include "SkXMLParser.h"
23#include "SkColorPriv.h"
24#include "SkImageDecoder.h"
25#include "SkBlurMaskFilter.h"
26
27static void setNamedTypeface(SkPaint* paint, const char name[]) {
28    SkTypeface* face = SkTypeface::CreateFromName(name, SkTypeface::kNormal);
29    paint->setTypeface(face);
30    SkSafeUnref(face);
31}
32
33static uint16_t gBG[] = { 0xFFFF, 0xCCCF, 0xCCCF, 0xFFFF };
34
35class XfermodesBlurView : public SampleView {
36    SkBitmap    fBG;
37    SkBitmap    fSrcB, fDstB;
38
39    void draw_mode(SkCanvas* canvas, SkXfermode* mode, int alpha,
40                   SkScalar x, SkScalar y) {
41        SkPaint p;
42        SkMaskFilter* mf = SkBlurMaskFilter::Create(5, SkBlurMaskFilter::kNormal_BlurStyle, 0);
43        p.setMaskFilter(mf)->unref();
44
45        SkScalar ww = SkIntToScalar(W);
46        SkScalar hh = SkIntToScalar(H);
47
48        // draw a circle covering the upper
49        // left three quarters of the canvas
50        p.setColor(0xFFCC44FF);
51        SkRect r;
52        r.set(0, 0, ww*3/4, hh*3/4);
53        r.offset(x, y);
54        canvas->drawOval(r, p);
55
56        p.setXfermode(mode);
57
58        // draw a square overlapping the circle
59        // in the lower right of the canvas
60        p.setColor(0x00AA6633 | alpha << 24);
61        r.set(ww/3, hh/3, ww*19/20, hh*19/20);
62        r.offset(x, y);
63        canvas->drawRect(r, p);
64    }
65
66public:
67    const static int W = 64;
68    const static int H = 64;
69	XfermodesBlurView() {
70        const int W = 64;
71        const int H = 64;
72
73        fBG.setConfig(SkBitmap::kARGB_4444_Config, 2, 2, 4);
74        fBG.setPixels(gBG);
75        fBG.setIsOpaque(true);
76    }
77
78protected:
79    // overrides from SkEventSink
80    virtual bool onQuery(SkEvent* evt) {
81        if (SampleCode::TitleQ(*evt)) {
82            SampleCode::TitleR(evt, "XfermodesBlur");
83            return true;
84        }
85        return this->INHERITED::onQuery(evt);
86    }
87
88    virtual void onDrawContent(SkCanvas* canvas) {
89        canvas->translate(SkIntToScalar(10), SkIntToScalar(20));
90
91        const struct {
92            SkXfermode::Mode  fMode;
93            const char*         fLabel;
94        } gModes[] = {
95            { SkXfermode::kClear_Mode,    "Clear"     },
96            { SkXfermode::kSrc_Mode,      "Src"       },
97            { SkXfermode::kDst_Mode,      "Dst"       },
98            { SkXfermode::kSrcOver_Mode,  "SrcOver"   },
99            { SkXfermode::kDstOver_Mode,  "DstOver"   },
100            { SkXfermode::kSrcIn_Mode,    "SrcIn"     },
101            { SkXfermode::kDstIn_Mode,    "DstIn"     },
102            { SkXfermode::kSrcOut_Mode,   "SrcOut"    },
103            { SkXfermode::kDstOut_Mode,   "DstOut"    },
104            { SkXfermode::kSrcATop_Mode,  "SrcATop"   },
105            { SkXfermode::kDstATop_Mode,  "DstATop"   },
106            { SkXfermode::kXor_Mode,      "Xor"       },
107
108            { SkXfermode::kPlus_Mode,         "Plus"          },
109            /*{ SkXfermode::kMultiply_Mode,     "Multiply"      },
110            { SkXfermode::kScreen_Mode,       "Screen"        },
111            { SkXfermode::kOverlay_Mode,      "Overlay"       },
112            { SkXfermode::kDarken_Mode,       "Darken"        },
113            { SkXfermode::kLighten_Mode,      "Lighten"       },
114            { SkXfermode::kColorDodge_Mode,   "ColorDodge"    },
115            { SkXfermode::kColorBurn_Mode,    "ColorBurn"     },
116            { SkXfermode::kHardLight_Mode,    "HardLight"     },
117            { SkXfermode::kSoftLight_Mode,    "SoftLight"     },
118            { SkXfermode::kDifference_Mode,   "Difference"    },
119            { SkXfermode::kExclusion_Mode,    "Exclusion"     },*/
120        };
121
122        const SkScalar w = SkIntToScalar(W);
123        const SkScalar h = SkIntToScalar(H);
124        SkShader* s = SkShader::CreateBitmapShader(fBG,
125                                                   SkShader::kRepeat_TileMode,
126                                                   SkShader::kRepeat_TileMode);
127        SkMatrix m;
128        m.setScale(SkIntToScalar(6), SkIntToScalar(6));
129        s->setLocalMatrix(m);
130
131        SkPaint labelP;
132        labelP.setAntiAlias(true);
133        labelP.setLCDRenderText(true);
134        labelP.setTextAlign(SkPaint::kCenter_Align);
135        setNamedTypeface(&labelP, "Menlo Regular");
136
137        const int W = 5;
138
139        SkScalar x0 = 0;
140        for (int twice = 0; twice < 2; twice++) {
141            SkScalar x = x0, y = 0;
142            for (size_t i = 0; i < SK_ARRAY_COUNT(gModes); i++) {
143                SkXfermode* mode = SkXfermode::Create(gModes[i].fMode);
144                SkAutoUnref aur(mode);
145                SkRect r;
146                r.set(x, y, x+w, y+h);
147
148                SkPaint p;
149                p.setStyle(SkPaint::kFill_Style);
150                p.setShader(s);
151                canvas->drawRect(r, p);
152
153                canvas->saveLayer(&r, NULL, SkCanvas::kARGB_ClipLayer_SaveFlag);
154                draw_mode(canvas, mode, twice ? 0x88 : 0xFF, r.fLeft, r.fTop);
155                canvas->restore();
156
157                r.inset(-SK_ScalarHalf, -SK_ScalarHalf);
158                p.setStyle(SkPaint::kStroke_Style);
159                p.setShader(NULL);
160                canvas->drawRect(r, p);
161
162                canvas->drawText(gModes[i].fLabel, strlen(gModes[i].fLabel),
163                                 x + w/2, y - labelP.getTextSize()/2, labelP);
164                x += w + SkIntToScalar(10);
165                if ((i % W) == W - 1) {
166                    x = x0;
167                    y += h + SkIntToScalar(30);
168                }
169            }
170            x0 += SkIntToScalar(400);
171        }
172        s->unref();
173    }
174
175private:
176    typedef SampleView INHERITED;
177};
178
179//////////////////////////////////////////////////////////////////////////////
180
181static SkView* MyFactory() { return new XfermodesBlurView; }
182static SkViewRegister reg(MyFactory);
183