blob: fcd962867aa94939dac8d7ea6658ae2444d98ffd [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"
8#include "SkPorterDuff.h"
9#include "SkRandom.h"
10#include "SkRegion.h"
11#include "SkShader.h"
12#include "SkUtils.h"
13#include "SkXfermode.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +000014#include "SkColorPriv.h"
15#include "SkColorFilter.h"
16#include "SkTime.h"
17#include "SkTypeface.h"
18
reed@android.com8a1c16f2008-12-17 15:59:43 +000019#include "SkOSFile.h"
20#include "SkStream.h"
21#include "SkNinePatch.h"
22
23void setup_vertexbug(SkPoint verts[], SkPoint texs[], uint16_t index[]);
24
25static void drawbug(SkCanvas* canvas, SkScalar scale) {
26 SkBitmap bm, bm2;
27
28 SkImageDecoder::DecodeFile("/skimages/btn_default_normal.9.png", &bm);
29 SkPaint paint;
30
31 SkIRect subset;
32 subset.set(1, 1, bm.width() - 1, bm.height() - 1);
33 bm.extractSubset(&bm2, subset);
34
35#if 0
36 SkPoint verts[16], texs[16];
37 uint16_t index[54];
38
39 SkShader* s = SkShader::CreateBitmapShader(bm2, SkShader::kClamp_TileMode,
40 SkShader::kClamp_TileMode);
41 paint.setShader(s)->unref();
42
43 setup_vertexbug(verts, texs, index);
44 int indexCount = 6; // 54
45 canvas->drawVertices(SkCanvas::kTriangles_VertexMode, 16, verts, texs,
46 NULL, NULL, &index[6], indexCount, paint);
47
48#if 0
49 paint.setShader(NULL);
50 canvas->drawVertices(SkCanvas::kTriangles_VertexMode, 16, verts, NULL,
51 NULL, NULL, index, indexCount, paint);
52#endif
53#else
54 SkRect dst;
55 SkIRect margin;
56
57 dst.set(SkIntToScalar(10), SkIntToScalar(10),
58 SkIntToScalar(100) + scale,
59 SkIntToScalar(40) + scale);
60 margin.set(9, 9, 9, 9);
61 SkNinePatch::DrawNine(canvas, dst, bm2, margin, NULL);
62#endif
63}
64
65static SkShader* make_shader0(SkIPoint* size) {
66 SkBitmap bm;
67
68 SkImageDecoder::DecodeFile("/skimages/logo.gif", &bm);
69 size->set(bm.width(), bm.height());
70 return SkShader::CreateBitmapShader(bm, SkShader::kClamp_TileMode,
71 SkShader::kClamp_TileMode);
72}
73
74static SkShader* make_shader1(const SkIPoint& size) {
75 SkPoint pts[] = { 0, 0, SkIntToScalar(size.fX), SkIntToScalar(size.fY) };
76 SkColor colors[] = { SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorRED };
77 return SkGradientShader::CreateLinear(pts, colors, NULL,
78 SK_ARRAY_COUNT(colors), SkShader::kMirror_TileMode, NULL);
79}
80
81class VerticesView : public SkView {
82 SkShader* fShader0;
83 SkShader* fShader1;
84
85public:
86 VerticesView() {
87 SkIPoint size;
88
89 fShader0 = make_shader0(&size);
90 fShader1 = make_shader1(size);
91
92 make_strip(&fRecs[0], size.fX, size.fY);
93 make_fan(&fRecs[1], size.fX, size.fY);
94 make_tris(&fRecs[2]);
95
96 fScale = SK_Scalar1;
97 }
98
99 virtual ~VerticesView() {
100 fShader0->safeUnref();
101 fShader1->safeUnref();
102 }
103
104protected:
105 // overrides from SkEventSink
106 virtual bool onQuery(SkEvent* evt) {
107 if (SampleCode::TitleQ(*evt))
108 {
109 SkString str("Vertices");
110 SampleCode::TitleR(evt, str.c_str());
111 return true;
112 }
113 return this->INHERITED::onQuery(evt);
114 }
115
116 void drawBG(SkCanvas* canvas) {
117 canvas->drawColor(SK_ColorGRAY);
118 }
119
120 SkScalar fScale;
121
122 virtual void onDraw(SkCanvas* canvas) {
123 this->drawBG(canvas);
124
125#if 1
126 canvas->drawColor(SK_ColorWHITE);
127 canvas->translate(SK_Scalar1/2, SkIntToScalar(15) + SK_Scalar1/2);
128 canvas->scale(SkIntToScalar(3)/2, SkIntToScalar(3)/2);
129 drawbug(canvas, fScale);
130 fScale += SK_Scalar1/93;
131 this->inval(NULL);
132 return;
133#endif
134
135 SkPaint paint;
136 paint.setDither(true);
137 paint.setFilterBitmap(true);
138
139 for (int i = 0; i < SK_ARRAY_COUNT(fRecs); i++) {
140 canvas->save();
141
142 paint.setShader(NULL);
143 canvas->drawVertices(fRecs[i].fMode, fRecs[i].fCount,
144 fRecs[i].fVerts, fRecs[i].fTexs,
145 NULL, NULL, NULL, 0, paint);
146
147 canvas->translate(SkIntToScalar(250), 0);
148
149 paint.setShader(fShader0);
150 canvas->drawVertices(fRecs[i].fMode, fRecs[i].fCount,
151 fRecs[i].fVerts, fRecs[i].fTexs,
152 NULL, NULL, NULL, 0, paint);
153
154 canvas->translate(SkIntToScalar(250), 0);
155
156 paint.setShader(fShader1);
157 canvas->drawVertices(fRecs[i].fMode, fRecs[i].fCount,
158 fRecs[i].fVerts, fRecs[i].fTexs,
159 NULL, NULL, NULL, 0, paint);
160 canvas->restore();
161
162 canvas->translate(0, SkIntToScalar(250));
163 }
164 }
165
166 virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) {
167 return new Click(this);
168 }
169
170 virtual bool onClick(Click* click) {
171 // fCurrX = click->fICurr.fX;
172 // fCurrY = click->fICurr.fY;
173 this->inval(NULL);
174 return true;
175 }
176
177private:
178 struct Rec {
179 SkCanvas::VertexMode fMode;
180 int fCount;
181 SkPoint* fVerts;
182 SkPoint* fTexs;
183
184 Rec() : fCount(0), fVerts(NULL), fTexs(NULL) {}
185 ~Rec() { delete[] fVerts; delete[] fTexs; }
186 };
187
188 void make_tris(Rec* rec) {
189 int n = 10;
190 SkRandom rand;
191
192 rec->fMode = SkCanvas::kTriangles_VertexMode;
193 rec->fCount = n * 3;
194 rec->fVerts = new SkPoint[rec->fCount];
195
196 for (int i = 0; i < n; i++) {
197 SkPoint* v = &rec->fVerts[i*3];
198 for (int j = 0; j < 3; j++) {
199 v[j].set(rand.nextUScalar1() * 250, rand.nextUScalar1() * 250);
200 }
201 }
202 }
203
204 void make_fan(Rec* rec, int texWidth, int texHeight) {
205 const SkScalar tx = SkIntToScalar(texWidth);
206 const SkScalar ty = SkIntToScalar(texHeight);
207 const int n = 24;
208
209 rec->fMode = SkCanvas::kTriangleFan_VertexMode;
210 rec->fCount = n + 2;
211 rec->fVerts = new SkPoint[rec->fCount];
212 rec->fTexs = new SkPoint[rec->fCount];
213
214 SkPoint* v = rec->fVerts;
215 SkPoint* t = rec->fTexs;
216
217 v[0].set(0, 0);
218 t[0].set(0, 0);
219 for (int i = 0; i < n; i++) {
220 SkScalar cos;
221 SkScalar sin = SkScalarSinCos(SK_ScalarPI * 2 * i / n, &cos);
222 v[i+1].set(cos, sin);
223 t[i+1].set(i*tx/n, ty);
224 }
225 v[n+1] = v[1];
226 t[n+1].set(tx, ty);
227
228 SkMatrix m;
229 m.setScale(SkIntToScalar(100), SkIntToScalar(100));
230 m.postTranslate(SkIntToScalar(110), SkIntToScalar(110));
231 m.mapPoints(v, rec->fCount);
232 }
233
234 void make_strip(Rec* rec, int texWidth, int texHeight) {
235 const SkScalar tx = SkIntToScalar(texWidth);
236 const SkScalar ty = SkIntToScalar(texHeight);
237 const int n = 24;
238
239 rec->fMode = SkCanvas::kTriangleStrip_VertexMode;
240 rec->fCount = 2 * (n + 1);
241 rec->fVerts = new SkPoint[rec->fCount];
242 rec->fTexs = new SkPoint[rec->fCount];
243
244 SkPoint* v = rec->fVerts;
245 SkPoint* t = rec->fTexs;
246
247 for (int i = 0; i < n; i++) {
248 SkScalar cos;
249 SkScalar sin = SkScalarSinCos(SK_ScalarPI * 2 * i / n, &cos);
250 v[i*2 + 0].set(cos/2, sin/2);
251 v[i*2 + 1].set(cos, sin);
252
253 t[i*2 + 0].set(tx * i / n, ty);
254 t[i*2 + 1].set(tx * i / n, 0);
255 }
256 v[2*n + 0] = v[0];
257 v[2*n + 1] = v[1];
258
259 t[2*n + 0].set(tx, ty);
260 t[2*n + 1].set(tx, 0);
261
262 SkMatrix m;
263 m.setScale(SkIntToScalar(100), SkIntToScalar(100));
264 m.postTranslate(SkIntToScalar(110), SkIntToScalar(110));
265 m.mapPoints(v, rec->fCount);
266 }
267
268 Rec fRecs[3];
269
270 typedef SkView INHERITED;
271};
272
273//////////////////////////////////////////////////////////////////////////////
274
275static SkView* MyFactory() { return new VerticesView; }
276static SkViewRegister reg(MyFactory);
277