1
2 /*
3 * Copyright 2011 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8 #include "SampleCode.h"
9 #include "SkView.h"
10 #include "SkCanvas.h"
11 #include "SkGradientShader.h"
12 #include "SkGraphics.h"
13 #include "SkImageDecoder.h"
14 #include "SkPath.h"
15 #include "SkRegion.h"
16 #include "SkShader.h"
17 #include "SkUtils.h"
18 #include "SkXfermode.h"
19 #include "SkComposeShader.h"
20 #include "SkColorPriv.h"
21 #include "SkColorFilter.h"
22 #include "SkTime.h"
23 #include "SkTypeface.h"
24
25 #include "SkImageRef_GlobalPool.h"
26 #include "SkOSFile.h"
27 #include "SkStream.h"
28
29 #include "SkBlurDrawLooper.h"
30 #include "SkColorMatrixFilter.h"
31
drawmarshmallow(SkCanvas * canvas)32 static void drawmarshmallow(SkCanvas* canvas) {
33 SkBitmap bitmap;
34 SkPaint paint;
35 SkRect r;
36 SkMatrix m;
37
38 SkImageDecoder::DecodeFile("/Users/reed/Downloads/3elfs.jpg", &bitmap);
39 if (!bitmap.pixelRef()) {
40 return;
41 }
42
43 SkShader* s = SkShader::CreateBitmapShader(bitmap,
44 SkShader::kRepeat_TileMode,
45 SkShader::kRepeat_TileMode);
46 paint.setShader(s)->unref();
47 m.setTranslate(SkIntToScalar(250), SkIntToScalar(134));
48 s->setLocalMatrix(m);
49
50 r.set(SkIntToScalar(250),
51 SkIntToScalar(134),
52 SkIntToScalar(250 + 449),
53 SkIntToScalar(134 + 701));
54 paint.setFlags(2);
55
56 canvas->drawRect(r, paint);
57 }
58
DrawRoundRect(SkCanvas & canvas)59 static void DrawRoundRect(SkCanvas& canvas) {
60 bool ret = false;
61 SkPaint paint;
62 SkBitmap bitmap;
63 SkMatrix matrix;
64 matrix.reset();
65
66 bitmap.setConfig(SkBitmap::kARGB_8888_Config, 1370, 812);
67 bitmap.allocPixels();
68 #if 0
69 SkCanvas canvas;
70 canvas.setBitmapDevice(bitmap);
71 #endif
72
73 // set up clipper
74 SkRect skclip;
75 skclip.set(SkIntToScalar(284), SkIntToScalar(40), SkIntToScalar(1370), SkIntToScalar(708));
76
77 // ret = canvas.clipRect(skclip);
78 // SkASSERT(ret);
79
80 matrix.set(SkMatrix::kMTransX, SkFloatToScalar(-1153.28f));
81 matrix.set(SkMatrix::kMTransY, SkFloatToScalar(1180.50f));
82
83 matrix.set(SkMatrix::kMScaleX, SkFloatToScalar(0.177171f));
84 matrix.set(SkMatrix::kMScaleY, SkFloatToScalar(0.177043f));
85
86 matrix.set(SkMatrix::kMSkewX, SkFloatToScalar(0.126968f));
87 matrix.set(SkMatrix::kMSkewY, SkFloatToScalar(-0.126876f));
88
89 matrix.set(SkMatrix::kMPersp0, SkFloatToScalar(0.0f));
90 matrix.set(SkMatrix::kMPersp1, SkFloatToScalar(0.0f));
91
92 ret = canvas.concat(matrix);
93
94 paint.setAntiAlias(true);
95 paint.setColor(0xb2202020);
96 paint.setStyle(SkPaint::kStroke_Style);
97 paint.setStrokeWidth(SkFloatToScalar(68.13f));
98
99 SkRect r;
100 r.set(SkFloatToScalar(-313.714417f), SkFloatToScalar(-4.826389f), SkFloatToScalar(18014.447266f), SkFloatToScalar(1858.154541f));
101 canvas.drawRoundRect(r, SkFloatToScalar(91.756363f), SkFloatToScalar(91.756363f), paint);
102 }
103
SetImageRef(SkBitmap * bitmap,SkStream * stream,SkBitmap::Config pref,const char name[]=NULL)104 static bool SetImageRef(SkBitmap* bitmap, SkStream* stream,
105 SkBitmap::Config pref, const char name[] = NULL) {
106 #if 0
107 // test buffer streams
108 SkStream* str = new SkBufferStream(stream, 717);
109 stream->unref();
110 stream = str;
111 #endif
112
113 SkImageRef* ref = new SkImageRef_GlobalPool(stream, pref, 1);
114 ref->setURI(name);
115 if (!ref->getInfo(bitmap)) {
116 delete ref;
117 return false;
118 }
119 bitmap->setPixelRef(ref)->unref();
120 return true;
121 }
122
123 //#define SPECIFIC_IMAGE "/skimages/72.jpg"
124 #define SPECIFIC_IMAGE "/Users/reed/Downloads/3elfs.jpg"
125
126 #define IMAGE_DIR "/skimages/"
127 #define IMAGE_SUFFIX ".gif"
128
129 class ImageDirView : public SkView {
130 public:
131 SkBitmap* fBitmaps;
132 SkString* fStrings;
133 int fBitmapCount;
134 int fCurrIndex;
135 SkScalar fSaturation;
136 SkScalar fAngle;
137
ImageDirView()138 ImageDirView() {
139 SkImageRef_GlobalPool::SetRAMBudget(320 * 1024);
140
141 #ifdef SPECIFIC_IMAGE
142 fBitmaps = new SkBitmap[3];
143 fStrings = new SkString[3];
144 fBitmapCount = 3;
145 const SkBitmap::Config configs[] = {
146 SkBitmap::kARGB_8888_Config,
147 SkBitmap::kRGB_565_Config,
148 SkBitmap::kARGB_4444_Config
149 };
150 for (int i = 0; i < fBitmapCount; i++) {
151 #if 1
152 SkStream* stream = new SkFILEStream(SPECIFIC_IMAGE);
153 SetImageRef(&fBitmaps[i], stream, configs[i], SPECIFIC_IMAGE);
154 stream->unref();
155 #else
156 SkImageDecoder::DecodeFile(SPECIFIC_IMAGE, &fBitmaps[i]);
157 #endif
158 }
159 #else
160 int i, N = 0;
161 SkOSFile::Iter iter(IMAGE_DIR, IMAGE_SUFFIX);
162 SkString name;
163 while (iter.next(&name)) {
164 N += 1;
165 }
166 fBitmaps = new SkBitmap[N];
167 fStrings = new SkString[N];
168 iter.reset(IMAGE_DIR, IMAGE_SUFFIX);
169 for (i = 0; i < N; i++) {
170 iter.next(&name);
171 SkString path(IMAGE_DIR);
172 path.append(name);
173 SkStream* stream = new SkFILEStream(path.c_str());
174
175 SetImageRef(&fBitmaps[i], stream, SkBitmap::kNo_Config,
176 name.c_str());
177 stream->unref();
178 fStrings[i] = name;
179 }
180 fBitmapCount = N;
181 #endif
182 fCurrIndex = 0;
183 fDX = fDY = 0;
184
185 fSaturation = SK_Scalar1;
186 fAngle = 0;
187
188 fScale = SK_Scalar1;
189 }
190
~ImageDirView()191 virtual ~ImageDirView() {
192 delete[] fBitmaps;
193 delete[] fStrings;
194
195 SkImageRef_GlobalPool::DumpPool();
196 }
197
198 protected:
199 // overrides from SkEventSink
onQuery(SkEvent * evt)200 virtual bool onQuery(SkEvent* evt) {
201 if (SampleCode::TitleQ(*evt)) {
202 SkString str("ImageDir: ");
203 #ifdef SPECIFIC_IMAGE
204 str.append(SPECIFIC_IMAGE);
205 #else
206 str.append(IMAGE_DIR);
207 #endif
208 SampleCode::TitleR(evt, str.c_str());
209 return true;
210 }
211 return this->INHERITED::onQuery(evt);
212 }
213
drawBG(SkCanvas * canvas)214 void drawBG(SkCanvas* canvas) {
215 // canvas->drawColor(0xFFDDDDDD);
216 canvas->drawColor(SK_ColorGRAY);
217 canvas->drawColor(SK_ColorWHITE);
218 }
219
220 SkScalar fScale;
onDraw(SkCanvas * canvas)221 virtual void onDraw(SkCanvas* canvas) {
222 this->drawBG(canvas);
223
224 if (true) {
225 canvas->scale(SkIntToScalar(2), SkIntToScalar(2));
226 drawmarshmallow(canvas);
227 return;
228 }
229
230 if (false) {
231 SkPaint p;
232 p.setStyle(SkPaint::kStroke_Style);
233 p.setStrokeWidth(SkIntToScalar(4));
234 canvas->drawCircle(SkIntToScalar(100), SkIntToScalar(100), SkIntToScalar(50), p);
235 p.setAntiAlias(true);
236 canvas->drawCircle(SkIntToScalar(300), SkIntToScalar(100), SkIntToScalar(50), p);
237 }
238 if (false) {
239 SkScalar cx = this->width()/2;
240 SkScalar cy = this->height()/2;
241 canvas->translate(cx, cy);
242 canvas->scale(fScale, fScale);
243 canvas->translate(-cx, -cy);
244 DrawRoundRect(*canvas);
245 return;
246 }
247
248 canvas->translate(SkIntToScalar(10), SkIntToScalar(10));
249
250 SkScalar x = SkIntToScalar(32), y = SkIntToScalar(32);
251 SkPaint paint;
252
253 #if 0
254 for (int i = 0; i < fBitmapCount; i++) {
255 SkPaint p;
256
257 #if 1
258 const SkScalar cm[] = {
259 SkIntToScalar(2), 0, 0, 0, SkIntToScalar(-255),
260 0, SkIntToScalar(2), 0, 0, SkIntToScalar(-255),
261 0, 0, SkIntToScalar(2), 0, SkIntToScalar(-255),
262 0, 0, 0, SkIntToScalar(1), 0
263 };
264 SkColorFilter* cf = new SkColorMatrixFilter(cm);
265 p.setColorFilter(cf)->unref();
266 #endif
267
268 canvas->drawBitmap(fBitmaps[i], x, y, &p);
269 x += SkIntToScalar(fBitmaps[i].width() + 10);
270 }
271 return;
272 #endif
273
274 canvas->drawBitmap(fBitmaps[fCurrIndex], x, y, &paint);
275 #ifndef SPECIFIC_IMAGE
276 if (true) {
277 fCurrIndex += 1;
278 if (fCurrIndex >= fBitmapCount) {
279 fCurrIndex = 0;
280 }
281 this->inval(NULL);
282 }
283 #endif
284 }
285
onFindClickHandler(SkScalar x,SkScalar y)286 virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) {
287 if (true) {
288 fCurrIndex += 1;
289 if (fCurrIndex >= fBitmapCount)
290 fCurrIndex = 0;
291 this->inval(NULL);
292 }
293 return new Click(this);
294 }
295
onClick(Click * click)296 virtual bool onClick(Click* click) {
297 SkScalar center = this->width()/2;
298 fSaturation = SkScalarDiv(click->fCurr.fX - center, center/2);
299 center = this->height()/2;
300 fAngle = SkScalarDiv(click->fCurr.fY - center, center) * 180;
301
302 fDX += click->fCurr.fX - click->fPrev.fX;
303 fDY += click->fCurr.fY - click->fPrev.fY;
304
305 fScale = SkScalarDiv(click->fCurr.fX, this->width());
306
307 this->inval(NULL);
308 return true;
309 return this->INHERITED::onClick(click);
310 }
311
312 private:
313 SkScalar fDX, fDY;
314 typedef SkView INHERITED;
315 };
316
317 //////////////////////////////////////////////////////////////////////////////
318
MyFactory()319 static SkView* MyFactory() { return new ImageDirView; }
320 static SkViewRegister reg(MyFactory);
321
322