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