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