SampleSlides.cpp revision 3a67a668dbdc3a6bba68700a6dfdef8164ae0c69
1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
863e34c61818b92c4f40387a1de32594934295bbbreed@android.com#include "SampleCode.h"
963e34c61818b92c4f40387a1de32594934295bbbreed@android.com#include "SkView.h"
1063e34c61818b92c4f40387a1de32594934295bbbreed@android.com#include "SkCanvas.h"
1163e34c61818b92c4f40387a1de32594934295bbbreed@android.com#include "SkDevice.h"
1263e34c61818b92c4f40387a1de32594934295bbbreed@android.com#include "SkPaint.h"
1363e34c61818b92c4f40387a1de32594934295bbbreed@android.com
148af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com#define BG_COLOR    0xFFDDDDDD
158af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
1663e34c61818b92c4f40387a1de32594934295bbbreed@android.comtypedef void (*SlideProc)(SkCanvas*);
1763e34c61818b92c4f40387a1de32594934295bbbreed@android.com
1863e34c61818b92c4f40387a1de32594934295bbbreed@android.com///////////////////////////////////////////////////////////////////////////////
1963e34c61818b92c4f40387a1de32594934295bbbreed@android.com
2063e34c61818b92c4f40387a1de32594934295bbbreed@android.com#include "Sk1DPathEffect.h"
2163e34c61818b92c4f40387a1de32594934295bbbreed@android.com#include "Sk2DPathEffect.h"
2263e34c61818b92c4f40387a1de32594934295bbbreed@android.com#include "SkCornerPathEffect.h"
2363e34c61818b92c4f40387a1de32594934295bbbreed@android.com#include "SkDashPathEffect.h"
2463e34c61818b92c4f40387a1de32594934295bbbreed@android.com#include "SkDiscretePathEffect.h"
2563e34c61818b92c4f40387a1de32594934295bbbreed@android.com
2663e34c61818b92c4f40387a1de32594934295bbbreed@android.comstatic void compose_pe(SkPaint* paint) {
2763e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkPathEffect* pe = paint->getPathEffect();
2863e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkPathEffect* corner = new SkCornerPathEffect(25);
2963e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkPathEffect* compose;
3063e34c61818b92c4f40387a1de32594934295bbbreed@android.com    if (pe) {
3163e34c61818b92c4f40387a1de32594934295bbbreed@android.com        compose = new SkComposePathEffect(pe, corner);
3263e34c61818b92c4f40387a1de32594934295bbbreed@android.com        corner->unref();
3363e34c61818b92c4f40387a1de32594934295bbbreed@android.com    } else {
3463e34c61818b92c4f40387a1de32594934295bbbreed@android.com        compose = corner;
3563e34c61818b92c4f40387a1de32594934295bbbreed@android.com    }
3663e34c61818b92c4f40387a1de32594934295bbbreed@android.com    paint->setPathEffect(compose)->unref();
3763e34c61818b92c4f40387a1de32594934295bbbreed@android.com}
3863e34c61818b92c4f40387a1de32594934295bbbreed@android.com
3963e34c61818b92c4f40387a1de32594934295bbbreed@android.comstatic void hair_pe(SkPaint* paint) {
4063e34c61818b92c4f40387a1de32594934295bbbreed@android.com    paint->setStrokeWidth(0);
4163e34c61818b92c4f40387a1de32594934295bbbreed@android.com}
4263e34c61818b92c4f40387a1de32594934295bbbreed@android.com
4363e34c61818b92c4f40387a1de32594934295bbbreed@android.comstatic void hair2_pe(SkPaint* paint) {
4463e34c61818b92c4f40387a1de32594934295bbbreed@android.com    paint->setStrokeWidth(0);
4563e34c61818b92c4f40387a1de32594934295bbbreed@android.com    compose_pe(paint);
4663e34c61818b92c4f40387a1de32594934295bbbreed@android.com}
4763e34c61818b92c4f40387a1de32594934295bbbreed@android.com
4863e34c61818b92c4f40387a1de32594934295bbbreed@android.comstatic void stroke_pe(SkPaint* paint) {
4963e34c61818b92c4f40387a1de32594934295bbbreed@android.com    paint->setStrokeWidth(12);
5063e34c61818b92c4f40387a1de32594934295bbbreed@android.com    compose_pe(paint);
5163e34c61818b92c4f40387a1de32594934295bbbreed@android.com}
5263e34c61818b92c4f40387a1de32594934295bbbreed@android.com
5363e34c61818b92c4f40387a1de32594934295bbbreed@android.comstatic void dash_pe(SkPaint* paint) {
5463e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkScalar inter[] = { 20, 10, 10, 10 };
5563e34c61818b92c4f40387a1de32594934295bbbreed@android.com    paint->setStrokeWidth(12);
5663e34c61818b92c4f40387a1de32594934295bbbreed@android.com    paint->setPathEffect(new SkDashPathEffect(inter, SK_ARRAY_COUNT(inter),
5763e34c61818b92c4f40387a1de32594934295bbbreed@android.com                                              0))->unref();
5863e34c61818b92c4f40387a1de32594934295bbbreed@android.com    compose_pe(paint);
5963e34c61818b92c4f40387a1de32594934295bbbreed@android.com}
6063e34c61818b92c4f40387a1de32594934295bbbreed@android.com
6163e34c61818b92c4f40387a1de32594934295bbbreed@android.comstatic const int gXY[] = {
6263e34c61818b92c4f40387a1de32594934295bbbreed@android.com4, 0, 0, -4, 8, -4, 12, 0, 8, 4, 0, 4
6363e34c61818b92c4f40387a1de32594934295bbbreed@android.com};
6463e34c61818b92c4f40387a1de32594934295bbbreed@android.com
6563e34c61818b92c4f40387a1de32594934295bbbreed@android.comstatic void scale(SkPath* path, SkScalar scale) {
6663e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkMatrix m;
6763e34c61818b92c4f40387a1de32594934295bbbreed@android.com    m.setScale(scale, scale);
6863e34c61818b92c4f40387a1de32594934295bbbreed@android.com    path->transform(m);
6963e34c61818b92c4f40387a1de32594934295bbbreed@android.com}
7063e34c61818b92c4f40387a1de32594934295bbbreed@android.com
7163e34c61818b92c4f40387a1de32594934295bbbreed@android.comstatic void one_d_pe(SkPaint* paint) {
7263e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkPath  path;
7363e34c61818b92c4f40387a1de32594934295bbbreed@android.com    path.moveTo(SkIntToScalar(gXY[0]), SkIntToScalar(gXY[1]));
7463e34c61818b92c4f40387a1de32594934295bbbreed@android.com    for (unsigned i = 2; i < SK_ARRAY_COUNT(gXY); i += 2)
7563e34c61818b92c4f40387a1de32594934295bbbreed@android.com        path.lineTo(SkIntToScalar(gXY[i]), SkIntToScalar(gXY[i+1]));
7663e34c61818b92c4f40387a1de32594934295bbbreed@android.com    path.close();
7763e34c61818b92c4f40387a1de32594934295bbbreed@android.com    path.offset(SkIntToScalar(-6), 0);
78c6ce750c73c6586a5c2e88a0620b04e9569af401robertphillips@google.com    scale(&path, SkFloatToScalar(1.5f));
7963e34c61818b92c4f40387a1de32594934295bbbreed@android.com
8063e34c61818b92c4f40387a1de32594934295bbbreed@android.com    paint->setPathEffect(new SkPath1DPathEffect(path, SkIntToScalar(21), 0,
8163e34c61818b92c4f40387a1de32594934295bbbreed@android.com                                SkPath1DPathEffect::kRotate_Style))->unref();
8263e34c61818b92c4f40387a1de32594934295bbbreed@android.com    compose_pe(paint);
8363e34c61818b92c4f40387a1de32594934295bbbreed@android.com}
8463e34c61818b92c4f40387a1de32594934295bbbreed@android.com
8563e34c61818b92c4f40387a1de32594934295bbbreed@android.comtypedef void (*PE_Proc)(SkPaint*);
8663e34c61818b92c4f40387a1de32594934295bbbreed@android.comstatic const PE_Proc gPE[] = { hair_pe, hair2_pe, stroke_pe, dash_pe, one_d_pe };
8763e34c61818b92c4f40387a1de32594934295bbbreed@android.com
8863e34c61818b92c4f40387a1de32594934295bbbreed@android.comstatic void fill_pe(SkPaint* paint) {
8963e34c61818b92c4f40387a1de32594934295bbbreed@android.com    paint->setStyle(SkPaint::kFill_Style);
9063e34c61818b92c4f40387a1de32594934295bbbreed@android.com    paint->setPathEffect(NULL);
9163e34c61818b92c4f40387a1de32594934295bbbreed@android.com}
9263e34c61818b92c4f40387a1de32594934295bbbreed@android.com
9363e34c61818b92c4f40387a1de32594934295bbbreed@android.comstatic void discrete_pe(SkPaint* paint) {
9463e34c61818b92c4f40387a1de32594934295bbbreed@android.com    paint->setPathEffect(new SkDiscretePathEffect(10, 4))->unref();
9563e34c61818b92c4f40387a1de32594934295bbbreed@android.com}
9663e34c61818b92c4f40387a1de32594934295bbbreed@android.com
9743e9f20f4b5eecb2335e26461b5c4c84f2e3bcd2reed@google.comstatic SkPathEffect* MakeTileEffect() {
9843e9f20f4b5eecb2335e26461b5c4c84f2e3bcd2reed@google.com    SkMatrix m;
9943e9f20f4b5eecb2335e26461b5c4c84f2e3bcd2reed@google.com    m.setScale(SkIntToScalar(12), SkIntToScalar(12));
10063e34c61818b92c4f40387a1de32594934295bbbreed@android.com
10143e9f20f4b5eecb2335e26461b5c4c84f2e3bcd2reed@google.com    SkPath path;
10243e9f20f4b5eecb2335e26461b5c4c84f2e3bcd2reed@google.com    path.addCircle(0, 0, SkIntToScalar(5));
10343e9f20f4b5eecb2335e26461b5c4c84f2e3bcd2reed@google.com
10443e9f20f4b5eecb2335e26461b5c4c84f2e3bcd2reed@google.com    return new SkPath2DPathEffect(m, path);
10543e9f20f4b5eecb2335e26461b5c4c84f2e3bcd2reed@google.com}
10663e34c61818b92c4f40387a1de32594934295bbbreed@android.com
10763e34c61818b92c4f40387a1de32594934295bbbreed@android.comstatic void tile_pe(SkPaint* paint) {
10843e9f20f4b5eecb2335e26461b5c4c84f2e3bcd2reed@google.com    paint->setPathEffect(MakeTileEffect())->unref();
10963e34c61818b92c4f40387a1de32594934295bbbreed@android.com}
11063e34c61818b92c4f40387a1de32594934295bbbreed@android.com
11163e34c61818b92c4f40387a1de32594934295bbbreed@android.comstatic const PE_Proc gPE2[] = { fill_pe, discrete_pe, tile_pe };
11263e34c61818b92c4f40387a1de32594934295bbbreed@android.com
11363e34c61818b92c4f40387a1de32594934295bbbreed@android.comstatic void patheffect_slide(SkCanvas* canvas) {
11463e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkPaint paint;
11563e34c61818b92c4f40387a1de32594934295bbbreed@android.com    paint.setAntiAlias(true);
11663e34c61818b92c4f40387a1de32594934295bbbreed@android.com    paint.setStyle(SkPaint::kStroke_Style);
11763e34c61818b92c4f40387a1de32594934295bbbreed@android.com
11863e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkPath path;
11963e34c61818b92c4f40387a1de32594934295bbbreed@android.com    path.moveTo(20, 20);
12063e34c61818b92c4f40387a1de32594934295bbbreed@android.com    path.lineTo(70, 120);
12163e34c61818b92c4f40387a1de32594934295bbbreed@android.com    path.lineTo(120, 30);
12263e34c61818b92c4f40387a1de32594934295bbbreed@android.com    path.lineTo(170, 80);
12363e34c61818b92c4f40387a1de32594934295bbbreed@android.com    path.lineTo(240, 50);
12463e34c61818b92c4f40387a1de32594934295bbbreed@android.com
12563e34c61818b92c4f40387a1de32594934295bbbreed@android.com    size_t i;
12663e34c61818b92c4f40387a1de32594934295bbbreed@android.com    canvas->save();
12763e34c61818b92c4f40387a1de32594934295bbbreed@android.com    for (i = 0; i < SK_ARRAY_COUNT(gPE); i++) {
12863e34c61818b92c4f40387a1de32594934295bbbreed@android.com        gPE[i](&paint);
12963e34c61818b92c4f40387a1de32594934295bbbreed@android.com        canvas->drawPath(path, paint);
13063e34c61818b92c4f40387a1de32594934295bbbreed@android.com        canvas->translate(0, 75);
13163e34c61818b92c4f40387a1de32594934295bbbreed@android.com    }
13263e34c61818b92c4f40387a1de32594934295bbbreed@android.com    canvas->restore();
13363e34c61818b92c4f40387a1de32594934295bbbreed@android.com
13463e34c61818b92c4f40387a1de32594934295bbbreed@android.com    path.reset();
13563e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkRect r = { 0, 0, 250, 120 };
13663e34c61818b92c4f40387a1de32594934295bbbreed@android.com    path.addOval(r, SkPath::kCW_Direction);
13763e34c61818b92c4f40387a1de32594934295bbbreed@android.com    r.inset(50, 50);
13863e34c61818b92c4f40387a1de32594934295bbbreed@android.com    path.addRect(r, SkPath::kCCW_Direction);
13963e34c61818b92c4f40387a1de32594934295bbbreed@android.com
14063e34c61818b92c4f40387a1de32594934295bbbreed@android.com    canvas->translate(320, 20);
14163e34c61818b92c4f40387a1de32594934295bbbreed@android.com    for (i = 0; i < SK_ARRAY_COUNT(gPE2); i++) {
14263e34c61818b92c4f40387a1de32594934295bbbreed@android.com        gPE2[i](&paint);
14363e34c61818b92c4f40387a1de32594934295bbbreed@android.com        canvas->drawPath(path, paint);
14463e34c61818b92c4f40387a1de32594934295bbbreed@android.com        canvas->translate(0, 160);
14563e34c61818b92c4f40387a1de32594934295bbbreed@android.com    }
14663e34c61818b92c4f40387a1de32594934295bbbreed@android.com}
14763e34c61818b92c4f40387a1de32594934295bbbreed@android.com
14863e34c61818b92c4f40387a1de32594934295bbbreed@android.com///////////////////////////////////////////////////////////////////////////////
14963e34c61818b92c4f40387a1de32594934295bbbreed@android.com
15063e34c61818b92c4f40387a1de32594934295bbbreed@android.com#include "SkGradientShader.h"
15163e34c61818b92c4f40387a1de32594934295bbbreed@android.com
15263e34c61818b92c4f40387a1de32594934295bbbreed@android.comstruct GradData {
15363e34c61818b92c4f40387a1de32594934295bbbreed@android.com    int             fCount;
15463e34c61818b92c4f40387a1de32594934295bbbreed@android.com    const SkColor*  fColors;
15563e34c61818b92c4f40387a1de32594934295bbbreed@android.com    const SkScalar* fPos;
15663e34c61818b92c4f40387a1de32594934295bbbreed@android.com};
15763e34c61818b92c4f40387a1de32594934295bbbreed@android.com
15863e34c61818b92c4f40387a1de32594934295bbbreed@android.comstatic const SkColor gColors[] = {
15963e34c61818b92c4f40387a1de32594934295bbbreed@android.comSK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK
16063e34c61818b92c4f40387a1de32594934295bbbreed@android.com};
16163e34c61818b92c4f40387a1de32594934295bbbreed@android.comstatic const SkScalar gPos0[] = { 0, SK_Scalar1 };
16263e34c61818b92c4f40387a1de32594934295bbbreed@android.comstatic const SkScalar gPos1[] = { SK_Scalar1/4, SK_Scalar1*3/4 };
16363e34c61818b92c4f40387a1de32594934295bbbreed@android.comstatic const SkScalar gPos2[] = {
16463e34c61818b92c4f40387a1de32594934295bbbreed@android.com0, SK_Scalar1/8, SK_Scalar1/2, SK_Scalar1*7/8, SK_Scalar1
16563e34c61818b92c4f40387a1de32594934295bbbreed@android.com};
16663e34c61818b92c4f40387a1de32594934295bbbreed@android.com
16763e34c61818b92c4f40387a1de32594934295bbbreed@android.comstatic const GradData gGradData[] = {
16863e34c61818b92c4f40387a1de32594934295bbbreed@android.com{ 2, gColors, NULL },
16963e34c61818b92c4f40387a1de32594934295bbbreed@android.com{ 2, gColors, gPos0 },
17063e34c61818b92c4f40387a1de32594934295bbbreed@android.com{ 2, gColors, gPos1 },
17163e34c61818b92c4f40387a1de32594934295bbbreed@android.com{ 5, gColors, NULL },
17263e34c61818b92c4f40387a1de32594934295bbbreed@android.com{ 5, gColors, gPos2 }
17363e34c61818b92c4f40387a1de32594934295bbbreed@android.com};
17463e34c61818b92c4f40387a1de32594934295bbbreed@android.com
17563e34c61818b92c4f40387a1de32594934295bbbreed@android.comstatic SkShader* MakeLinear(const SkPoint pts[2], const GradData& data,
17663e34c61818b92c4f40387a1de32594934295bbbreed@android.com                            SkShader::TileMode tm, SkUnitMapper* mapper) {
17763e34c61818b92c4f40387a1de32594934295bbbreed@android.com    return SkGradientShader::CreateLinear(pts, data.fColors, data.fPos,
17863e34c61818b92c4f40387a1de32594934295bbbreed@android.com                                          data.fCount, tm, mapper);
17963e34c61818b92c4f40387a1de32594934295bbbreed@android.com}
18063e34c61818b92c4f40387a1de32594934295bbbreed@android.com
18163e34c61818b92c4f40387a1de32594934295bbbreed@android.comstatic SkShader* MakeRadial(const SkPoint pts[2], const GradData& data,
18263e34c61818b92c4f40387a1de32594934295bbbreed@android.com                            SkShader::TileMode tm, SkUnitMapper* mapper) {
18363e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkPoint center;
18463e34c61818b92c4f40387a1de32594934295bbbreed@android.com    center.set(SkScalarAve(pts[0].fX, pts[1].fX),
18563e34c61818b92c4f40387a1de32594934295bbbreed@android.com               SkScalarAve(pts[0].fY, pts[1].fY));
18663e34c61818b92c4f40387a1de32594934295bbbreed@android.com    return SkGradientShader::CreateRadial(center, center.fX, data.fColors,
18763e34c61818b92c4f40387a1de32594934295bbbreed@android.com                                          data.fPos, data.fCount, tm, mapper);
18863e34c61818b92c4f40387a1de32594934295bbbreed@android.com}
18963e34c61818b92c4f40387a1de32594934295bbbreed@android.com
19063e34c61818b92c4f40387a1de32594934295bbbreed@android.comstatic SkShader* MakeSweep(const SkPoint pts[2], const GradData& data,
19163e34c61818b92c4f40387a1de32594934295bbbreed@android.com                           SkShader::TileMode tm, SkUnitMapper* mapper) {
19263e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkPoint center;
19363e34c61818b92c4f40387a1de32594934295bbbreed@android.com    center.set(SkScalarAve(pts[0].fX, pts[1].fX),
19463e34c61818b92c4f40387a1de32594934295bbbreed@android.com               SkScalarAve(pts[0].fY, pts[1].fY));
19563e34c61818b92c4f40387a1de32594934295bbbreed@android.com    return SkGradientShader::CreateSweep(center.fX, center.fY, data.fColors,
19663e34c61818b92c4f40387a1de32594934295bbbreed@android.com                                         data.fPos, data.fCount, mapper);
19763e34c61818b92c4f40387a1de32594934295bbbreed@android.com}
19863e34c61818b92c4f40387a1de32594934295bbbreed@android.com
19963e34c61818b92c4f40387a1de32594934295bbbreed@android.comstatic SkShader* Make2Radial(const SkPoint pts[2], const GradData& data,
20063e34c61818b92c4f40387a1de32594934295bbbreed@android.com                             SkShader::TileMode tm, SkUnitMapper* mapper) {
20163e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkPoint center0, center1;
20263e34c61818b92c4f40387a1de32594934295bbbreed@android.com    center0.set(SkScalarAve(pts[0].fX, pts[1].fX),
20363e34c61818b92c4f40387a1de32594934295bbbreed@android.com                SkScalarAve(pts[0].fY, pts[1].fY));
20463e34c61818b92c4f40387a1de32594934295bbbreed@android.com    center1.set(SkScalarInterp(pts[0].fX, pts[1].fX, SkIntToScalar(3)/5),
20563e34c61818b92c4f40387a1de32594934295bbbreed@android.com                SkScalarInterp(pts[0].fY, pts[1].fY, SkIntToScalar(1)/4));
20663e34c61818b92c4f40387a1de32594934295bbbreed@android.com    return SkGradientShader::CreateTwoPointRadial(
20763e34c61818b92c4f40387a1de32594934295bbbreed@android.com                                                  center1, (pts[1].fX - pts[0].fX) / 7,
20863e34c61818b92c4f40387a1de32594934295bbbreed@android.com                                                  center0, (pts[1].fX - pts[0].fX) / 2,
20963e34c61818b92c4f40387a1de32594934295bbbreed@android.com                                                  data.fColors, data.fPos, data.fCount, tm, mapper);
21063e34c61818b92c4f40387a1de32594934295bbbreed@android.com}
21163e34c61818b92c4f40387a1de32594934295bbbreed@android.com
21263e34c61818b92c4f40387a1de32594934295bbbreed@android.comtypedef SkShader* (*GradMaker)(const SkPoint pts[2], const GradData& data,
21363e34c61818b92c4f40387a1de32594934295bbbreed@android.com                               SkShader::TileMode tm, SkUnitMapper* mapper);
21463e34c61818b92c4f40387a1de32594934295bbbreed@android.comstatic const GradMaker gGradMakers[] = {
21563e34c61818b92c4f40387a1de32594934295bbbreed@android.com    MakeLinear, MakeRadial, MakeSweep, Make2Radial
21663e34c61818b92c4f40387a1de32594934295bbbreed@android.com};
21763e34c61818b92c4f40387a1de32594934295bbbreed@android.com
21863e34c61818b92c4f40387a1de32594934295bbbreed@android.comstatic void gradient_slide(SkCanvas* canvas) {
21963e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkPoint pts[2] = {
22063e34c61818b92c4f40387a1de32594934295bbbreed@android.com        { 0, 0 },
22163e34c61818b92c4f40387a1de32594934295bbbreed@android.com        { SkIntToScalar(100), SkIntToScalar(100) }
22263e34c61818b92c4f40387a1de32594934295bbbreed@android.com    };
22363e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkShader::TileMode tm = SkShader::kClamp_TileMode;
22463e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkRect r = { 0, 0, SkIntToScalar(100), SkIntToScalar(100) };
22563e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkPaint paint;
22663e34c61818b92c4f40387a1de32594934295bbbreed@android.com    paint.setAntiAlias(true);
22763e34c61818b92c4f40387a1de32594934295bbbreed@android.com    paint.setDither(true);
22863e34c61818b92c4f40387a1de32594934295bbbreed@android.com
22963e34c61818b92c4f40387a1de32594934295bbbreed@android.com    canvas->translate(SkIntToScalar(20), SkIntToScalar(10));
23063e34c61818b92c4f40387a1de32594934295bbbreed@android.com    for (size_t i = 0; i < SK_ARRAY_COUNT(gGradData); i++) {
23163e34c61818b92c4f40387a1de32594934295bbbreed@android.com        canvas->save();
23263e34c61818b92c4f40387a1de32594934295bbbreed@android.com        for (size_t j = 0; j < SK_ARRAY_COUNT(gGradMakers); j++) {
23363e34c61818b92c4f40387a1de32594934295bbbreed@android.com            SkShader* shader = gGradMakers[j](pts, gGradData[i], tm, NULL);
23463e34c61818b92c4f40387a1de32594934295bbbreed@android.com            paint.setShader(shader);
23563e34c61818b92c4f40387a1de32594934295bbbreed@android.com            canvas->drawRect(r, paint);
23663e34c61818b92c4f40387a1de32594934295bbbreed@android.com            shader->unref();
23763e34c61818b92c4f40387a1de32594934295bbbreed@android.com            canvas->translate(0, SkIntToScalar(120));
23863e34c61818b92c4f40387a1de32594934295bbbreed@android.com        }
23963e34c61818b92c4f40387a1de32594934295bbbreed@android.com        canvas->restore();
24063e34c61818b92c4f40387a1de32594934295bbbreed@android.com        canvas->translate(SkIntToScalar(120), 0);
24163e34c61818b92c4f40387a1de32594934295bbbreed@android.com    }
24263e34c61818b92c4f40387a1de32594934295bbbreed@android.com}
24363e34c61818b92c4f40387a1de32594934295bbbreed@android.com
24463e34c61818b92c4f40387a1de32594934295bbbreed@android.com///////////////////////////////////////////////////////////////////////////////
24563e34c61818b92c4f40387a1de32594934295bbbreed@android.com
24663e34c61818b92c4f40387a1de32594934295bbbreed@android.com#include "SkPathMeasure.h"
24763e34c61818b92c4f40387a1de32594934295bbbreed@android.com
24863e34c61818b92c4f40387a1de32594934295bbbreed@android.comstatic SkScalar getpathlen(const SkPath& path) {
24963e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkPathMeasure   meas(path, false);
25063e34c61818b92c4f40387a1de32594934295bbbreed@android.com    return meas.getLength();
25163e34c61818b92c4f40387a1de32594934295bbbreed@android.com}
25263e34c61818b92c4f40387a1de32594934295bbbreed@android.com
25363e34c61818b92c4f40387a1de32594934295bbbreed@android.comstatic void textonpath_slide(SkCanvas* canvas) {
25463e34c61818b92c4f40387a1de32594934295bbbreed@android.com    const char* text = "Displacement";
25563e34c61818b92c4f40387a1de32594934295bbbreed@android.com    size_t len =strlen(text);
25663e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkPath path;
25763e34c61818b92c4f40387a1de32594934295bbbreed@android.com    path.moveTo(100, 300);
25863e34c61818b92c4f40387a1de32594934295bbbreed@android.com    path.quadTo(300, 100, 500, 300);
25963e34c61818b92c4f40387a1de32594934295bbbreed@android.com    path.offset(0, -100);
26063e34c61818b92c4f40387a1de32594934295bbbreed@android.com
26163e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkPaint paint;
26263e34c61818b92c4f40387a1de32594934295bbbreed@android.com    paint.setAntiAlias(true);
26363e34c61818b92c4f40387a1de32594934295bbbreed@android.com    paint.setTextSize(40);
26463e34c61818b92c4f40387a1de32594934295bbbreed@android.com
26563e34c61818b92c4f40387a1de32594934295bbbreed@android.com    paint.setStyle(SkPaint::kStroke_Style);
26663e34c61818b92c4f40387a1de32594934295bbbreed@android.com    canvas->drawPath(path, paint);
26763e34c61818b92c4f40387a1de32594934295bbbreed@android.com    paint.setStyle(SkPaint::kFill_Style);
26863e34c61818b92c4f40387a1de32594934295bbbreed@android.com
26963e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkScalar x = 50;
27063e34c61818b92c4f40387a1de32594934295bbbreed@android.com    paint.setColor(0xFF008800);
27163e34c61818b92c4f40387a1de32594934295bbbreed@android.com    canvas->drawTextOnPathHV(text, len, path,
27263e34c61818b92c4f40387a1de32594934295bbbreed@android.com                             x, paint.getTextSize()*2/3, paint);
27363e34c61818b92c4f40387a1de32594934295bbbreed@android.com    paint.setColor(SK_ColorRED);
27463e34c61818b92c4f40387a1de32594934295bbbreed@android.com    canvas->drawTextOnPathHV(text, len, path,
27563e34c61818b92c4f40387a1de32594934295bbbreed@android.com                             x + 60, 0, paint);
27663e34c61818b92c4f40387a1de32594934295bbbreed@android.com    paint.setColor(SK_ColorBLUE);
27763e34c61818b92c4f40387a1de32594934295bbbreed@android.com    canvas->drawTextOnPathHV(text, len, path,
27863e34c61818b92c4f40387a1de32594934295bbbreed@android.com                             x + 120, -paint.getTextSize()*2/3, paint);
27963e34c61818b92c4f40387a1de32594934295bbbreed@android.com
28063e34c61818b92c4f40387a1de32594934295bbbreed@android.com    path.offset(0, 200);
28163e34c61818b92c4f40387a1de32594934295bbbreed@android.com    paint.setTextAlign(SkPaint::kRight_Align);
28263e34c61818b92c4f40387a1de32594934295bbbreed@android.com
28363e34c61818b92c4f40387a1de32594934295bbbreed@android.com    text = "Matrices";
28463e34c61818b92c4f40387a1de32594934295bbbreed@android.com    len = strlen(text);
28563e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkScalar pathLen = getpathlen(path);
28663e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkMatrix matrix;
28763e34c61818b92c4f40387a1de32594934295bbbreed@android.com
28863e34c61818b92c4f40387a1de32594934295bbbreed@android.com    paint.setColor(SK_ColorBLACK);
28963e34c61818b92c4f40387a1de32594934295bbbreed@android.com    paint.setStyle(SkPaint::kStroke_Style);
29063e34c61818b92c4f40387a1de32594934295bbbreed@android.com    canvas->drawPath(path, paint);
29163e34c61818b92c4f40387a1de32594934295bbbreed@android.com    paint.setStyle(SkPaint::kFill_Style);
29263e34c61818b92c4f40387a1de32594934295bbbreed@android.com
29363e34c61818b92c4f40387a1de32594934295bbbreed@android.com    paint.setTextSize(50);
29463e34c61818b92c4f40387a1de32594934295bbbreed@android.com    canvas->drawTextOnPath(text, len, path, NULL, paint);
29563e34c61818b92c4f40387a1de32594934295bbbreed@android.com
29663e34c61818b92c4f40387a1de32594934295bbbreed@android.com    paint.setColor(SK_ColorRED);
29763e34c61818b92c4f40387a1de32594934295bbbreed@android.com    matrix.setScale(-SK_Scalar1, SK_Scalar1);
29863e34c61818b92c4f40387a1de32594934295bbbreed@android.com    matrix.postTranslate(pathLen, 0);
29963e34c61818b92c4f40387a1de32594934295bbbreed@android.com    canvas->drawTextOnPath(text, len, path, &matrix, paint);
30063e34c61818b92c4f40387a1de32594934295bbbreed@android.com
30163e34c61818b92c4f40387a1de32594934295bbbreed@android.com    paint.setColor(SK_ColorBLUE);
30263e34c61818b92c4f40387a1de32594934295bbbreed@android.com    matrix.setScale(SK_Scalar1, -SK_Scalar1);
30363e34c61818b92c4f40387a1de32594934295bbbreed@android.com    canvas->drawTextOnPath(text, len, path, &matrix, paint);
30463e34c61818b92c4f40387a1de32594934295bbbreed@android.com
30563e34c61818b92c4f40387a1de32594934295bbbreed@android.com    paint.setColor(0xFF008800);
30663e34c61818b92c4f40387a1de32594934295bbbreed@android.com    matrix.setScale(-SK_Scalar1, -SK_Scalar1);
30763e34c61818b92c4f40387a1de32594934295bbbreed@android.com    matrix.postTranslate(pathLen, 0);
30863e34c61818b92c4f40387a1de32594934295bbbreed@android.com    canvas->drawTextOnPath(text, len, path, &matrix, paint);
30963e34c61818b92c4f40387a1de32594934295bbbreed@android.com}
31063e34c61818b92c4f40387a1de32594934295bbbreed@android.com
31163e34c61818b92c4f40387a1de32594934295bbbreed@android.com///////////////////////////////////////////////////////////////////////////////
31263e34c61818b92c4f40387a1de32594934295bbbreed@android.com
31363e34c61818b92c4f40387a1de32594934295bbbreed@android.com#include "SkImageDecoder.h"
31463e34c61818b92c4f40387a1de32594934295bbbreed@android.com#include "SkOSFile.h"
31563e34c61818b92c4f40387a1de32594934295bbbreed@android.com#include "SkRandom.h"
31663e34c61818b92c4f40387a1de32594934295bbbreed@android.com#include "SkStream.h"
31763e34c61818b92c4f40387a1de32594934295bbbreed@android.com
31863e34c61818b92c4f40387a1de32594934295bbbreed@android.comstatic SkShader* make_shader0(SkIPoint* size) {
31963e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkBitmap    bm;
32063e34c61818b92c4f40387a1de32594934295bbbreed@android.com
32163e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkImageDecoder::DecodeFile("/skimages/logo.gif", &bm);
32263e34c61818b92c4f40387a1de32594934295bbbreed@android.com    size->set(bm.width(), bm.height());
32363e34c61818b92c4f40387a1de32594934295bbbreed@android.com    return SkShader::CreateBitmapShader(bm, SkShader::kClamp_TileMode,
32463e34c61818b92c4f40387a1de32594934295bbbreed@android.com                                        SkShader::kClamp_TileMode);
32563e34c61818b92c4f40387a1de32594934295bbbreed@android.com}
32663e34c61818b92c4f40387a1de32594934295bbbreed@android.com
32763e34c61818b92c4f40387a1de32594934295bbbreed@android.comstatic SkShader* make_shader1(const SkIPoint& size) {
32864cc579efa7e416c7298ed159d76b074b283c0f9senorblanco@chromium.org    SkPoint pts[] = { { 0, 0 },
32964cc579efa7e416c7298ed159d76b074b283c0f9senorblanco@chromium.org                      { SkIntToScalar(size.fX), SkIntToScalar(size.fY) } };
33063e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkColor colors[] = { SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorRED };
33163e34c61818b92c4f40387a1de32594934295bbbreed@android.com    return SkGradientShader::CreateLinear(pts, colors, NULL,
33263e34c61818b92c4f40387a1de32594934295bbbreed@android.com                                          SK_ARRAY_COUNT(colors), SkShader::kMirror_TileMode, NULL);
33363e34c61818b92c4f40387a1de32594934295bbbreed@android.com}
33463e34c61818b92c4f40387a1de32594934295bbbreed@android.com
335f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.comclass Rec {
336f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.compublic:
33763e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkCanvas::VertexMode    fMode;
33863e34c61818b92c4f40387a1de32594934295bbbreed@android.com    int                     fCount;
33963e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkPoint*                fVerts;
34063e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkPoint*                fTexs;
34163e34c61818b92c4f40387a1de32594934295bbbreed@android.com
34263e34c61818b92c4f40387a1de32594934295bbbreed@android.com    Rec() : fCount(0), fVerts(NULL), fTexs(NULL) {}
34363e34c61818b92c4f40387a1de32594934295bbbreed@android.com    ~Rec() { delete[] fVerts; delete[] fTexs; }
34463e34c61818b92c4f40387a1de32594934295bbbreed@android.com};
34563e34c61818b92c4f40387a1de32594934295bbbreed@android.com
34602939ce4bddd3223d9e8cc98d4abd02939b7f70acaryclark@google.comstatic void make_tris(Rec* rec) {
34763e34c61818b92c4f40387a1de32594934295bbbreed@android.com    int n = 10;
34863e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkRandom    rand;
34963e34c61818b92c4f40387a1de32594934295bbbreed@android.com
35063e34c61818b92c4f40387a1de32594934295bbbreed@android.com    rec->fMode = SkCanvas::kTriangles_VertexMode;
35163e34c61818b92c4f40387a1de32594934295bbbreed@android.com    rec->fCount = n * 3;
35263e34c61818b92c4f40387a1de32594934295bbbreed@android.com    rec->fVerts = new SkPoint[rec->fCount];
35363e34c61818b92c4f40387a1de32594934295bbbreed@android.com
35463e34c61818b92c4f40387a1de32594934295bbbreed@android.com    for (int i = 0; i < n; i++) {
35563e34c61818b92c4f40387a1de32594934295bbbreed@android.com        SkPoint* v = &rec->fVerts[i*3];
35663e34c61818b92c4f40387a1de32594934295bbbreed@android.com        for (int j = 0; j < 3; j++) {
35763e34c61818b92c4f40387a1de32594934295bbbreed@android.com            v[j].set(rand.nextUScalar1() * 250, rand.nextUScalar1() * 250);
35863e34c61818b92c4f40387a1de32594934295bbbreed@android.com        }
35963e34c61818b92c4f40387a1de32594934295bbbreed@android.com    }
36063e34c61818b92c4f40387a1de32594934295bbbreed@android.com}
36163e34c61818b92c4f40387a1de32594934295bbbreed@android.com
36202939ce4bddd3223d9e8cc98d4abd02939b7f70acaryclark@google.comstatic void make_fan(Rec* rec, int texWidth, int texHeight) {
36363e34c61818b92c4f40387a1de32594934295bbbreed@android.com    const SkScalar tx = SkIntToScalar(texWidth);
36463e34c61818b92c4f40387a1de32594934295bbbreed@android.com    const SkScalar ty = SkIntToScalar(texHeight);
36563e34c61818b92c4f40387a1de32594934295bbbreed@android.com    const int n = 24;
36663e34c61818b92c4f40387a1de32594934295bbbreed@android.com
36763e34c61818b92c4f40387a1de32594934295bbbreed@android.com    rec->fMode = SkCanvas::kTriangleFan_VertexMode;
36863e34c61818b92c4f40387a1de32594934295bbbreed@android.com    rec->fCount = n + 2;
36963e34c61818b92c4f40387a1de32594934295bbbreed@android.com    rec->fVerts = new SkPoint[rec->fCount];
37063e34c61818b92c4f40387a1de32594934295bbbreed@android.com    rec->fTexs  = new SkPoint[rec->fCount];
37163e34c61818b92c4f40387a1de32594934295bbbreed@android.com
37263e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkPoint* v = rec->fVerts;
37363e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkPoint* t = rec->fTexs;
37463e34c61818b92c4f40387a1de32594934295bbbreed@android.com
37563e34c61818b92c4f40387a1de32594934295bbbreed@android.com    v[0].set(0, 0);
37663e34c61818b92c4f40387a1de32594934295bbbreed@android.com    t[0].set(0, 0);
37763e34c61818b92c4f40387a1de32594934295bbbreed@android.com    for (int i = 0; i < n; i++) {
37863e34c61818b92c4f40387a1de32594934295bbbreed@android.com        SkScalar cos;
37963e34c61818b92c4f40387a1de32594934295bbbreed@android.com        SkScalar sin = SkScalarSinCos(SK_ScalarPI * 2 * i / n, &cos);
38063e34c61818b92c4f40387a1de32594934295bbbreed@android.com        v[i+1].set(cos, sin);
38163e34c61818b92c4f40387a1de32594934295bbbreed@android.com        t[i+1].set(i*tx/n, ty);
38263e34c61818b92c4f40387a1de32594934295bbbreed@android.com    }
38363e34c61818b92c4f40387a1de32594934295bbbreed@android.com    v[n+1] = v[1];
38463e34c61818b92c4f40387a1de32594934295bbbreed@android.com    t[n+1].set(tx, ty);
38563e34c61818b92c4f40387a1de32594934295bbbreed@android.com
38663e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkMatrix m;
38763e34c61818b92c4f40387a1de32594934295bbbreed@android.com    m.setScale(SkIntToScalar(100), SkIntToScalar(100));
38863e34c61818b92c4f40387a1de32594934295bbbreed@android.com    m.postTranslate(SkIntToScalar(110), SkIntToScalar(110));
38963e34c61818b92c4f40387a1de32594934295bbbreed@android.com    m.mapPoints(v, rec->fCount);
39063e34c61818b92c4f40387a1de32594934295bbbreed@android.com}
39163e34c61818b92c4f40387a1de32594934295bbbreed@android.com
39202939ce4bddd3223d9e8cc98d4abd02939b7f70acaryclark@google.comstatic void make_strip(Rec* rec, int texWidth, int texHeight) {
39363e34c61818b92c4f40387a1de32594934295bbbreed@android.com    const SkScalar tx = SkIntToScalar(texWidth);
39463e34c61818b92c4f40387a1de32594934295bbbreed@android.com    const SkScalar ty = SkIntToScalar(texHeight);
39563e34c61818b92c4f40387a1de32594934295bbbreed@android.com    const int n = 24;
39663e34c61818b92c4f40387a1de32594934295bbbreed@android.com
39763e34c61818b92c4f40387a1de32594934295bbbreed@android.com    rec->fMode = SkCanvas::kTriangleStrip_VertexMode;
39863e34c61818b92c4f40387a1de32594934295bbbreed@android.com    rec->fCount = 2 * (n + 1);
39963e34c61818b92c4f40387a1de32594934295bbbreed@android.com    rec->fVerts = new SkPoint[rec->fCount];
40063e34c61818b92c4f40387a1de32594934295bbbreed@android.com    rec->fTexs  = new SkPoint[rec->fCount];
40163e34c61818b92c4f40387a1de32594934295bbbreed@android.com
40263e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkPoint* v = rec->fVerts;
40363e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkPoint* t = rec->fTexs;
40463e34c61818b92c4f40387a1de32594934295bbbreed@android.com
40563e34c61818b92c4f40387a1de32594934295bbbreed@android.com    for (int i = 0; i < n; i++) {
40663e34c61818b92c4f40387a1de32594934295bbbreed@android.com        SkScalar cos;
40763e34c61818b92c4f40387a1de32594934295bbbreed@android.com        SkScalar sin = SkScalarSinCos(SK_ScalarPI * 2 * i / n, &cos);
40863e34c61818b92c4f40387a1de32594934295bbbreed@android.com        v[i*2 + 0].set(cos/2, sin/2);
40963e34c61818b92c4f40387a1de32594934295bbbreed@android.com        v[i*2 + 1].set(cos, sin);
41063e34c61818b92c4f40387a1de32594934295bbbreed@android.com
41163e34c61818b92c4f40387a1de32594934295bbbreed@android.com        t[i*2 + 0].set(tx * i / n, ty);
41263e34c61818b92c4f40387a1de32594934295bbbreed@android.com        t[i*2 + 1].set(tx * i / n, 0);
41363e34c61818b92c4f40387a1de32594934295bbbreed@android.com    }
41463e34c61818b92c4f40387a1de32594934295bbbreed@android.com    v[2*n + 0] = v[0];
41563e34c61818b92c4f40387a1de32594934295bbbreed@android.com    v[2*n + 1] = v[1];
41663e34c61818b92c4f40387a1de32594934295bbbreed@android.com
41763e34c61818b92c4f40387a1de32594934295bbbreed@android.com    t[2*n + 0].set(tx, ty);
41863e34c61818b92c4f40387a1de32594934295bbbreed@android.com    t[2*n + 1].set(tx, 0);
41963e34c61818b92c4f40387a1de32594934295bbbreed@android.com
42063e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkMatrix m;
42163e34c61818b92c4f40387a1de32594934295bbbreed@android.com    m.setScale(SkIntToScalar(100), SkIntToScalar(100));
42263e34c61818b92c4f40387a1de32594934295bbbreed@android.com    m.postTranslate(SkIntToScalar(110), SkIntToScalar(110));
42363e34c61818b92c4f40387a1de32594934295bbbreed@android.com    m.mapPoints(v, rec->fCount);
42463e34c61818b92c4f40387a1de32594934295bbbreed@android.com}
42563e34c61818b92c4f40387a1de32594934295bbbreed@android.com
42663e34c61818b92c4f40387a1de32594934295bbbreed@android.comstatic void mesh_slide(SkCanvas* canvas) {
42763e34c61818b92c4f40387a1de32594934295bbbreed@android.com    Rec fRecs[3];
42863e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkIPoint    size;
42963e34c61818b92c4f40387a1de32594934295bbbreed@android.com
43063e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkShader* fShader0 = make_shader0(&size);
43163e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkShader* fShader1 = make_shader1(size);
432f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
433f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    SkAutoUnref aur0(fShader0);
434f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    SkAutoUnref aur1(fShader1);
435f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
43663e34c61818b92c4f40387a1de32594934295bbbreed@android.com    make_strip(&fRecs[0], size.fX, size.fY);
43763e34c61818b92c4f40387a1de32594934295bbbreed@android.com    make_fan(&fRecs[1], size.fX, size.fY);
43863e34c61818b92c4f40387a1de32594934295bbbreed@android.com    make_tris(&fRecs[2]);
43963e34c61818b92c4f40387a1de32594934295bbbreed@android.com
44063e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkPaint paint;
44163e34c61818b92c4f40387a1de32594934295bbbreed@android.com    paint.setDither(true);
44263e34c61818b92c4f40387a1de32594934295bbbreed@android.com    paint.setFilterBitmap(true);
44363e34c61818b92c4f40387a1de32594934295bbbreed@android.com
44464cc579efa7e416c7298ed159d76b074b283c0f9senorblanco@chromium.org    for (size_t i = 0; i < SK_ARRAY_COUNT(fRecs); i++) {
44563e34c61818b92c4f40387a1de32594934295bbbreed@android.com        canvas->save();
44663e34c61818b92c4f40387a1de32594934295bbbreed@android.com
44763e34c61818b92c4f40387a1de32594934295bbbreed@android.com        paint.setShader(NULL);
44863e34c61818b92c4f40387a1de32594934295bbbreed@android.com        canvas->drawVertices(fRecs[i].fMode, fRecs[i].fCount,
44963e34c61818b92c4f40387a1de32594934295bbbreed@android.com                             fRecs[i].fVerts, fRecs[i].fTexs,
45063e34c61818b92c4f40387a1de32594934295bbbreed@android.com                             NULL, NULL, NULL, 0, paint);
45163e34c61818b92c4f40387a1de32594934295bbbreed@android.com
45263e34c61818b92c4f40387a1de32594934295bbbreed@android.com        canvas->translate(SkIntToScalar(210), 0);
45363e34c61818b92c4f40387a1de32594934295bbbreed@android.com
45463e34c61818b92c4f40387a1de32594934295bbbreed@android.com        paint.setShader(fShader0);
45563e34c61818b92c4f40387a1de32594934295bbbreed@android.com        canvas->drawVertices(fRecs[i].fMode, fRecs[i].fCount,
45663e34c61818b92c4f40387a1de32594934295bbbreed@android.com                             fRecs[i].fVerts, fRecs[i].fTexs,
45763e34c61818b92c4f40387a1de32594934295bbbreed@android.com                             NULL, NULL, NULL, 0, paint);
45863e34c61818b92c4f40387a1de32594934295bbbreed@android.com
45963e34c61818b92c4f40387a1de32594934295bbbreed@android.com        canvas->translate(SkIntToScalar(210), 0);
46063e34c61818b92c4f40387a1de32594934295bbbreed@android.com
46163e34c61818b92c4f40387a1de32594934295bbbreed@android.com        paint.setShader(fShader1);
46263e34c61818b92c4f40387a1de32594934295bbbreed@android.com        canvas->drawVertices(fRecs[i].fMode, fRecs[i].fCount,
46363e34c61818b92c4f40387a1de32594934295bbbreed@android.com                             fRecs[i].fVerts, fRecs[i].fTexs,
46463e34c61818b92c4f40387a1de32594934295bbbreed@android.com                             NULL, NULL, NULL, 0, paint);
46563e34c61818b92c4f40387a1de32594934295bbbreed@android.com        canvas->restore();
46663e34c61818b92c4f40387a1de32594934295bbbreed@android.com
46763e34c61818b92c4f40387a1de32594934295bbbreed@android.com        canvas->translate(0, SkIntToScalar(250));
46863e34c61818b92c4f40387a1de32594934295bbbreed@android.com    }
46963e34c61818b92c4f40387a1de32594934295bbbreed@android.com}
47063e34c61818b92c4f40387a1de32594934295bbbreed@android.com
47163e34c61818b92c4f40387a1de32594934295bbbreed@android.com///////////////////////////////////////////////////////////////////////////////
47263e34c61818b92c4f40387a1de32594934295bbbreed@android.com
4738af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com#include "SkGradientShader.h"
4748af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com#include "SkLayerRasterizer.h"
4758af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com#include "SkBlurMaskFilter.h"
4768af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
4778af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.comstatic void r0(SkLayerRasterizer* rast, SkPaint& p)
4788af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com{
4798af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setMaskFilter(SkBlurMaskFilter::Create(SkIntToScalar(3),
4808af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com                                             SkBlurMaskFilter::kNormal_BlurStyle))->unref();
4818af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    rast->addLayer(p, SkIntToScalar(3), SkIntToScalar(3));
4828af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
4838af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setMaskFilter(NULL);
4848af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setStyle(SkPaint::kStroke_Style);
4858af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setStrokeWidth(SK_Scalar1);
4868af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    rast->addLayer(p);
4878af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
4888af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setAlpha(0x11);
4898af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setStyle(SkPaint::kFill_Style);
4908af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setXfermodeMode(SkXfermode::kSrc_Mode);
4918af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    rast->addLayer(p);
4928af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com}
4938af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
4948af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.comstatic void r1(SkLayerRasterizer* rast, SkPaint& p)
4958af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com{
4968af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    rast->addLayer(p);
4978af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
4988af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setAlpha(0x40);
4998af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setXfermodeMode(SkXfermode::kSrc_Mode);
5008af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setStyle(SkPaint::kStroke_Style);
5018af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setStrokeWidth(SK_Scalar1*2);
5028af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    rast->addLayer(p);
5038af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com}
5048af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
5058af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.comstatic void r2(SkLayerRasterizer* rast, SkPaint& p)
5068af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com{
5078af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setStyle(SkPaint::kStrokeAndFill_Style);
5088af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setStrokeWidth(SK_Scalar1*4);
5098af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    rast->addLayer(p);
5108af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
5118af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setStyle(SkPaint::kStroke_Style);
5128af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setStrokeWidth(SK_Scalar1*3/2);
5138af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setXfermodeMode(SkXfermode::kClear_Mode);
5148af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    rast->addLayer(p);
5158af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com}
5168af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
5178af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.comstatic void r3(SkLayerRasterizer* rast, SkPaint& p)
5188af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com{
5198af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setStyle(SkPaint::kStroke_Style);
5208af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setStrokeWidth(SK_Scalar1*3);
5218af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    rast->addLayer(p);
5228af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
5238af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setAlpha(0x20);
5248af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setStyle(SkPaint::kFill_Style);
5258af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setXfermodeMode(SkXfermode::kSrc_Mode);
5268af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    rast->addLayer(p);
5278af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com}
5288af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
5298af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.comstatic void r4(SkLayerRasterizer* rast, SkPaint& p)
5308af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com{
5318af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setAlpha(0x60);
5328af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    rast->addLayer(p, SkIntToScalar(3), SkIntToScalar(3));
5338af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
5348af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setAlpha(0xFF);
5358af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setXfermodeMode(SkXfermode::kClear_Mode);
5368af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    rast->addLayer(p, SK_Scalar1*3/2, SK_Scalar1*3/2);
5378af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
5388af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setXfermode(NULL);
5398af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    rast->addLayer(p);
5408af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com}
5418af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
5428af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com#include "SkDiscretePathEffect.h"
5438af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
5448af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.comstatic void r5(SkLayerRasterizer* rast, SkPaint& p)
5458af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com{
5468af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    rast->addLayer(p);
5478af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
5488af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setPathEffect(new SkDiscretePathEffect(SK_Scalar1*4, SK_Scalar1*3))->unref();
5498af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setXfermodeMode(SkXfermode::kSrcOut_Mode);
5508af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    rast->addLayer(p);
5518af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com}
5528af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
5538af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.comstatic void r6(SkLayerRasterizer* rast, SkPaint& p)
5548af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com{
5558af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    rast->addLayer(p);
5568af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
5578af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setAntiAlias(false);
5588af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    SkLayerRasterizer* rast2 = new SkLayerRasterizer;
5598af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    r5(rast2, p);
5608af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setRasterizer(rast2)->unref();
5618af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setXfermodeMode(SkXfermode::kClear_Mode);
5628af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    rast->addLayer(p);
5638af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com}
5648af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
5658af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com#include "Sk2DPathEffect.h"
5668af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
56718dc47731f4b37d8896b51f1b92ab31abd78b5a0reed@google.comstatic SkPathEffect* MakeDotEffect(SkScalar radius, const SkMatrix& matrix) {
56818dc47731f4b37d8896b51f1b92ab31abd78b5a0reed@google.com    SkPath path;
56918dc47731f4b37d8896b51f1b92ab31abd78b5a0reed@google.com    path.addCircle(0, 0, radius);
57018dc47731f4b37d8896b51f1b92ab31abd78b5a0reed@google.com    return new SkPath2DPathEffect(matrix, path);
57118dc47731f4b37d8896b51f1b92ab31abd78b5a0reed@google.com}
5728af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
5738af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.comstatic void r7(SkLayerRasterizer* rast, SkPaint& p)
5748af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com{
5758af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    SkMatrix    lattice;
5768af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    lattice.setScale(SK_Scalar1*6, SK_Scalar1*6, 0, 0);
5778af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    lattice.postSkew(SK_Scalar1/3, 0, 0, 0);
57818dc47731f4b37d8896b51f1b92ab31abd78b5a0reed@google.com    p.setPathEffect(MakeDotEffect(SK_Scalar1*4, lattice))->unref();
5798af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    rast->addLayer(p);
5808af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com}
5818af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
5828af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.comstatic void r8(SkLayerRasterizer* rast, SkPaint& p)
5838af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com{
5848af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    rast->addLayer(p);
5858af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
5868af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    SkMatrix    lattice;
5878af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    lattice.setScale(SK_Scalar1*6, SK_Scalar1*6, 0, 0);
5888af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    lattice.postSkew(SK_Scalar1/3, 0, 0, 0);
58918dc47731f4b37d8896b51f1b92ab31abd78b5a0reed@google.com    p.setPathEffect(MakeDotEffect(SK_Scalar1*2, lattice))->unref();
5908af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setXfermodeMode(SkXfermode::kClear_Mode);
5918af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    rast->addLayer(p);
5928af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
5938af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setPathEffect(NULL);
5948af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setXfermode(NULL);
5958af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setStyle(SkPaint::kStroke_Style);
5968af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setStrokeWidth(SK_Scalar1);
5978af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    rast->addLayer(p);
5988af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com}
5998af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
6008af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.comclass Line2DPathEffect : public Sk2DPathEffect {
6018af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.compublic:
6028af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    Line2DPathEffect(SkScalar width, const SkMatrix& matrix)
6038af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    : Sk2DPathEffect(matrix), fWidth(width) {}
6048af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
605fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com	virtual bool filterPath(SkPath* dst, const SkPath& src, SkStrokeRec* rec) SK_OVERRIDE {
606fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com        if (this->INHERITED::filterPath(dst, src, rec)) {
607fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com            rec->setStrokeStyle(fWidth);
6088af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com            return true;
6098af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com        }
6108af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com        return false;
6118af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    }
6128af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
613ba28d03e94dc221d6a803bf2a84a420b9159255cdjsollen@google.com    SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(Line2DPathEffect)
6148af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.comprotected:
6158af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com	virtual void nextSpan(int u, int v, int ucount, SkPath* dst)
6168af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    {
6178af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com        if (ucount > 1)
6188af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com        {
6198af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com            SkPoint	src[2], dstP[2];
6208af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
6218af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com            src[0].set(SkIntToScalar(u) + SK_ScalarHalf,
6228af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com                       SkIntToScalar(v) + SK_ScalarHalf);
6238af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com            src[1].set(SkIntToScalar(u+ucount) + SK_ScalarHalf,
6248af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com                       SkIntToScalar(v) + SK_ScalarHalf);
6258af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com            this->getMatrix().mapPoints(dstP, src, 2);
6268af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
6278af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com            dst->moveTo(dstP[0]);
6288af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com            dst->lineTo(dstP[1]);
6298af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com        }
6308af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    }
6318af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
63254924243c1b65b3ee6d8fa064b50a9b1bb2a19a5djsollen@google.com    Line2DPathEffect(SkFlattenableReadBuffer& buffer) : INHERITED(buffer)
6338af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    {
6348af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com        fWidth = buffer.readScalar();
6358af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    }
63654924243c1b65b3ee6d8fa064b50a9b1bb2a19a5djsollen@google.com    virtual void flatten(SkFlattenableWriteBuffer& buffer) const SK_OVERRIDE
63754924243c1b65b3ee6d8fa064b50a9b1bb2a19a5djsollen@google.com    {
63854924243c1b65b3ee6d8fa064b50a9b1bb2a19a5djsollen@google.com        this->INHERITED::flatten(buffer);
63954924243c1b65b3ee6d8fa064b50a9b1bb2a19a5djsollen@google.com        buffer.writeScalar(fWidth);
64054924243c1b65b3ee6d8fa064b50a9b1bb2a19a5djsollen@google.com    }
6418af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
6428af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.comprivate:
6438af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    SkScalar fWidth;
6448af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
6458af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    typedef Sk2DPathEffect INHERITED;
6468af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com};
6478af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
6488af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.comstatic void r9(SkLayerRasterizer* rast, SkPaint& p)
6498af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com{
6508af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    rast->addLayer(p);
6518af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
6528af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    SkMatrix    lattice;
6538af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    lattice.setScale(SK_Scalar1, SK_Scalar1*6, 0, 0);
6548af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    lattice.postRotate(SkIntToScalar(30), 0, 0);
6558af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setPathEffect(new Line2DPathEffect(SK_Scalar1*2, lattice))->unref();
6568af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setXfermodeMode(SkXfermode::kClear_Mode);
6578af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    rast->addLayer(p);
6588af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
6598af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setPathEffect(NULL);
6608af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setXfermode(NULL);
6618af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setStyle(SkPaint::kStroke_Style);
6628af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setStrokeWidth(SK_Scalar1);
6638af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    rast->addLayer(p);
6648af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com}
6658af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
6668af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.comtypedef void (*raster_proc)(SkLayerRasterizer*, SkPaint&);
6678af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
6688af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.comstatic const raster_proc gRastProcs[] = {
6698af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    r0, r1, r2, r3, r4, r5, r6, r7, r8, r9
6708af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com};
6718af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
6728af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.comstatic void apply_shader(SkPaint* paint, int index) {
6738af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    raster_proc proc = gRastProcs[index];
6748af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    SkPaint p;
6758af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    SkLayerRasterizer*  rast = new SkLayerRasterizer;
6768af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
6778af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setAntiAlias(true);
6788af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    proc(rast, p);
6798af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    paint->setRasterizer(rast)->unref();
6808af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    paint->setColor(SK_ColorBLUE);
6818af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com}
6828af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
6838af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com#include "SkTypeface.h"
6848af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
6858af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.comstatic void texteffect_slide(SkCanvas* canvas) {
6868af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    const char* str = "Google";
6878af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    size_t len = strlen(str);
6888af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    SkScalar x = 20;
6898af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    SkScalar y = 80;
6908af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    SkPaint paint;
6918af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    paint.setTypeface(SkTypeface::CreateFromName("Georgia", SkTypeface::kItalic));
6928af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    paint.setTextSize(75);
6938af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    paint.setAntiAlias(true);
6948af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    paint.setColor(SK_ColorBLUE);
69564cc579efa7e416c7298ed159d76b074b283c0f9senorblanco@chromium.org    for (size_t i = 0; i < SK_ARRAY_COUNT(gRastProcs); i++) {
6968af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com        apply_shader(&paint, i);
6978af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com        canvas->drawText(str, len, x, y, paint);
6988af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com        y += 80;
6998af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com        if (i == 4) {
7008af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com            x += 320;
7018af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com            y = 80;
7028af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com        }
7038af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    }
7048af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com}
7058af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
7068af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com///////////////////////////////////////////////////////////////////////////////
7078af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
70863e34c61818b92c4f40387a1de32594934295bbbreed@android.com#include "SkImageEncoder.h"
70963e34c61818b92c4f40387a1de32594934295bbbreed@android.com
71063e34c61818b92c4f40387a1de32594934295bbbreed@android.comstatic const SlideProc gProc[] = {
71163e34c61818b92c4f40387a1de32594934295bbbreed@android.com    patheffect_slide,
71263e34c61818b92c4f40387a1de32594934295bbbreed@android.com    gradient_slide,
71363e34c61818b92c4f40387a1de32594934295bbbreed@android.com    textonpath_slide,
7148af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    mesh_slide,
7158af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    texteffect_slide
71663e34c61818b92c4f40387a1de32594934295bbbreed@android.com};
71763e34c61818b92c4f40387a1de32594934295bbbreed@android.com
71881e3d7f7943d5c257a07580b75218a5e256b0aadreed@google.comclass SlideView : public SampleView {
71963e34c61818b92c4f40387a1de32594934295bbbreed@android.com    int fIndex;
7207b1859034fd1febd69eeeca9efd5e3eb297fb168reed@google.com    bool fOnce;
72163e34c61818b92c4f40387a1de32594934295bbbreed@android.compublic:
72263e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SlideView() {
7237b1859034fd1febd69eeeca9efd5e3eb297fb168reed@google.com        fOnce = false;
7247b1859034fd1febd69eeeca9efd5e3eb297fb168reed@google.com    }
7257b1859034fd1febd69eeeca9efd5e3eb297fb168reed@google.com
7267b1859034fd1febd69eeeca9efd5e3eb297fb168reed@google.com    void init() {
7277b1859034fd1febd69eeeca9efd5e3eb297fb168reed@google.com        if (fOnce) {
7287b1859034fd1febd69eeeca9efd5e3eb297fb168reed@google.com            return;
7297b1859034fd1febd69eeeca9efd5e3eb297fb168reed@google.com        }
7307b1859034fd1febd69eeeca9efd5e3eb297fb168reed@google.com        fOnce = true;
7317b1859034fd1febd69eeeca9efd5e3eb297fb168reed@google.com
73263e34c61818b92c4f40387a1de32594934295bbbreed@android.com        fIndex = 0;
73363e34c61818b92c4f40387a1de32594934295bbbreed@android.com
73463e34c61818b92c4f40387a1de32594934295bbbreed@android.com        SkBitmap bm;
73563e34c61818b92c4f40387a1de32594934295bbbreed@android.com        bm.setConfig(SkBitmap::kARGB_8888_Config, 1024, 768);
73663e34c61818b92c4f40387a1de32594934295bbbreed@android.com        bm.allocPixels();
73763e34c61818b92c4f40387a1de32594934295bbbreed@android.com        SkCanvas canvas(bm);
73863e34c61818b92c4f40387a1de32594934295bbbreed@android.com        SkScalar s = SkIntToScalar(1024) / 640;
73963e34c61818b92c4f40387a1de32594934295bbbreed@android.com        canvas.scale(s, s);
74063e34c61818b92c4f40387a1de32594934295bbbreed@android.com        for (size_t i = 0; i < SK_ARRAY_COUNT(gProc); i++) {
74163e34c61818b92c4f40387a1de32594934295bbbreed@android.com            canvas.save();
7428af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com            canvas.drawColor(BG_COLOR);
74363e34c61818b92c4f40387a1de32594934295bbbreed@android.com            gProc[i](&canvas);
74463e34c61818b92c4f40387a1de32594934295bbbreed@android.com            canvas.restore();
74563e34c61818b92c4f40387a1de32594934295bbbreed@android.com            SkString str;
7463a67a668dbdc3a6bba68700a6dfdef8164ae0c69senorblanco@chromium.org            str.printf("/skimages/slide_" SK_SIZE_T_SPECIFIER ".png", i);
74763e34c61818b92c4f40387a1de32594934295bbbreed@android.com            SkImageEncoder::EncodeFile(str.c_str(), bm, SkImageEncoder::kPNG_Type, 100);
74863e34c61818b92c4f40387a1de32594934295bbbreed@android.com        }
74981e3d7f7943d5c257a07580b75218a5e256b0aadreed@google.com        this->setBGColor(BG_COLOR);
75063e34c61818b92c4f40387a1de32594934295bbbreed@android.com    }
75163e34c61818b92c4f40387a1de32594934295bbbreed@android.com
75263e34c61818b92c4f40387a1de32594934295bbbreed@android.comprotected:
75363e34c61818b92c4f40387a1de32594934295bbbreed@android.com    // overrides from SkEventSink
75463e34c61818b92c4f40387a1de32594934295bbbreed@android.com    virtual bool onQuery(SkEvent* evt) {
75563e34c61818b92c4f40387a1de32594934295bbbreed@android.com        if (SampleCode::TitleQ(*evt)) {
75663e34c61818b92c4f40387a1de32594934295bbbreed@android.com            SampleCode::TitleR(evt, "Slides");
75763e34c61818b92c4f40387a1de32594934295bbbreed@android.com            return true;
75863e34c61818b92c4f40387a1de32594934295bbbreed@android.com        }
75963e34c61818b92c4f40387a1de32594934295bbbreed@android.com        return this->INHERITED::onQuery(evt);
76063e34c61818b92c4f40387a1de32594934295bbbreed@android.com    }
76163e34c61818b92c4f40387a1de32594934295bbbreed@android.com
76281e3d7f7943d5c257a07580b75218a5e256b0aadreed@google.com    virtual void onDrawContent(SkCanvas* canvas) {
7637b1859034fd1febd69eeeca9efd5e3eb297fb168reed@google.com        this->init();
76463e34c61818b92c4f40387a1de32594934295bbbreed@android.com        gProc[fIndex](canvas);
76563e34c61818b92c4f40387a1de32594934295bbbreed@android.com    }
76663e34c61818b92c4f40387a1de32594934295bbbreed@android.com
76763e34c61818b92c4f40387a1de32594934295bbbreed@android.com    virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) {
7687b1859034fd1febd69eeeca9efd5e3eb297fb168reed@google.com        this->init();
76963e34c61818b92c4f40387a1de32594934295bbbreed@android.com        fIndex = (fIndex + 1) % SK_ARRAY_COUNT(gProc);
77063e34c61818b92c4f40387a1de32594934295bbbreed@android.com        this->inval(NULL);
77163e34c61818b92c4f40387a1de32594934295bbbreed@android.com        return NULL;
77263e34c61818b92c4f40387a1de32594934295bbbreed@android.com    }
77363e34c61818b92c4f40387a1de32594934295bbbreed@android.com
77463e34c61818b92c4f40387a1de32594934295bbbreed@android.comprivate:
77581e3d7f7943d5c257a07580b75218a5e256b0aadreed@google.com    typedef SampleView INHERITED;
77663e34c61818b92c4f40387a1de32594934295bbbreed@android.com};
77763e34c61818b92c4f40387a1de32594934295bbbreed@android.com
77863e34c61818b92c4f40387a1de32594934295bbbreed@android.com//////////////////////////////////////////////////////////////////////////////
77963e34c61818b92c4f40387a1de32594934295bbbreed@android.com
78063e34c61818b92c4f40387a1de32594934295bbbreed@android.comstatic SkView* MyFactory() { return new SlideView; }
78163e34c61818b92c4f40387a1de32594934295bbbreed@android.comstatic SkViewRegister reg(MyFactory);
78263e34c61818b92c4f40387a1de32594934295bbbreed@android.com
783