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