SampleXfermodesBlur.cpp revision ae933ce0ea5fd9d21cb6ef2cee7e729d32690aac
1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
8271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SampleCode.h"
9271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkView.h"
10271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkCanvas.h"
11271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "Sk64.h"
12271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkCornerPathEffect.h"
13271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkGradientShader.h"
14271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkGraphics.h"
15271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkImageDecoder.h"
16271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkKernel33MaskFilter.h"
17271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkPath.h"
18271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkRandom.h"
19271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkRegion.h"
20271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkShader.h"
21271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkUtils.h"
22271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkColorPriv.h"
23271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkColorFilter.h"
24271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkTime.h"
25271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkTypeface.h"
26271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkXfermode.h"
27271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
28271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkStream.h"
29271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkXMLParser.h"
30271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkColorPriv.h"
31271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkImageDecoder.h"
32271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkBlurMaskFilter.h"
33271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
34045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com#ifdef SK_BUILD_FOR_MAC
35045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com#import <ApplicationServices/ApplicationServices.h>
36045e62d715f5ee9b03deb5af3c750f8318096179reed@google.comSkTypeface* SkCreateTypefaceFromCTFont(CTFontRef fontRef);
37045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com#endif
38045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com
39271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.comstatic void setNamedTypeface(SkPaint* paint, const char name[]) {
40271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com    SkTypeface* face = SkTypeface::CreateFromName(name, SkTypeface::kNormal);
41271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com    paint->setTypeface(face);
42271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com    SkSafeUnref(face);
43271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com}
44271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
45271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.comstatic uint16_t gBG[] = { 0xFFFF, 0xCCCF, 0xCCCF, 0xFFFF };
46271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
47271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.comclass XfermodesBlurView : public SampleView {
48271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com    SkBitmap    fBG;
49271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com    SkBitmap    fSrcB, fDstB;
50271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
51271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com    void draw_mode(SkCanvas* canvas, SkXfermode* mode, int alpha,
52271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                   SkScalar x, SkScalar y) {
53271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        SkPaint p;
54271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        SkMaskFilter* mf = SkBlurMaskFilter::Create(5, SkBlurMaskFilter::kNormal_BlurStyle, 0);
55271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        p.setMaskFilter(mf)->unref();
56271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
57271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        SkScalar ww = SkIntToScalar(W);
58271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        SkScalar hh = SkIntToScalar(H);
59271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
60271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        // draw a circle covering the upper
61271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        // left three quarters of the canvas
62271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        p.setColor(0xFFCC44FF);
63271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        SkRect r;
64271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        r.set(0, 0, ww*3/4, hh*3/4);
65271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        r.offset(x, y);
66271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        canvas->drawOval(r, p);
67271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
68271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        p.setXfermode(mode);
69271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
70271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        // draw a square overlapping the circle
71271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        // in the lower right of the canvas
72271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        p.setColor(0x00AA6633 | alpha << 24);
73271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        r.set(ww/3, hh/3, ww*19/20, hh*19/20);
74271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        r.offset(x, y);
75271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        canvas->drawRect(r, p);
76045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com
77045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com#ifdef SK_BUILD_FOR_MAC
78045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com        static const char* gNames[] = { "Arial", "Times", "Courier", "Lucida" };
7902939ce4bddd3223d9e8cc98d4abd02939b7f70acaryclark@google.com        for (size_t j = 0; j < SK_ARRAY_COUNT(gNames); ++j) {
80045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com            CFStringRef name = CFStringCreateWithCString(NULL, gNames[j], kCFStringEncodingUTF8);
81045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com            CTFontRef font = CTFontCreateWithName(name, 0, NULL);
82045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com            SkTypeface* face = SkCreateTypefaceFromCTFont(font);
83045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com            SkDebugf("%s ct:%p face:%p ats:%p\n", gNames[j], font, face, CTFontGetPlatformFont(font, NULL));
84045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com            for (int i = 9; i <= 24; ++i) {
85045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com                CTFontRef newFont = CTFontCreateCopyWithAttributes(font, i, NULL, NULL);
86045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com                SkTypeface* newFace = SkCreateTypefaceFromCTFont(newFont);
87045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com                SkDebugf("size:%d ct:%p face:%p ats:%p\n", i, newFont, newFace, CTFontGetPlatformFont(newFont, NULL));
88045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com                newFace->unref();
89045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com                CFRelease(newFont);
90045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com            }
91045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com            face->unref();
92045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com            CFRelease(font);
93045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com            CFRelease(name);
94045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com        }
95045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com#endif
96271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com    }
97271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
98271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.compublic:
99271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com    const static int W = 64;
100271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com    const static int H = 64;
10122c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com    XfermodesBlurView() {
102271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        fBG.setConfig(SkBitmap::kARGB_4444_Config, 2, 2, 4);
103271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        fBG.setPixels(gBG);
104271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        fBG.setIsOpaque(true);
105271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com    }
106271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
107271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.comprotected:
108271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com    // overrides from SkEventSink
109271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com    virtual bool onQuery(SkEvent* evt) {
110271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        if (SampleCode::TitleQ(*evt)) {
111271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            SampleCode::TitleR(evt, "XfermodesBlur");
112271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            return true;
113271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        }
114271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        return this->INHERITED::onQuery(evt);
115271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com    }
116271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
117271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com    virtual void onDrawContent(SkCanvas* canvas) {
118271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        canvas->translate(SkIntToScalar(10), SkIntToScalar(20));
119271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
12087fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com        if (false) {
12187fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com            SkPaint paint;
12287fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com            paint.setAntiAlias(true);
12387fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com            paint.setTextSize(50);
12487fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com            paint.setTypeface(SkTypeface::CreateFromName("Arial Unicode MS", SkTypeface::kNormal));
12587fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com            SkSafeUnref(paint.getTypeface());
12687fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com            char buffer[10];
12787fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com            size_t len = SkUTF8_FromUnichar(0x8500, buffer);
12887fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com            canvas->drawText(buffer, len, 40, 40, paint);
12987fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com            return;
13087fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com        }
1310e0c94c8e9062a0e11f2bad55f1c1a83b34ddbc8reed@google.com        if (false) {
13287fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com            SkPaint paint;
13387fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com            paint.setAntiAlias(true);
134ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
13587fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com            SkRect r0 = { 0, 0, 10.5f, 20 };
13687fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com            SkRect r1 = { 10.5f, 10, 20, 30 };
13787fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com            paint.setColor(SK_ColorRED);
13887fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com            canvas->drawRect(r0, paint);
13987fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com            paint.setColor(SK_ColorBLUE);
14087fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com            canvas->drawRect(r1, paint);
14187fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com            return;
14287fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com        }
14387fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com
144271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        const struct {
145271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            SkXfermode::Mode  fMode;
146271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            const char*         fLabel;
147271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        } gModes[] = {
148271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            { SkXfermode::kClear_Mode,    "Clear"     },
149271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            { SkXfermode::kSrc_Mode,      "Src"       },
150271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            { SkXfermode::kDst_Mode,      "Dst"       },
151271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            { SkXfermode::kSrcOver_Mode,  "SrcOver"   },
152271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            { SkXfermode::kDstOver_Mode,  "DstOver"   },
153271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            { SkXfermode::kSrcIn_Mode,    "SrcIn"     },
154271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            { SkXfermode::kDstIn_Mode,    "DstIn"     },
155271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            { SkXfermode::kSrcOut_Mode,   "SrcOut"    },
156271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            { SkXfermode::kDstOut_Mode,   "DstOut"    },
157271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            { SkXfermode::kSrcATop_Mode,  "SrcATop"   },
158271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            { SkXfermode::kDstATop_Mode,  "DstATop"   },
159271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            { SkXfermode::kXor_Mode,      "Xor"       },
160271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
161271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            { SkXfermode::kPlus_Mode,         "Plus"          },
162271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            /*{ SkXfermode::kMultiply_Mode,     "Multiply"      },
163271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            { SkXfermode::kScreen_Mode,       "Screen"        },
164271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            { SkXfermode::kOverlay_Mode,      "Overlay"       },
165271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            { SkXfermode::kDarken_Mode,       "Darken"        },
166271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            { SkXfermode::kLighten_Mode,      "Lighten"       },
167271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            { SkXfermode::kColorDodge_Mode,   "ColorDodge"    },
168271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            { SkXfermode::kColorBurn_Mode,    "ColorBurn"     },
169271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            { SkXfermode::kHardLight_Mode,    "HardLight"     },
170271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            { SkXfermode::kSoftLight_Mode,    "SoftLight"     },
171271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            { SkXfermode::kDifference_Mode,   "Difference"    },
172271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            { SkXfermode::kExclusion_Mode,    "Exclusion"     },*/
173271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        };
174271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
175271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        const SkScalar w = SkIntToScalar(W);
176271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        const SkScalar h = SkIntToScalar(H);
177271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        SkShader* s = SkShader::CreateBitmapShader(fBG,
178271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                                                   SkShader::kRepeat_TileMode,
179271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                                                   SkShader::kRepeat_TileMode);
180271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        SkMatrix m;
181271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        m.setScale(SkIntToScalar(6), SkIntToScalar(6));
182271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        s->setLocalMatrix(m);
183271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
184271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        SkPaint labelP;
185271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        labelP.setAntiAlias(true);
186271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        labelP.setLCDRenderText(true);
187271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        labelP.setTextAlign(SkPaint::kCenter_Align);
188271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        setNamedTypeface(&labelP, "Menlo Regular");
189271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
190271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        const int W = 5;
191271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
192271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        SkScalar x0 = 0;
193271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        for (int twice = 0; twice < 2; twice++) {
194271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            SkScalar x = x0, y = 0;
195271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            for (size_t i = 0; i < SK_ARRAY_COUNT(gModes); i++) {
196271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                SkXfermode* mode = SkXfermode::Create(gModes[i].fMode);
197271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                SkAutoUnref aur(mode);
198271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                SkRect r;
199271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                r.set(x, y, x+w, y+h);
200271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
201271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                SkPaint p;
202271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                p.setStyle(SkPaint::kFill_Style);
203271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                p.setShader(s);
204271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                canvas->drawRect(r, p);
205271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
206271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                canvas->saveLayer(&r, NULL, SkCanvas::kARGB_ClipLayer_SaveFlag);
207271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                draw_mode(canvas, mode, twice ? 0x88 : 0xFF, r.fLeft, r.fTop);
208271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                canvas->restore();
209271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
210271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                r.inset(-SK_ScalarHalf, -SK_ScalarHalf);
211271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                p.setStyle(SkPaint::kStroke_Style);
212271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                p.setShader(NULL);
213271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                canvas->drawRect(r, p);
214271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
215271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                canvas->drawText(gModes[i].fLabel, strlen(gModes[i].fLabel),
216271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                                 x + w/2, y - labelP.getTextSize()/2, labelP);
217271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                x += w + SkIntToScalar(10);
218271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                if ((i % W) == W - 1) {
219271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                    x = x0;
220271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                    y += h + SkIntToScalar(30);
221271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                }
222271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            }
223271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            x0 += SkIntToScalar(400);
224271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        }
225271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        s->unref();
226271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com    }
227271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
228271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.comprivate:
229271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com    typedef SampleView INHERITED;
230271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com};
231271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
232271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com//////////////////////////////////////////////////////////////////////////////
233271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
234271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.comstatic SkView* MyFactory() { return new XfermodesBlurView; }
235271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.comstatic SkViewRegister reg(MyFactory);
236