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"
9b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com#include "SkBlurMask.h"
10b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com#include "SkBlurMaskFilter.h"
1163e34c61818b92c4f40387a1de32594934295bbbreed@android.com#include "SkCanvas.h"
1263e34c61818b92c4f40387a1de32594934295bbbreed@android.com#include "SkDevice.h"
138b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org#include "SkReadBuffer.h"
148b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org#include "SkWriteBuffer.h"
15b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com#include "SkGradientShader.h"
16b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com#include "SkLayerRasterizer.h"
1763e34c61818b92c4f40387a1de32594934295bbbreed@android.com#include "SkPaint.h"
18b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com#include "SkView.h"
1963e34c61818b92c4f40387a1de32594934295bbbreed@android.com
208af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com#define BG_COLOR    0xFFDDDDDD
218af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
2263e34c61818b92c4f40387a1de32594934295bbbreed@android.comtypedef void (*SlideProc)(SkCanvas*);
2363e34c61818b92c4f40387a1de32594934295bbbreed@android.com
2463e34c61818b92c4f40387a1de32594934295bbbreed@android.com///////////////////////////////////////////////////////////////////////////////
2563e34c61818b92c4f40387a1de32594934295bbbreed@android.com
2663e34c61818b92c4f40387a1de32594934295bbbreed@android.com#include "Sk1DPathEffect.h"
2763e34c61818b92c4f40387a1de32594934295bbbreed@android.com#include "Sk2DPathEffect.h"
2863e34c61818b92c4f40387a1de32594934295bbbreed@android.com#include "SkCornerPathEffect.h"
2963e34c61818b92c4f40387a1de32594934295bbbreed@android.com#include "SkDashPathEffect.h"
3063e34c61818b92c4f40387a1de32594934295bbbreed@android.com#include "SkDiscretePathEffect.h"
3163e34c61818b92c4f40387a1de32594934295bbbreed@android.com
3263e34c61818b92c4f40387a1de32594934295bbbreed@android.comstatic void compose_pe(SkPaint* paint) {
3363e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkPathEffect* pe = paint->getPathEffect();
340a2bf90dccba3bde188e0386a7f0c60e6dde1ae9commit-bot@chromium.org    SkPathEffect* corner = SkCornerPathEffect::Create(25);
3563e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkPathEffect* compose;
3663e34c61818b92c4f40387a1de32594934295bbbreed@android.com    if (pe) {
370a2bf90dccba3bde188e0386a7f0c60e6dde1ae9commit-bot@chromium.org        compose = SkComposePathEffect::Create(pe, corner);
3863e34c61818b92c4f40387a1de32594934295bbbreed@android.com        corner->unref();
3963e34c61818b92c4f40387a1de32594934295bbbreed@android.com    } else {
4063e34c61818b92c4f40387a1de32594934295bbbreed@android.com        compose = corner;
4163e34c61818b92c4f40387a1de32594934295bbbreed@android.com    }
4263e34c61818b92c4f40387a1de32594934295bbbreed@android.com    paint->setPathEffect(compose)->unref();
4363e34c61818b92c4f40387a1de32594934295bbbreed@android.com}
4463e34c61818b92c4f40387a1de32594934295bbbreed@android.com
4563e34c61818b92c4f40387a1de32594934295bbbreed@android.comstatic void hair_pe(SkPaint* paint) {
4663e34c61818b92c4f40387a1de32594934295bbbreed@android.com    paint->setStrokeWidth(0);
4763e34c61818b92c4f40387a1de32594934295bbbreed@android.com}
4863e34c61818b92c4f40387a1de32594934295bbbreed@android.com
4963e34c61818b92c4f40387a1de32594934295bbbreed@android.comstatic void hair2_pe(SkPaint* paint) {
5063e34c61818b92c4f40387a1de32594934295bbbreed@android.com    paint->setStrokeWidth(0);
5163e34c61818b92c4f40387a1de32594934295bbbreed@android.com    compose_pe(paint);
5263e34c61818b92c4f40387a1de32594934295bbbreed@android.com}
5363e34c61818b92c4f40387a1de32594934295bbbreed@android.com
5463e34c61818b92c4f40387a1de32594934295bbbreed@android.comstatic void stroke_pe(SkPaint* paint) {
5563e34c61818b92c4f40387a1de32594934295bbbreed@android.com    paint->setStrokeWidth(12);
5663e34c61818b92c4f40387a1de32594934295bbbreed@android.com    compose_pe(paint);
5763e34c61818b92c4f40387a1de32594934295bbbreed@android.com}
5863e34c61818b92c4f40387a1de32594934295bbbreed@android.com
5963e34c61818b92c4f40387a1de32594934295bbbreed@android.comstatic void dash_pe(SkPaint* paint) {
6063e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkScalar inter[] = { 20, 10, 10, 10 };
6163e34c61818b92c4f40387a1de32594934295bbbreed@android.com    paint->setStrokeWidth(12);
620a2bf90dccba3bde188e0386a7f0c60e6dde1ae9commit-bot@chromium.org    paint->setPathEffect(SkDashPathEffect::Create(inter, SK_ARRAY_COUNT(inter),
630a2bf90dccba3bde188e0386a7f0c60e6dde1ae9commit-bot@chromium.org                                                  0))->unref();
6463e34c61818b92c4f40387a1de32594934295bbbreed@android.com    compose_pe(paint);
6563e34c61818b92c4f40387a1de32594934295bbbreed@android.com}
6663e34c61818b92c4f40387a1de32594934295bbbreed@android.com
6763e34c61818b92c4f40387a1de32594934295bbbreed@android.comstatic const int gXY[] = {
6863e34c61818b92c4f40387a1de32594934295bbbreed@android.com4, 0, 0, -4, 8, -4, 12, 0, 8, 4, 0, 4
6963e34c61818b92c4f40387a1de32594934295bbbreed@android.com};
7063e34c61818b92c4f40387a1de32594934295bbbreed@android.com
7163e34c61818b92c4f40387a1de32594934295bbbreed@android.comstatic void scale(SkPath* path, SkScalar scale) {
7263e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkMatrix m;
7363e34c61818b92c4f40387a1de32594934295bbbreed@android.com    m.setScale(scale, scale);
7463e34c61818b92c4f40387a1de32594934295bbbreed@android.com    path->transform(m);
7563e34c61818b92c4f40387a1de32594934295bbbreed@android.com}
7663e34c61818b92c4f40387a1de32594934295bbbreed@android.com
7763e34c61818b92c4f40387a1de32594934295bbbreed@android.comstatic void one_d_pe(SkPaint* paint) {
7863e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkPath  path;
7963e34c61818b92c4f40387a1de32594934295bbbreed@android.com    path.moveTo(SkIntToScalar(gXY[0]), SkIntToScalar(gXY[1]));
8063e34c61818b92c4f40387a1de32594934295bbbreed@android.com    for (unsigned i = 2; i < SK_ARRAY_COUNT(gXY); i += 2)
8163e34c61818b92c4f40387a1de32594934295bbbreed@android.com        path.lineTo(SkIntToScalar(gXY[i]), SkIntToScalar(gXY[i+1]));
8263e34c61818b92c4f40387a1de32594934295bbbreed@android.com    path.close();
8363e34c61818b92c4f40387a1de32594934295bbbreed@android.com    path.offset(SkIntToScalar(-6), 0);
844b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org    scale(&path, 1.5f);
85ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
860a2bf90dccba3bde188e0386a7f0c60e6dde1ae9commit-bot@chromium.org    paint->setPathEffect(SkPath1DPathEffect::Create(path, SkIntToScalar(21), 0,
870a2bf90dccba3bde188e0386a7f0c60e6dde1ae9commit-bot@chromium.org                                                    SkPath1DPathEffect::kRotate_Style))->unref();
8863e34c61818b92c4f40387a1de32594934295bbbreed@android.com    compose_pe(paint);
8963e34c61818b92c4f40387a1de32594934295bbbreed@android.com}
9063e34c61818b92c4f40387a1de32594934295bbbreed@android.com
9163e34c61818b92c4f40387a1de32594934295bbbreed@android.comtypedef void (*PE_Proc)(SkPaint*);
9263e34c61818b92c4f40387a1de32594934295bbbreed@android.comstatic const PE_Proc gPE[] = { hair_pe, hair2_pe, stroke_pe, dash_pe, one_d_pe };
9363e34c61818b92c4f40387a1de32594934295bbbreed@android.com
9463e34c61818b92c4f40387a1de32594934295bbbreed@android.comstatic void fill_pe(SkPaint* paint) {
9563e34c61818b92c4f40387a1de32594934295bbbreed@android.com    paint->setStyle(SkPaint::kFill_Style);
9663e34c61818b92c4f40387a1de32594934295bbbreed@android.com    paint->setPathEffect(NULL);
9763e34c61818b92c4f40387a1de32594934295bbbreed@android.com}
9863e34c61818b92c4f40387a1de32594934295bbbreed@android.com
9963e34c61818b92c4f40387a1de32594934295bbbreed@android.comstatic void discrete_pe(SkPaint* paint) {
1000a2bf90dccba3bde188e0386a7f0c60e6dde1ae9commit-bot@chromium.org    paint->setPathEffect(SkDiscretePathEffect::Create(10, 4))->unref();
10163e34c61818b92c4f40387a1de32594934295bbbreed@android.com}
10263e34c61818b92c4f40387a1de32594934295bbbreed@android.com
10343e9f20f4b5eecb2335e26461b5c4c84f2e3bcd2reed@google.comstatic SkPathEffect* MakeTileEffect() {
10443e9f20f4b5eecb2335e26461b5c4c84f2e3bcd2reed@google.com    SkMatrix m;
10543e9f20f4b5eecb2335e26461b5c4c84f2e3bcd2reed@google.com    m.setScale(SkIntToScalar(12), SkIntToScalar(12));
10663e34c61818b92c4f40387a1de32594934295bbbreed@android.com
10743e9f20f4b5eecb2335e26461b5c4c84f2e3bcd2reed@google.com    SkPath path;
10843e9f20f4b5eecb2335e26461b5c4c84f2e3bcd2reed@google.com    path.addCircle(0, 0, SkIntToScalar(5));
109ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
1100a2bf90dccba3bde188e0386a7f0c60e6dde1ae9commit-bot@chromium.org    return SkPath2DPathEffect::Create(m, path);
11143e9f20f4b5eecb2335e26461b5c4c84f2e3bcd2reed@google.com}
11263e34c61818b92c4f40387a1de32594934295bbbreed@android.com
11363e34c61818b92c4f40387a1de32594934295bbbreed@android.comstatic void tile_pe(SkPaint* paint) {
11443e9f20f4b5eecb2335e26461b5c4c84f2e3bcd2reed@google.com    paint->setPathEffect(MakeTileEffect())->unref();
11563e34c61818b92c4f40387a1de32594934295bbbreed@android.com}
11663e34c61818b92c4f40387a1de32594934295bbbreed@android.com
11763e34c61818b92c4f40387a1de32594934295bbbreed@android.comstatic const PE_Proc gPE2[] = { fill_pe, discrete_pe, tile_pe };
11863e34c61818b92c4f40387a1de32594934295bbbreed@android.com
11963e34c61818b92c4f40387a1de32594934295bbbreed@android.comstatic void patheffect_slide(SkCanvas* canvas) {
12063e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkPaint paint;
12163e34c61818b92c4f40387a1de32594934295bbbreed@android.com    paint.setAntiAlias(true);
12263e34c61818b92c4f40387a1de32594934295bbbreed@android.com    paint.setStyle(SkPaint::kStroke_Style);
12363e34c61818b92c4f40387a1de32594934295bbbreed@android.com
12463e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkPath path;
12563e34c61818b92c4f40387a1de32594934295bbbreed@android.com    path.moveTo(20, 20);
12663e34c61818b92c4f40387a1de32594934295bbbreed@android.com    path.lineTo(70, 120);
12763e34c61818b92c4f40387a1de32594934295bbbreed@android.com    path.lineTo(120, 30);
12863e34c61818b92c4f40387a1de32594934295bbbreed@android.com    path.lineTo(170, 80);
12963e34c61818b92c4f40387a1de32594934295bbbreed@android.com    path.lineTo(240, 50);
13063e34c61818b92c4f40387a1de32594934295bbbreed@android.com
13163e34c61818b92c4f40387a1de32594934295bbbreed@android.com    size_t i;
13263e34c61818b92c4f40387a1de32594934295bbbreed@android.com    canvas->save();
13363e34c61818b92c4f40387a1de32594934295bbbreed@android.com    for (i = 0; i < SK_ARRAY_COUNT(gPE); i++) {
13463e34c61818b92c4f40387a1de32594934295bbbreed@android.com        gPE[i](&paint);
13563e34c61818b92c4f40387a1de32594934295bbbreed@android.com        canvas->drawPath(path, paint);
13663e34c61818b92c4f40387a1de32594934295bbbreed@android.com        canvas->translate(0, 75);
13763e34c61818b92c4f40387a1de32594934295bbbreed@android.com    }
13863e34c61818b92c4f40387a1de32594934295bbbreed@android.com    canvas->restore();
13963e34c61818b92c4f40387a1de32594934295bbbreed@android.com
14063e34c61818b92c4f40387a1de32594934295bbbreed@android.com    path.reset();
14163e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkRect r = { 0, 0, 250, 120 };
14263e34c61818b92c4f40387a1de32594934295bbbreed@android.com    path.addOval(r, SkPath::kCW_Direction);
14363e34c61818b92c4f40387a1de32594934295bbbreed@android.com    r.inset(50, 50);
14463e34c61818b92c4f40387a1de32594934295bbbreed@android.com    path.addRect(r, SkPath::kCCW_Direction);
145ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
14663e34c61818b92c4f40387a1de32594934295bbbreed@android.com    canvas->translate(320, 20);
14763e34c61818b92c4f40387a1de32594934295bbbreed@android.com    for (i = 0; i < SK_ARRAY_COUNT(gPE2); i++) {
14863e34c61818b92c4f40387a1de32594934295bbbreed@android.com        gPE2[i](&paint);
14963e34c61818b92c4f40387a1de32594934295bbbreed@android.com        canvas->drawPath(path, paint);
15063e34c61818b92c4f40387a1de32594934295bbbreed@android.com        canvas->translate(0, 160);
15163e34c61818b92c4f40387a1de32594934295bbbreed@android.com    }
15263e34c61818b92c4f40387a1de32594934295bbbreed@android.com}
15363e34c61818b92c4f40387a1de32594934295bbbreed@android.com
15463e34c61818b92c4f40387a1de32594934295bbbreed@android.com///////////////////////////////////////////////////////////////////////////////
15563e34c61818b92c4f40387a1de32594934295bbbreed@android.com
15663e34c61818b92c4f40387a1de32594934295bbbreed@android.com#include "SkGradientShader.h"
15763e34c61818b92c4f40387a1de32594934295bbbreed@android.com
15863e34c61818b92c4f40387a1de32594934295bbbreed@android.comstruct GradData {
15963e34c61818b92c4f40387a1de32594934295bbbreed@android.com    int             fCount;
16063e34c61818b92c4f40387a1de32594934295bbbreed@android.com    const SkColor*  fColors;
16163e34c61818b92c4f40387a1de32594934295bbbreed@android.com    const SkScalar* fPos;
16263e34c61818b92c4f40387a1de32594934295bbbreed@android.com};
16363e34c61818b92c4f40387a1de32594934295bbbreed@android.com
16463e34c61818b92c4f40387a1de32594934295bbbreed@android.comstatic const SkColor gColors[] = {
16563e34c61818b92c4f40387a1de32594934295bbbreed@android.comSK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK
16663e34c61818b92c4f40387a1de32594934295bbbreed@android.com};
16763e34c61818b92c4f40387a1de32594934295bbbreed@android.comstatic const SkScalar gPos0[] = { 0, SK_Scalar1 };
16863e34c61818b92c4f40387a1de32594934295bbbreed@android.comstatic const SkScalar gPos1[] = { SK_Scalar1/4, SK_Scalar1*3/4 };
16963e34c61818b92c4f40387a1de32594934295bbbreed@android.comstatic const SkScalar gPos2[] = {
17063e34c61818b92c4f40387a1de32594934295bbbreed@android.com0, SK_Scalar1/8, SK_Scalar1/2, SK_Scalar1*7/8, SK_Scalar1
17163e34c61818b92c4f40387a1de32594934295bbbreed@android.com};
17263e34c61818b92c4f40387a1de32594934295bbbreed@android.com
17363e34c61818b92c4f40387a1de32594934295bbbreed@android.comstatic const GradData gGradData[] = {
17463e34c61818b92c4f40387a1de32594934295bbbreed@android.com{ 2, gColors, NULL },
17563e34c61818b92c4f40387a1de32594934295bbbreed@android.com{ 2, gColors, gPos0 },
17663e34c61818b92c4f40387a1de32594934295bbbreed@android.com{ 2, gColors, gPos1 },
17763e34c61818b92c4f40387a1de32594934295bbbreed@android.com{ 5, gColors, NULL },
17863e34c61818b92c4f40387a1de32594934295bbbreed@android.com{ 5, gColors, gPos2 }
17963e34c61818b92c4f40387a1de32594934295bbbreed@android.com};
18063e34c61818b92c4f40387a1de32594934295bbbreed@android.com
18183f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.orgstatic SkShader* MakeLinear(const SkPoint pts[2], const GradData& data, SkShader::TileMode tm) {
18283f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org    return SkGradientShader::CreateLinear(pts, data.fColors, data.fPos, data.fCount, tm);
18363e34c61818b92c4f40387a1de32594934295bbbreed@android.com}
18463e34c61818b92c4f40387a1de32594934295bbbreed@android.com
18583f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.orgstatic SkShader* MakeRadial(const SkPoint pts[2], const GradData& data, SkShader::TileMode tm) {
18663e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkPoint center;
18763e34c61818b92c4f40387a1de32594934295bbbreed@android.com    center.set(SkScalarAve(pts[0].fX, pts[1].fX),
18863e34c61818b92c4f40387a1de32594934295bbbreed@android.com               SkScalarAve(pts[0].fY, pts[1].fY));
18963e34c61818b92c4f40387a1de32594934295bbbreed@android.com    return SkGradientShader::CreateRadial(center, center.fX, data.fColors,
19083f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org                                          data.fPos, data.fCount, tm);
19163e34c61818b92c4f40387a1de32594934295bbbreed@android.com}
19263e34c61818b92c4f40387a1de32594934295bbbreed@android.com
19383f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.orgstatic SkShader* MakeSweep(const SkPoint pts[2], const GradData& data, SkShader::TileMode tm) {
19463e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkPoint center;
19563e34c61818b92c4f40387a1de32594934295bbbreed@android.com    center.set(SkScalarAve(pts[0].fX, pts[1].fX),
19663e34c61818b92c4f40387a1de32594934295bbbreed@android.com               SkScalarAve(pts[0].fY, pts[1].fY));
19783f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org    return SkGradientShader::CreateSweep(center.fX, center.fY, data.fColors, data.fPos, data.fCount);
19863e34c61818b92c4f40387a1de32594934295bbbreed@android.com}
19963e34c61818b92c4f40387a1de32594934295bbbreed@android.com
20083f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.orgstatic SkShader* Make2Radial(const SkPoint pts[2], const GradData& data, SkShader::TileMode tm) {
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,
20983f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org                                                  data.fColors, data.fPos, data.fCount, tm);
21063e34c61818b92c4f40387a1de32594934295bbbreed@android.com}
21163e34c61818b92c4f40387a1de32594934295bbbreed@android.com
21283f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.orgtypedef SkShader* (*GradMaker)(const SkPoint pts[2], const GradData& data, SkShader::TileMode tm);
21363e34c61818b92c4f40387a1de32594934295bbbreed@android.comstatic const GradMaker gGradMakers[] = {
21463e34c61818b92c4f40387a1de32594934295bbbreed@android.com    MakeLinear, MakeRadial, MakeSweep, Make2Radial
21563e34c61818b92c4f40387a1de32594934295bbbreed@android.com};
21663e34c61818b92c4f40387a1de32594934295bbbreed@android.com
21763e34c61818b92c4f40387a1de32594934295bbbreed@android.comstatic void gradient_slide(SkCanvas* canvas) {
21863e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkPoint pts[2] = {
21963e34c61818b92c4f40387a1de32594934295bbbreed@android.com        { 0, 0 },
22063e34c61818b92c4f40387a1de32594934295bbbreed@android.com        { SkIntToScalar(100), SkIntToScalar(100) }
22163e34c61818b92c4f40387a1de32594934295bbbreed@android.com    };
22263e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkShader::TileMode tm = SkShader::kClamp_TileMode;
22363e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkRect r = { 0, 0, SkIntToScalar(100), SkIntToScalar(100) };
22463e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkPaint paint;
22563e34c61818b92c4f40387a1de32594934295bbbreed@android.com    paint.setAntiAlias(true);
22663e34c61818b92c4f40387a1de32594934295bbbreed@android.com    paint.setDither(true);
227ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
22863e34c61818b92c4f40387a1de32594934295bbbreed@android.com    canvas->translate(SkIntToScalar(20), SkIntToScalar(10));
22963e34c61818b92c4f40387a1de32594934295bbbreed@android.com    for (size_t i = 0; i < SK_ARRAY_COUNT(gGradData); i++) {
23063e34c61818b92c4f40387a1de32594934295bbbreed@android.com        canvas->save();
23163e34c61818b92c4f40387a1de32594934295bbbreed@android.com        for (size_t j = 0; j < SK_ARRAY_COUNT(gGradMakers); j++) {
23283f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org            SkShader* shader = gGradMakers[j](pts, gGradData[i], tm);
23363e34c61818b92c4f40387a1de32594934295bbbreed@android.com            paint.setShader(shader);
23463e34c61818b92c4f40387a1de32594934295bbbreed@android.com            canvas->drawRect(r, paint);
23563e34c61818b92c4f40387a1de32594934295bbbreed@android.com            shader->unref();
23663e34c61818b92c4f40387a1de32594934295bbbreed@android.com            canvas->translate(0, SkIntToScalar(120));
23763e34c61818b92c4f40387a1de32594934295bbbreed@android.com        }
23863e34c61818b92c4f40387a1de32594934295bbbreed@android.com        canvas->restore();
23963e34c61818b92c4f40387a1de32594934295bbbreed@android.com        canvas->translate(SkIntToScalar(120), 0);
24063e34c61818b92c4f40387a1de32594934295bbbreed@android.com    }
24163e34c61818b92c4f40387a1de32594934295bbbreed@android.com}
24263e34c61818b92c4f40387a1de32594934295bbbreed@android.com
24363e34c61818b92c4f40387a1de32594934295bbbreed@android.com///////////////////////////////////////////////////////////////////////////////
24463e34c61818b92c4f40387a1de32594934295bbbreed@android.com
24563e34c61818b92c4f40387a1de32594934295bbbreed@android.com#include "SkPathMeasure.h"
24663e34c61818b92c4f40387a1de32594934295bbbreed@android.com
24763e34c61818b92c4f40387a1de32594934295bbbreed@android.comstatic SkScalar getpathlen(const SkPath& path) {
24863e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkPathMeasure   meas(path, false);
24963e34c61818b92c4f40387a1de32594934295bbbreed@android.com    return meas.getLength();
25063e34c61818b92c4f40387a1de32594934295bbbreed@android.com}
25163e34c61818b92c4f40387a1de32594934295bbbreed@android.com
25263e34c61818b92c4f40387a1de32594934295bbbreed@android.comstatic void textonpath_slide(SkCanvas* canvas) {
25363e34c61818b92c4f40387a1de32594934295bbbreed@android.com    const char* text = "Displacement";
25463e34c61818b92c4f40387a1de32594934295bbbreed@android.com    size_t len =strlen(text);
25563e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkPath path;
25663e34c61818b92c4f40387a1de32594934295bbbreed@android.com    path.moveTo(100, 300);
25763e34c61818b92c4f40387a1de32594934295bbbreed@android.com    path.quadTo(300, 100, 500, 300);
25863e34c61818b92c4f40387a1de32594934295bbbreed@android.com    path.offset(0, -100);
25963e34c61818b92c4f40387a1de32594934295bbbreed@android.com
26063e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkPaint paint;
26163e34c61818b92c4f40387a1de32594934295bbbreed@android.com    paint.setAntiAlias(true);
26263e34c61818b92c4f40387a1de32594934295bbbreed@android.com    paint.setTextSize(40);
263ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
26463e34c61818b92c4f40387a1de32594934295bbbreed@android.com    paint.setStyle(SkPaint::kStroke_Style);
26563e34c61818b92c4f40387a1de32594934295bbbreed@android.com    canvas->drawPath(path, paint);
26663e34c61818b92c4f40387a1de32594934295bbbreed@android.com    paint.setStyle(SkPaint::kFill_Style);
267ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
26863e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkScalar x = 50;
26963e34c61818b92c4f40387a1de32594934295bbbreed@android.com    paint.setColor(0xFF008800);
27063e34c61818b92c4f40387a1de32594934295bbbreed@android.com    canvas->drawTextOnPathHV(text, len, path,
27163e34c61818b92c4f40387a1de32594934295bbbreed@android.com                             x, paint.getTextSize()*2/3, paint);
27263e34c61818b92c4f40387a1de32594934295bbbreed@android.com    paint.setColor(SK_ColorRED);
27363e34c61818b92c4f40387a1de32594934295bbbreed@android.com    canvas->drawTextOnPathHV(text, len, path,
274ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com                             x + 60, 0, paint);
27563e34c61818b92c4f40387a1de32594934295bbbreed@android.com    paint.setColor(SK_ColorBLUE);
27663e34c61818b92c4f40387a1de32594934295bbbreed@android.com    canvas->drawTextOnPathHV(text, len, path,
27763e34c61818b92c4f40387a1de32594934295bbbreed@android.com                             x + 120, -paint.getTextSize()*2/3, paint);
27863e34c61818b92c4f40387a1de32594934295bbbreed@android.com
27963e34c61818b92c4f40387a1de32594934295bbbreed@android.com    path.offset(0, 200);
28063e34c61818b92c4f40387a1de32594934295bbbreed@android.com    paint.setTextAlign(SkPaint::kRight_Align);
281ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
28263e34c61818b92c4f40387a1de32594934295bbbreed@android.com    text = "Matrices";
28363e34c61818b92c4f40387a1de32594934295bbbreed@android.com    len = strlen(text);
28463e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkScalar pathLen = getpathlen(path);
28563e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkMatrix matrix;
286ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
28763e34c61818b92c4f40387a1de32594934295bbbreed@android.com    paint.setColor(SK_ColorBLACK);
28863e34c61818b92c4f40387a1de32594934295bbbreed@android.com    paint.setStyle(SkPaint::kStroke_Style);
28963e34c61818b92c4f40387a1de32594934295bbbreed@android.com    canvas->drawPath(path, paint);
29063e34c61818b92c4f40387a1de32594934295bbbreed@android.com    paint.setStyle(SkPaint::kFill_Style);
29163e34c61818b92c4f40387a1de32594934295bbbreed@android.com
29263e34c61818b92c4f40387a1de32594934295bbbreed@android.com    paint.setTextSize(50);
29363e34c61818b92c4f40387a1de32594934295bbbreed@android.com    canvas->drawTextOnPath(text, len, path, NULL, paint);
294ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
29563e34c61818b92c4f40387a1de32594934295bbbreed@android.com    paint.setColor(SK_ColorRED);
29663e34c61818b92c4f40387a1de32594934295bbbreed@android.com    matrix.setScale(-SK_Scalar1, SK_Scalar1);
29763e34c61818b92c4f40387a1de32594934295bbbreed@android.com    matrix.postTranslate(pathLen, 0);
29863e34c61818b92c4f40387a1de32594934295bbbreed@android.com    canvas->drawTextOnPath(text, len, path, &matrix, paint);
299ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
30063e34c61818b92c4f40387a1de32594934295bbbreed@android.com    paint.setColor(SK_ColorBLUE);
30163e34c61818b92c4f40387a1de32594934295bbbreed@android.com    matrix.setScale(SK_Scalar1, -SK_Scalar1);
30263e34c61818b92c4f40387a1de32594934295bbbreed@android.com    canvas->drawTextOnPath(text, len, path, &matrix, paint);
303ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
30463e34c61818b92c4f40387a1de32594934295bbbreed@android.com    paint.setColor(0xFF008800);
30563e34c61818b92c4f40387a1de32594934295bbbreed@android.com    matrix.setScale(-SK_Scalar1, -SK_Scalar1);
30663e34c61818b92c4f40387a1de32594934295bbbreed@android.com    matrix.postTranslate(pathLen, 0);
30763e34c61818b92c4f40387a1de32594934295bbbreed@android.com    canvas->drawTextOnPath(text, len, path, &matrix, paint);
30863e34c61818b92c4f40387a1de32594934295bbbreed@android.com}
30963e34c61818b92c4f40387a1de32594934295bbbreed@android.com
31063e34c61818b92c4f40387a1de32594934295bbbreed@android.com///////////////////////////////////////////////////////////////////////////////
31163e34c61818b92c4f40387a1de32594934295bbbreed@android.com
31263e34c61818b92c4f40387a1de32594934295bbbreed@android.com#include "SkImageDecoder.h"
31363e34c61818b92c4f40387a1de32594934295bbbreed@android.com#include "SkOSFile.h"
31463e34c61818b92c4f40387a1de32594934295bbbreed@android.com#include "SkRandom.h"
31563e34c61818b92c4f40387a1de32594934295bbbreed@android.com#include "SkStream.h"
31663e34c61818b92c4f40387a1de32594934295bbbreed@android.com
31763e34c61818b92c4f40387a1de32594934295bbbreed@android.comstatic SkShader* make_shader0(SkIPoint* size) {
31863e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkBitmap    bm;
319ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
32063e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkImageDecoder::DecodeFile("/skimages/logo.gif", &bm);
32163e34c61818b92c4f40387a1de32594934295bbbreed@android.com    size->set(bm.width(), bm.height());
32263e34c61818b92c4f40387a1de32594934295bbbreed@android.com    return SkShader::CreateBitmapShader(bm, SkShader::kClamp_TileMode,
32363e34c61818b92c4f40387a1de32594934295bbbreed@android.com                                        SkShader::kClamp_TileMode);
32463e34c61818b92c4f40387a1de32594934295bbbreed@android.com}
32563e34c61818b92c4f40387a1de32594934295bbbreed@android.com
32663e34c61818b92c4f40387a1de32594934295bbbreed@android.comstatic SkShader* make_shader1(const SkIPoint& size) {
32764cc579efa7e416c7298ed159d76b074b283c0f9senorblanco@chromium.org    SkPoint pts[] = { { 0, 0 },
32864cc579efa7e416c7298ed159d76b074b283c0f9senorblanco@chromium.org                      { SkIntToScalar(size.fX), SkIntToScalar(size.fY) } };
32963e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkColor colors[] = { SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorRED };
33063e34c61818b92c4f40387a1de32594934295bbbreed@android.com    return SkGradientShader::CreateLinear(pts, colors, NULL,
33183f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org                                          SK_ARRAY_COUNT(colors), SkShader::kMirror_TileMode);
33263e34c61818b92c4f40387a1de32594934295bbbreed@android.com}
33363e34c61818b92c4f40387a1de32594934295bbbreed@android.com
334f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.comclass Rec {
335f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.compublic:
33663e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkCanvas::VertexMode    fMode;
33763e34c61818b92c4f40387a1de32594934295bbbreed@android.com    int                     fCount;
33863e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkPoint*                fVerts;
33963e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkPoint*                fTexs;
340ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
34163e34c61818b92c4f40387a1de32594934295bbbreed@android.com    Rec() : fCount(0), fVerts(NULL), fTexs(NULL) {}
34263e34c61818b92c4f40387a1de32594934295bbbreed@android.com    ~Rec() { delete[] fVerts; delete[] fTexs; }
34363e34c61818b92c4f40387a1de32594934295bbbreed@android.com};
34463e34c61818b92c4f40387a1de32594934295bbbreed@android.com
34502939ce4bddd3223d9e8cc98d4abd02939b7f70acaryclark@google.comstatic void make_tris(Rec* rec) {
34663e34c61818b92c4f40387a1de32594934295bbbreed@android.com    int n = 10;
347e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org    SkRandom    rand;
348ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
34963e34c61818b92c4f40387a1de32594934295bbbreed@android.com    rec->fMode = SkCanvas::kTriangles_VertexMode;
35063e34c61818b92c4f40387a1de32594934295bbbreed@android.com    rec->fCount = n * 3;
35163e34c61818b92c4f40387a1de32594934295bbbreed@android.com    rec->fVerts = new SkPoint[rec->fCount];
352ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
35363e34c61818b92c4f40387a1de32594934295bbbreed@android.com    for (int i = 0; i < n; i++) {
35463e34c61818b92c4f40387a1de32594934295bbbreed@android.com        SkPoint* v = &rec->fVerts[i*3];
35563e34c61818b92c4f40387a1de32594934295bbbreed@android.com        for (int j = 0; j < 3; j++) {
35663e34c61818b92c4f40387a1de32594934295bbbreed@android.com            v[j].set(rand.nextUScalar1() * 250, rand.nextUScalar1() * 250);
35763e34c61818b92c4f40387a1de32594934295bbbreed@android.com        }
35863e34c61818b92c4f40387a1de32594934295bbbreed@android.com    }
35963e34c61818b92c4f40387a1de32594934295bbbreed@android.com}
36063e34c61818b92c4f40387a1de32594934295bbbreed@android.com
36102939ce4bddd3223d9e8cc98d4abd02939b7f70acaryclark@google.comstatic void make_fan(Rec* rec, int texWidth, int texHeight) {
36263e34c61818b92c4f40387a1de32594934295bbbreed@android.com    const SkScalar tx = SkIntToScalar(texWidth);
36363e34c61818b92c4f40387a1de32594934295bbbreed@android.com    const SkScalar ty = SkIntToScalar(texHeight);
36463e34c61818b92c4f40387a1de32594934295bbbreed@android.com    const int n = 24;
365ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
36663e34c61818b92c4f40387a1de32594934295bbbreed@android.com    rec->fMode = SkCanvas::kTriangleFan_VertexMode;
36763e34c61818b92c4f40387a1de32594934295bbbreed@android.com    rec->fCount = n + 2;
36863e34c61818b92c4f40387a1de32594934295bbbreed@android.com    rec->fVerts = new SkPoint[rec->fCount];
36963e34c61818b92c4f40387a1de32594934295bbbreed@android.com    rec->fTexs  = new SkPoint[rec->fCount];
370ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
37163e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkPoint* v = rec->fVerts;
37263e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkPoint* t = rec->fTexs;
373ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
37463e34c61818b92c4f40387a1de32594934295bbbreed@android.com    v[0].set(0, 0);
37563e34c61818b92c4f40387a1de32594934295bbbreed@android.com    t[0].set(0, 0);
37663e34c61818b92c4f40387a1de32594934295bbbreed@android.com    for (int i = 0; i < n; i++) {
37763e34c61818b92c4f40387a1de32594934295bbbreed@android.com        SkScalar cos;
37863e34c61818b92c4f40387a1de32594934295bbbreed@android.com        SkScalar sin = SkScalarSinCos(SK_ScalarPI * 2 * i / n, &cos);
37963e34c61818b92c4f40387a1de32594934295bbbreed@android.com        v[i+1].set(cos, sin);
38063e34c61818b92c4f40387a1de32594934295bbbreed@android.com        t[i+1].set(i*tx/n, ty);
38163e34c61818b92c4f40387a1de32594934295bbbreed@android.com    }
38263e34c61818b92c4f40387a1de32594934295bbbreed@android.com    v[n+1] = v[1];
38363e34c61818b92c4f40387a1de32594934295bbbreed@android.com    t[n+1].set(tx, ty);
384ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
38563e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkMatrix m;
38663e34c61818b92c4f40387a1de32594934295bbbreed@android.com    m.setScale(SkIntToScalar(100), SkIntToScalar(100));
38763e34c61818b92c4f40387a1de32594934295bbbreed@android.com    m.postTranslate(SkIntToScalar(110), SkIntToScalar(110));
38863e34c61818b92c4f40387a1de32594934295bbbreed@android.com    m.mapPoints(v, rec->fCount);
38963e34c61818b92c4f40387a1de32594934295bbbreed@android.com}
39063e34c61818b92c4f40387a1de32594934295bbbreed@android.com
39102939ce4bddd3223d9e8cc98d4abd02939b7f70acaryclark@google.comstatic void make_strip(Rec* rec, int texWidth, int texHeight) {
39263e34c61818b92c4f40387a1de32594934295bbbreed@android.com    const SkScalar tx = SkIntToScalar(texWidth);
39363e34c61818b92c4f40387a1de32594934295bbbreed@android.com    const SkScalar ty = SkIntToScalar(texHeight);
39463e34c61818b92c4f40387a1de32594934295bbbreed@android.com    const int n = 24;
395ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
39663e34c61818b92c4f40387a1de32594934295bbbreed@android.com    rec->fMode = SkCanvas::kTriangleStrip_VertexMode;
39763e34c61818b92c4f40387a1de32594934295bbbreed@android.com    rec->fCount = 2 * (n + 1);
39863e34c61818b92c4f40387a1de32594934295bbbreed@android.com    rec->fVerts = new SkPoint[rec->fCount];
39963e34c61818b92c4f40387a1de32594934295bbbreed@android.com    rec->fTexs  = new SkPoint[rec->fCount];
400ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
40163e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkPoint* v = rec->fVerts;
40263e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkPoint* t = rec->fTexs;
403ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
40463e34c61818b92c4f40387a1de32594934295bbbreed@android.com    for (int i = 0; i < n; i++) {
40563e34c61818b92c4f40387a1de32594934295bbbreed@android.com        SkScalar cos;
40663e34c61818b92c4f40387a1de32594934295bbbreed@android.com        SkScalar sin = SkScalarSinCos(SK_ScalarPI * 2 * i / n, &cos);
40763e34c61818b92c4f40387a1de32594934295bbbreed@android.com        v[i*2 + 0].set(cos/2, sin/2);
40863e34c61818b92c4f40387a1de32594934295bbbreed@android.com        v[i*2 + 1].set(cos, sin);
409ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
41063e34c61818b92c4f40387a1de32594934295bbbreed@android.com        t[i*2 + 0].set(tx * i / n, ty);
41163e34c61818b92c4f40387a1de32594934295bbbreed@android.com        t[i*2 + 1].set(tx * i / n, 0);
41263e34c61818b92c4f40387a1de32594934295bbbreed@android.com    }
41363e34c61818b92c4f40387a1de32594934295bbbreed@android.com    v[2*n + 0] = v[0];
41463e34c61818b92c4f40387a1de32594934295bbbreed@android.com    v[2*n + 1] = v[1];
415ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
41663e34c61818b92c4f40387a1de32594934295bbbreed@android.com    t[2*n + 0].set(tx, ty);
41763e34c61818b92c4f40387a1de32594934295bbbreed@android.com    t[2*n + 1].set(tx, 0);
418ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
41963e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkMatrix m;
42063e34c61818b92c4f40387a1de32594934295bbbreed@android.com    m.setScale(SkIntToScalar(100), SkIntToScalar(100));
42163e34c61818b92c4f40387a1de32594934295bbbreed@android.com    m.postTranslate(SkIntToScalar(110), SkIntToScalar(110));
42263e34c61818b92c4f40387a1de32594934295bbbreed@android.com    m.mapPoints(v, rec->fCount);
42363e34c61818b92c4f40387a1de32594934295bbbreed@android.com}
42463e34c61818b92c4f40387a1de32594934295bbbreed@android.com
42563e34c61818b92c4f40387a1de32594934295bbbreed@android.comstatic void mesh_slide(SkCanvas* canvas) {
42663e34c61818b92c4f40387a1de32594934295bbbreed@android.com    Rec fRecs[3];
42763e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkIPoint    size;
428ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
42963e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkShader* fShader0 = make_shader0(&size);
43063e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkShader* fShader1 = make_shader1(size);
431f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
432f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    SkAutoUnref aur0(fShader0);
433f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    SkAutoUnref aur1(fShader1);
434f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
43563e34c61818b92c4f40387a1de32594934295bbbreed@android.com    make_strip(&fRecs[0], size.fX, size.fY);
43663e34c61818b92c4f40387a1de32594934295bbbreed@android.com    make_fan(&fRecs[1], size.fX, size.fY);
43763e34c61818b92c4f40387a1de32594934295bbbreed@android.com    make_tris(&fRecs[2]);
43863e34c61818b92c4f40387a1de32594934295bbbreed@android.com
43963e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SkPaint paint;
44063e34c61818b92c4f40387a1de32594934295bbbreed@android.com    paint.setDither(true);
4414469938e92d779dff05e745559e67907bbf21e78reed@google.com    paint.setFilterLevel(SkPaint::kLow_FilterLevel);
442ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
44364cc579efa7e416c7298ed159d76b074b283c0f9senorblanco@chromium.org    for (size_t i = 0; i < SK_ARRAY_COUNT(fRecs); i++) {
44463e34c61818b92c4f40387a1de32594934295bbbreed@android.com        canvas->save();
445ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
44663e34c61818b92c4f40387a1de32594934295bbbreed@android.com        paint.setShader(NULL);
44763e34c61818b92c4f40387a1de32594934295bbbreed@android.com        canvas->drawVertices(fRecs[i].fMode, fRecs[i].fCount,
44863e34c61818b92c4f40387a1de32594934295bbbreed@android.com                             fRecs[i].fVerts, fRecs[i].fTexs,
44963e34c61818b92c4f40387a1de32594934295bbbreed@android.com                             NULL, NULL, NULL, 0, paint);
450ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
45163e34c61818b92c4f40387a1de32594934295bbbreed@android.com        canvas->translate(SkIntToScalar(210), 0);
452ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
45363e34c61818b92c4f40387a1de32594934295bbbreed@android.com        paint.setShader(fShader0);
45463e34c61818b92c4f40387a1de32594934295bbbreed@android.com        canvas->drawVertices(fRecs[i].fMode, fRecs[i].fCount,
45563e34c61818b92c4f40387a1de32594934295bbbreed@android.com                             fRecs[i].fVerts, fRecs[i].fTexs,
45663e34c61818b92c4f40387a1de32594934295bbbreed@android.com                             NULL, NULL, NULL, 0, paint);
457ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
45863e34c61818b92c4f40387a1de32594934295bbbreed@android.com        canvas->translate(SkIntToScalar(210), 0);
459ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
46063e34c61818b92c4f40387a1de32594934295bbbreed@android.com        paint.setShader(fShader1);
46163e34c61818b92c4f40387a1de32594934295bbbreed@android.com        canvas->drawVertices(fRecs[i].fMode, fRecs[i].fCount,
46263e34c61818b92c4f40387a1de32594934295bbbreed@android.com                             fRecs[i].fVerts, fRecs[i].fTexs,
46363e34c61818b92c4f40387a1de32594934295bbbreed@android.com                             NULL, NULL, NULL, 0, paint);
46463e34c61818b92c4f40387a1de32594934295bbbreed@android.com        canvas->restore();
465ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
46663e34c61818b92c4f40387a1de32594934295bbbreed@android.com        canvas->translate(0, SkIntToScalar(250));
46763e34c61818b92c4f40387a1de32594934295bbbreed@android.com    }
46863e34c61818b92c4f40387a1de32594934295bbbreed@android.com}
46963e34c61818b92c4f40387a1de32594934295bbbreed@android.com
47063e34c61818b92c4f40387a1de32594934295bbbreed@android.com///////////////////////////////////////////////////////////////////////////////
47163e34c61818b92c4f40387a1de32594934295bbbreed@android.com
472f792a1b20747f769b28906a4b00fd67691ce8d0bcommit-bot@chromium.orgstatic void r0(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p)
4738af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com{
474e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org    p.setMaskFilter(SkBlurMaskFilter::Create(kNormal_SkBlurStyle,
475b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com                                             SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(3))))->unref();
476f792a1b20747f769b28906a4b00fd67691ce8d0bcommit-bot@chromium.org    rastBuilder->addLayer(p, SkIntToScalar(3), SkIntToScalar(3));
477ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
4788af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setMaskFilter(NULL);
4798af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setStyle(SkPaint::kStroke_Style);
4808af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setStrokeWidth(SK_Scalar1);
481f792a1b20747f769b28906a4b00fd67691ce8d0bcommit-bot@chromium.org    rastBuilder->addLayer(p);
482ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
4838af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setAlpha(0x11);
4848af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setStyle(SkPaint::kFill_Style);
4858af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setXfermodeMode(SkXfermode::kSrc_Mode);
486f792a1b20747f769b28906a4b00fd67691ce8d0bcommit-bot@chromium.org    rastBuilder->addLayer(p);
4878af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com}
4888af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
489f792a1b20747f769b28906a4b00fd67691ce8d0bcommit-bot@chromium.orgstatic void r1(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p)
4908af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com{
491f792a1b20747f769b28906a4b00fd67691ce8d0bcommit-bot@chromium.org    rastBuilder->addLayer(p);
492ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
4938af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setAlpha(0x40);
4948af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setXfermodeMode(SkXfermode::kSrc_Mode);
4958af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setStyle(SkPaint::kStroke_Style);
4968af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setStrokeWidth(SK_Scalar1*2);
497f792a1b20747f769b28906a4b00fd67691ce8d0bcommit-bot@chromium.org    rastBuilder->addLayer(p);
4988af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com}
4998af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
500f792a1b20747f769b28906a4b00fd67691ce8d0bcommit-bot@chromium.orgstatic void r2(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p)
5018af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com{
5028af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setStyle(SkPaint::kStrokeAndFill_Style);
5038af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setStrokeWidth(SK_Scalar1*4);
504f792a1b20747f769b28906a4b00fd67691ce8d0bcommit-bot@chromium.org    rastBuilder->addLayer(p);
505ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
5068af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setStyle(SkPaint::kStroke_Style);
5078af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setStrokeWidth(SK_Scalar1*3/2);
5088af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setXfermodeMode(SkXfermode::kClear_Mode);
509f792a1b20747f769b28906a4b00fd67691ce8d0bcommit-bot@chromium.org    rastBuilder->addLayer(p);
5108af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com}
5118af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
512f792a1b20747f769b28906a4b00fd67691ce8d0bcommit-bot@chromium.orgstatic void r3(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p)
5138af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com{
5148af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setStyle(SkPaint::kStroke_Style);
5158af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setStrokeWidth(SK_Scalar1*3);
516f792a1b20747f769b28906a4b00fd67691ce8d0bcommit-bot@chromium.org    rastBuilder->addLayer(p);
517ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
5188af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setAlpha(0x20);
5198af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setStyle(SkPaint::kFill_Style);
5208af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setXfermodeMode(SkXfermode::kSrc_Mode);
521f792a1b20747f769b28906a4b00fd67691ce8d0bcommit-bot@chromium.org    rastBuilder->addLayer(p);
5228af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com}
5238af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
524f792a1b20747f769b28906a4b00fd67691ce8d0bcommit-bot@chromium.orgstatic void r4(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p)
5258af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com{
5268af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setAlpha(0x60);
527f792a1b20747f769b28906a4b00fd67691ce8d0bcommit-bot@chromium.org    rastBuilder->addLayer(p, SkIntToScalar(3), SkIntToScalar(3));
528ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
5298af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setAlpha(0xFF);
5308af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setXfermodeMode(SkXfermode::kClear_Mode);
531f792a1b20747f769b28906a4b00fd67691ce8d0bcommit-bot@chromium.org    rastBuilder->addLayer(p, SK_Scalar1*3/2, SK_Scalar1*3/2);
532ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
5338af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setXfermode(NULL);
534f792a1b20747f769b28906a4b00fd67691ce8d0bcommit-bot@chromium.org    rastBuilder->addLayer(p);
5358af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com}
5368af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
5378af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com#include "SkDiscretePathEffect.h"
5388af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
539f792a1b20747f769b28906a4b00fd67691ce8d0bcommit-bot@chromium.orgstatic void r5(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p)
5408af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com{
541f792a1b20747f769b28906a4b00fd67691ce8d0bcommit-bot@chromium.org    rastBuilder->addLayer(p);
542ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
5430a2bf90dccba3bde188e0386a7f0c60e6dde1ae9commit-bot@chromium.org    p.setPathEffect(SkDiscretePathEffect::Create(SK_Scalar1*4, SK_Scalar1*3))->unref();
5448af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setXfermodeMode(SkXfermode::kSrcOut_Mode);
545f792a1b20747f769b28906a4b00fd67691ce8d0bcommit-bot@chromium.org    rastBuilder->addLayer(p);
5468af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com}
5478af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
548f792a1b20747f769b28906a4b00fd67691ce8d0bcommit-bot@chromium.orgstatic void r6(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p)
5498af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com{
550f792a1b20747f769b28906a4b00fd67691ce8d0bcommit-bot@chromium.org    rastBuilder->addLayer(p);
551ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
5528af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setAntiAlias(false);
553f792a1b20747f769b28906a4b00fd67691ce8d0bcommit-bot@chromium.org    SkLayerRasterizer::Builder rastBuilder2;
554f792a1b20747f769b28906a4b00fd67691ce8d0bcommit-bot@chromium.org    r5(&rastBuilder2, p);
555f792a1b20747f769b28906a4b00fd67691ce8d0bcommit-bot@chromium.org    p.setRasterizer(rastBuilder2.detachRasterizer())->unref();
5568af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setXfermodeMode(SkXfermode::kClear_Mode);
557f792a1b20747f769b28906a4b00fd67691ce8d0bcommit-bot@chromium.org    rastBuilder->addLayer(p);
5588af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com}
5598af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
5608af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com#include "Sk2DPathEffect.h"
5618af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
56218dc47731f4b37d8896b51f1b92ab31abd78b5a0reed@google.comstatic SkPathEffect* MakeDotEffect(SkScalar radius, const SkMatrix& matrix) {
56318dc47731f4b37d8896b51f1b92ab31abd78b5a0reed@google.com    SkPath path;
56418dc47731f4b37d8896b51f1b92ab31abd78b5a0reed@google.com    path.addCircle(0, 0, radius);
5650a2bf90dccba3bde188e0386a7f0c60e6dde1ae9commit-bot@chromium.org    return SkPath2DPathEffect::Create(matrix, path);
56618dc47731f4b37d8896b51f1b92ab31abd78b5a0reed@google.com}
5678af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
568f792a1b20747f769b28906a4b00fd67691ce8d0bcommit-bot@chromium.orgstatic void r7(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p)
5698af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com{
5708af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    SkMatrix    lattice;
5718af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    lattice.setScale(SK_Scalar1*6, SK_Scalar1*6, 0, 0);
5728af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    lattice.postSkew(SK_Scalar1/3, 0, 0, 0);
57318dc47731f4b37d8896b51f1b92ab31abd78b5a0reed@google.com    p.setPathEffect(MakeDotEffect(SK_Scalar1*4, lattice))->unref();
574f792a1b20747f769b28906a4b00fd67691ce8d0bcommit-bot@chromium.org    rastBuilder->addLayer(p);
5758af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com}
5768af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
577f792a1b20747f769b28906a4b00fd67691ce8d0bcommit-bot@chromium.orgstatic void r8(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p)
5788af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com{
579f792a1b20747f769b28906a4b00fd67691ce8d0bcommit-bot@chromium.org    rastBuilder->addLayer(p);
580ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
5818af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    SkMatrix    lattice;
5828af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    lattice.setScale(SK_Scalar1*6, SK_Scalar1*6, 0, 0);
5838af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    lattice.postSkew(SK_Scalar1/3, 0, 0, 0);
58418dc47731f4b37d8896b51f1b92ab31abd78b5a0reed@google.com    p.setPathEffect(MakeDotEffect(SK_Scalar1*2, lattice))->unref();
5858af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setXfermodeMode(SkXfermode::kClear_Mode);
586f792a1b20747f769b28906a4b00fd67691ce8d0bcommit-bot@chromium.org    rastBuilder->addLayer(p);
587ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
5888af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setPathEffect(NULL);
5898af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setXfermode(NULL);
5908af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setStyle(SkPaint::kStroke_Style);
5918af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setStrokeWidth(SK_Scalar1);
592f792a1b20747f769b28906a4b00fd67691ce8d0bcommit-bot@chromium.org    rastBuilder->addLayer(p);
5938af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com}
5948af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
595f792a1b20747f769b28906a4b00fd67691ce8d0bcommit-bot@chromium.orgstatic void r9(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p)
5968af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com{
597f792a1b20747f769b28906a4b00fd67691ce8d0bcommit-bot@chromium.org    rastBuilder->addLayer(p);
598ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
5998af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    SkMatrix    lattice;
6008af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    lattice.setScale(SK_Scalar1, SK_Scalar1*6, 0, 0);
6018af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    lattice.postRotate(SkIntToScalar(30), 0, 0);
6020a2bf90dccba3bde188e0386a7f0c60e6dde1ae9commit-bot@chromium.org    p.setPathEffect(SkLine2DPathEffect::Create(SK_Scalar1*2, lattice))->unref();
6038af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setXfermodeMode(SkXfermode::kClear_Mode);
604f792a1b20747f769b28906a4b00fd67691ce8d0bcommit-bot@chromium.org    rastBuilder->addLayer(p);
605ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
6068af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setPathEffect(NULL);
6078af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setXfermode(NULL);
6088af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setStyle(SkPaint::kStroke_Style);
6098af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setStrokeWidth(SK_Scalar1);
610f792a1b20747f769b28906a4b00fd67691ce8d0bcommit-bot@chromium.org    rastBuilder->addLayer(p);
6118af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com}
6128af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
613f792a1b20747f769b28906a4b00fd67691ce8d0bcommit-bot@chromium.orgtypedef void (*raster_proc)(SkLayerRasterizer::Builder*, SkPaint&);
6148af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
6158af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.comstatic const raster_proc gRastProcs[] = {
6168af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    r0, r1, r2, r3, r4, r5, r6, r7, r8, r9
6178af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com};
6188af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
619ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.comstatic void apply_shader(SkPaint* paint, int index) {
6208af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    raster_proc proc = gRastProcs[index];
6218af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    SkPaint p;
622f792a1b20747f769b28906a4b00fd67691ce8d0bcommit-bot@chromium.org    SkLayerRasterizer::Builder rastBuilder;
623ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
6248af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    p.setAntiAlias(true);
625f792a1b20747f769b28906a4b00fd67691ce8d0bcommit-bot@chromium.org    proc(&rastBuilder, p);
626f792a1b20747f769b28906a4b00fd67691ce8d0bcommit-bot@chromium.org    paint->setRasterizer(rastBuilder.detachRasterizer())->unref();
6278af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    paint->setColor(SK_ColorBLUE);
6288af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com}
6298af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
6308af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com#include "SkTypeface.h"
6318af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
6328af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.comstatic void texteffect_slide(SkCanvas* canvas) {
6338af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    const char* str = "Google";
6348af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    size_t len = strlen(str);
6358af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    SkScalar x = 20;
6368af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    SkScalar y = 80;
6378af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    SkPaint paint;
6388af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    paint.setTypeface(SkTypeface::CreateFromName("Georgia", SkTypeface::kItalic));
6398af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    paint.setTextSize(75);
6408af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    paint.setAntiAlias(true);
6418af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    paint.setColor(SK_ColorBLUE);
64264cc579efa7e416c7298ed159d76b074b283c0f9senorblanco@chromium.org    for (size_t i = 0; i < SK_ARRAY_COUNT(gRastProcs); i++) {
6437fa2a65c0cfc714364490cb715171461143024e0reed@google.com        apply_shader(&paint, (int)i);
6448af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com        canvas->drawText(str, len, x, y, paint);
6458af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com        y += 80;
6468af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com        if (i == 4) {
6478af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com            x += 320;
6488af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com            y = 80;
6498af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com        }
6508af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    }
6518af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com}
6528af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
6538af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com///////////////////////////////////////////////////////////////////////////////
6548af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com
65563e34c61818b92c4f40387a1de32594934295bbbreed@android.com#include "SkImageEncoder.h"
65663e34c61818b92c4f40387a1de32594934295bbbreed@android.com
65763e34c61818b92c4f40387a1de32594934295bbbreed@android.comstatic const SlideProc gProc[] = {
65863e34c61818b92c4f40387a1de32594934295bbbreed@android.com    patheffect_slide,
65963e34c61818b92c4f40387a1de32594934295bbbreed@android.com    gradient_slide,
66063e34c61818b92c4f40387a1de32594934295bbbreed@android.com    textonpath_slide,
6618af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    mesh_slide,
6628af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com    texteffect_slide
66363e34c61818b92c4f40387a1de32594934295bbbreed@android.com};
66463e34c61818b92c4f40387a1de32594934295bbbreed@android.com
66581e3d7f7943d5c257a07580b75218a5e256b0aadreed@google.comclass SlideView : public SampleView {
66663e34c61818b92c4f40387a1de32594934295bbbreed@android.com    int fIndex;
6677b1859034fd1febd69eeeca9efd5e3eb297fb168reed@google.com    bool fOnce;
66863e34c61818b92c4f40387a1de32594934295bbbreed@android.compublic:
66963e34c61818b92c4f40387a1de32594934295bbbreed@android.com    SlideView() {
6707b1859034fd1febd69eeeca9efd5e3eb297fb168reed@google.com        fOnce = false;
6717b1859034fd1febd69eeeca9efd5e3eb297fb168reed@google.com    }
672ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
6737b1859034fd1febd69eeeca9efd5e3eb297fb168reed@google.com    void init() {
6747b1859034fd1febd69eeeca9efd5e3eb297fb168reed@google.com        if (fOnce) {
6757b1859034fd1febd69eeeca9efd5e3eb297fb168reed@google.com            return;
6767b1859034fd1febd69eeeca9efd5e3eb297fb168reed@google.com        }
6777b1859034fd1febd69eeeca9efd5e3eb297fb168reed@google.com        fOnce = true;
6787b1859034fd1febd69eeeca9efd5e3eb297fb168reed@google.com
67963e34c61818b92c4f40387a1de32594934295bbbreed@android.com        fIndex = 0;
680ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
68163e34c61818b92c4f40387a1de32594934295bbbreed@android.com        SkBitmap bm;
682a8c183125f2861067daf432cada06d431a795cd0commit-bot@chromium.org        bm.allocN32Pixels(1024, 768);
68363e34c61818b92c4f40387a1de32594934295bbbreed@android.com        SkCanvas canvas(bm);
68463e34c61818b92c4f40387a1de32594934295bbbreed@android.com        SkScalar s = SkIntToScalar(1024) / 640;
68563e34c61818b92c4f40387a1de32594934295bbbreed@android.com        canvas.scale(s, s);
68663e34c61818b92c4f40387a1de32594934295bbbreed@android.com        for (size_t i = 0; i < SK_ARRAY_COUNT(gProc); i++) {
68763e34c61818b92c4f40387a1de32594934295bbbreed@android.com            canvas.save();
6888af9602f6161e8d031ea175d7a5e4bd206d8e72breed@android.com            canvas.drawColor(BG_COLOR);
68963e34c61818b92c4f40387a1de32594934295bbbreed@android.com            gProc[i](&canvas);
69063e34c61818b92c4f40387a1de32594934295bbbreed@android.com            canvas.restore();
69163e34c61818b92c4f40387a1de32594934295bbbreed@android.com            SkString str;
6923a67a668dbdc3a6bba68700a6dfdef8164ae0c69senorblanco@chromium.org            str.printf("/skimages/slide_" SK_SIZE_T_SPECIFIER ".png", i);
69363e34c61818b92c4f40387a1de32594934295bbbreed@android.com            SkImageEncoder::EncodeFile(str.c_str(), bm, SkImageEncoder::kPNG_Type, 100);
69463e34c61818b92c4f40387a1de32594934295bbbreed@android.com        }
69581e3d7f7943d5c257a07580b75218a5e256b0aadreed@google.com        this->setBGColor(BG_COLOR);
69663e34c61818b92c4f40387a1de32594934295bbbreed@android.com    }
697ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
69863e34c61818b92c4f40387a1de32594934295bbbreed@android.comprotected:
69963e34c61818b92c4f40387a1de32594934295bbbreed@android.com    // overrides from SkEventSink
70063e34c61818b92c4f40387a1de32594934295bbbreed@android.com    virtual bool onQuery(SkEvent* evt) {
70163e34c61818b92c4f40387a1de32594934295bbbreed@android.com        if (SampleCode::TitleQ(*evt)) {
70263e34c61818b92c4f40387a1de32594934295bbbreed@android.com            SampleCode::TitleR(evt, "Slides");
70363e34c61818b92c4f40387a1de32594934295bbbreed@android.com            return true;
70463e34c61818b92c4f40387a1de32594934295bbbreed@android.com        }
70563e34c61818b92c4f40387a1de32594934295bbbreed@android.com        return this->INHERITED::onQuery(evt);
70663e34c61818b92c4f40387a1de32594934295bbbreed@android.com    }
707ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
70881e3d7f7943d5c257a07580b75218a5e256b0aadreed@google.com    virtual void onDrawContent(SkCanvas* canvas) {
7097b1859034fd1febd69eeeca9efd5e3eb297fb168reed@google.com        this->init();
71063e34c61818b92c4f40387a1de32594934295bbbreed@android.com        gProc[fIndex](canvas);
71163e34c61818b92c4f40387a1de32594934295bbbreed@android.com    }
71263e34c61818b92c4f40387a1de32594934295bbbreed@android.com
7139c55f801a35b0d6c39f007fae432bd13094f3c52sugoi@google.com    virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned) SK_OVERRIDE {
7147b1859034fd1febd69eeeca9efd5e3eb297fb168reed@google.com        this->init();
71563e34c61818b92c4f40387a1de32594934295bbbreed@android.com        fIndex = (fIndex + 1) % SK_ARRAY_COUNT(gProc);
71663e34c61818b92c4f40387a1de32594934295bbbreed@android.com        this->inval(NULL);
71763e34c61818b92c4f40387a1de32594934295bbbreed@android.com        return NULL;
71863e34c61818b92c4f40387a1de32594934295bbbreed@android.com    }
71963e34c61818b92c4f40387a1de32594934295bbbreed@android.com
72063e34c61818b92c4f40387a1de32594934295bbbreed@android.comprivate:
72181e3d7f7943d5c257a07580b75218a5e256b0aadreed@google.com    typedef SampleView INHERITED;
72263e34c61818b92c4f40387a1de32594934295bbbreed@android.com};
72363e34c61818b92c4f40387a1de32594934295bbbreed@android.com
72463e34c61818b92c4f40387a1de32594934295bbbreed@android.com//////////////////////////////////////////////////////////////////////////////
72563e34c61818b92c4f40387a1de32594934295bbbreed@android.com
72663e34c61818b92c4f40387a1de32594934295bbbreed@android.comstatic SkView* MyFactory() { return new SlideView; }
72763e34c61818b92c4f40387a1de32594934295bbbreed@android.comstatic SkViewRegister reg(MyFactory);
728