11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/* 31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc. 41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * 51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be 61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file. 71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */ 80b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SampleCode.h" 90b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkView.h" 100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkCanvas.h" 110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "Sk64.h" 120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkCornerPathEffect.h" 130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkGradientShader.h" 140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkGraphics.h" 150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkImageDecoder.h" 160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkKernel33MaskFilter.h" 170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkPath.h" 180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkRandom.h" 190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkRegion.h" 200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkShader.h" 210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkUtils.h" 220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkColorPriv.h" 230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkColorFilter.h" 240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkTime.h" 250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkTypeface.h" 260b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkXfermode.h" 270b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 280b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkStream.h" 290b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkXMLParser.h" 300b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkColorPriv.h" 310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkImageDecoder.h" 320b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkBlurMaskFilter.h" 330b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#ifdef SK_BUILD_FOR_MAC 351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#import <ApplicationServices/ApplicationServices.h> 361cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerSkTypeface* SkCreateTypefaceFromCTFont(CTFontRef fontRef); 371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#endif 381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 390b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic void setNamedTypeface(SkPaint* paint, const char name[]) { 400b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkTypeface* face = SkTypeface::CreateFromName(name, SkTypeface::kNormal); 410b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint->setTypeface(face); 420b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkSafeUnref(face); 430b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger} 440b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 450b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic uint16_t gBG[] = { 0xFFFF, 0xCCCF, 0xCCCF, 0xFFFF }; 460b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 470b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerclass XfermodesBlurView : public SampleView { 480b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkBitmap fBG; 490b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkBitmap fSrcB, fDstB; 500b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 510b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger void draw_mode(SkCanvas* canvas, SkXfermode* mode, int alpha, 520b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkScalar x, SkScalar y) { 530b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkPaint p; 540b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkMaskFilter* mf = SkBlurMaskFilter::Create(5, SkBlurMaskFilter::kNormal_BlurStyle, 0); 550b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger p.setMaskFilter(mf)->unref(); 560b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 570b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkScalar ww = SkIntToScalar(W); 580b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkScalar hh = SkIntToScalar(H); 590b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 600b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger // draw a circle covering the upper 610b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger // left three quarters of the canvas 620b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger p.setColor(0xFFCC44FF); 630b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkRect r; 640b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger r.set(0, 0, ww*3/4, hh*3/4); 650b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger r.offset(x, y); 660b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->drawOval(r, p); 670b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 680b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger p.setXfermode(mode); 690b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 700b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger // draw a square overlapping the circle 710b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger // in the lower right of the canvas 720b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger p.setColor(0x00AA6633 | alpha << 24); 730b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger r.set(ww/3, hh/3, ww*19/20, hh*19/20); 740b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger r.offset(x, y); 750b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->drawRect(r, p); 761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#ifdef SK_BUILD_FOR_MAC 781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger static const char* gNames[] = { "Arial", "Times", "Courier", "Lucida" }; 791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger for (int j = 0; j < SK_ARRAY_COUNT(gNames); ++j) { 801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger CFStringRef name = CFStringCreateWithCString(NULL, gNames[j], kCFStringEncodingUTF8); 811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger CTFontRef font = CTFontCreateWithName(name, 0, NULL); 821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkTypeface* face = SkCreateTypefaceFromCTFont(font); 831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkDebugf("%s ct:%p face:%p ats:%p\n", gNames[j], font, face, CTFontGetPlatformFont(font, NULL)); 841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger for (int i = 9; i <= 24; ++i) { 851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger CTFontRef newFont = CTFontCreateCopyWithAttributes(font, i, NULL, NULL); 861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkTypeface* newFace = SkCreateTypefaceFromCTFont(newFont); 871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkDebugf("size:%d ct:%p face:%p ats:%p\n", i, newFont, newFace, CTFontGetPlatformFont(newFont, NULL)); 881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger newFace->unref(); 891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger CFRelease(newFont); 901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger face->unref(); 921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger CFRelease(font); 931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger CFRelease(name); 941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#endif 960b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 970b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 980b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerpublic: 990b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger const static int W = 64; 1000b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger const static int H = 64; 1011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger XfermodesBlurView() { 1020b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger const int W = 64; 1030b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger const int H = 64; 1040b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1050b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger fBG.setConfig(SkBitmap::kARGB_4444_Config, 2, 2, 4); 1060b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger fBG.setPixels(gBG); 1070b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger fBG.setIsOpaque(true); 1080b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 1090b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerprotected: 1110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger // overrides from SkEventSink 1120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger virtual bool onQuery(SkEvent* evt) { 1130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger if (SampleCode::TitleQ(*evt)) { 1140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SampleCode::TitleR(evt, "XfermodesBlur"); 1150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return true; 1160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 1170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return this->INHERITED::onQuery(evt); 1180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 1190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger virtual void onDrawContent(SkCanvas* canvas) { 1210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->translate(SkIntToScalar(10), SkIntToScalar(20)); 1220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger if (false) { 1241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkPaint paint; 1251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger paint.setAntiAlias(true); 1261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger paint.setTextSize(50); 1271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger paint.setTypeface(SkTypeface::CreateFromName("Arial Unicode MS", SkTypeface::kNormal)); 1281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkSafeUnref(paint.getTypeface()); 1291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger char buffer[10]; 1301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger size_t len = SkUTF8_FromUnichar(0x8500, buffer); 1311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->drawText(buffer, len, 40, 40, paint); 1321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger return; 1331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 1341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger if (false) { 1351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkPaint paint; 1361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger paint.setAntiAlias(true); 1371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkRect r0 = { 0, 0, 10.5f, 20 }; 1391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkRect r1 = { 10.5f, 10, 20, 30 }; 1401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger paint.setColor(SK_ColorRED); 1411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->drawRect(r0, paint); 1421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger paint.setColor(SK_ColorBLUE); 1431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->drawRect(r1, paint); 1441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger return; 1451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 1461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1470b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger const struct { 1480b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkXfermode::Mode fMode; 1490b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger const char* fLabel; 1500b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } gModes[] = { 1510b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger { SkXfermode::kClear_Mode, "Clear" }, 1520b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger { SkXfermode::kSrc_Mode, "Src" }, 1530b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger { SkXfermode::kDst_Mode, "Dst" }, 1540b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger { SkXfermode::kSrcOver_Mode, "SrcOver" }, 1550b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger { SkXfermode::kDstOver_Mode, "DstOver" }, 1560b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger { SkXfermode::kSrcIn_Mode, "SrcIn" }, 1570b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger { SkXfermode::kDstIn_Mode, "DstIn" }, 1580b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger { SkXfermode::kSrcOut_Mode, "SrcOut" }, 1590b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger { SkXfermode::kDstOut_Mode, "DstOut" }, 1600b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger { SkXfermode::kSrcATop_Mode, "SrcATop" }, 1610b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger { SkXfermode::kDstATop_Mode, "DstATop" }, 1620b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger { SkXfermode::kXor_Mode, "Xor" }, 1630b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1640b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger { SkXfermode::kPlus_Mode, "Plus" }, 1650b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger /*{ SkXfermode::kMultiply_Mode, "Multiply" }, 1660b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger { SkXfermode::kScreen_Mode, "Screen" }, 1670b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger { SkXfermode::kOverlay_Mode, "Overlay" }, 1680b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger { SkXfermode::kDarken_Mode, "Darken" }, 1690b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger { SkXfermode::kLighten_Mode, "Lighten" }, 1700b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger { SkXfermode::kColorDodge_Mode, "ColorDodge" }, 1710b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger { SkXfermode::kColorBurn_Mode, "ColorBurn" }, 1720b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger { SkXfermode::kHardLight_Mode, "HardLight" }, 1730b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger { SkXfermode::kSoftLight_Mode, "SoftLight" }, 1740b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger { SkXfermode::kDifference_Mode, "Difference" }, 1750b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger { SkXfermode::kExclusion_Mode, "Exclusion" },*/ 1760b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger }; 1770b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1780b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger const SkScalar w = SkIntToScalar(W); 1790b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger const SkScalar h = SkIntToScalar(H); 1800b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkShader* s = SkShader::CreateBitmapShader(fBG, 1810b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkShader::kRepeat_TileMode, 1820b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkShader::kRepeat_TileMode); 1830b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkMatrix m; 1840b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger m.setScale(SkIntToScalar(6), SkIntToScalar(6)); 1850b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger s->setLocalMatrix(m); 1860b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1870b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkPaint labelP; 1880b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger labelP.setAntiAlias(true); 1890b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger labelP.setLCDRenderText(true); 1900b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger labelP.setTextAlign(SkPaint::kCenter_Align); 1910b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger setNamedTypeface(&labelP, "Menlo Regular"); 1920b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1930b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger const int W = 5; 1940b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1950b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkScalar x0 = 0; 1960b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger for (int twice = 0; twice < 2; twice++) { 1970b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkScalar x = x0, y = 0; 1980b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger for (size_t i = 0; i < SK_ARRAY_COUNT(gModes); i++) { 1990b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkXfermode* mode = SkXfermode::Create(gModes[i].fMode); 2000b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkAutoUnref aur(mode); 2010b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkRect r; 2020b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger r.set(x, y, x+w, y+h); 2030b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 2040b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkPaint p; 2050b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger p.setStyle(SkPaint::kFill_Style); 2060b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger p.setShader(s); 2070b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->drawRect(r, p); 2080b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 2090b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->saveLayer(&r, NULL, SkCanvas::kARGB_ClipLayer_SaveFlag); 2100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger draw_mode(canvas, mode, twice ? 0x88 : 0xFF, r.fLeft, r.fTop); 2110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->restore(); 2120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 2130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger r.inset(-SK_ScalarHalf, -SK_ScalarHalf); 2140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger p.setStyle(SkPaint::kStroke_Style); 2150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger p.setShader(NULL); 2160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->drawRect(r, p); 2170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 2180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->drawText(gModes[i].fLabel, strlen(gModes[i].fLabel), 2190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger x + w/2, y - labelP.getTextSize()/2, labelP); 2200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger x += w + SkIntToScalar(10); 2210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger if ((i % W) == W - 1) { 2220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger x = x0; 2230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger y += h + SkIntToScalar(30); 2240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 2250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 2260b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger x0 += SkIntToScalar(400); 2270b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 2280b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger s->unref(); 2290b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 2300b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 2310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerprivate: 2320b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger typedef SampleView INHERITED; 2330b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}; 2340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 2350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger////////////////////////////////////////////////////////////////////////////// 2360b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 2370b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic SkView* MyFactory() { return new XfermodesBlurView; } 2380b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic SkViewRegister reg(MyFactory); 239