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