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