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