blob: 84f1e1254f2e63b0e6ae3c5ea0def27741a40ecf [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
reed@android.com8a1c16f2008-12-17 15:59:43 +000023static SkShader* make_shader0(SkIPoint* size) {
24 SkBitmap bm;
25
26 SkImageDecoder::DecodeFile("/skimages/logo.gif", &bm);
27 size->set(bm.width(), bm.height());
28 return SkShader::CreateBitmapShader(bm, SkShader::kClamp_TileMode,
29 SkShader::kClamp_TileMode);
30}
31
32static SkShader* make_shader1(const SkIPoint& size) {
33 SkPoint pts[] = { 0, 0, SkIntToScalar(size.fX), SkIntToScalar(size.fY) };
34 SkColor colors[] = { SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorRED };
35 return SkGradientShader::CreateLinear(pts, colors, NULL,
36 SK_ARRAY_COUNT(colors), SkShader::kMirror_TileMode, NULL);
37}
38
39class VerticesView : public SkView {
40 SkShader* fShader0;
41 SkShader* fShader1;
42
43public:
44 VerticesView() {
45 SkIPoint size;
46
47 fShader0 = make_shader0(&size);
48 fShader1 = make_shader1(size);
49
50 make_strip(&fRecs[0], size.fX, size.fY);
51 make_fan(&fRecs[1], size.fX, size.fY);
52 make_tris(&fRecs[2]);
53
54 fScale = SK_Scalar1;
55 }
56
57 virtual ~VerticesView() {
58 fShader0->safeUnref();
59 fShader1->safeUnref();
60 }
61
62protected:
63 // overrides from SkEventSink
64 virtual bool onQuery(SkEvent* evt) {
65 if (SampleCode::TitleQ(*evt))
66 {
67 SkString str("Vertices");
68 SampleCode::TitleR(evt, str.c_str());
69 return true;
70 }
71 return this->INHERITED::onQuery(evt);
72 }
73
74 void drawBG(SkCanvas* canvas) {
75 canvas->drawColor(SK_ColorGRAY);
76 }
77
78 SkScalar fScale;
79
80 virtual void onDraw(SkCanvas* canvas) {
81 this->drawBG(canvas);
82
reed@android.com8a1c16f2008-12-17 15:59:43 +000083 SkPaint paint;
84 paint.setDither(true);
85 paint.setFilterBitmap(true);
86
87 for (int i = 0; i < SK_ARRAY_COUNT(fRecs); i++) {
88 canvas->save();
89
90 paint.setShader(NULL);
91 canvas->drawVertices(fRecs[i].fMode, fRecs[i].fCount,
92 fRecs[i].fVerts, fRecs[i].fTexs,
93 NULL, NULL, NULL, 0, paint);
94
95 canvas->translate(SkIntToScalar(250), 0);
96
97 paint.setShader(fShader0);
98 canvas->drawVertices(fRecs[i].fMode, fRecs[i].fCount,
99 fRecs[i].fVerts, fRecs[i].fTexs,
100 NULL, NULL, NULL, 0, paint);
101
102 canvas->translate(SkIntToScalar(250), 0);
103
104 paint.setShader(fShader1);
105 canvas->drawVertices(fRecs[i].fMode, fRecs[i].fCount,
106 fRecs[i].fVerts, fRecs[i].fTexs,
107 NULL, NULL, NULL, 0, paint);
108 canvas->restore();
109
110 canvas->translate(0, SkIntToScalar(250));
111 }
112 }
113
114 virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) {
115 return new Click(this);
116 }
117
118 virtual bool onClick(Click* click) {
119 // fCurrX = click->fICurr.fX;
120 // fCurrY = click->fICurr.fY;
121 this->inval(NULL);
122 return true;
123 }
124
125private:
126 struct Rec {
127 SkCanvas::VertexMode fMode;
128 int fCount;
129 SkPoint* fVerts;
130 SkPoint* fTexs;
131
132 Rec() : fCount(0), fVerts(NULL), fTexs(NULL) {}
133 ~Rec() { delete[] fVerts; delete[] fTexs; }
134 };
135
136 void make_tris(Rec* rec) {
137 int n = 10;
138 SkRandom rand;
139
140 rec->fMode = SkCanvas::kTriangles_VertexMode;
141 rec->fCount = n * 3;
142 rec->fVerts = new SkPoint[rec->fCount];
143
144 for (int i = 0; i < n; i++) {
145 SkPoint* v = &rec->fVerts[i*3];
146 for (int j = 0; j < 3; j++) {
147 v[j].set(rand.nextUScalar1() * 250, rand.nextUScalar1() * 250);
148 }
149 }
150 }
151
152 void make_fan(Rec* rec, int texWidth, int texHeight) {
153 const SkScalar tx = SkIntToScalar(texWidth);
154 const SkScalar ty = SkIntToScalar(texHeight);
155 const int n = 24;
156
157 rec->fMode = SkCanvas::kTriangleFan_VertexMode;
158 rec->fCount = n + 2;
159 rec->fVerts = new SkPoint[rec->fCount];
160 rec->fTexs = new SkPoint[rec->fCount];
161
162 SkPoint* v = rec->fVerts;
163 SkPoint* t = rec->fTexs;
164
165 v[0].set(0, 0);
166 t[0].set(0, 0);
167 for (int i = 0; i < n; i++) {
168 SkScalar cos;
169 SkScalar sin = SkScalarSinCos(SK_ScalarPI * 2 * i / n, &cos);
170 v[i+1].set(cos, sin);
171 t[i+1].set(i*tx/n, ty);
172 }
173 v[n+1] = v[1];
174 t[n+1].set(tx, ty);
175
176 SkMatrix m;
177 m.setScale(SkIntToScalar(100), SkIntToScalar(100));
178 m.postTranslate(SkIntToScalar(110), SkIntToScalar(110));
179 m.mapPoints(v, rec->fCount);
180 }
181
182 void make_strip(Rec* rec, int texWidth, int texHeight) {
183 const SkScalar tx = SkIntToScalar(texWidth);
184 const SkScalar ty = SkIntToScalar(texHeight);
185 const int n = 24;
186
187 rec->fMode = SkCanvas::kTriangleStrip_VertexMode;
188 rec->fCount = 2 * (n + 1);
189 rec->fVerts = new SkPoint[rec->fCount];
190 rec->fTexs = new SkPoint[rec->fCount];
191
192 SkPoint* v = rec->fVerts;
193 SkPoint* t = rec->fTexs;
194
195 for (int i = 0; i < n; i++) {
196 SkScalar cos;
197 SkScalar sin = SkScalarSinCos(SK_ScalarPI * 2 * i / n, &cos);
198 v[i*2 + 0].set(cos/2, sin/2);
199 v[i*2 + 1].set(cos, sin);
200
201 t[i*2 + 0].set(tx * i / n, ty);
202 t[i*2 + 1].set(tx * i / n, 0);
203 }
204 v[2*n + 0] = v[0];
205 v[2*n + 1] = v[1];
206
207 t[2*n + 0].set(tx, ty);
208 t[2*n + 1].set(tx, 0);
209
210 SkMatrix m;
211 m.setScale(SkIntToScalar(100), SkIntToScalar(100));
212 m.postTranslate(SkIntToScalar(110), SkIntToScalar(110));
213 m.mapPoints(v, rec->fCount);
214 }
215
216 Rec fRecs[3];
217
218 typedef SkView INHERITED;
219};
220
221//////////////////////////////////////////////////////////////////////////////
222
223static SkView* MyFactory() { return new VerticesView; }
224static SkViewRegister reg(MyFactory);
225