blob: fb63f7146cc1ea1427ef7e88485a3bab50a8446a [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 "SkGraphics.h"
5#include "SkRandom.h"
6
7#include <pthread.h>
8
9static void call_measure()
10{
11 SkPaint paint;
12 uint16_t text[32];
13 SkRandom rand;
14
15 paint.setAntiAlias(true);
16 paint.setTextEncoding(SkPaint::kUTF16_TextEncoding);
17 for (int j = 0; j < SK_ARRAY_COUNT(text); j++)
18 text[j] = (uint16_t)((rand.nextU() & 0xFF) + 32);
19
20 for (int i = 9; i < 36; i++)
21 {
22 SkPaint::FontMetrics m;
23
24 paint.setTextSize(SkIntToScalar(i));
25 paint.getFontMetrics(&m);
26 paint.measureText(text, sizeof(text));
27 }
28}
29
30static void call_draw(SkCanvas* canvas)
31{
32 SkPaint paint;
33 uint16_t text[32];
34 SkRandom rand;
35
36 paint.setAntiAlias(true);
37 paint.setTextEncoding(SkPaint::kUTF16_TextEncoding);
38 for (int j = 0; j < SK_ARRAY_COUNT(text); j++)
39 text[j] = (uint16_t)((rand.nextU() & 0xFF) + 32);
40
41 SkScalar x = SkIntToScalar(10);
42 SkScalar y = SkIntToScalar(20);
43
44 canvas->drawColor(SK_ColorWHITE);
45 for (int i = 9; i < 36; i++)
46 {
47 SkPaint::FontMetrics m;
48
49 paint.setTextSize(SkIntToScalar(i));
50 paint.getFontMetrics(&m);
51 canvas->drawText(text, sizeof(text), x, y, paint);
52 y += m.fDescent - m.fAscent;
53 }
54}
55
56static bool gDone;
57
58static void* measure_proc(void* context)
59{
60 while (!gDone)
61 {
62 call_measure();
63 }
64 return NULL;
65}
66
67static void* draw_proc(void* context)
68{
69 SkBitmap* bm = (SkBitmap*)context;
70 SkCanvas canvas(*bm);
71
72 while (!gDone)
73 {
74 call_draw(&canvas);
75 }
76 return NULL;
77}
78
79class FontCacheView : public SkView {
80public:
81 enum { N = 4 };
82
83 pthread_t fMThreads[N];
84 pthread_t fDThreads[N];
85 SkBitmap fBitmaps[N];
86
87 FontCacheView()
88 {
89 gDone = false;
90 for (int i = 0; i < N; i++)
91 {
92 int status;
93 pthread_attr_t attr;
94
95 status = pthread_attr_init(&attr);
96 SkASSERT(0 == status);
97 status = pthread_create(&fMThreads[i], &attr, measure_proc, NULL);
98 SkASSERT(0 == status);
99
100 fBitmaps[i].setConfig(SkBitmap::kRGB_565_Config, 320, 240);
101 fBitmaps[i].allocPixels();
102 status = pthread_create(&fDThreads[i], &attr, draw_proc, &fBitmaps[i]);
103 SkASSERT(0 == status);
104 }
105 }
106
107 virtual ~FontCacheView()
108 {
109 gDone = true;
110 for (int i = 0; i < N; i++)
111 {
112 void* ret;
113 int status = pthread_join(fMThreads[i], &ret);
114 SkASSERT(0 == status);
115 status = pthread_join(fDThreads[i], &ret);
116 SkASSERT(0 == status);
117 }
118 }
119
120protected:
121 // overrides from SkEventSink
122 virtual bool onQuery(SkEvent* evt)
123 {
124 if (SampleCode::TitleQ(*evt))
125 {
126 SampleCode::TitleR(evt, "FontCache");
127 return true;
128 }
129 return this->INHERITED::onQuery(evt);
130 }
131
132 void drawBG(SkCanvas* canvas)
133 {
134 canvas->drawColor(0xFFDDDDDD);
135// canvas->drawColor(SK_ColorWHITE);
136 }
137
138 virtual void onDraw(SkCanvas* canvas)
139 {
140 this->drawBG(canvas);
141
142 SkScalar x = 0;
143 SkScalar y = 0;
144 for (int i = 0; i < N; i++)
145 {
146 canvas->drawBitmap(fBitmaps[i], x, y);
147 x += SkIntToScalar(fBitmaps[i].width());
148 }
149 this->inval(NULL);
150 }
151
152 virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y)
153 {
154 this->inval(NULL);
155 return this->INHERITED::onFindClickHandler(x, y);
156 }
157
158 virtual bool onClick(Click* click)
159 {
160 return this->INHERITED::onClick(click);
161 }
162
163private:
164 typedef SkView INHERITED;
165};
166
167//////////////////////////////////////////////////////////////////////////////
168
169static SkView* MyFactory() { return new FontCacheView; }
170static SkViewRegister reg(MyFactory);
171