blob: f260e1af254382e79b37e14faca4fe2f17596c64 [file] [log] [blame]
reed@android.com8a1c16f2008-12-17 15:59:43 +00001#include "SampleCode.h"
2#include "SkView.h"
3#include "SkCanvas.h"
4#include "SkGradientShader.h"
5#include "SkGraphics.h"
6#include "SkImageDecoder.h"
7#include "SkPath.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +00008#include "SkRandom.h"
9#include "SkRegion.h"
10#include "SkShader.h"
11#include "SkUtils.h"
12#include "SkXfermode.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +000013#include "SkColorPriv.h"
14#include "SkColorFilter.h"
15#include "SkTime.h"
16#include "SkTypeface.h"
17
reed@android.com8a1c16f2008-12-17 15:59:43 +000018#include "SkOSFile.h"
19#include "SkStream.h"
20#include "SkNinePatch.h"
21
reed@android.com8a1c16f2008-12-17 15:59:43 +000022static SkShader* make_shader0(SkIPoint* size) {
23 SkBitmap bm;
reed@google.com82065d62011-02-07 15:30:46 +000024
reed@android.comf2b98d62010-12-20 18:26:13 +000025 SkImageDecoder::DecodeFile("/skimages/logo.png", &bm);
reed@android.com8a1c16f2008-12-17 15:59:43 +000026 size->set(bm.width(), bm.height());
27 return SkShader::CreateBitmapShader(bm, SkShader::kClamp_TileMode,
28 SkShader::kClamp_TileMode);
29}
30
31static SkShader* make_shader1(const SkIPoint& size) {
32 SkPoint pts[] = { 0, 0, SkIntToScalar(size.fX), SkIntToScalar(size.fY) };
33 SkColor colors[] = { SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorRED };
34 return SkGradientShader::CreateLinear(pts, colors, NULL,
35 SK_ARRAY_COUNT(colors), SkShader::kMirror_TileMode, NULL);
36}
37
reed@google.comf2183392011-04-22 14:10:48 +000038class VerticesView : public SampleView {
reed@android.com8a1c16f2008-12-17 15:59:43 +000039 SkShader* fShader0;
40 SkShader* fShader1;
41
reed@google.com82065d62011-02-07 15:30:46 +000042public:
reed@android.com8a1c16f2008-12-17 15:59:43 +000043 VerticesView() {
44 SkIPoint size;
reed@google.com82065d62011-02-07 15:30:46 +000045
reed@android.com8a1c16f2008-12-17 15:59:43 +000046 fShader0 = make_shader0(&size);
47 fShader1 = make_shader1(size);
48
49 make_strip(&fRecs[0], size.fX, size.fY);
50 make_fan(&fRecs[1], size.fX, size.fY);
51 make_tris(&fRecs[2]);
reed@google.com82065d62011-02-07 15:30:46 +000052
reed@android.com8a1c16f2008-12-17 15:59:43 +000053 fScale = SK_Scalar1;
reed@google.comf2183392011-04-22 14:10:48 +000054
55 this->setBGColor(SK_ColorGRAY);
reed@android.com8a1c16f2008-12-17 15:59:43 +000056 }
reed@google.com82065d62011-02-07 15:30:46 +000057
reed@android.com8a1c16f2008-12-17 15:59:43 +000058 virtual ~VerticesView() {
reed@google.com82065d62011-02-07 15:30:46 +000059 SkSafeUnref(fShader0);
60 SkSafeUnref(fShader1);
reed@android.com8a1c16f2008-12-17 15:59:43 +000061 }
reed@google.com82065d62011-02-07 15:30:46 +000062
reed@android.com8a1c16f2008-12-17 15:59:43 +000063protected:
64 // overrides from SkEventSink
65 virtual bool onQuery(SkEvent* evt) {
66 if (SampleCode::TitleQ(*evt))
67 {
68 SkString str("Vertices");
69 SampleCode::TitleR(evt, str.c_str());
70 return true;
71 }
72 return this->INHERITED::onQuery(evt);
73 }
reed@google.com82065d62011-02-07 15:30:46 +000074
reed@android.com8a1c16f2008-12-17 15:59:43 +000075 SkScalar fScale;
reed@google.com82065d62011-02-07 15:30:46 +000076
reed@google.comf2183392011-04-22 14:10:48 +000077 virtual void onDrawContent(SkCanvas* canvas) {
reed@android.com8a1c16f2008-12-17 15:59:43 +000078 SkPaint paint;
79 paint.setDither(true);
80 paint.setFilterBitmap(true);
reed@google.com82065d62011-02-07 15:30:46 +000081
reed@android.com8a1c16f2008-12-17 15:59:43 +000082 for (int i = 0; i < SK_ARRAY_COUNT(fRecs); i++) {
83 canvas->save();
reed@google.com82065d62011-02-07 15:30:46 +000084
reed@android.com8a1c16f2008-12-17 15:59:43 +000085 paint.setShader(NULL);
86 canvas->drawVertices(fRecs[i].fMode, fRecs[i].fCount,
87 fRecs[i].fVerts, fRecs[i].fTexs,
88 NULL, NULL, NULL, 0, paint);
reed@google.com82065d62011-02-07 15:30:46 +000089
reed@android.com8a1c16f2008-12-17 15:59:43 +000090 canvas->translate(SkIntToScalar(250), 0);
reed@google.com82065d62011-02-07 15:30:46 +000091
reed@android.com8a1c16f2008-12-17 15:59:43 +000092 paint.setShader(fShader0);
93 canvas->drawVertices(fRecs[i].fMode, fRecs[i].fCount,
94 fRecs[i].fVerts, fRecs[i].fTexs,
95 NULL, NULL, NULL, 0, paint);
96
97 canvas->translate(SkIntToScalar(250), 0);
reed@google.com82065d62011-02-07 15:30:46 +000098
reed@android.com8a1c16f2008-12-17 15:59:43 +000099 paint.setShader(fShader1);
100 canvas->drawVertices(fRecs[i].fMode, fRecs[i].fCount,
101 fRecs[i].fVerts, fRecs[i].fTexs,
102 NULL, NULL, NULL, 0, paint);
103 canvas->restore();
reed@google.com82065d62011-02-07 15:30:46 +0000104
reed@android.com8a1c16f2008-12-17 15:59:43 +0000105 canvas->translate(0, SkIntToScalar(250));
106 }
107 }
reed@google.com82065d62011-02-07 15:30:46 +0000108
reed@android.com8a1c16f2008-12-17 15:59:43 +0000109 virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) {
110 return new Click(this);
111 }
reed@google.com82065d62011-02-07 15:30:46 +0000112
reed@android.com8a1c16f2008-12-17 15:59:43 +0000113 virtual bool onClick(Click* click) {
114 // fCurrX = click->fICurr.fX;
115 // fCurrY = click->fICurr.fY;
116 this->inval(NULL);
117 return true;
118 }
reed@google.com82065d62011-02-07 15:30:46 +0000119
reed@android.com8a1c16f2008-12-17 15:59:43 +0000120private:
121 struct Rec {
122 SkCanvas::VertexMode fMode;
123 int fCount;
124 SkPoint* fVerts;
125 SkPoint* fTexs;
reed@google.com82065d62011-02-07 15:30:46 +0000126
reed@android.com8a1c16f2008-12-17 15:59:43 +0000127 Rec() : fCount(0), fVerts(NULL), fTexs(NULL) {}
128 ~Rec() { delete[] fVerts; delete[] fTexs; }
129 };
130
131 void make_tris(Rec* rec) {
132 int n = 10;
133 SkRandom rand;
reed@google.com82065d62011-02-07 15:30:46 +0000134
reed@android.com8a1c16f2008-12-17 15:59:43 +0000135 rec->fMode = SkCanvas::kTriangles_VertexMode;
136 rec->fCount = n * 3;
137 rec->fVerts = new SkPoint[rec->fCount];
reed@google.com82065d62011-02-07 15:30:46 +0000138
reed@android.com8a1c16f2008-12-17 15:59:43 +0000139 for (int i = 0; i < n; i++) {
140 SkPoint* v = &rec->fVerts[i*3];
141 for (int j = 0; j < 3; j++) {
142 v[j].set(rand.nextUScalar1() * 250, rand.nextUScalar1() * 250);
143 }
144 }
145 }
reed@google.com82065d62011-02-07 15:30:46 +0000146
reed@android.com8a1c16f2008-12-17 15:59:43 +0000147 void make_fan(Rec* rec, int texWidth, int texHeight) {
148 const SkScalar tx = SkIntToScalar(texWidth);
149 const SkScalar ty = SkIntToScalar(texHeight);
150 const int n = 24;
reed@google.com82065d62011-02-07 15:30:46 +0000151
reed@android.com8a1c16f2008-12-17 15:59:43 +0000152 rec->fMode = SkCanvas::kTriangleFan_VertexMode;
153 rec->fCount = n + 2;
154 rec->fVerts = new SkPoint[rec->fCount];
155 rec->fTexs = new SkPoint[rec->fCount];
reed@google.com82065d62011-02-07 15:30:46 +0000156
reed@android.com8a1c16f2008-12-17 15:59:43 +0000157 SkPoint* v = rec->fVerts;
158 SkPoint* t = rec->fTexs;
159
160 v[0].set(0, 0);
161 t[0].set(0, 0);
162 for (int i = 0; i < n; i++) {
163 SkScalar cos;
164 SkScalar sin = SkScalarSinCos(SK_ScalarPI * 2 * i / n, &cos);
165 v[i+1].set(cos, sin);
166 t[i+1].set(i*tx/n, ty);
167 }
168 v[n+1] = v[1];
169 t[n+1].set(tx, ty);
reed@google.com82065d62011-02-07 15:30:46 +0000170
reed@android.com8a1c16f2008-12-17 15:59:43 +0000171 SkMatrix m;
172 m.setScale(SkIntToScalar(100), SkIntToScalar(100));
173 m.postTranslate(SkIntToScalar(110), SkIntToScalar(110));
174 m.mapPoints(v, rec->fCount);
175 }
reed@google.com82065d62011-02-07 15:30:46 +0000176
reed@android.com8a1c16f2008-12-17 15:59:43 +0000177 void make_strip(Rec* rec, int texWidth, int texHeight) {
178 const SkScalar tx = SkIntToScalar(texWidth);
179 const SkScalar ty = SkIntToScalar(texHeight);
180 const int n = 24;
reed@google.com82065d62011-02-07 15:30:46 +0000181
reed@android.com8a1c16f2008-12-17 15:59:43 +0000182 rec->fMode = SkCanvas::kTriangleStrip_VertexMode;
183 rec->fCount = 2 * (n + 1);
184 rec->fVerts = new SkPoint[rec->fCount];
185 rec->fTexs = new SkPoint[rec->fCount];
reed@google.com82065d62011-02-07 15:30:46 +0000186
reed@android.com8a1c16f2008-12-17 15:59:43 +0000187 SkPoint* v = rec->fVerts;
188 SkPoint* t = rec->fTexs;
reed@google.com82065d62011-02-07 15:30:46 +0000189
reed@android.com8a1c16f2008-12-17 15:59:43 +0000190 for (int i = 0; i < n; i++) {
191 SkScalar cos;
192 SkScalar sin = SkScalarSinCos(SK_ScalarPI * 2 * i / n, &cos);
193 v[i*2 + 0].set(cos/2, sin/2);
194 v[i*2 + 1].set(cos, sin);
reed@google.com82065d62011-02-07 15:30:46 +0000195
reed@android.com8a1c16f2008-12-17 15:59:43 +0000196 t[i*2 + 0].set(tx * i / n, ty);
197 t[i*2 + 1].set(tx * i / n, 0);
198 }
199 v[2*n + 0] = v[0];
200 v[2*n + 1] = v[1];
reed@google.com82065d62011-02-07 15:30:46 +0000201
reed@android.com8a1c16f2008-12-17 15:59:43 +0000202 t[2*n + 0].set(tx, ty);
203 t[2*n + 1].set(tx, 0);
reed@google.com82065d62011-02-07 15:30:46 +0000204
reed@android.com8a1c16f2008-12-17 15:59:43 +0000205 SkMatrix m;
206 m.setScale(SkIntToScalar(100), SkIntToScalar(100));
207 m.postTranslate(SkIntToScalar(110), SkIntToScalar(110));
208 m.mapPoints(v, rec->fCount);
209 }
reed@google.com82065d62011-02-07 15:30:46 +0000210
reed@android.com8a1c16f2008-12-17 15:59:43 +0000211 Rec fRecs[3];
212
reed@google.comf2183392011-04-22 14:10:48 +0000213 typedef SampleView INHERITED;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000214};
215
216//////////////////////////////////////////////////////////////////////////////
217
218static SkView* MyFactory() { return new VerticesView; }
219static SkViewRegister reg(MyFactory);
220