1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
7bf0001d0472d727266762c5967ec0d919a6df083reed@google.com
8271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SampleCode.h"
9271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkView.h"
10b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com#include "SkBlurMask.h"
11271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkCanvas.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 "SkPath.h"
17271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkRandom.h"
18271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkRegion.h"
19271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkShader.h"
20271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkUtils.h"
21271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkColorPriv.h"
22271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkColorFilter.h"
23271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkTime.h"
24271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkTypeface.h"
25271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkXfermode.h"
26271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
27271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkStream.h"
28271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkXMLParser.h"
29271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkColorPriv.h"
30271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkImageDecoder.h"
31271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkBlurMaskFilter.h"
32271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
33271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.comstatic void setNamedTypeface(SkPaint* paint, const char name[]) {
34271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com    SkTypeface* face = SkTypeface::CreateFromName(name, SkTypeface::kNormal);
35271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com    paint->setTypeface(face);
36271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com    SkSafeUnref(face);
37271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com}
38271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
39271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.comstatic uint16_t gBG[] = { 0xFFFF, 0xCCCF, 0xCCCF, 0xFFFF };
40271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
41271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.comclass XfermodesBlurView : public SampleView {
42271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com    SkBitmap    fBG;
43271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com    SkBitmap    fSrcB, fDstB;
44271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
45271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com    void draw_mode(SkCanvas* canvas, SkXfermode* mode, int alpha,
46271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                   SkScalar x, SkScalar y) {
47271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        SkPaint p;
48e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org        SkMaskFilter* mf = SkBlurMaskFilter::Create(kNormal_SkBlurStyle,
49b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com                                       SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(5)),
50b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com                                       SkBlurMaskFilter::kNone_BlurFlag);
51271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        p.setMaskFilter(mf)->unref();
52271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
53271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        SkScalar ww = SkIntToScalar(W);
54271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        SkScalar hh = SkIntToScalar(H);
55271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
56271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        // draw a circle covering the upper
57271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        // left three quarters of the canvas
58271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        p.setColor(0xFFCC44FF);
59271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        SkRect r;
60271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        r.set(0, 0, ww*3/4, hh*3/4);
61271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        r.offset(x, y);
62271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        canvas->drawOval(r, p);
63271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
64271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        p.setXfermode(mode);
65271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
66271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        // draw a square overlapping the circle
67271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        // in the lower right of the canvas
68271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        p.setColor(0x00AA6633 | alpha << 24);
69271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        r.set(ww/3, hh/3, ww*19/20, hh*19/20);
70271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        r.offset(x, y);
71271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        canvas->drawRect(r, p);
72271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com    }
73271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
74271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.compublic:
75271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com    const static int W = 64;
76271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com    const static int H = 64;
7722c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com    XfermodesBlurView() {
7800f8d6c75d22ce8f95f932c5b101354b196fa0dfcommit-bot@chromium.org        fBG.installPixels(SkImageInfo::Make(2, 2, kARGB_4444_SkColorType, kPremul_SkAlphaType),
7900f8d6c75d22ce8f95f932c5b101354b196fa0dfcommit-bot@chromium.org                          gBG, 4);
80271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com    }
81271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
82271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.comprotected:
83271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com    // overrides from SkEventSink
84271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com    virtual bool onQuery(SkEvent* evt) {
85271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        if (SampleCode::TitleQ(*evt)) {
86271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            SampleCode::TitleR(evt, "XfermodesBlur");
87271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            return true;
88271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        }
89271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        return this->INHERITED::onQuery(evt);
90271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com    }
91271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
92271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com    virtual void onDrawContent(SkCanvas* canvas) {
93271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        canvas->translate(SkIntToScalar(10), SkIntToScalar(20));
94271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
9587fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com        if (false) {
9687fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com            SkPaint paint;
9787fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com            paint.setAntiAlias(true);
9887fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com            paint.setTextSize(50);
9987fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com            paint.setTypeface(SkTypeface::CreateFromName("Arial Unicode MS", SkTypeface::kNormal));
10087fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com            SkSafeUnref(paint.getTypeface());
10187fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com            char buffer[10];
10287fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com            size_t len = SkUTF8_FromUnichar(0x8500, buffer);
10387fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com            canvas->drawText(buffer, len, 40, 40, paint);
10487fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com            return;
10587fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com        }
1060e0c94c8e9062a0e11f2bad55f1c1a83b34ddbc8reed@google.com        if (false) {
10787fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com            SkPaint paint;
10887fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com            paint.setAntiAlias(true);
109ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
11087fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com            SkRect r0 = { 0, 0, 10.5f, 20 };
11187fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com            SkRect r1 = { 10.5f, 10, 20, 30 };
11287fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com            paint.setColor(SK_ColorRED);
11387fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com            canvas->drawRect(r0, paint);
11487fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com            paint.setColor(SK_ColorBLUE);
11587fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com            canvas->drawRect(r1, paint);
11687fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com            return;
11787fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com        }
11887fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com
119271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        const struct {
120271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            SkXfermode::Mode  fMode;
121271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            const char*         fLabel;
122271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        } gModes[] = {
123271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            { SkXfermode::kClear_Mode,    "Clear"     },
124271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            { SkXfermode::kSrc_Mode,      "Src"       },
125271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            { SkXfermode::kDst_Mode,      "Dst"       },
126271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            { SkXfermode::kSrcOver_Mode,  "SrcOver"   },
127271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            { SkXfermode::kDstOver_Mode,  "DstOver"   },
128271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            { SkXfermode::kSrcIn_Mode,    "SrcIn"     },
129271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            { SkXfermode::kDstIn_Mode,    "DstIn"     },
130271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            { SkXfermode::kSrcOut_Mode,   "SrcOut"    },
131271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            { SkXfermode::kDstOut_Mode,   "DstOut"    },
132271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            { SkXfermode::kSrcATop_Mode,  "SrcATop"   },
133271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            { SkXfermode::kDstATop_Mode,  "DstATop"   },
134271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            { SkXfermode::kXor_Mode,      "Xor"       },
135271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
136271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            { SkXfermode::kPlus_Mode,         "Plus"          },
1378d3cd7a170c810e3816bf00220cbef51e7b16795reed@google.com            /*{ SkXfermode::kModulate_Mode,     "Modulate"      },
138271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            { SkXfermode::kScreen_Mode,       "Screen"        },
139271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            { SkXfermode::kOverlay_Mode,      "Overlay"       },
140271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            { SkXfermode::kDarken_Mode,       "Darken"        },
141271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            { SkXfermode::kLighten_Mode,      "Lighten"       },
142271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            { SkXfermode::kColorDodge_Mode,   "ColorDodge"    },
143271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            { SkXfermode::kColorBurn_Mode,    "ColorBurn"     },
144271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            { SkXfermode::kHardLight_Mode,    "HardLight"     },
145271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            { SkXfermode::kSoftLight_Mode,    "SoftLight"     },
146271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            { SkXfermode::kDifference_Mode,   "Difference"    },
147271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            { SkXfermode::kExclusion_Mode,    "Exclusion"     },*/
148271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        };
149271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
150271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        const SkScalar w = SkIntToScalar(W);
151271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        const SkScalar h = SkIntToScalar(H);
152271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        SkMatrix m;
153271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        m.setScale(SkIntToScalar(6), SkIntToScalar(6));
1549c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org        SkShader* s = SkShader::CreateBitmapShader(fBG,
1559c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org                                                   SkShader::kRepeat_TileMode,
1569c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org                                                   SkShader::kRepeat_TileMode,
1579c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org                                                   &m);
158271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
159271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        SkPaint labelP;
160271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        labelP.setAntiAlias(true);
161271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        labelP.setLCDRenderText(true);
162271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        labelP.setTextAlign(SkPaint::kCenter_Align);
163271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        setNamedTypeface(&labelP, "Menlo Regular");
164271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
165271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        const int W = 5;
166271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
167271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        SkScalar x0 = 0;
168271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        for (int twice = 0; twice < 2; twice++) {
169271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            SkScalar x = x0, y = 0;
170271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            for (size_t i = 0; i < SK_ARRAY_COUNT(gModes); i++) {
171271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                SkXfermode* mode = SkXfermode::Create(gModes[i].fMode);
172271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                SkAutoUnref aur(mode);
173271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                SkRect r;
174271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                r.set(x, y, x+w, y+h);
175271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
176271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                SkPaint p;
177271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                p.setStyle(SkPaint::kFill_Style);
178271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                p.setShader(s);
179271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                canvas->drawRect(r, p);
180271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
181091a594dbc4116ec2e54724432472bf37dae794acommit-bot@chromium.org                canvas->saveLayer(&r, NULL);
182271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                draw_mode(canvas, mode, twice ? 0x88 : 0xFF, r.fLeft, r.fTop);
183271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                canvas->restore();
184271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
185271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                r.inset(-SK_ScalarHalf, -SK_ScalarHalf);
186271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                p.setStyle(SkPaint::kStroke_Style);
187271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                p.setShader(NULL);
188271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                canvas->drawRect(r, p);
189271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
190271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                canvas->drawText(gModes[i].fLabel, strlen(gModes[i].fLabel),
191271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                                 x + w/2, y - labelP.getTextSize()/2, labelP);
192271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                x += w + SkIntToScalar(10);
193271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                if ((i % W) == W - 1) {
194271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                    x = x0;
195271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                    y += h + SkIntToScalar(30);
196271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                }
197271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            }
198271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            x0 += SkIntToScalar(400);
199271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        }
200271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        s->unref();
201271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com    }
202271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
203271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.comprivate:
204271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com    typedef SampleView INHERITED;
205271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com};
206271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
207271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com//////////////////////////////////////////////////////////////////////////////
208271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
209271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.comstatic SkView* MyFactory() { return new XfermodesBlurView; }
210271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.comstatic SkViewRegister reg(MyFactory);
211