blob: 2d0da1f71b27f052ad0b69b8b4ba2b2ac253ac6d [file] [log] [blame]
reed@android.com8a1c16f2008-12-17 15:59:43 +00001#include "SkCanvas.h"
2#include "SkDevice.h"
3#include "SkGLCanvas.h"
4#include "SkGraphics.h"
reed@android.comb08eb2b2009-01-06 20:16:26 +00005#include "SkImageEncoder.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +00006#include "SkPaint.h"
7#include "SkPicture.h"
8#include "SkStream.h"
9#include "SkWindow.h"
10
11#include "SampleCode.h"
12
reed@android.com34245c72009-11-03 04:00:48 +000013SkView* create_overview(int, const SkViewFactory*);
14
reed@android.com6efdc472008-12-19 18:24:35 +000015//#define SK_SUPPORT_GL
16
17#ifdef SK_SUPPORT_GL
reed@android.com8a1c16f2008-12-17 15:59:43 +000018#include <AGL/agl.h>
19#include <OpenGL/gl.h>
reed@android.com6efdc472008-12-19 18:24:35 +000020#endif
reed@android.com8a1c16f2008-12-17 15:59:43 +000021
22#define ANIMATING_EVENTTYPE "nextSample"
23#define ANIMATING_DELAY 750
24
25#define USE_OFFSCREEN
26
27SkViewRegister* SkViewRegister::gHead;
28SkViewRegister::SkViewRegister(SkViewFactory fact) : fFact(fact) {
29 static bool gOnce;
30 if (!gOnce) {
31 gHead = NULL;
32 gOnce = true;
33 }
34
35 fChain = gHead;
36 gHead = this;
37}
38
reed@android.com6efdc472008-12-19 18:24:35 +000039#ifdef SK_SUPPORT_GL
reed@android.com8a1c16f2008-12-17 15:59:43 +000040static AGLContext gAGLContext;
41
42static void init_gl(WindowRef wref) {
43 GLint major, minor;
44
45 aglGetVersion(&major, &minor);
46 SkDebugf("---- agl version %d %d\n", major, minor);
47
48 const GLint pixelAttrs[] = {
49 AGL_RGBA,
50 AGL_DEPTH_SIZE, 32,
51 AGL_OFFSCREEN,
52 AGL_NONE
53 };
54
55 AGLPixelFormat format = aglCreatePixelFormat(pixelAttrs);
56 SkDebugf("----- agl format %p\n", format);
57 gAGLContext = aglCreateContext(format, NULL);
58 SkDebugf("----- agl context %p\n", gAGLContext);
59 aglDestroyPixelFormat(format);
60
61 aglEnable(gAGLContext, GL_BLEND);
62 aglEnable(gAGLContext, GL_LINE_SMOOTH);
63 aglEnable(gAGLContext, GL_POINT_SMOOTH);
64 aglEnable(gAGLContext, GL_POLYGON_SMOOTH);
65
66 aglSetCurrentContext(gAGLContext);
67}
68
69static void setup_offscreen_gl(const SkBitmap& offscreen, WindowRef wref) {
70 GLboolean success = true;
71
72#ifdef USE_OFFSCREEN
73 success = aglSetOffScreen(gAGLContext,
74 offscreen.width(),
75 offscreen.height(),
76 offscreen.rowBytes(),
77 offscreen.getPixels());
78#else
79 success = aglSetWindowRef(gAGLContext, wref);
80#endif
81
82 GLenum err = aglGetError();
83 if (err) {
84 SkDebugf("---- setoffscreen %d %d %s [%d %d]\n", success, err,
85 aglErrorString(err), offscreen.width(), offscreen.height());
86 }
87
88 glEnable(GL_BLEND);
89 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
90 glHint(GL_LINE_SMOOTH_HINT, GL_DONT_CARE);
91 glEnable(GL_TEXTURE_2D);
92
93 glClearColor(0, 0, 0, 0);
94 glClear(GL_COLOR_BUFFER_BIT);
95}
reed@android.com6efdc472008-12-19 18:24:35 +000096#endif
reed@android.com8a1c16f2008-12-17 15:59:43 +000097
98//////////////////////////////////////////////////////////////////////////////
99
100static const char gTitleEvtName[] = "SampleCode_Title_Event";
101static const char gPrefSizeEvtName[] = "SampleCode_PrefSize_Event";
102
103bool SampleCode::TitleQ(const SkEvent& evt) {
104 return evt.isType(gTitleEvtName, sizeof(gTitleEvtName) - 1);
105}
106
107void SampleCode::TitleR(SkEvent* evt, const char title[]) {
108 SkASSERT(evt && TitleQ(*evt));
109 evt->setString(gTitleEvtName, title);
110}
111
112bool SampleCode::PrefSizeQ(const SkEvent& evt) {
113 return evt.isType(gPrefSizeEvtName, sizeof(gPrefSizeEvtName) - 1);
114}
115
116void SampleCode::PrefSizeR(SkEvent* evt, SkScalar width, SkScalar height) {
117 SkASSERT(evt && PrefSizeQ(*evt));
118 SkScalar size[2];
119 size[0] = width;
120 size[1] = height;
121 evt->setScalars(gPrefSizeEvtName, 2, size);
122}
123
124//////////////////////////////////////////////////////////////////////////////
125
126class SampleWindow : public SkOSWindow {
reed@android.com34245c72009-11-03 04:00:48 +0000127 SkTDArray<SkViewFactory> fSamples;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000128public:
129 SampleWindow(void* hwnd);
130 virtual ~SampleWindow();
131
reed@android.come522ca52009-11-23 20:10:41 +0000132 virtual void draw(SkCanvas* canvas);
133
reed@android.com8a1c16f2008-12-17 15:59:43 +0000134protected:
135 virtual void onDraw(SkCanvas* canvas);
136 virtual bool onHandleKey(SkKey key);
137 virtual bool onHandleChar(SkUnichar);
138 virtual void onSizeChange();
139
140 virtual SkCanvas* beforeChildren(SkCanvas*);
141 virtual void afterChildren(SkCanvas*);
reed@android.com6c5f6f22009-08-14 16:08:38 +0000142 virtual void beforeChild(SkView* child, SkCanvas* canvas);
143 virtual void afterChild(SkView* child, SkCanvas* canvas);
144
reed@android.com8a1c16f2008-12-17 15:59:43 +0000145 virtual bool onEvent(const SkEvent& evt);
146
147#if 0
148 virtual bool handleChar(SkUnichar uni);
149 virtual bool handleEvent(const SkEvent& evt);
150 virtual bool handleKey(SkKey key);
151 virtual bool handleKeyUp(SkKey key);
152
153 virtual bool onClick(Click* click);
154 virtual Click* onFindClickHandler(SkScalar x, SkScalar y);
155 virtual bool onHandleKeyUp(SkKey key);
156#endif
157private:
reed@android.com34245c72009-11-03 04:00:48 +0000158 int fCurrIndex;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000159
160 SkPicture* fPicture;
161 SkGLCanvas* fGLCanvas;
162 SkPath fClipPath;
163
164 enum CanvasType {
165 kRaster_CanvasType,
166 kPicture_CanvasType,
167 kOpenGL_CanvasType
168 };
169 CanvasType fCanvasType;
170
171 bool fUseClip;
reed@android.come522ca52009-11-23 20:10:41 +0000172 bool fNClip;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000173 bool fRepeatDrawing;
174 bool fAnimating;
reed@android.com6c5f6f22009-08-14 16:08:38 +0000175 bool fRotate;
176 bool fScale;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000177
178 int fScrollTestX, fScrollTestY;
179
180 void loadView(SkView*);
181 void updateTitle();
182 bool nextSample();
183
184 void postAnimatingEvent() {
185 if (fAnimating) {
186 SkEvent* evt = new SkEvent(ANIMATING_EVENTTYPE);
187 evt->post(this->getSinkID(), ANIMATING_DELAY);
188 }
189 }
190
191
192 static CanvasType cycle_canvastype(CanvasType);
193
194 typedef SkOSWindow INHERITED;
195};
196
197SampleWindow::CanvasType SampleWindow::cycle_canvastype(CanvasType ct) {
198 static const CanvasType gCT[] = {
199 kPicture_CanvasType,
200 kOpenGL_CanvasType,
201 kRaster_CanvasType
202 };
203 return gCT[ct];
204}
205
206SampleWindow::SampleWindow(void* hwnd) : INHERITED(hwnd) {
reed@android.com6efdc472008-12-19 18:24:35 +0000207#ifdef SK_SUPPORT_GL
reed@android.com8a1c16f2008-12-17 15:59:43 +0000208 init_gl((WindowRef)hwnd);
reed@android.com6efdc472008-12-19 18:24:35 +0000209#endif
210
reed@android.com8a1c16f2008-12-17 15:59:43 +0000211 fPicture = NULL;
212 fGLCanvas = NULL;
213
214 fCanvasType = kRaster_CanvasType;
215 fUseClip = false;
reed@android.come522ca52009-11-23 20:10:41 +0000216 fNClip = false;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000217 fRepeatDrawing = false;
218 fAnimating = false;
reed@android.com6c5f6f22009-08-14 16:08:38 +0000219 fRotate = false;
220 fScale = false;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000221
222 fScrollTestX = fScrollTestY = 0;
223
224// this->setConfig(SkBitmap::kRGB_565_Config);
225 this->setConfig(SkBitmap::kARGB_8888_Config);
226 this->setVisibleP(true);
227
reed@android.com34245c72009-11-03 04:00:48 +0000228 {
229 const SkViewRegister* reg = SkViewRegister::Head();
230 while (reg) {
231 *fSamples.append() = reg->factory();
232 reg = reg->next();
233 }
234 }
235 fCurrIndex = 0;
reed@android.come0f13ee2009-11-04 19:40:25 +0000236 this->loadView(fSamples[fCurrIndex]());
reed@android.com8a1c16f2008-12-17 15:59:43 +0000237}
238
239SampleWindow::~SampleWindow() {
240 delete fPicture;
241 delete fGLCanvas;
242}
243
reed@android.come522ca52009-11-23 20:10:41 +0000244#define XCLIP_N 4
245#define YCLIP_N 1
246
247void SampleWindow::draw(SkCanvas* canvas) {
248 if (fNClip) {
249 // this->INHERITED::draw(canvas);
250 // SkBitmap orig = capture_bitmap(canvas);
251
252 const SkScalar w = this->width();
253 const SkScalar h = this->height();
254 const SkScalar cw = w / XCLIP_N;
255 const SkScalar ch = h / YCLIP_N;
256 for (int y = 0; y < YCLIP_N; y++) {
257 for (int x = 0; x < XCLIP_N; x++) {
258 SkAutoCanvasRestore acr(canvas, true);
259 SkRect r = {
260 x * cw, y * ch, (x + 1) * cw, (y + 1) * ch
261 };
262 canvas->clipRect(r);
263 this->INHERITED::draw(canvas);
264 }
265 }
266 } else {
267 this->INHERITED::draw(canvas);
268 }
269}
270
reed@android.com8a1c16f2008-12-17 15:59:43 +0000271void SampleWindow::onDraw(SkCanvas* canvas) {
272 if (fRepeatDrawing) {
273 this->inval(NULL);
274 }
275}
276
277#include "SkColorPriv.h"
278
279static void reverseRedAndBlue(const SkBitmap& bm) {
280 SkASSERT(bm.config() == SkBitmap::kARGB_8888_Config);
281 uint8_t* p = (uint8_t*)bm.getPixels();
282 uint8_t* stop = p + bm.getSize();
283 while (p < stop) {
284 // swap red/blue (to go from ARGB(int) to RGBA(memory) and premultiply
285 unsigned scale = SkAlpha255To256(p[3]);
286 unsigned r = p[2];
287 unsigned b = p[0];
288 p[0] = SkAlphaMul(r, scale);
289 p[1] = SkAlphaMul(p[1], scale);
290 p[2] = SkAlphaMul(b, scale);
291 p += 4;
292 }
293}
294
295SkCanvas* SampleWindow::beforeChildren(SkCanvas* canvas) {
reed@android.com6efdc472008-12-19 18:24:35 +0000296#ifdef SK_SUPPORT_GL
reed@android.com8a1c16f2008-12-17 15:59:43 +0000297#ifndef USE_OFFSCREEN
298 aglSetWindowRef(gAGLContext, NULL);
299#endif
reed@android.com6efdc472008-12-19 18:24:35 +0000300#endif
reed@android.com8a1c16f2008-12-17 15:59:43 +0000301 switch (fCanvasType) {
302 case kRaster_CanvasType:
303 canvas = this->INHERITED::beforeChildren(canvas);
304 break;
305 case kPicture_CanvasType:
306 fPicture = new SkPicture;
307 canvas = fPicture->beginRecording(9999, 9999);
308 break;
reed@android.com6efdc472008-12-19 18:24:35 +0000309#ifdef SK_SUPPORT_GL
reed@android.com8a1c16f2008-12-17 15:59:43 +0000310 case kOpenGL_CanvasType: {
311 //SkGLCanvas::DeleteAllTextures(); // just for testing
312 SkDevice* device = canvas->getDevice();
313 const SkBitmap& bitmap = device->accessBitmap(true);
314 // first clear the raster bitmap, so we don't see any leftover bits
315 bitmap.eraseColor(0);
316 // now setup our glcanvas
317 setup_offscreen_gl(bitmap, (WindowRef)this->getHWND());
318 fGLCanvas = new SkGLCanvas;
319 fGLCanvas->setViewport(bitmap.width(), bitmap.height());
320 canvas = fGLCanvas;
321 break;
322 }
reed@android.com6efdc472008-12-19 18:24:35 +0000323#endif
reed@android.com8a1c16f2008-12-17 15:59:43 +0000324 }
325
326 if (fUseClip) {
327 canvas->drawColor(0xFFFF88FF);
328 canvas->clipPath(fClipPath);
329 }
330
331 return canvas;
332}
333
334static void paint_rgn(const SkBitmap& bm, const SkIRect& r,
335 const SkRegion& rgn) {
336 SkCanvas canvas(bm);
337 SkRegion inval(rgn);
338
339 inval.translate(r.fLeft, r.fTop);
340 canvas.clipRegion(inval);
341 canvas.drawColor(0xFFFF8080);
342}
343
344void SampleWindow::afterChildren(SkCanvas* orig) {
345 switch (fCanvasType) {
346 case kRaster_CanvasType:
347 break;
348 case kPicture_CanvasType:
reed@android.comaefd2bc2009-03-30 21:02:14 +0000349 if (true) {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000350 SkPicture* pict = new SkPicture(*fPicture);
351 fPicture->unref();
352 orig->drawPicture(*pict);
353 pict->unref();
reed@android.comaefd2bc2009-03-30 21:02:14 +0000354 } else if (true) {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000355 SkDynamicMemoryWStream ostream;
356 fPicture->serialize(&ostream);
357 fPicture->unref();
358
359 SkMemoryStream istream(ostream.getStream(), ostream.getOffset());
360 SkPicture pict(&istream);
361 orig->drawPicture(pict);
362 } else {
363 fPicture->draw(orig);
364 fPicture->unref();
365 }
366 fPicture = NULL;
367 break;
reed@android.com6efdc472008-12-19 18:24:35 +0000368#ifdef SK_SUPPORT_GL
reed@android.com8a1c16f2008-12-17 15:59:43 +0000369 case kOpenGL_CanvasType:
370 glFlush();
371 delete fGLCanvas;
372 fGLCanvas = NULL;
373#ifdef USE_OFFSCREEN
374 reverseRedAndBlue(orig->getDevice()->accessBitmap(true));
375#endif
376 break;
reed@android.com6efdc472008-12-19 18:24:35 +0000377#endif
reed@android.com8a1c16f2008-12-17 15:59:43 +0000378 }
379
380// if ((fScrollTestX | fScrollTestY) != 0)
381 {
382 const SkBitmap& bm = orig->getDevice()->accessBitmap(true);
383 int dx = fScrollTestX * 7;
384 int dy = fScrollTestY * 7;
385 SkIRect r;
386 SkRegion inval;
387
388 r.set(50, 50, 50+100, 50+100);
389 bm.scrollRect(&r, dx, dy, &inval);
390 paint_rgn(bm, r, inval);
391 }
392}
393
reed@android.com6c5f6f22009-08-14 16:08:38 +0000394void SampleWindow::beforeChild(SkView* child, SkCanvas* canvas) {
395 if (fScale) {
396 SkScalar scale = SK_Scalar1 * 7 / 10;
397 SkScalar cx = this->width() / 2;
398 SkScalar cy = this->height() / 2;
399 canvas->translate(cx, cy);
400 canvas->scale(scale, scale);
401 canvas->translate(-cx, -cy);
402 }
403 if (fRotate) {
404 SkScalar cx = this->width() / 2;
405 SkScalar cy = this->height() / 2;
406 canvas->translate(cx, cy);
407 canvas->rotate(SkIntToScalar(30));
408 canvas->translate(-cx, -cy);
409 }
410}
411
412void SampleWindow::afterChild(SkView* child, SkCanvas* canvas) {
413}
414
reed@android.com8a1c16f2008-12-17 15:59:43 +0000415static SkBitmap::Config gConfigCycle[] = {
416 SkBitmap::kNo_Config, // none -> none
417 SkBitmap::kNo_Config, // a1 -> none
418 SkBitmap::kNo_Config, // a8 -> none
419 SkBitmap::kNo_Config, // index8 -> none
420 SkBitmap::kARGB_4444_Config, // 565 -> 4444
421 SkBitmap::kARGB_8888_Config, // 4444 -> 8888
422 SkBitmap::kRGB_565_Config // 8888 -> 565
423};
424
425static SkBitmap::Config cycle_configs(SkBitmap::Config c) {
426 return gConfigCycle[c];
427}
428
429bool SampleWindow::nextSample() {
reed@android.com34245c72009-11-03 04:00:48 +0000430 fCurrIndex = (fCurrIndex + 1) % fSamples.count();
431 this->loadView(fSamples[fCurrIndex]());
432 return true;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000433}
434
435bool SampleWindow::onEvent(const SkEvent& evt) {
436 if (evt.isType(ANIMATING_EVENTTYPE)) {
437 if (fAnimating) {
438 this->nextSample();
439 this->postAnimatingEvent();
440 }
441 return true;
442 }
reed@android.com34245c72009-11-03 04:00:48 +0000443 if (evt.isType("set-curr-index")) {
444 fCurrIndex = evt.getFast32() % fSamples.count();
445 this->loadView(fSamples[fCurrIndex]());
446 return true;
447 }
reed@android.com8a1c16f2008-12-17 15:59:43 +0000448 return this->INHERITED::onEvent(evt);
449}
450
reed@android.com0ae6b242008-12-23 16:49:54 +0000451static void cleanup_for_filename(SkString* name) {
452 char* str = name->writable_str();
453 for (int i = 0; i < name->size(); i++) {
454 switch (str[i]) {
455 case ':': str[i] = '-'; break;
456 case '/': str[i] = '-'; break;
457 case ' ': str[i] = '_'; break;
458 default: break;
459 }
460 }
461}
reed@android.com8a1c16f2008-12-17 15:59:43 +0000462
463bool SampleWindow::onHandleChar(SkUnichar uni) {
464 int dx = 0xFF;
465 int dy = 0xFF;
466
467 switch (uni) {
468 case '5': dx = 0; dy = 0; break;
469 case '8': dx = 0; dy = -1; break;
470 case '6': dx = 1; dy = 0; break;
471 case '2': dx = 0; dy = 1; break;
472 case '4': dx = -1; dy = 0; break;
473 case '7': dx = -1; dy = -1; break;
474 case '9': dx = 1; dy = -1; break;
475 case '3': dx = 1; dy = 1; break;
476 case '1': dx = -1; dy = 1; break;
477
478 default:
479 break;
480 }
481
482 if (0xFF != dx && 0xFF != dy) {
483 if ((dx | dy) == 0) {
484 fScrollTestX = fScrollTestY = 0;
485 } else {
486 fScrollTestX += dx;
487 fScrollTestY += dy;
488 }
489 this->inval(NULL);
490 return true;
491 }
492
reed@android.com0ae6b242008-12-23 16:49:54 +0000493 switch (uni) {
494 case 'a':
495 fAnimating = !fAnimating;
496 this->postAnimatingEvent();
497 this->updateTitle();
498 return true;
499 case 'f': {
500 const char* title = this->getTitle();
501 if (title[0] == 0) {
502 title = "sampleapp";
503 }
504 SkString name(title);
505 cleanup_for_filename(&name);
506 name.append(".png");
507 if (SkImageEncoder::EncodeFile(name.c_str(), this->getBitmap(),
reed@android.comb08eb2b2009-01-06 20:16:26 +0000508 SkImageEncoder::kPNG_Type, 100)) {
reed@android.com0ae6b242008-12-23 16:49:54 +0000509 SkDebugf("Created %s\n", name.c_str());
510 }
511 return true;
512 }
reed@android.com6c5f6f22009-08-14 16:08:38 +0000513 case 'r':
514 fRotate = !fRotate;
515 this->inval(NULL);
516 this->updateTitle();
517 return true;
518 case 's':
519 fScale = !fScale;
520 this->inval(NULL);
521 this->updateTitle();
522 return true;
reed@android.com0ae6b242008-12-23 16:49:54 +0000523 default:
524 break;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000525 }
526
527 return this->INHERITED::onHandleChar(uni);
528}
529
530#include "SkDumpCanvas.h"
531
532bool SampleWindow::onHandleKey(SkKey key) {
533 switch (key) {
534 case kRight_SkKey:
535 if (this->nextSample()) {
536 return true;
537 }
538 break;
539 case kLeft_SkKey:
540 fCanvasType = cycle_canvastype(fCanvasType);
541 this->updateTitle();
542 this->inval(NULL);
543 return true;
544 case kUp_SkKey:
reed@android.come522ca52009-11-23 20:10:41 +0000545 fNClip = !fNClip;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000546 this->updateTitle();
547 this->inval(NULL);
548 return true;
549 case kDown_SkKey:
550 this->setConfig(cycle_configs(this->getBitmap().config()));
551 this->updateTitle();
552 return true;
553 case kOK_SkKey:
554 if (true) {
555 SkDebugfDumper dumper;
556 SkDumpCanvas dc(&dumper);
557 this->draw(&dc);
558 } else {
559 fRepeatDrawing = !fRepeatDrawing;
560 if (fRepeatDrawing) {
561 this->inval(NULL);
562 }
563 }
564 return true;
reed@android.com34245c72009-11-03 04:00:48 +0000565 case kBack_SkKey:
566 this->loadView(NULL);
567 return true;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000568 default:
569 break;
570 }
571 return this->INHERITED::onHandleKey(key);
572}
573
574void SampleWindow::loadView(SkView* view) {
575 SkView::F2BIter iter(this);
576 SkView* prev = iter.next();
577 if (prev) {
578 prev->detachFromParent();
579 }
reed@android.com34245c72009-11-03 04:00:48 +0000580
581 if (NULL == view) {
582 view = create_overview(fSamples.count(), fSamples.begin());
583 }
reed@android.com8a1c16f2008-12-17 15:59:43 +0000584 view->setVisibleP(true);
585 this->attachChildToFront(view)->unref();
586 view->setSize(this->width(), this->height());
587
588 this->updateTitle();
589}
590
591static const char* gConfigNames[] = {
592 "unknown config",
593 "A1",
594 "A8",
595 "Index8",
596 "565",
597 "4444",
598 "8888"
599};
600
601static const char* configToString(SkBitmap::Config c) {
602 return gConfigNames[c];
603}
604
605static const char* gCanvasTypePrefix[] = {
606 "raster: ",
607 "picture: ",
608 "opengl: "
609};
610
611void SampleWindow::updateTitle() {
612 SkString title;
613
614 SkView::F2BIter iter(this);
615 SkView* view = iter.next();
616 SkEvent evt(gTitleEvtName);
617 if (view->doQuery(&evt)) {
618 title.set(evt.findString(gTitleEvtName));
619 }
620 if (title.size() == 0) {
621 title.set("<unknown>");
622 }
623
624 title.prepend(gCanvasTypePrefix[fCanvasType]);
625
626 title.prepend(" ");
627 title.prepend(configToString(this->getBitmap().config()));
628
629 if (fAnimating) {
630 title.prepend("<A> ");
631 }
reed@android.com6c5f6f22009-08-14 16:08:38 +0000632 if (fScale) {
633 title.prepend("<S> ");
634 }
635 if (fRotate) {
636 title.prepend("<R> ");
637 }
reed@android.come522ca52009-11-23 20:10:41 +0000638 if (fNClip) {
639 title.prepend("<C> ");
640 }
reed@android.com8a1c16f2008-12-17 15:59:43 +0000641 this->setTitle(title.c_str());
642}
643
644void SampleWindow::onSizeChange() {
645 this->INHERITED::onSizeChange();
646
647 SkView::F2BIter iter(this);
648 SkView* view = iter.next();
649 view->setSize(this->width(), this->height());
650
651 // rebuild our clippath
652 {
653 const SkScalar W = this->width();
654 const SkScalar H = this->height();
655
656 fClipPath.reset();
657#if 0
658 for (SkScalar y = SK_Scalar1; y < H; y += SkIntToScalar(32)) {
659 SkRect r;
660 r.set(SK_Scalar1, y, SkIntToScalar(30), y + SkIntToScalar(30));
661 for (; r.fLeft < W; r.offset(SkIntToScalar(32), 0))
662 fClipPath.addRect(r);
663 }
664#else
665 SkRect r;
666 r.set(0, 0, W, H);
667 fClipPath.addRect(r, SkPath::kCCW_Direction);
668 r.set(W/4, H/4, W*3/4, H*3/4);
669 fClipPath.addRect(r, SkPath::kCW_Direction);
670#endif
671 }
672
673 this->updateTitle(); // to refresh our config
674}
675
676///////////////////////////////////////////////////////////////////////////////
677
678SkOSWindow* create_sk_window(void* hwnd) {
679 return new SampleWindow(hwnd);
680}
681
682void get_preferred_size(int* x, int* y, int* width, int* height) {
683 *x = 10;
684 *y = 50;
685 *width = 640;
686 *height = 480;
687}
688
689void application_init() {
690// setenv("ANDROID_ROOT", "../../../data", 0);
691 setenv("ANDROID_ROOT", "/android/device/data", 0);
reed@android.com5e5adfd2009-03-07 03:39:23 +0000692 SkGraphics::Init();
reed@android.com8a1c16f2008-12-17 15:59:43 +0000693 SkEvent::Init();
694}
695
696void application_term() {
697 SkEvent::Term();
698 SkGraphics::Term();
699}