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