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/SkBitmap.h"
8cb93a386Sopenharmony_ci#include "include/core/SkCanvas.h"
9cb93a386Sopenharmony_ci#include "include/core/SkColorFilter.h"
10cb93a386Sopenharmony_ci#include "include/core/SkColorPriv.h"
11cb93a386Sopenharmony_ci#include "include/core/SkGraphics.h"
12cb93a386Sopenharmony_ci#include "include/core/SkPath.h"
13cb93a386Sopenharmony_ci#include "include/core/SkRegion.h"
14cb93a386Sopenharmony_ci#include "include/core/SkShader.h"
15cb93a386Sopenharmony_ci#include "include/core/SkTime.h"
16cb93a386Sopenharmony_ci#include "include/core/SkTypeface.h"
17cb93a386Sopenharmony_ci#include "include/core/SkVertices.h"
18cb93a386Sopenharmony_ci#include "include/effects/SkGradientShader.h"
19cb93a386Sopenharmony_ci#include "include/utils/SkRandom.h"
20cb93a386Sopenharmony_ci#include "samplecode/Sample.h"
21cb93a386Sopenharmony_ci#include "src/utils/SkUTF.h"
22cb93a386Sopenharmony_ci
23cb93a386Sopenharmony_ci#include "include/core/SkStream.h"
24cb93a386Sopenharmony_ci#include "src/core/SkOSFile.h"
25cb93a386Sopenharmony_ci
26cb93a386Sopenharmony_cistatic sk_sp<SkShader> make_shader0(SkIPoint* size) {
27cb93a386Sopenharmony_ci    SkBitmap    bm;
28cb93a386Sopenharmony_ci    size->set(2, 2);
29cb93a386Sopenharmony_ci    SkPMColor color0 = SkPreMultiplyARGB(0x80, 0x80, 0xff, 0x80);
30cb93a386Sopenharmony_ci    SkPMColor color1 = SkPreMultiplyARGB(0x40, 0xff, 0x00, 0xff);
31cb93a386Sopenharmony_ci    bm.allocN32Pixels(size->fX, size->fY);
32cb93a386Sopenharmony_ci    bm.eraseColor(color0);
33cb93a386Sopenharmony_ci    uint32_t* pixels = (uint32_t*) bm.getPixels();
34cb93a386Sopenharmony_ci    pixels[0] = pixels[2] = color0;
35cb93a386Sopenharmony_ci    pixels[1] = pixels[3] = color1;
36cb93a386Sopenharmony_ci
37cb93a386Sopenharmony_ci    return bm.makeShader(SkTileMode::kRepeat, SkTileMode::kRepeat,
38cb93a386Sopenharmony_ci                         SkSamplingOptions(SkFilterMode::kLinear));
39cb93a386Sopenharmony_ci}
40cb93a386Sopenharmony_ci
41cb93a386Sopenharmony_cistatic sk_sp<SkShader> make_shader1(const SkIPoint& size) {
42cb93a386Sopenharmony_ci    SkPoint pts[] = { { 0, 0 },
43cb93a386Sopenharmony_ci                      { SkIntToScalar(size.fX), SkIntToScalar(size.fY) } };
44cb93a386Sopenharmony_ci    SkColor colors[] = { SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorRED };
45cb93a386Sopenharmony_ci    return SkGradientShader::MakeLinear(pts, colors, nullptr,
46cb93a386Sopenharmony_ci                    SK_ARRAY_COUNT(colors), SkTileMode::kMirror);
47cb93a386Sopenharmony_ci}
48cb93a386Sopenharmony_ci
49cb93a386Sopenharmony_ciclass VerticesView : public Sample {
50cb93a386Sopenharmony_ci    sk_sp<SkShader> fShader0;
51cb93a386Sopenharmony_ci    sk_sp<SkShader> fShader1;
52cb93a386Sopenharmony_ci
53cb93a386Sopenharmony_cipublic:
54cb93a386Sopenharmony_ci    VerticesView() {
55cb93a386Sopenharmony_ci        SkIPoint    size;
56cb93a386Sopenharmony_ci
57cb93a386Sopenharmony_ci        fShader0 = make_shader0(&size);
58cb93a386Sopenharmony_ci        fShader1 = make_shader1(size);
59cb93a386Sopenharmony_ci
60cb93a386Sopenharmony_ci        make_strip(&fRecs[0], size.fX, size.fY);
61cb93a386Sopenharmony_ci        make_fan(&fRecs[1], size.fX, size.fY);
62cb93a386Sopenharmony_ci        make_tris(&fRecs[2]);
63cb93a386Sopenharmony_ci
64cb93a386Sopenharmony_ci        fScale = SK_Scalar1;
65cb93a386Sopenharmony_ci
66cb93a386Sopenharmony_ci        this->setBGColor(SK_ColorGRAY);
67cb93a386Sopenharmony_ci    }
68cb93a386Sopenharmony_ci
69cb93a386Sopenharmony_ciprotected:
70cb93a386Sopenharmony_ci    SkString name() override { return SkString("Vertices"); }
71cb93a386Sopenharmony_ci
72cb93a386Sopenharmony_ci    SkScalar fScale;
73cb93a386Sopenharmony_ci
74cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
75cb93a386Sopenharmony_ci        SkPaint paint;
76cb93a386Sopenharmony_ci        paint.setDither(true);
77cb93a386Sopenharmony_ci
78cb93a386Sopenharmony_ci        for (size_t i = 0; i < SK_ARRAY_COUNT(fRecs); i++) {
79cb93a386Sopenharmony_ci            auto verts = SkVertices::MakeCopy(fRecs[i].fMode, fRecs[i].fCount,
80cb93a386Sopenharmony_ci                                              fRecs[i].fVerts, fRecs[i].fTexs,
81cb93a386Sopenharmony_ci                                              nullptr);
82cb93a386Sopenharmony_ci            canvas->save();
83cb93a386Sopenharmony_ci
84cb93a386Sopenharmony_ci            paint.setShader(nullptr);
85cb93a386Sopenharmony_ci            canvas->drawVertices(verts, SkBlendMode::kModulate, paint);
86cb93a386Sopenharmony_ci
87cb93a386Sopenharmony_ci            canvas->translate(SkIntToScalar(250), 0);
88cb93a386Sopenharmony_ci
89cb93a386Sopenharmony_ci            paint.setShader(fShader0);
90cb93a386Sopenharmony_ci            canvas->drawVertices(verts, SkBlendMode::kModulate, paint);
91cb93a386Sopenharmony_ci
92cb93a386Sopenharmony_ci            canvas->translate(SkIntToScalar(250), 0);
93cb93a386Sopenharmony_ci
94cb93a386Sopenharmony_ci            paint.setShader(fShader1);
95cb93a386Sopenharmony_ci            canvas->drawVertices(verts, SkBlendMode::kModulate, paint);
96cb93a386Sopenharmony_ci            canvas->restore();
97cb93a386Sopenharmony_ci
98cb93a386Sopenharmony_ci            canvas->translate(0, SkIntToScalar(250));
99cb93a386Sopenharmony_ci        }
100cb93a386Sopenharmony_ci    }
101cb93a386Sopenharmony_ci
102cb93a386Sopenharmony_ci    Sample::Click* onFindClickHandler(SkScalar x, SkScalar y, skui::ModifierKey) override {
103cb93a386Sopenharmony_ci        return new Click();
104cb93a386Sopenharmony_ci    }
105cb93a386Sopenharmony_ci
106cb93a386Sopenharmony_ci    bool onClick(Click* click) override {
107cb93a386Sopenharmony_ci    //    fCurrX = click->fICurr.fX;
108cb93a386Sopenharmony_ci    //    fCurrY = click->fICurr.fY;
109cb93a386Sopenharmony_ci        return true;
110cb93a386Sopenharmony_ci    }
111cb93a386Sopenharmony_ci
112cb93a386Sopenharmony_ciprivate:
113cb93a386Sopenharmony_ci    struct Rec {
114cb93a386Sopenharmony_ci        SkVertices::VertexMode  fMode;
115cb93a386Sopenharmony_ci        int                     fCount;
116cb93a386Sopenharmony_ci        SkPoint*                fVerts;
117cb93a386Sopenharmony_ci        SkPoint*                fTexs;
118cb93a386Sopenharmony_ci
119cb93a386Sopenharmony_ci        Rec() : fCount(0), fVerts(nullptr), fTexs(nullptr) {}
120cb93a386Sopenharmony_ci        ~Rec() { delete[] fVerts; delete[] fTexs; }
121cb93a386Sopenharmony_ci    };
122cb93a386Sopenharmony_ci
123cb93a386Sopenharmony_ci    void make_tris(Rec* rec) {
124cb93a386Sopenharmony_ci        int n = 10;
125cb93a386Sopenharmony_ci        SkRandom    rand;
126cb93a386Sopenharmony_ci
127cb93a386Sopenharmony_ci        rec->fMode = SkVertices::kTriangles_VertexMode;
128cb93a386Sopenharmony_ci        rec->fCount = n * 3;
129cb93a386Sopenharmony_ci        rec->fVerts = new SkPoint[rec->fCount];
130cb93a386Sopenharmony_ci
131cb93a386Sopenharmony_ci        for (int i = 0; i < n; i++) {
132cb93a386Sopenharmony_ci            SkPoint* v = &rec->fVerts[i*3];
133cb93a386Sopenharmony_ci            for (int j = 0; j < 3; j++) {
134cb93a386Sopenharmony_ci                v[j].set(rand.nextUScalar1() * 250, rand.nextUScalar1() * 250);
135cb93a386Sopenharmony_ci            }
136cb93a386Sopenharmony_ci        }
137cb93a386Sopenharmony_ci    }
138cb93a386Sopenharmony_ci
139cb93a386Sopenharmony_ci    void make_fan(Rec* rec, int texWidth, int texHeight) {
140cb93a386Sopenharmony_ci        const SkScalar tx = SkIntToScalar(texWidth);
141cb93a386Sopenharmony_ci        const SkScalar ty = SkIntToScalar(texHeight);
142cb93a386Sopenharmony_ci        const int n = 24;
143cb93a386Sopenharmony_ci
144cb93a386Sopenharmony_ci        rec->fMode = SkVertices::kTriangleFan_VertexMode;
145cb93a386Sopenharmony_ci        rec->fCount = n + 2;
146cb93a386Sopenharmony_ci        rec->fVerts = new SkPoint[rec->fCount];
147cb93a386Sopenharmony_ci        rec->fTexs  = new SkPoint[rec->fCount];
148cb93a386Sopenharmony_ci
149cb93a386Sopenharmony_ci        SkPoint* v = rec->fVerts;
150cb93a386Sopenharmony_ci        SkPoint* t = rec->fTexs;
151cb93a386Sopenharmony_ci
152cb93a386Sopenharmony_ci        v[0].set(0, 0);
153cb93a386Sopenharmony_ci        t[0].set(0, 0);
154cb93a386Sopenharmony_ci        for (int i = 0; i < n; i++) {
155cb93a386Sopenharmony_ci            SkScalar r   = SK_ScalarPI * 2 * i / n,
156cb93a386Sopenharmony_ci                     sin = SkScalarSin(r),
157cb93a386Sopenharmony_ci                     cos = SkScalarCos(r);
158cb93a386Sopenharmony_ci            v[i+1].set(cos, sin);
159cb93a386Sopenharmony_ci            t[i+1].set(i*tx/n, ty);
160cb93a386Sopenharmony_ci        }
161cb93a386Sopenharmony_ci        v[n+1] = v[1];
162cb93a386Sopenharmony_ci        t[n+1].set(tx, ty);
163cb93a386Sopenharmony_ci
164cb93a386Sopenharmony_ci        SkMatrix m;
165cb93a386Sopenharmony_ci        m.setScale(SkIntToScalar(100), SkIntToScalar(100));
166cb93a386Sopenharmony_ci        m.postTranslate(SkIntToScalar(110), SkIntToScalar(110));
167cb93a386Sopenharmony_ci        m.mapPoints(v, rec->fCount);
168cb93a386Sopenharmony_ci    }
169cb93a386Sopenharmony_ci
170cb93a386Sopenharmony_ci    void make_strip(Rec* rec, int texWidth, int texHeight) {
171cb93a386Sopenharmony_ci        const SkScalar tx = SkIntToScalar(texWidth);
172cb93a386Sopenharmony_ci        const SkScalar ty = SkIntToScalar(texHeight);
173cb93a386Sopenharmony_ci        const int n = 24;
174cb93a386Sopenharmony_ci
175cb93a386Sopenharmony_ci        rec->fMode = SkVertices::kTriangleStrip_VertexMode;
176cb93a386Sopenharmony_ci        rec->fCount = 2 * (n + 1);
177cb93a386Sopenharmony_ci        rec->fVerts = new SkPoint[rec->fCount];
178cb93a386Sopenharmony_ci        rec->fTexs  = new SkPoint[rec->fCount];
179cb93a386Sopenharmony_ci
180cb93a386Sopenharmony_ci        SkPoint* v = rec->fVerts;
181cb93a386Sopenharmony_ci        SkPoint* t = rec->fTexs;
182cb93a386Sopenharmony_ci
183cb93a386Sopenharmony_ci        for (int i = 0; i < n; i++) {
184cb93a386Sopenharmony_ci            SkScalar r   = SK_ScalarPI * 2 * i / n,
185cb93a386Sopenharmony_ci                     sin = SkScalarSin(r),
186cb93a386Sopenharmony_ci                     cos = SkScalarCos(r);
187cb93a386Sopenharmony_ci            v[i*2 + 0].set(cos/2, sin/2);
188cb93a386Sopenharmony_ci            v[i*2 + 1].set(cos, sin);
189cb93a386Sopenharmony_ci
190cb93a386Sopenharmony_ci            t[i*2 + 0].set(tx * i / n, ty);
191cb93a386Sopenharmony_ci            t[i*2 + 1].set(tx * i / n, 0);
192cb93a386Sopenharmony_ci        }
193cb93a386Sopenharmony_ci        v[2*n + 0] = v[0];
194cb93a386Sopenharmony_ci        v[2*n + 1] = v[1];
195cb93a386Sopenharmony_ci
196cb93a386Sopenharmony_ci        t[2*n + 0].set(tx, ty);
197cb93a386Sopenharmony_ci        t[2*n + 1].set(tx, 0);
198cb93a386Sopenharmony_ci
199cb93a386Sopenharmony_ci        SkMatrix m;
200cb93a386Sopenharmony_ci        m.setScale(SkIntToScalar(100), SkIntToScalar(100));
201cb93a386Sopenharmony_ci        m.postTranslate(SkIntToScalar(110), SkIntToScalar(110));
202cb93a386Sopenharmony_ci        m.mapPoints(v, rec->fCount);
203cb93a386Sopenharmony_ci    }
204cb93a386Sopenharmony_ci
205cb93a386Sopenharmony_ci    Rec fRecs[3];
206cb93a386Sopenharmony_ci
207cb93a386Sopenharmony_ci    using INHERITED = Sample;
208cb93a386Sopenharmony_ci};
209cb93a386Sopenharmony_ci
210cb93a386Sopenharmony_ci//////////////////////////////////////////////////////////////////////////////
211cb93a386Sopenharmony_ci
212cb93a386Sopenharmony_ciDEF_SAMPLE( return new VerticesView(); )
213