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