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