blob: 652a2f3f478289d7eef1839d3356e6d623c8d0c0 [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001
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 */
reed@android.com8a1c16f2008-12-17 15:59:43 +00008#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"
reed@android.com8a1c16f2008-12-17 15:59:43 +000015#include "SkRegion.h"
16#include "SkShader.h"
17#include "SkUtils.h"
18#include "SkXfermode.h"
reed@android.com0767e472008-12-23 16:06:51 +000019#include "SkComposeShader.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +000020#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
32static 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);
reed@google.com5f068f12011-07-06 18:16:00 +000039 if (!bitmap.pixelRef()) {
40 return;
41 }
42
reed@android.com8a1c16f2008-12-17 15:59:43 +000043 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
59static 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();
reed@android.com8a1c16f2008-12-17 15:59:43 +000068
69 // set up clipper
70 SkRect skclip;
bsalomon@google.com820e80a2011-10-24 21:09:40 +000071 skclip.set(SkIntToScalar(284), SkIntToScalar(40), SkIntToScalar(1370), SkIntToScalar(708));
reed@android.com8a1c16f2008-12-17 15:59:43 +000072
73// ret = canvas.clipRect(skclip);
74// SkASSERT(ret);
75
bsalomon@google.com820e80a2011-10-24 21:09:40 +000076 matrix.set(SkMatrix::kMTransX, SkFloatToScalar(-1153.28f));
77 matrix.set(SkMatrix::kMTransY, SkFloatToScalar(1180.50f));
reed@android.com8a1c16f2008-12-17 15:59:43 +000078
bsalomon@google.com820e80a2011-10-24 21:09:40 +000079 matrix.set(SkMatrix::kMScaleX, SkFloatToScalar(0.177171f));
80 matrix.set(SkMatrix::kMScaleY, SkFloatToScalar(0.177043f));
reed@android.com8a1c16f2008-12-17 15:59:43 +000081
bsalomon@google.com820e80a2011-10-24 21:09:40 +000082 matrix.set(SkMatrix::kMSkewX, SkFloatToScalar(0.126968f));
83 matrix.set(SkMatrix::kMSkewY, SkFloatToScalar(-0.126876f));
reed@android.com8a1c16f2008-12-17 15:59:43 +000084
bsalomon@google.com820e80a2011-10-24 21:09:40 +000085 matrix.set(SkMatrix::kMPersp0, SkFloatToScalar(0.0f));
86 matrix.set(SkMatrix::kMPersp1, SkFloatToScalar(0.0f));
reed@android.com8a1c16f2008-12-17 15:59:43 +000087
88 ret = canvas.concat(matrix);
89
90 paint.setAntiAlias(true);
91 paint.setColor(0xb2202020);
92 paint.setStyle(SkPaint::kStroke_Style);
bsalomon@google.com820e80a2011-10-24 21:09:40 +000093 paint.setStrokeWidth(SkFloatToScalar(68.13f));
reed@android.com8a1c16f2008-12-17 15:59:43 +000094
95 SkRect r;
bsalomon@google.com820e80a2011-10-24 21:09:40 +000096 r.set(SkFloatToScalar(-313.714417f), SkFloatToScalar(-4.826389f), SkFloatToScalar(18014.447266f), SkFloatToScalar(1858.154541f));
97 canvas.drawRoundRect(r, SkFloatToScalar(91.756363f), SkFloatToScalar(91.756363f), paint);
reed@android.com8a1c16f2008-12-17 15:59:43 +000098}
99
reed@android.com8a1c16f2008-12-17 15:59:43 +0000100static bool SetImageRef(SkBitmap* bitmap, SkStream* stream,
101 SkBitmap::Config pref, const char name[] = NULL) {
102#if 0
103 // test buffer streams
104 SkStream* str = new SkBufferStream(stream, 717);
105 stream->unref();
106 stream = str;
107#endif
108
109 SkImageRef* ref = new SkImageRef_GlobalPool(stream, pref, 1);
110 ref->setURI(name);
111 if (!ref->getInfo(bitmap)) {
112 delete ref;
113 return false;
114 }
115 bitmap->setPixelRef(ref)->unref();
116 return true;
117}
118
119//#define SPECIFIC_IMAGE "/skimages/72.jpg"
120#define SPECIFIC_IMAGE "/Users/reed/Downloads/3elfs.jpg"
121
122#define IMAGE_DIR "/skimages/"
123#define IMAGE_SUFFIX ".gif"
124
125class ImageDirView : public SkView {
126public:
127 SkBitmap* fBitmaps;
128 SkString* fStrings;
129 int fBitmapCount;
130 int fCurrIndex;
131 SkScalar fSaturation;
132 SkScalar fAngle;
133
rmistry@google.comae933ce2012-08-23 18:19:56 +0000134 ImageDirView() {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000135 SkImageRef_GlobalPool::SetRAMBudget(320 * 1024);
rmistry@google.comae933ce2012-08-23 18:19:56 +0000136
reed@android.com8a1c16f2008-12-17 15:59:43 +0000137#ifdef SPECIFIC_IMAGE
138 fBitmaps = new SkBitmap[3];
139 fStrings = new SkString[3];
140 fBitmapCount = 3;
141 const SkBitmap::Config configs[] = {
142 SkBitmap::kARGB_8888_Config,
143 SkBitmap::kRGB_565_Config,
144 SkBitmap::kARGB_4444_Config
145 };
146 for (int i = 0; i < fBitmapCount; i++) {
147#if 1
148 SkStream* stream = new SkFILEStream(SPECIFIC_IMAGE);
149 SetImageRef(&fBitmaps[i], stream, configs[i], SPECIFIC_IMAGE);
reed@android.com791f5a12009-03-16 13:53:11 +0000150 stream->unref();
reed@android.com8a1c16f2008-12-17 15:59:43 +0000151#else
152 SkImageDecoder::DecodeFile(SPECIFIC_IMAGE, &fBitmaps[i]);
153#endif
154 }
155#else
156 int i, N = 0;
157 SkOSFile::Iter iter(IMAGE_DIR, IMAGE_SUFFIX);
158 SkString name;
159 while (iter.next(&name)) {
160 N += 1;
161 }
162 fBitmaps = new SkBitmap[N];
163 fStrings = new SkString[N];
164 iter.reset(IMAGE_DIR, IMAGE_SUFFIX);
165 for (i = 0; i < N; i++) {
166 iter.next(&name);
167 SkString path(IMAGE_DIR);
168 path.append(name);
169 SkStream* stream = new SkFILEStream(path.c_str());
rmistry@google.comae933ce2012-08-23 18:19:56 +0000170
reed@android.com8a1c16f2008-12-17 15:59:43 +0000171 SetImageRef(&fBitmaps[i], stream, SkBitmap::kNo_Config,
172 name.c_str());
reed@android.com791f5a12009-03-16 13:53:11 +0000173 stream->unref();
reed@android.com8a1c16f2008-12-17 15:59:43 +0000174 fStrings[i] = name;
175 }
176 fBitmapCount = N;
177#endif
178 fCurrIndex = 0;
179 fDX = fDY = 0;
rmistry@google.comae933ce2012-08-23 18:19:56 +0000180
reed@android.com8a1c16f2008-12-17 15:59:43 +0000181 fSaturation = SK_Scalar1;
182 fAngle = 0;
rmistry@google.comae933ce2012-08-23 18:19:56 +0000183
reed@android.com8a1c16f2008-12-17 15:59:43 +0000184 fScale = SK_Scalar1;
185 }
rmistry@google.comae933ce2012-08-23 18:19:56 +0000186
reed@android.com8a1c16f2008-12-17 15:59:43 +0000187 virtual ~ImageDirView() {
188 delete[] fBitmaps;
189 delete[] fStrings;
190
191 SkImageRef_GlobalPool::DumpPool();
192 }
rmistry@google.comae933ce2012-08-23 18:19:56 +0000193
reed@android.com8a1c16f2008-12-17 15:59:43 +0000194protected:
195 // overrides from SkEventSink
196 virtual bool onQuery(SkEvent* evt) {
197 if (SampleCode::TitleQ(*evt)) {
198 SkString str("ImageDir: ");
199#ifdef SPECIFIC_IMAGE
200 str.append(SPECIFIC_IMAGE);
201#else
202 str.append(IMAGE_DIR);
203#endif
204 SampleCode::TitleR(evt, str.c_str());
205 return true;
206 }
207 return this->INHERITED::onQuery(evt);
208 }
rmistry@google.comae933ce2012-08-23 18:19:56 +0000209
reed@android.com8a1c16f2008-12-17 15:59:43 +0000210 void drawBG(SkCanvas* canvas) {
211// canvas->drawColor(0xFFDDDDDD);
212 canvas->drawColor(SK_ColorGRAY);
213 canvas->drawColor(SK_ColorWHITE);
214 }
rmistry@google.comae933ce2012-08-23 18:19:56 +0000215
reed@android.com8a1c16f2008-12-17 15:59:43 +0000216 SkScalar fScale;
217 virtual void onDraw(SkCanvas* canvas) {
218 this->drawBG(canvas);
rmistry@google.comae933ce2012-08-23 18:19:56 +0000219
reed@android.com8a1c16f2008-12-17 15:59:43 +0000220 if (true) {
221 canvas->scale(SkIntToScalar(2), SkIntToScalar(2));
222 drawmarshmallow(canvas);
223 return;
224 }
rmistry@google.comae933ce2012-08-23 18:19:56 +0000225
reed@android.com8a1c16f2008-12-17 15:59:43 +0000226 if (false) {
227 SkPaint p;
228 p.setStyle(SkPaint::kStroke_Style);
229 p.setStrokeWidth(SkIntToScalar(4));
230 canvas->drawCircle(SkIntToScalar(100), SkIntToScalar(100), SkIntToScalar(50), p);
231 p.setAntiAlias(true);
232 canvas->drawCircle(SkIntToScalar(300), SkIntToScalar(100), SkIntToScalar(50), p);
233 }
234 if (false) {
235 SkScalar cx = this->width()/2;
236 SkScalar cy = this->height()/2;
237 canvas->translate(cx, cy);
238 canvas->scale(fScale, fScale);
239 canvas->translate(-cx, -cy);
240 DrawRoundRect(*canvas);
241 return;
242 }
rmistry@google.comae933ce2012-08-23 18:19:56 +0000243
reed@android.com8a1c16f2008-12-17 15:59:43 +0000244 canvas->translate(SkIntToScalar(10), SkIntToScalar(10));
rmistry@google.comae933ce2012-08-23 18:19:56 +0000245
reed@android.com8a1c16f2008-12-17 15:59:43 +0000246 SkScalar x = SkIntToScalar(32), y = SkIntToScalar(32);
247 SkPaint paint;
reed@android.com44a63122009-05-30 02:40:28 +0000248
reed@android.com8a1c16f2008-12-17 15:59:43 +0000249#if 0
250 for (int i = 0; i < fBitmapCount; i++) {
251 SkPaint p;
rmistry@google.comae933ce2012-08-23 18:19:56 +0000252
reed@android.com8a1c16f2008-12-17 15:59:43 +0000253#if 1
254 const SkScalar cm[] = {
255 SkIntToScalar(2), 0, 0, 0, SkIntToScalar(-255),
256 0, SkIntToScalar(2), 0, 0, SkIntToScalar(-255),
257 0, 0, SkIntToScalar(2), 0, SkIntToScalar(-255),
258 0, 0, 0, SkIntToScalar(1), 0
259 };
260 SkColorFilter* cf = new SkColorMatrixFilter(cm);
261 p.setColorFilter(cf)->unref();
262#endif
rmistry@google.comae933ce2012-08-23 18:19:56 +0000263
reed@android.com8a1c16f2008-12-17 15:59:43 +0000264 canvas->drawBitmap(fBitmaps[i], x, y, &p);
265 x += SkIntToScalar(fBitmaps[i].width() + 10);
266 }
267 return;
268#endif
269
270 canvas->drawBitmap(fBitmaps[fCurrIndex], x, y, &paint);
271#ifndef SPECIFIC_IMAGE
272 if (true) {
273 fCurrIndex += 1;
274 if (fCurrIndex >= fBitmapCount) {
275 fCurrIndex = 0;
276 }
277 this->inval(NULL);
278 }
279#endif
280 }
rmistry@google.comae933ce2012-08-23 18:19:56 +0000281
reed@android.com8a1c16f2008-12-17 15:59:43 +0000282 virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) {
283 if (true) {
284 fCurrIndex += 1;
285 if (fCurrIndex >= fBitmapCount)
286 fCurrIndex = 0;
287 this->inval(NULL);
288 }
289 return new Click(this);
290 }
rmistry@google.comae933ce2012-08-23 18:19:56 +0000291
reed@android.com8a1c16f2008-12-17 15:59:43 +0000292 virtual bool onClick(Click* click) {
293 SkScalar center = this->width()/2;
294 fSaturation = SkScalarDiv(click->fCurr.fX - center, center/2);
295 center = this->height()/2;
296 fAngle = SkScalarDiv(click->fCurr.fY - center, center) * 180;
297
298 fDX += click->fCurr.fX - click->fPrev.fX;
299 fDY += click->fCurr.fY - click->fPrev.fY;
rmistry@google.comae933ce2012-08-23 18:19:56 +0000300
reed@android.com8a1c16f2008-12-17 15:59:43 +0000301 fScale = SkScalarDiv(click->fCurr.fX, this->width());
302
303 this->inval(NULL);
304 return true;
305 return this->INHERITED::onClick(click);
306 }
rmistry@google.comae933ce2012-08-23 18:19:56 +0000307
reed@android.com8a1c16f2008-12-17 15:59:43 +0000308private:
309 SkScalar fDX, fDY;
310 typedef SkView INHERITED;
311};
312
313//////////////////////////////////////////////////////////////////////////////
314
315static SkView* MyFactory() { return new ImageDirView; }
316static SkViewRegister reg(MyFactory);
317