1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2011 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci#include "include/core/SkCanvas.h" 8cb93a386Sopenharmony_ci#include "include/core/SkPaint.h" 9cb93a386Sopenharmony_ci#include "include/core/SkVertices.h" 10cb93a386Sopenharmony_ci#include "include/effects/SkGradientShader.h" 11cb93a386Sopenharmony_ci#include "samplecode/Sample.h" 12cb93a386Sopenharmony_ci#include "src/core/SkBlurMask.h" 13cb93a386Sopenharmony_ci#include "src/core/SkReadBuffer.h" 14cb93a386Sopenharmony_ci#include "src/core/SkWriteBuffer.h" 15cb93a386Sopenharmony_ci 16cb93a386Sopenharmony_ci#include "tools/ToolUtils.h" 17cb93a386Sopenharmony_ci 18cb93a386Sopenharmony_ci#define BG_COLOR 0xFFDDDDDD 19cb93a386Sopenharmony_ci 20cb93a386Sopenharmony_citypedef void (*SlideProc)(SkCanvas*); 21cb93a386Sopenharmony_ci 22cb93a386Sopenharmony_ci/////////////////////////////////////////////////////////////////////////////// 23cb93a386Sopenharmony_ci 24cb93a386Sopenharmony_ci#include "include/effects/Sk1DPathEffect.h" 25cb93a386Sopenharmony_ci#include "include/effects/Sk2DPathEffect.h" 26cb93a386Sopenharmony_ci#include "include/effects/SkCornerPathEffect.h" 27cb93a386Sopenharmony_ci#include "include/effects/SkDashPathEffect.h" 28cb93a386Sopenharmony_ci#include "include/effects/SkDiscretePathEffect.h" 29cb93a386Sopenharmony_ci 30cb93a386Sopenharmony_cistatic void compose_pe(SkPaint* paint) { 31cb93a386Sopenharmony_ci SkPathEffect* pe = paint->getPathEffect(); 32cb93a386Sopenharmony_ci sk_sp<SkPathEffect> corner = SkCornerPathEffect::Make(25); 33cb93a386Sopenharmony_ci sk_sp<SkPathEffect> compose; 34cb93a386Sopenharmony_ci if (pe) { 35cb93a386Sopenharmony_ci compose = SkPathEffect::MakeCompose(sk_ref_sp(pe), corner); 36cb93a386Sopenharmony_ci } else { 37cb93a386Sopenharmony_ci compose = corner; 38cb93a386Sopenharmony_ci } 39cb93a386Sopenharmony_ci paint->setPathEffect(compose); 40cb93a386Sopenharmony_ci} 41cb93a386Sopenharmony_ci 42cb93a386Sopenharmony_cistatic void hair_pe(SkPaint* paint) { 43cb93a386Sopenharmony_ci paint->setStrokeWidth(0); 44cb93a386Sopenharmony_ci} 45cb93a386Sopenharmony_ci 46cb93a386Sopenharmony_cistatic void hair2_pe(SkPaint* paint) { 47cb93a386Sopenharmony_ci paint->setStrokeWidth(0); 48cb93a386Sopenharmony_ci compose_pe(paint); 49cb93a386Sopenharmony_ci} 50cb93a386Sopenharmony_ci 51cb93a386Sopenharmony_cistatic void stroke_pe(SkPaint* paint) { 52cb93a386Sopenharmony_ci paint->setStrokeWidth(12); 53cb93a386Sopenharmony_ci compose_pe(paint); 54cb93a386Sopenharmony_ci} 55cb93a386Sopenharmony_ci 56cb93a386Sopenharmony_cistatic void dash_pe(SkPaint* paint) { 57cb93a386Sopenharmony_ci SkScalar inter[] = { 20, 10, 10, 10 }; 58cb93a386Sopenharmony_ci paint->setStrokeWidth(12); 59cb93a386Sopenharmony_ci paint->setPathEffect(SkDashPathEffect::Make(inter, SK_ARRAY_COUNT(inter), 0)); 60cb93a386Sopenharmony_ci compose_pe(paint); 61cb93a386Sopenharmony_ci} 62cb93a386Sopenharmony_ci 63cb93a386Sopenharmony_cistatic const int gXY[] = { 64cb93a386Sopenharmony_ci4, 0, 0, -4, 8, -4, 12, 0, 8, 4, 0, 4 65cb93a386Sopenharmony_ci}; 66cb93a386Sopenharmony_ci 67cb93a386Sopenharmony_cistatic void scale(SkPath* path, SkScalar scale) { 68cb93a386Sopenharmony_ci SkMatrix m; 69cb93a386Sopenharmony_ci m.setScale(scale, scale); 70cb93a386Sopenharmony_ci path->transform(m); 71cb93a386Sopenharmony_ci} 72cb93a386Sopenharmony_ci 73cb93a386Sopenharmony_cistatic void one_d_pe(SkPaint* paint) { 74cb93a386Sopenharmony_ci SkPath path; 75cb93a386Sopenharmony_ci path.moveTo(SkIntToScalar(gXY[0]), SkIntToScalar(gXY[1])); 76cb93a386Sopenharmony_ci for (unsigned i = 2; i < SK_ARRAY_COUNT(gXY); i += 2) 77cb93a386Sopenharmony_ci path.lineTo(SkIntToScalar(gXY[i]), SkIntToScalar(gXY[i+1])); 78cb93a386Sopenharmony_ci path.close(); 79cb93a386Sopenharmony_ci path.offset(SkIntToScalar(-6), 0); 80cb93a386Sopenharmony_ci scale(&path, 1.5f); 81cb93a386Sopenharmony_ci 82cb93a386Sopenharmony_ci paint->setPathEffect(SkPath1DPathEffect::Make(path, SkIntToScalar(21), 0, 83cb93a386Sopenharmony_ci SkPath1DPathEffect::kRotate_Style)); 84cb93a386Sopenharmony_ci compose_pe(paint); 85cb93a386Sopenharmony_ci} 86cb93a386Sopenharmony_ci 87cb93a386Sopenharmony_citypedef void (*PE_Proc)(SkPaint*); 88cb93a386Sopenharmony_cistatic const PE_Proc gPE[] = { hair_pe, hair2_pe, stroke_pe, dash_pe, one_d_pe }; 89cb93a386Sopenharmony_ci 90cb93a386Sopenharmony_cistatic void fill_pe(SkPaint* paint) { 91cb93a386Sopenharmony_ci paint->setStyle(SkPaint::kFill_Style); 92cb93a386Sopenharmony_ci paint->setPathEffect(nullptr); 93cb93a386Sopenharmony_ci} 94cb93a386Sopenharmony_ci 95cb93a386Sopenharmony_cistatic void discrete_pe(SkPaint* paint) { 96cb93a386Sopenharmony_ci paint->setPathEffect(SkDiscretePathEffect::Make(10, 4)); 97cb93a386Sopenharmony_ci} 98cb93a386Sopenharmony_ci 99cb93a386Sopenharmony_cistatic sk_sp<SkPathEffect> MakeTileEffect() { 100cb93a386Sopenharmony_ci SkMatrix m; 101cb93a386Sopenharmony_ci m.setScale(SkIntToScalar(12), SkIntToScalar(12)); 102cb93a386Sopenharmony_ci 103cb93a386Sopenharmony_ci SkPath path; 104cb93a386Sopenharmony_ci path.addCircle(0, 0, SkIntToScalar(5)); 105cb93a386Sopenharmony_ci 106cb93a386Sopenharmony_ci return SkPath2DPathEffect::Make(m, path); 107cb93a386Sopenharmony_ci} 108cb93a386Sopenharmony_ci 109cb93a386Sopenharmony_cistatic void tile_pe(SkPaint* paint) { 110cb93a386Sopenharmony_ci paint->setPathEffect(MakeTileEffect()); 111cb93a386Sopenharmony_ci} 112cb93a386Sopenharmony_ci 113cb93a386Sopenharmony_cistatic const PE_Proc gPE2[] = { fill_pe, discrete_pe, tile_pe }; 114cb93a386Sopenharmony_ci 115cb93a386Sopenharmony_cistatic void patheffect_slide(SkCanvas* canvas) { 116cb93a386Sopenharmony_ci SkPaint paint; 117cb93a386Sopenharmony_ci paint.setAntiAlias(true); 118cb93a386Sopenharmony_ci paint.setStyle(SkPaint::kStroke_Style); 119cb93a386Sopenharmony_ci 120cb93a386Sopenharmony_ci SkPath path; 121cb93a386Sopenharmony_ci path.moveTo(20, 20); 122cb93a386Sopenharmony_ci path.lineTo(70, 120); 123cb93a386Sopenharmony_ci path.lineTo(120, 30); 124cb93a386Sopenharmony_ci path.lineTo(170, 80); 125cb93a386Sopenharmony_ci path.lineTo(240, 50); 126cb93a386Sopenharmony_ci 127cb93a386Sopenharmony_ci size_t i; 128cb93a386Sopenharmony_ci canvas->save(); 129cb93a386Sopenharmony_ci for (i = 0; i < SK_ARRAY_COUNT(gPE); i++) { 130cb93a386Sopenharmony_ci gPE[i](&paint); 131cb93a386Sopenharmony_ci canvas->drawPath(path, paint); 132cb93a386Sopenharmony_ci canvas->translate(0, 75); 133cb93a386Sopenharmony_ci } 134cb93a386Sopenharmony_ci canvas->restore(); 135cb93a386Sopenharmony_ci 136cb93a386Sopenharmony_ci path.reset(); 137cb93a386Sopenharmony_ci SkRect r = { 0, 0, 250, 120 }; 138cb93a386Sopenharmony_ci path.addOval(r, SkPathDirection::kCW); 139cb93a386Sopenharmony_ci r.inset(50, 50); 140cb93a386Sopenharmony_ci path.addRect(r, SkPathDirection::kCCW); 141cb93a386Sopenharmony_ci 142cb93a386Sopenharmony_ci canvas->translate(320, 20); 143cb93a386Sopenharmony_ci for (i = 0; i < SK_ARRAY_COUNT(gPE2); i++) { 144cb93a386Sopenharmony_ci gPE2[i](&paint); 145cb93a386Sopenharmony_ci canvas->drawPath(path, paint); 146cb93a386Sopenharmony_ci canvas->translate(0, 160); 147cb93a386Sopenharmony_ci } 148cb93a386Sopenharmony_ci} 149cb93a386Sopenharmony_ci 150cb93a386Sopenharmony_ci/////////////////////////////////////////////////////////////////////////////// 151cb93a386Sopenharmony_ci 152cb93a386Sopenharmony_ci#include "include/effects/SkGradientShader.h" 153cb93a386Sopenharmony_ci 154cb93a386Sopenharmony_cistruct GradData { 155cb93a386Sopenharmony_ci int fCount; 156cb93a386Sopenharmony_ci const SkColor* fColors; 157cb93a386Sopenharmony_ci const SkScalar* fPos; 158cb93a386Sopenharmony_ci}; 159cb93a386Sopenharmony_ci 160cb93a386Sopenharmony_cistatic const SkColor gColors[] = { 161cb93a386Sopenharmony_ciSK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK 162cb93a386Sopenharmony_ci}; 163cb93a386Sopenharmony_cistatic const SkScalar gPos0[] = { 0, SK_Scalar1 }; 164cb93a386Sopenharmony_cistatic const SkScalar gPos1[] = { SK_Scalar1/4, SK_Scalar1*3/4 }; 165cb93a386Sopenharmony_cistatic const SkScalar gPos2[] = { 166cb93a386Sopenharmony_ci0, SK_Scalar1/8, SK_Scalar1/2, SK_Scalar1*7/8, SK_Scalar1 167cb93a386Sopenharmony_ci}; 168cb93a386Sopenharmony_ci 169cb93a386Sopenharmony_cistatic const GradData gGradData[] = { 170cb93a386Sopenharmony_ci{ 2, gColors, nullptr }, 171cb93a386Sopenharmony_ci{ 2, gColors, gPos0 }, 172cb93a386Sopenharmony_ci{ 2, gColors, gPos1 }, 173cb93a386Sopenharmony_ci{ 5, gColors, nullptr }, 174cb93a386Sopenharmony_ci{ 5, gColors, gPos2 } 175cb93a386Sopenharmony_ci}; 176cb93a386Sopenharmony_ci 177cb93a386Sopenharmony_cistatic sk_sp<SkShader> MakeLinear(const SkPoint pts[2], const GradData& data, SkTileMode tm) { 178cb93a386Sopenharmony_ci return SkGradientShader::MakeLinear(pts, data.fColors, data.fPos, data.fCount, tm); 179cb93a386Sopenharmony_ci} 180cb93a386Sopenharmony_ci 181cb93a386Sopenharmony_cistatic sk_sp<SkShader> MakeRadial(const SkPoint pts[2], const GradData& data, SkTileMode tm) { 182cb93a386Sopenharmony_ci SkPoint center; 183cb93a386Sopenharmony_ci center.set(SkScalarAve(pts[0].fX, pts[1].fX), 184cb93a386Sopenharmony_ci SkScalarAve(pts[0].fY, pts[1].fY)); 185cb93a386Sopenharmony_ci return SkGradientShader::MakeRadial(center, center.fX, data.fColors, 186cb93a386Sopenharmony_ci data.fPos, data.fCount, tm); 187cb93a386Sopenharmony_ci} 188cb93a386Sopenharmony_ci 189cb93a386Sopenharmony_cistatic sk_sp<SkShader> MakeSweep(const SkPoint pts[2], const GradData& data, SkTileMode tm) { 190cb93a386Sopenharmony_ci SkPoint center; 191cb93a386Sopenharmony_ci center.set(SkScalarAve(pts[0].fX, pts[1].fX), 192cb93a386Sopenharmony_ci SkScalarAve(pts[0].fY, pts[1].fY)); 193cb93a386Sopenharmony_ci return SkGradientShader::MakeSweep(center.fX, center.fY, data.fColors, data.fPos, data.fCount); 194cb93a386Sopenharmony_ci} 195cb93a386Sopenharmony_ci 196cb93a386Sopenharmony_cistatic sk_sp<SkShader> Make2Conical(const SkPoint pts[2], const GradData& data, SkTileMode tm) { 197cb93a386Sopenharmony_ci SkPoint center0, center1; 198cb93a386Sopenharmony_ci center0.set(SkScalarAve(pts[0].fX, pts[1].fX), 199cb93a386Sopenharmony_ci SkScalarAve(pts[0].fY, pts[1].fY)); 200cb93a386Sopenharmony_ci center1.set(SkScalarInterp(pts[0].fX, pts[1].fX, SkIntToScalar(3)/5), 201cb93a386Sopenharmony_ci SkScalarInterp(pts[0].fY, pts[1].fY, SkIntToScalar(1)/4)); 202cb93a386Sopenharmony_ci return SkGradientShader::MakeTwoPointConical(center1, (pts[1].fX - pts[0].fX) / 7, 203cb93a386Sopenharmony_ci center0, (pts[1].fX - pts[0].fX) / 2, 204cb93a386Sopenharmony_ci data.fColors, data.fPos, data.fCount, tm); 205cb93a386Sopenharmony_ci} 206cb93a386Sopenharmony_ci 207cb93a386Sopenharmony_citypedef sk_sp<SkShader> (*GradMaker)(const SkPoint pts[2], const GradData&, SkTileMode); 208cb93a386Sopenharmony_cistatic const GradMaker gGradMakers[] = { 209cb93a386Sopenharmony_ci MakeLinear, MakeRadial, MakeSweep, Make2Conical 210cb93a386Sopenharmony_ci}; 211cb93a386Sopenharmony_ci 212cb93a386Sopenharmony_cistatic void gradient_slide(SkCanvas* canvas) { 213cb93a386Sopenharmony_ci SkPoint pts[2] = { 214cb93a386Sopenharmony_ci { 0, 0 }, 215cb93a386Sopenharmony_ci { SkIntToScalar(100), SkIntToScalar(100) } 216cb93a386Sopenharmony_ci }; 217cb93a386Sopenharmony_ci SkTileMode tm = SkTileMode::kClamp; 218cb93a386Sopenharmony_ci SkRect r = { 0, 0, SkIntToScalar(100), SkIntToScalar(100) }; 219cb93a386Sopenharmony_ci SkPaint paint; 220cb93a386Sopenharmony_ci paint.setAntiAlias(true); 221cb93a386Sopenharmony_ci paint.setDither(true); 222cb93a386Sopenharmony_ci 223cb93a386Sopenharmony_ci canvas->translate(SkIntToScalar(20), SkIntToScalar(10)); 224cb93a386Sopenharmony_ci for (size_t i = 0; i < SK_ARRAY_COUNT(gGradData); i++) { 225cb93a386Sopenharmony_ci canvas->save(); 226cb93a386Sopenharmony_ci for (size_t j = 0; j < SK_ARRAY_COUNT(gGradMakers); j++) { 227cb93a386Sopenharmony_ci paint.setShader(gGradMakers[j](pts, gGradData[i], tm)); 228cb93a386Sopenharmony_ci canvas->drawRect(r, paint); 229cb93a386Sopenharmony_ci canvas->translate(0, SkIntToScalar(120)); 230cb93a386Sopenharmony_ci } 231cb93a386Sopenharmony_ci canvas->restore(); 232cb93a386Sopenharmony_ci canvas->translate(SkIntToScalar(120), 0); 233cb93a386Sopenharmony_ci } 234cb93a386Sopenharmony_ci} 235cb93a386Sopenharmony_ci 236cb93a386Sopenharmony_ci/////////////////////////////////////////////////////////////////////////////// 237cb93a386Sopenharmony_ci 238cb93a386Sopenharmony_ci#include "include/core/SkStream.h" 239cb93a386Sopenharmony_ci#include "include/utils/SkRandom.h" 240cb93a386Sopenharmony_ci#include "samplecode/DecodeFile.h" 241cb93a386Sopenharmony_ci#include "src/core/SkOSFile.h" 242cb93a386Sopenharmony_ci 243cb93a386Sopenharmony_cistatic sk_sp<SkShader> make_shader0(SkIPoint* size) { 244cb93a386Sopenharmony_ci SkBitmap bm; 245cb93a386Sopenharmony_ci 246cb93a386Sopenharmony_ci decode_file("/skimages/logo.gif", &bm); 247cb93a386Sopenharmony_ci size->set(bm.width(), bm.height()); 248cb93a386Sopenharmony_ci return bm.makeShader(SkSamplingOptions(SkFilterMode::kLinear)); 249cb93a386Sopenharmony_ci} 250cb93a386Sopenharmony_ci 251cb93a386Sopenharmony_cistatic sk_sp<SkShader> make_shader1(const SkIPoint& size) { 252cb93a386Sopenharmony_ci SkPoint pts[] = { { 0, 0 }, 253cb93a386Sopenharmony_ci { SkIntToScalar(size.fX), SkIntToScalar(size.fY) } }; 254cb93a386Sopenharmony_ci SkColor colors[] = { SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorRED }; 255cb93a386Sopenharmony_ci return SkGradientShader::MakeLinear(pts, colors, nullptr, 256cb93a386Sopenharmony_ci SK_ARRAY_COUNT(colors), SkTileMode::kMirror); 257cb93a386Sopenharmony_ci} 258cb93a386Sopenharmony_ci 259cb93a386Sopenharmony_ciclass Rec { 260cb93a386Sopenharmony_cipublic: 261cb93a386Sopenharmony_ci SkVertices::VertexMode fMode; 262cb93a386Sopenharmony_ci int fCount; 263cb93a386Sopenharmony_ci SkPoint* fVerts; 264cb93a386Sopenharmony_ci SkPoint* fTexs; 265cb93a386Sopenharmony_ci 266cb93a386Sopenharmony_ci Rec() : fCount(0), fVerts(nullptr), fTexs(nullptr) {} 267cb93a386Sopenharmony_ci ~Rec() { delete[] fVerts; delete[] fTexs; } 268cb93a386Sopenharmony_ci}; 269cb93a386Sopenharmony_ci 270cb93a386Sopenharmony_cistatic void make_tris(Rec* rec) { 271cb93a386Sopenharmony_ci int n = 10; 272cb93a386Sopenharmony_ci SkRandom rand; 273cb93a386Sopenharmony_ci 274cb93a386Sopenharmony_ci rec->fMode = SkVertices::kTriangles_VertexMode; 275cb93a386Sopenharmony_ci rec->fCount = n * 3; 276cb93a386Sopenharmony_ci rec->fVerts = new SkPoint[rec->fCount]; 277cb93a386Sopenharmony_ci 278cb93a386Sopenharmony_ci for (int i = 0; i < n; i++) { 279cb93a386Sopenharmony_ci SkPoint* v = &rec->fVerts[i*3]; 280cb93a386Sopenharmony_ci for (int j = 0; j < 3; j++) { 281cb93a386Sopenharmony_ci v[j].set(rand.nextUScalar1() * 250, rand.nextUScalar1() * 250); 282cb93a386Sopenharmony_ci } 283cb93a386Sopenharmony_ci } 284cb93a386Sopenharmony_ci} 285cb93a386Sopenharmony_ci 286cb93a386Sopenharmony_cistatic void make_fan(Rec* rec, int texWidth, int texHeight) { 287cb93a386Sopenharmony_ci const SkScalar tx = SkIntToScalar(texWidth); 288cb93a386Sopenharmony_ci const SkScalar ty = SkIntToScalar(texHeight); 289cb93a386Sopenharmony_ci const int n = 24; 290cb93a386Sopenharmony_ci 291cb93a386Sopenharmony_ci rec->fMode = SkVertices::kTriangleFan_VertexMode; 292cb93a386Sopenharmony_ci rec->fCount = n + 2; 293cb93a386Sopenharmony_ci rec->fVerts = new SkPoint[rec->fCount]; 294cb93a386Sopenharmony_ci rec->fTexs = new SkPoint[rec->fCount]; 295cb93a386Sopenharmony_ci 296cb93a386Sopenharmony_ci SkPoint* v = rec->fVerts; 297cb93a386Sopenharmony_ci SkPoint* t = rec->fTexs; 298cb93a386Sopenharmony_ci 299cb93a386Sopenharmony_ci v[0].set(0, 0); 300cb93a386Sopenharmony_ci t[0].set(0, 0); 301cb93a386Sopenharmony_ci for (int i = 0; i < n; i++) { 302cb93a386Sopenharmony_ci SkScalar r = SK_ScalarPI * 2 * i / n, 303cb93a386Sopenharmony_ci sin = SkScalarSin(r), 304cb93a386Sopenharmony_ci cos = SkScalarCos(r); 305cb93a386Sopenharmony_ci v[i+1].set(cos, sin); 306cb93a386Sopenharmony_ci t[i+1].set(i*tx/n, ty); 307cb93a386Sopenharmony_ci } 308cb93a386Sopenharmony_ci v[n+1] = v[1]; 309cb93a386Sopenharmony_ci t[n+1].set(tx, ty); 310cb93a386Sopenharmony_ci 311cb93a386Sopenharmony_ci SkMatrix m; 312cb93a386Sopenharmony_ci m.setScale(SkIntToScalar(100), SkIntToScalar(100)); 313cb93a386Sopenharmony_ci m.postTranslate(SkIntToScalar(110), SkIntToScalar(110)); 314cb93a386Sopenharmony_ci m.mapPoints(v, rec->fCount); 315cb93a386Sopenharmony_ci} 316cb93a386Sopenharmony_ci 317cb93a386Sopenharmony_cistatic void make_strip(Rec* rec, int texWidth, int texHeight) { 318cb93a386Sopenharmony_ci const SkScalar tx = SkIntToScalar(texWidth); 319cb93a386Sopenharmony_ci const SkScalar ty = SkIntToScalar(texHeight); 320cb93a386Sopenharmony_ci const int n = 24; 321cb93a386Sopenharmony_ci 322cb93a386Sopenharmony_ci rec->fMode = SkVertices::kTriangleStrip_VertexMode; 323cb93a386Sopenharmony_ci rec->fCount = 2 * (n + 1); 324cb93a386Sopenharmony_ci rec->fVerts = new SkPoint[rec->fCount]; 325cb93a386Sopenharmony_ci rec->fTexs = new SkPoint[rec->fCount]; 326cb93a386Sopenharmony_ci 327cb93a386Sopenharmony_ci SkPoint* v = rec->fVerts; 328cb93a386Sopenharmony_ci SkPoint* t = rec->fTexs; 329cb93a386Sopenharmony_ci 330cb93a386Sopenharmony_ci for (int i = 0; i < n; i++) { 331cb93a386Sopenharmony_ci SkScalar r = SK_ScalarPI * 2 * i / n, 332cb93a386Sopenharmony_ci sin = SkScalarSin(r), 333cb93a386Sopenharmony_ci cos = SkScalarCos(r); 334cb93a386Sopenharmony_ci v[i*2 + 0].set(cos/2, sin/2); 335cb93a386Sopenharmony_ci v[i*2 + 1].set(cos, sin); 336cb93a386Sopenharmony_ci 337cb93a386Sopenharmony_ci t[i*2 + 0].set(tx * i / n, ty); 338cb93a386Sopenharmony_ci t[i*2 + 1].set(tx * i / n, 0); 339cb93a386Sopenharmony_ci } 340cb93a386Sopenharmony_ci v[2*n + 0] = v[0]; 341cb93a386Sopenharmony_ci v[2*n + 1] = v[1]; 342cb93a386Sopenharmony_ci 343cb93a386Sopenharmony_ci t[2*n + 0].set(tx, ty); 344cb93a386Sopenharmony_ci t[2*n + 1].set(tx, 0); 345cb93a386Sopenharmony_ci 346cb93a386Sopenharmony_ci SkMatrix m; 347cb93a386Sopenharmony_ci m.setScale(SkIntToScalar(100), SkIntToScalar(100)); 348cb93a386Sopenharmony_ci m.postTranslate(SkIntToScalar(110), SkIntToScalar(110)); 349cb93a386Sopenharmony_ci m.mapPoints(v, rec->fCount); 350cb93a386Sopenharmony_ci} 351cb93a386Sopenharmony_ci 352cb93a386Sopenharmony_cistatic void mesh_slide(SkCanvas* canvas) { 353cb93a386Sopenharmony_ci Rec fRecs[3]; 354cb93a386Sopenharmony_ci SkIPoint size; 355cb93a386Sopenharmony_ci 356cb93a386Sopenharmony_ci auto fShader0 = make_shader0(&size); 357cb93a386Sopenharmony_ci auto fShader1 = make_shader1(size); 358cb93a386Sopenharmony_ci 359cb93a386Sopenharmony_ci make_strip(&fRecs[0], size.fX, size.fY); 360cb93a386Sopenharmony_ci make_fan(&fRecs[1], size.fX, size.fY); 361cb93a386Sopenharmony_ci make_tris(&fRecs[2]); 362cb93a386Sopenharmony_ci 363cb93a386Sopenharmony_ci SkPaint paint; 364cb93a386Sopenharmony_ci paint.setDither(true); 365cb93a386Sopenharmony_ci 366cb93a386Sopenharmony_ci for (size_t i = 0; i < SK_ARRAY_COUNT(fRecs); i++) { 367cb93a386Sopenharmony_ci auto verts = SkVertices::MakeCopy(fRecs[i].fMode, fRecs[i].fCount, 368cb93a386Sopenharmony_ci fRecs[i].fVerts, fRecs[i].fTexs, nullptr); 369cb93a386Sopenharmony_ci canvas->save(); 370cb93a386Sopenharmony_ci 371cb93a386Sopenharmony_ci paint.setShader(nullptr); 372cb93a386Sopenharmony_ci canvas->drawVertices(verts, SkBlendMode::kModulate, paint); 373cb93a386Sopenharmony_ci 374cb93a386Sopenharmony_ci canvas->translate(SkIntToScalar(210), 0); 375cb93a386Sopenharmony_ci 376cb93a386Sopenharmony_ci paint.setShader(fShader0); 377cb93a386Sopenharmony_ci canvas->drawVertices(verts, SkBlendMode::kModulate, paint); 378cb93a386Sopenharmony_ci 379cb93a386Sopenharmony_ci canvas->translate(SkIntToScalar(210), 0); 380cb93a386Sopenharmony_ci 381cb93a386Sopenharmony_ci paint.setShader(fShader1); 382cb93a386Sopenharmony_ci canvas->drawVertices(verts, SkBlendMode::kModulate, paint); 383cb93a386Sopenharmony_ci canvas->restore(); 384cb93a386Sopenharmony_ci 385cb93a386Sopenharmony_ci canvas->translate(0, SkIntToScalar(250)); 386cb93a386Sopenharmony_ci } 387cb93a386Sopenharmony_ci} 388cb93a386Sopenharmony_ci 389cb93a386Sopenharmony_ci/////////////////////////////////////////////////////////////////////////////// 390cb93a386Sopenharmony_ci 391cb93a386Sopenharmony_ci#include "include/core/SkTypeface.h" 392cb93a386Sopenharmony_ci 393cb93a386Sopenharmony_ci/////////////////////////////////////////////////////////////////////////////// 394cb93a386Sopenharmony_ci 395cb93a386Sopenharmony_ci#include "include/core/SkImageEncoder.h" 396cb93a386Sopenharmony_ci 397cb93a386Sopenharmony_cistatic const SlideProc gProc[] = { 398cb93a386Sopenharmony_ci patheffect_slide, 399cb93a386Sopenharmony_ci gradient_slide, 400cb93a386Sopenharmony_ci mesh_slide, 401cb93a386Sopenharmony_ci}; 402cb93a386Sopenharmony_ci 403cb93a386Sopenharmony_ciclass SlideView : public Sample { 404cb93a386Sopenharmony_ci int fIndex; 405cb93a386Sopenharmony_ci bool fOnce; 406cb93a386Sopenharmony_cipublic: 407cb93a386Sopenharmony_ci SlideView() { 408cb93a386Sopenharmony_ci fOnce = false; 409cb93a386Sopenharmony_ci } 410cb93a386Sopenharmony_ci 411cb93a386Sopenharmony_ci void init() { 412cb93a386Sopenharmony_ci if (fOnce) { 413cb93a386Sopenharmony_ci return; 414cb93a386Sopenharmony_ci } 415cb93a386Sopenharmony_ci fOnce = true; 416cb93a386Sopenharmony_ci 417cb93a386Sopenharmony_ci fIndex = 0; 418cb93a386Sopenharmony_ci 419cb93a386Sopenharmony_ci SkBitmap bm; 420cb93a386Sopenharmony_ci bm.allocN32Pixels(1024, 768); 421cb93a386Sopenharmony_ci SkCanvas canvas(bm); 422cb93a386Sopenharmony_ci SkScalar s = SkIntToScalar(1024) / 640; 423cb93a386Sopenharmony_ci canvas.scale(s, s); 424cb93a386Sopenharmony_ci for (size_t i = 0; i < SK_ARRAY_COUNT(gProc); i++) { 425cb93a386Sopenharmony_ci canvas.save(); 426cb93a386Sopenharmony_ci canvas.drawColor(BG_COLOR); 427cb93a386Sopenharmony_ci gProc[i](&canvas); 428cb93a386Sopenharmony_ci canvas.restore(); 429cb93a386Sopenharmony_ci SkString str; 430cb93a386Sopenharmony_ci str.printf("/skimages/slide_%zu.png", i); 431cb93a386Sopenharmony_ci ToolUtils::EncodeImageToFile(str.c_str(), bm, SkEncodedImageFormat::kPNG, 100); 432cb93a386Sopenharmony_ci } 433cb93a386Sopenharmony_ci this->setBGColor(BG_COLOR); 434cb93a386Sopenharmony_ci } 435cb93a386Sopenharmony_ci 436cb93a386Sopenharmony_ciprotected: 437cb93a386Sopenharmony_ci SkString name() override { return SkString("Slides"); } 438cb93a386Sopenharmony_ci 439cb93a386Sopenharmony_ci void onDrawContent(SkCanvas* canvas) override { 440cb93a386Sopenharmony_ci this->init(); 441cb93a386Sopenharmony_ci gProc[fIndex](canvas); 442cb93a386Sopenharmony_ci } 443cb93a386Sopenharmony_ci 444cb93a386Sopenharmony_ci Sample::Click* onFindClickHandler(SkScalar x, SkScalar y, skui::ModifierKey) override { 445cb93a386Sopenharmony_ci this->init(); 446cb93a386Sopenharmony_ci fIndex = (fIndex + 1) % SK_ARRAY_COUNT(gProc); 447cb93a386Sopenharmony_ci return nullptr; 448cb93a386Sopenharmony_ci } 449cb93a386Sopenharmony_ci 450cb93a386Sopenharmony_ciprivate: 451cb93a386Sopenharmony_ci using INHERITED = Sample; 452cb93a386Sopenharmony_ci}; 453cb93a386Sopenharmony_ci 454cb93a386Sopenharmony_ci////////////////////////////////////////////////////////////////////////////// 455cb93a386Sopenharmony_ci 456cb93a386Sopenharmony_ciDEF_SAMPLE( return new SlideView(); ) 457