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 "SkCanvas.h"
100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkView.h"
110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "Sk1DPathEffect.h"
120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "Sk2DPathEffect.h"
130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkAvoidXfermode.h"
140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkBlurMaskFilter.h"
150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkColorFilter.h"
160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkColorPriv.h"
170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkCornerPathEffect.h"
180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkDashPathEffect.h"
190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkDiscretePathEffect.h"
200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkEmbossMaskFilter.h"
210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkGradientShader.h"
220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkImageDecoder.h"
230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkLayerRasterizer.h"
240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkMath.h"
250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkPath.h"
260b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkRegion.h"
270b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkShader.h"
280b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkComposeShader.h"
290b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkCornerPathEffect.h"
300b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkPathMeasure.h"
310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkPicture.h"
320b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkRandom.h"
330b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkTransparentShader.h"
340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkTypeface.h"
350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkUnitMappers.h"
360b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkUtils.h"
370b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkXfermode.h"
380b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
390b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include <math.h>
400b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
410b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic inline SkPMColor rgb2gray(SkPMColor c) {
420b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    unsigned r = SkGetPackedR32(c);
430b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    unsigned g = SkGetPackedG32(c);
440b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    unsigned b = SkGetPackedB32(c);
450b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
460b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    unsigned x = (r * 5 + g * 7 + b * 4) >> 4;
470b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
480b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    return SkPackARGB32(0, x, x, x) | (c & (SK_A32_MASK << SK_A32_SHIFT));
490b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
500b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
510b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerclass SkGrayScaleColorFilter : public SkColorFilter {
520b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerpublic:
530b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    virtual void filterSpan(const SkPMColor src[], int count, SkPMColor result[]) {
540b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        for (int i = 0; i < count; i++)
550b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            result[i] = rgb2gray(src[i]);
560b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
570b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger};
580b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
590b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerclass SkChannelMaskColorFilter : public SkColorFilter {
600b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerpublic:
610b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkChannelMaskColorFilter(U8CPU redMask, U8CPU greenMask, U8CPU blueMask) {
620b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        fMask = SkPackARGB32(0xFF, redMask, greenMask, blueMask);
630b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
640b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
650b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    virtual void filterSpan(const SkPMColor src[], int count, SkPMColor result[]) {
660b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkPMColor mask = fMask;
670b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        for (int i = 0; i < count; i++) {
680b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            result[i] = src[i] & mask;
690b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        }
700b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
710b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
720b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerprivate:
730b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkPMColor   fMask;
740b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger};
750b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
760b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger///////////////////////////////////////////////////////////
770b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
780b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic void r0(SkLayerRasterizer* rast, SkPaint& p) {
790b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    p.setMaskFilter(SkBlurMaskFilter::Create(SkIntToScalar(3),
800b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                                             SkBlurMaskFilter::kNormal_BlurStyle))->unref();
810b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    rast->addLayer(p, SkIntToScalar(3), SkIntToScalar(3));
820b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
830b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    p.setMaskFilter(NULL);
840b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    p.setStyle(SkPaint::kStroke_Style);
850b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    p.setStrokeWidth(SK_Scalar1);
860b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    rast->addLayer(p);
870b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
880b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    p.setAlpha(0x11);
890b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    p.setStyle(SkPaint::kFill_Style);
900b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    p.setXfermodeMode(SkXfermode::kSrc_Mode);
910b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    rast->addLayer(p);
920b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
930b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
940b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic void r1(SkLayerRasterizer* rast, SkPaint& p) {
950b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    rast->addLayer(p);
960b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
970b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    p.setAlpha(0x40);
980b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    p.setXfermodeMode(SkXfermode::kSrc_Mode);
990b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    p.setStyle(SkPaint::kStroke_Style);
1000b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    p.setStrokeWidth(SK_Scalar1*2);
1010b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    rast->addLayer(p);
1020b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
1030b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1040b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic void r2(SkLayerRasterizer* rast, SkPaint& p) {
1050b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    p.setStyle(SkPaint::kStrokeAndFill_Style);
1060b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    p.setStrokeWidth(SK_Scalar1*4);
1070b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    rast->addLayer(p);
1080b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1090b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    p.setStyle(SkPaint::kStroke_Style);
1100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    p.setStrokeWidth(SK_Scalar1*3/2);
1110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    p.setXfermodeMode(SkXfermode::kClear_Mode);
1120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    rast->addLayer(p);
1130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
1140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic void r3(SkLayerRasterizer* rast, SkPaint& p) {
1160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    p.setStyle(SkPaint::kStroke_Style);
1170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    p.setStrokeWidth(SK_Scalar1*3);
1180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    rast->addLayer(p);
1190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    p.setAlpha(0x20);
1210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    p.setStyle(SkPaint::kFill_Style);
1220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    p.setXfermodeMode(SkXfermode::kSrc_Mode);
1230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    rast->addLayer(p);
1240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
1250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1260b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic void r4(SkLayerRasterizer* rast, SkPaint& p) {
1270b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    p.setAlpha(0x60);
1280b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    rast->addLayer(p, SkIntToScalar(3), SkIntToScalar(3));
1290b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1300b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    p.setAlpha(0xFF);
1310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    p.setXfermodeMode(SkXfermode::kClear_Mode);
1320b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    rast->addLayer(p, SK_Scalar1*3/2, SK_Scalar1*3/2);
1330b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    p.setXfermode(NULL);
1350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    rast->addLayer(p);
1360b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
1370b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1380b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic void r5(SkLayerRasterizer* rast, SkPaint& p) {
1390b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    rast->addLayer(p);
1400b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1410b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    p.setPathEffect(new SkDiscretePathEffect(SK_Scalar1*4, SK_Scalar1*3))->unref();
1420b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    p.setXfermodeMode(SkXfermode::kSrcOut_Mode);
1430b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    rast->addLayer(p);
1440b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
1450b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1460b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic void r6(SkLayerRasterizer* rast, SkPaint& p) {
1470b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    rast->addLayer(p);
1480b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1490b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    p.setAntiAlias(false);
1500b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkLayerRasterizer* rast2 = new SkLayerRasterizer;
1510b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    r5(rast2, p);
1520b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    p.setRasterizer(rast2)->unref();
1530b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    p.setXfermodeMode(SkXfermode::kClear_Mode);
1540b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    rast->addLayer(p);
1550b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
1560b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1570b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerclass Dot2DPathEffect : public Sk2DPathEffect {
1580b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerpublic:
1590b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    Dot2DPathEffect(SkScalar radius, const SkMatrix& matrix)
1600b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        : Sk2DPathEffect(matrix), fRadius(radius) {}
1610b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1620b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    virtual void flatten(SkFlattenableWriteBuffer& buffer) {
1630b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        this->INHERITED::flatten(buffer);
1640b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1650b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        buffer.writeScalar(fRadius);
1660b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
1670b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    virtual Factory getFactory() { return CreateProc; }
1680b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1690b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerprotected:
1700b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	virtual void next(const SkPoint& loc, int u, int v, SkPath* dst) {
1710b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        dst->addCircle(loc.fX, loc.fY, fRadius);
1720b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
1730b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1740b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    Dot2DPathEffect(SkFlattenableReadBuffer& buffer) : Sk2DPathEffect(buffer) {
1750b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        fRadius = buffer.readScalar();
1760b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
1770b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerprivate:
1780b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkScalar fRadius;
1790b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1800b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) {
1810b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        return new Dot2DPathEffect(buffer);
1820b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
1830b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1840b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    typedef Sk2DPathEffect INHERITED;
1850b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger};
1860b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1870b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic void r7(SkLayerRasterizer* rast, SkPaint& p) {
1880b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkMatrix    lattice;
1890b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    lattice.setScale(SK_Scalar1*6, SK_Scalar1*6, 0, 0);
1900b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    lattice.postSkew(SK_Scalar1/3, 0, 0, 0);
1910b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    p.setPathEffect(new Dot2DPathEffect(SK_Scalar1*4, lattice))->unref();
1920b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    rast->addLayer(p);
1930b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
1940b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1950b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic void r8(SkLayerRasterizer* rast, SkPaint& p) {
1960b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    rast->addLayer(p);
1970b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1980b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkMatrix    lattice;
1990b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    lattice.setScale(SK_Scalar1*6, SK_Scalar1*6, 0, 0);
2000b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    lattice.postSkew(SK_Scalar1/3, 0, 0, 0);
2010b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    p.setPathEffect(new Dot2DPathEffect(SK_Scalar1*2, lattice))->unref();
2020b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    p.setXfermodeMode(SkXfermode::kClear_Mode);
2030b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    rast->addLayer(p);
2040b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
2050b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    p.setPathEffect(NULL);
2060b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    p.setXfermode(NULL);
2070b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    p.setStyle(SkPaint::kStroke_Style);
2080b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    p.setStrokeWidth(SK_Scalar1);
2090b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    rast->addLayer(p);
2100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
2110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
2120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerclass Line2DPathEffect : public Sk2DPathEffect {
2130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerpublic:
2140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    Line2DPathEffect(SkScalar width, const SkMatrix& matrix)
2150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        : Sk2DPathEffect(matrix), fWidth(width) {}
2160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
2170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	virtual bool filterPath(SkPath* dst, const SkPath& src, SkScalar* width) {
2180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        if (this->INHERITED::filterPath(dst, src, width)) {
2190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            *width = fWidth;
2200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            return true;
2210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        }
2220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        return false;
2230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
2240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
2250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    virtual Factory getFactory() { return CreateProc; }
2260b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    virtual void flatten(SkFlattenableWriteBuffer& buffer) {
2270b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        this->INHERITED::flatten(buffer);
2280b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        buffer.writeScalar(fWidth);
2290b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
2300b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerprotected:
2310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	virtual void nextSpan(int u, int v, int ucount, SkPath* dst) {
2320b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        if (ucount > 1) {
2330b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            SkPoint	src[2], dstP[2];
2340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
2350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            src[0].set(SkIntToScalar(u) + SK_ScalarHalf,
2360b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                       SkIntToScalar(v) + SK_ScalarHalf);
2370b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            src[1].set(SkIntToScalar(u+ucount) + SK_ScalarHalf,
2380b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                       SkIntToScalar(v) + SK_ScalarHalf);
2390b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            this->getMatrix().mapPoints(dstP, src, 2);
2400b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
2410b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            dst->moveTo(dstP[0]);
2420b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            dst->lineTo(dstP[1]);
2430b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        }
2440b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
2450b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
2460b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    Line2DPathEffect(SkFlattenableReadBuffer& buffer) : Sk2DPathEffect(buffer) {
2470b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        fWidth = buffer.readScalar();
2480b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
2490b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
2500b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerprivate:
2510b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkScalar fWidth;
2520b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
2530b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) { return new Line2DPathEffect(buffer); }
2540b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
2550b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    typedef Sk2DPathEffect INHERITED;
2560b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger};
2570b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
2580b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic void r9(SkLayerRasterizer* rast, SkPaint& p) {
2590b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    rast->addLayer(p);
2600b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
2610b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkMatrix    lattice;
2620b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    lattice.setScale(SK_Scalar1, SK_Scalar1*6, 0, 0);
2630b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    lattice.postRotate(SkIntToScalar(30), 0, 0);
2640b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    p.setPathEffect(new Line2DPathEffect(SK_Scalar1*2, lattice))->unref();
2650b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    p.setXfermodeMode(SkXfermode::kClear_Mode);
2660b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    rast->addLayer(p);
2670b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
2680b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    p.setPathEffect(NULL);
2690b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    p.setXfermode(NULL);
2700b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    p.setStyle(SkPaint::kStroke_Style);
2710b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    p.setStrokeWidth(SK_Scalar1);
2720b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    rast->addLayer(p);
2730b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
2740b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
2750b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergertypedef void (*raster_proc)(SkLayerRasterizer*, SkPaint&);
2760b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
2770b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic const raster_proc gRastProcs[] = {
2780b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    r0, r1, r2, r3, r4, r5, r6, r7, r8, r9
2790b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger};
2800b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
2810b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic const struct {
2820b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkColor fMul, fAdd;
2830b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger} gLightingColors[] = {
2840b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    { 0x808080, 0x800000 }, // general case
2850b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    { 0x707070, 0x707070 }, // no-pin case
2860b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    { 0xFFFFFF, 0x800000 }, // just-add case
2870b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    { 0x808080, 0x000000 }, // just-mul case
2880b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    { 0xFFFFFF, 0x000000 }  // identity case
2890b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger};
2900b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
2910b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic unsigned color_dist16(uint16_t a, uint16_t b) {
2920b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    unsigned dr = SkAbs32(SkPacked16ToR32(a) - SkPacked16ToR32(b));
2930b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    unsigned dg = SkAbs32(SkPacked16ToG32(a) - SkPacked16ToG32(b));
2940b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    unsigned db = SkAbs32(SkPacked16ToB32(a) - SkPacked16ToB32(b));
2950b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
2960b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    return SkMax32(dr, SkMax32(dg, db));
2970b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
2980b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
2990b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic unsigned scale_dist(unsigned dist, unsigned scale) {
3000b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    dist >>= 6;
3010b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    dist = (dist << 2) | dist;
3020b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    dist = (dist << 4) | dist;
3030b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    return dist;
3040b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
3050b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger//    return SkAlphaMul(dist, scale);
3060b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
3070b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
3080b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic void apply_shader(SkPaint* paint, int index) {
3090b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    raster_proc proc = gRastProcs[index];
3100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    if (proc) {
3110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkPaint p;
3120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkLayerRasterizer*  rast = new SkLayerRasterizer;
3130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
3140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        p.setAntiAlias(true);
3150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        proc(rast, p);
3160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        paint->setRasterizer(rast)->unref();
3170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
3180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
3190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#if 1
3200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkScalar dir[] = { SK_Scalar1, SK_Scalar1, SK_Scalar1 };
3210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    paint->setMaskFilter(SkBlurMaskFilter::CreateEmboss(dir, SK_Scalar1/4, SkIntToScalar(4), SkIntToScalar(3)))->unref();
3220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    paint->setColor(SK_ColorBLUE);
3230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#endif
3240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
3250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
3260b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerclass DemoView : public SampleView {
3270b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerpublic:
3280b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    DemoView() {}
3290b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
3300b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerprotected:
3310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    // overrides from SkEventSink
3320b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    virtual bool onQuery(SkEvent* evt) {
3330b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        if (SampleCode::TitleQ(*evt)) {
3340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            SampleCode::TitleR(evt, "Demo");
3350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            return true;
3360b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        }
3370b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        return this->INHERITED::onQuery(evt);
3380b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
3390b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
3400b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    virtual bool onClick(Click* click) {
3410b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        return this->INHERITED::onClick(click);
3420b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
3430b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
3440b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    void makePath(SkPath& path) {
3450b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        path.addCircle(SkIntToScalar(20), SkIntToScalar(20), SkIntToScalar(20),
3460b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            SkPath::kCCW_Direction);
3470b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        for (int index = 0; index < 10; index++) {
3480b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            SkScalar x = SkFloatToScalar(cos(index / 10.0f * 2 * 3.1415925358f));
3490b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            SkScalar y = SkFloatToScalar(sin(index / 10.0f * 2 * 3.1415925358f));
3500b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            x *= index & 1 ? 7 : 14;
3510b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            y *= index & 1 ? 7 : 14;
3520b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            x += SkIntToScalar(20);
3530b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            y += SkIntToScalar(20);
3540b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            if (index == 0)
3550b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                path.moveTo(x, y);
3560b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            else
3570b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                path.lineTo(x, y);
3580b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        }
3590b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        path.close();
3600b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
3610b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
3620b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    virtual void onDrawContent(SkCanvas* canvas) {
3630b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        canvas->save();
3640b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        drawPicture(canvas, 0);
3650b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        canvas->restore();
3660b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
3670b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        {
3680b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            SkPicture picture;
3690b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            SkCanvas* record = picture.beginRecording(320, 480);
3700b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            drawPicture(record, 120);
3710b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            canvas->translate(0, SkIntToScalar(120));
3720b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
3730b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            SkRect clip;
3740b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            clip.set(0, 0, SkIntToScalar(160), SkIntToScalar(160));
3750b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            do {
3760b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                canvas->save();
3770b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                canvas->clipRect(clip);
3780b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                picture.draw(canvas);
3790b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                canvas->restore();
3800b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                if (clip.fRight < SkIntToScalar(320))
3810b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                    clip.offset(SkIntToScalar(160), 0);
3820b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                else if (clip.fBottom < SkIntToScalar(480))
3830b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                    clip.offset(-SkIntToScalar(320), SkIntToScalar(160));
3840b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                else
3850b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                    break;
3860b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            } while (true);
3870b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        }
3880b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
3890b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
3900b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    void drawPicture(SkCanvas* canvas, int spriteOffset) {
3910b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	    SkMatrix matrix; matrix.reset();
3920b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		SkPaint paint;
3930b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		SkPath path;
3940b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkPoint start = {0, 0};
3950b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkPoint stop = { SkIntToScalar(40), SkIntToScalar(40) };
3960b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		SkRect rect = {0, 0, SkIntToScalar(40), SkIntToScalar(40) };
3970b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		SkRect rect2 = {0, 0, SkIntToScalar(65), SkIntToScalar(20) };
3980b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		SkScalar left = 0, top = 0, x = 0, y = 0;
3990b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		size_t index;
4000b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
4010b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		char ascii[] = "ascii...";
4020b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		size_t asciiLength = sizeof(ascii) - 1;
4030b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		char utf8[] = "utf8" "\xe2\x80\xa6";
4040b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		short utf16[] = {'u', 't', 'f', '1', '6', 0x2026 };
4050b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		short utf16simple[] = {'u', 't', 'f', '1', '6', '!' };
4060b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
4070b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        makePath(path);
4080b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkTDArray<SkPoint>(pos);
4090b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		pos.setCount(asciiLength);
4100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		for (index = 0;  index < asciiLength; index++)
4110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger			pos[index].set(SkIntToScalar(index * 10), SkIntToScalar(index * 2));
4120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkTDArray<SkPoint>(pos2);
4130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		pos2.setCount(asciiLength);
4140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		for (index = 0;  index < asciiLength; index++)
4150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger			pos2[index].set(SkIntToScalar(index * 10), SkIntToScalar(20));
4160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
4170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        // shaders
4180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkPoint linearPoints[] = { { 0, 0, }, { SkIntToScalar(40), SkIntToScalar(40) } };
4190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkColor linearColors[] = { SK_ColorRED, SK_ColorBLUE };
4200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkScalar* linearPos = NULL;
4210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        int linearCount = 2;
4220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkShader::TileMode linearMode = SkShader::kMirror_TileMode;
4230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkUnitMapper* linearMapper = new SkDiscreteMapper(3);
4240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkAutoUnref unmapLinearMapper(linearMapper);
4250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkShader* linear = SkGradientShader::CreateLinear(linearPoints,
4260b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            linearColors, linearPos, linearCount, linearMode, linearMapper);
4270b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
4280b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkPoint radialCenter = { SkIntToScalar(25), SkIntToScalar(25) };
4290b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkScalar radialRadius = SkIntToScalar(25);
4300b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkColor radialColors[] = { SK_ColorGREEN, SK_ColorGRAY, SK_ColorRED };
4310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkScalar radialPos[] = { 0, SkIntToScalar(3) / 5, SkIntToScalar(1)};
4320b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        int radialCount = 3;
4330b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkShader::TileMode radialMode = SkShader::kRepeat_TileMode;
4340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkUnitMapper* radialMapper = new SkCosineMapper();
4350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkAutoUnref unmapRadialMapper(radialMapper);
4360b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkShader* radial = SkGradientShader::CreateRadial(radialCenter,
4370b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            radialRadius, radialColors, radialPos, radialCount,
4380b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            radialMode, radialMapper);
4390b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
4400b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkTransparentShader* transparentShader = new SkTransparentShader();
4410b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkEmbossMaskFilter::Light light;
4420b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        light.fDirection[0] = SK_Scalar1/2;
4430b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        light.fDirection[1] = SK_Scalar1/2;
4440b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        light.fDirection[2] = SK_Scalar1/3;
4450b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        light.fAmbient		= 0x48;
4460b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        light.fSpecular		= 0x80;
4470b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkScalar radius = SkIntToScalar(12)/5;
4480b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkEmbossMaskFilter* embossFilter = new SkEmbossMaskFilter(light,
4490b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            radius);
4500b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
4510b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkXfermode* xfermode = SkXfermode::Create(SkXfermode::kXor_Mode);
4520b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkColorFilter* lightingFilter = SkColorFilter::CreateLightingFilter(
4530b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            0xff89bc45, 0xff112233);
4540b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
4550b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        canvas->save();
4560b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		canvas->translate(SkIntToScalar(0), SkIntToScalar(5));
4570b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		paint.setFlags(SkPaint::kAntiAlias_Flag | SkPaint::kFilterBitmap_Flag);
4580b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		// !!! draw through a clip
4590b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		paint.setColor(SK_ColorLTGRAY);
4600b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		paint.setStyle(SkPaint::kFill_Style);
4610b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkRect clip = {0, 0, SkIntToScalar(320), SkIntToScalar(120)};
4620b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        canvas->clipRect(clip);
4630b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        paint.setShader(SkShader::CreateBitmapShader(fTx,
4640b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            SkShader::kMirror_TileMode, SkShader::kRepeat_TileMode))->unref();
4650b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		canvas->drawPaint(paint);
4660b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		canvas->save();
4670b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
4680b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        // line (exercises xfermode, colorShader, colorFilter, filterShader)
4690b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		paint.setColor(SK_ColorGREEN);
4700b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		paint.setStrokeWidth(SkIntToScalar(10));
4710b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		paint.setStyle(SkPaint::kStroke_Style);
4720b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        paint.setXfermode(xfermode)->unref();
4730b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        paint.setColorFilter(lightingFilter)->unref();
4740b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		canvas->drawLine(start.fX, start.fY, stop.fX, stop.fY, paint); // should not be green
4750b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		paint.setXfermode(NULL);
4760b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        paint.setColorFilter(NULL);
4770b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
4780b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        // rectangle
4790b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		paint.setStyle(SkPaint::kFill_Style);
4800b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		canvas->translate(SkIntToScalar(50), 0);
4810b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		paint.setColor(SK_ColorYELLOW);
4820b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        paint.setShader(linear)->unref();
4830b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        paint.setPathEffect(pathEffectTest())->unref();
4840b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		canvas->drawRect(rect, paint);
4850b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        paint.setPathEffect(NULL);
4860b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
4870b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        // circle w/ emboss & transparent (exercises 3dshader)
4880b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		canvas->translate(SkIntToScalar(50), 0);
4890b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        paint.setMaskFilter(embossFilter)->unref();
4900b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        canvas->drawOval(rect, paint);
4910b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		canvas->translate(SkIntToScalar(10), SkIntToScalar(10));
4920b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        paint.setShader(transparentShader)->unref();
4930b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        canvas->drawOval(rect, paint);
4940b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		canvas->translate(0, SkIntToScalar(-10));
4950b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
4960b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        // path
4970b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		canvas->translate(SkIntToScalar(50), 0);
4980b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		paint.setColor(SK_ColorRED);
4990b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		paint.setStyle(SkPaint::kStroke_Style);
5000b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		paint.setStrokeWidth(SkIntToScalar(5));
5010b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        paint.setShader(radial)->unref();
5020b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        paint.setMaskFilter(NULL);
5030b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		canvas->drawPath(path, paint);
5040b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
5050b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        paint.setShader(NULL);
5060b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        // bitmap, sprite
5070b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		canvas->translate(SkIntToScalar(50), 0);
5080b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		paint.setStyle(SkPaint::kFill_Style);
5090b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		canvas->drawBitmap(fBug, left, top, &paint);
5100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		canvas->translate(SkIntToScalar(30), 0);
5110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		canvas->drawSprite(fTb,
5120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger			SkScalarRound(canvas->getTotalMatrix().getTranslateX()),
5130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            spriteOffset + 10, &paint);
5140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
5150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		canvas->translate(-SkIntToScalar(30), SkIntToScalar(30));
5160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        paint.setShader(shaderTest())->unref(); // test compose shader
5170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		canvas->drawRect(rect2, paint);
5180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        paint.setShader(NULL);
5190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
5200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        canvas->restore();
5210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        // text
5220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		canvas->translate(0, SkIntToScalar(60));
5230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        canvas->save();
5240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		paint.setColor(SK_ColorGRAY);
5250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		canvas->drawPosText(ascii, asciiLength, pos.begin(), paint);
5260b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		canvas->drawPosText(ascii, asciiLength, pos2.begin(), paint);
5270b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
5280b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		canvas->translate(SkIntToScalar(50), 0);
5290b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		paint.setColor(SK_ColorCYAN);
5300b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		canvas->drawText(utf8, sizeof(utf8) - 1, x, y, paint);
5310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
5320b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		canvas->translate(SkIntToScalar(30), 0);
5330b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		paint.setColor(SK_ColorMAGENTA);
5340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		paint.setTextEncoding(SkPaint::kUTF16_TextEncoding);
5350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        matrix.setTranslate(SkIntToScalar(10), SkIntToScalar(10));
5360b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		canvas->drawTextOnPath((void*) utf16, sizeof(utf16), path, &matrix, paint);
5370b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		canvas->translate(0, SkIntToScalar(20));
5380b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		canvas->drawTextOnPath((void*) utf16simple, sizeof(utf16simple), path, &matrix, paint);
5390b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        canvas->restore();
5400b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
5410b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        canvas->translate(0, SkIntToScalar(60));
5420b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		paint.setTextEncoding(SkPaint::kUTF8_TextEncoding);
5430b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        canvas->restore();
5440b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
5450b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
5460b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    /*
5470b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger./SkColorFilter.h:25:class SkColorFilter : public SkFlattenable { -- abstract
5480b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    static SkColorFilter* CreatXfermodeFilter() *** untested ***
5490b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    static SkColorFilter* CreatePorterDuffFilter() *** untested ***
5500b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    static SkColorFilter* CreateLightingFilter() -- tested
5510b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger./SkDrawLooper.h:9:class SkDrawLooper : public SkFlattenable { -- virtually abstract
5520b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    ./SkBlurDrawLooper.h:9:class SkBlurDrawLooper : public SkDrawLooper { *** untested ***
5530b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger./SkMaskFilter.h:41:class SkMaskFilter : public SkFlattenable { -- abstract chmod +w .h
5540b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    ./SkEmbossMaskFilter.h:27:class SkEmbossMaskFilter : public SkMaskFilter { -- tested
5550b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger./SkPathEffect.h:33:class SkPathEffect : public SkFlattenable { -- abstract
5560b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    ./Sk1DPathEffect.h:27:class Sk1DPathEffect : public SkPathEffect { -- abstract
5570b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        ./Sk1DPathEffect.h:48:class SkPath1DPathEffect : public Sk1DPathEffect { -- tested
5580b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    ./Sk2DPathEffect.h:25:class Sk2DPathEffect : public SkPathEffect { *** untested ***
5590b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    ./SkCornerPathEffect.h:28:class SkCornerPathEffect : public SkPathEffect { *** untested ***
5600b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    ./SkDashPathEffect.h:27:class SkDashPathEffect : public SkPathEffect {
5610b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    ./SkDiscretePathEffect.h:27:class SkDiscretePathEffect : public SkPathEffect {
5620b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    ./SkPaint.h:760:class SkStrokePathEffect : public SkPathEffect {
5630b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    ./SkPathEffect.h:58:class SkPairPathEffect : public SkPathEffect {
5640b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        ./SkPathEffect.h:78:class SkComposePathEffect : public SkPairPathEffect {
5650b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        ./SkPathEffect.h:114:class SkSumPathEffect : public SkPairPathEffect {
5660b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger./SkRasterizer.h:29:class SkRasterizer : public SkFlattenable {
5670b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    ./SkLayerRasterizer.h:27:class SkLayerRasterizer : public SkRasterizer {
5680b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger./SkShader.h:36:class SkShader : public SkFlattenable {
5690b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    ./SkColorFilter.h:59:class SkFilterShader : public SkShader {
5700b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    ./SkColorShader.h:26:class SkColorShader : public SkShader {
5710b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    ./SkShaderExtras.h:31:class SkComposeShader : public SkShader {
5720b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    ./SkTransparentShader.h:23:class SkTransparentShader : public SkShader {
5730b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger./SkUnitMapper.h:24:class SkUnitMapper : public SkFlattenable {
5740b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    ./SkUnitMapper.h:33:class SkDiscreteMapper : public SkUnitMapper {
5750b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    ./SkUnitMapper.h:51:class SkFlipCosineMapper : public SkUnitMapper {
5760b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger./SkXfermode.h:32:class SkXfermode : public SkFlattenable {
5770b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    ./SkAvoidXfermode.h:28:class SkAvoidXfermode : public SkXfermode { *** not done *** chmod +w .h .cpp
5780b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    ./SkXfermode.h:54:class SkProcXfermode : public SkXfermode {
5790b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    */
5800b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
5810b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    /*
5820b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger./SkBlurMaskFilter.h:25:class SkBlurMaskFilter {
5830b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    chmod +w SkBlurMaskFilter.cpp
5840b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger./SkGradientShader.h:30:class SkGradientShader {
5850b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    */
5860b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        // save layer, bounder, looper
5870b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        // matrix
5880b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        // clip /path/region
5890b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        // bitmap proc shader ?
5900b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
5910b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger/* untested:
5920b15698a8c76bb8abc1b555c1d91892669b4118fDerek SollenbergerSkCornerPathEffect.h:28:class SkCornerPathEffect : public SkPathEffect {
5930b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger*/
5940b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
5950b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) {
5960b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        fClickPt.set(x, y);
5970b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        this->inval(NULL);
5980b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        return this->INHERITED::onFindClickHandler(x, y);
5990b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
6000b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
6010b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkPathEffect* pathEffectTest() {
6020b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        static const int gXY[] = { 1, 0, 0, -1, 2, -1, 3, 0, 2, 1, 0, 1 };
6030b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkScalar gPhase = 0;
6040b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkPath path;
6050b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        path.moveTo(SkIntToScalar(gXY[0]), SkIntToScalar(gXY[1]));
6060b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        for (unsigned i = 2; i < SK_ARRAY_COUNT(gXY); i += 2)
6070b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            path.lineTo(SkIntToScalar(gXY[i]), SkIntToScalar(gXY[i+1]));
6080b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        path.close();
6090b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        path.offset(SkIntToScalar(-6), 0);
6100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkPathEffect* outer = new SkPath1DPathEffect(path, SkIntToScalar(12),
6110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            gPhase, SkPath1DPathEffect::kRotate_Style);
6120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkPathEffect* inner = new SkDiscretePathEffect(SkIntToScalar(2),
6130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            SkIntToScalar(1)/10); // SkCornerPathEffect(SkIntToScalar(2));
6140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkPathEffect* result = new SkComposePathEffect(outer, inner);
6150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        outer->unref();
6160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        inner->unref();
6170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        return result;
6180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
6190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
6200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkPathEffect* pathEffectTest2() { // unsure this works (has no visible effect)
6210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkPathEffect* outer = new SkStrokePathEffect(SkIntToScalar(4),
6220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            SkPaint::kStroke_Style, SkPaint::kMiter_Join, SkPaint::kButt_Cap);
6230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        static const SkScalar intervals[] = {SkIntToScalar(1), SkIntToScalar(2),
6240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            SkIntToScalar(2), SkIntToScalar(1)};
6250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkPathEffect* inner = new SkDashPathEffect(intervals,
6260b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            sizeof(intervals) / sizeof(intervals[0]), 0);
6270b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkPathEffect* result = new SkSumPathEffect(outer, inner);
6280b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        outer->unref();
6290b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        inner->unref();
6300b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        return result;
6310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
6320b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
6330b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkShader* shaderTest() {
6340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkPoint pts[] = { { 0, 0, }, { SkIntToScalar(100), 0 } };
6350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkColor colors[] = { SK_ColorRED, SK_ColorBLUE };
6360b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkShader* shaderA = SkGradientShader::CreateLinear(pts, colors, NULL,
6370b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            2, SkShader::kClamp_TileMode);
6380b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        pts[1].set(0, SkIntToScalar(100));
6390b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkColor colors2[] = {SK_ColorBLACK,  SkColorSetARGB(0x80, 0, 0, 0)};
6400b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkShader* shaderB = SkGradientShader::CreateLinear(pts, colors2, NULL,
6410b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            2, SkShader::kClamp_TileMode);
6420b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkXfermode* mode = SkXfermode::Create(SkXfermode::kDstIn_Mode);
6430b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkShader* result = new SkComposeShader(shaderA, shaderB, mode);
6440b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        shaderA->unref();
6450b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        shaderB->unref();
6460b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        mode->unref();
6470b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        return result;
6480b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
6490b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
6500b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    virtual void startTest() {
6510b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		SkImageDecoder::DecodeFile("/Users/caryclark/Desktop/bugcirc.gif", &fBug);
6520b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		SkImageDecoder::DecodeFile("/Users/caryclark/Desktop/tbcirc.gif", &fTb);
6530b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		SkImageDecoder::DecodeFile("/Users/caryclark/Desktop/05psp04.gif", &fTx);
6540b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	}
6550b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
6560b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    void drawRaster(SkCanvas* canvas)  {
6570b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        for (size_t index = 0; index < SK_ARRAY_COUNT(gRastProcs); index++)
6580b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            drawOneRaster(canvas);
6590b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
6600b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
6610b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    void drawOneRaster(SkCanvas* canvas) {
6620b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        canvas->save();
6630b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
6640b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkScalar    x = SkIntToScalar(20);
6650b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkScalar    y = SkIntToScalar(40);
6660b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkPaint     paint;
6670b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
6680b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        paint.setAntiAlias(true);
6690b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        paint.setTextSize(SkIntToScalar(48));
6700b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        paint.setTypeface(SkTypeface::CreateFromName("sans-serif",
6710b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                                                     SkTypeface::kBold));
6720b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
6730b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkString str("GOOGLE");
6740b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
6750b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        for (size_t i = 0; i < SK_ARRAY_COUNT(gRastProcs); i++) {
6760b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            apply_shader(&paint, i);
6770b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
6780b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger          //  paint.setMaskFilter(NULL);
6790b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger          //  paint.setColor(SK_ColorBLACK);
6800b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
6810b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#if 01
6820b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            int index = i % SK_ARRAY_COUNT(gLightingColors);
6830b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            paint.setColorFilter(SkColorFilter::CreateLightingFilter(
6840b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                                    gLightingColors[index].fMul,
6850b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                                    gLightingColors[index].fAdd))->unref();
6860b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#endif
6870b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
6880b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            canvas->drawText(str.c_str(), str.size(), x, y, paint);
6890b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            SkRect  oval = { x, y - SkIntToScalar(40), x + SkIntToScalar(40), y };
6900b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            paint.setStyle(SkPaint::kStroke_Style);
6910b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            canvas->drawOval(oval, paint);
6920b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            paint.setStyle(SkPaint::kFill_Style);
6930b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
6940b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            y += paint.getFontSpacing();
6950b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        }
6960b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
6970b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        canvas->restore();
6980b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
6990b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        if (1) {
7000b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            SkAvoidXfermode   mode(SK_ColorWHITE, 0xFF,
7010b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                                   SkAvoidXfermode::kTargetColor_Mode);
7020b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            SkPaint paint;
7030b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            x += SkIntToScalar(20);
7040b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            SkRect  r = { x, 0, x + SkIntToScalar(360), SkIntToScalar(700) };
7050b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            paint.setXfermode(&mode);
7060b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            paint.setColor(SK_ColorGREEN);
7070b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            paint.setAntiAlias(true);
7080b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            canvas->drawOval(r, paint);
7090b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        }
7100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
7110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
7120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerprivate:
7130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkPoint fClickPt;
7140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkBitmap fBug, fTb, fTx;
7150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    typedef SampleView INHERITED;
7160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger};
7170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
7180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger//////////////////////////////////////////////////////////////////////////////
7190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
7200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic SkView* MyFactory() { return new DemoView; }
7210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic SkViewRegister reg(MyFactory);
7220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
723