• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2011 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 #include "SampleCode.h"
8 #include "SkView.h"
9 #include "SkCanvas.h"
10 #include "SkGraphics.h"
11 #include "SkRandom.h"
12 
13 #include <pthread.h>
14 
call_measure()15 static void call_measure() {
16     SkPaint paint;
17     uint16_t text[32];
18     SkRandom rand;
19 
20     paint.setAntiAlias(true);
21     paint.setTextEncoding(SkPaint::kUTF16_TextEncoding);
22     for (int j = 0; j < SK_ARRAY_COUNT(text); j++)
23         text[j] = (uint16_t)((rand.nextU() & 0xFF) + 32);
24 
25     for (int i = 9; i < 36; i++) {
26         SkPaint::FontMetrics m;
27 
28         paint.setTextSize(SkIntToScalar(i));
29         paint.getFontMetrics(&m);
30         paint.measureText(text, sizeof(text));
31     }
32 }
33 
call_draw(SkCanvas * canvas)34 static void call_draw(SkCanvas* canvas) {
35     SkPaint paint;
36     uint16_t text[32];
37     SkRandom rand;
38 
39     paint.setAntiAlias(true);
40     paint.setTextEncoding(SkPaint::kUTF16_TextEncoding);
41     for (int j = 0; j < SK_ARRAY_COUNT(text); j++)
42         text[j] = (uint16_t)((rand.nextU() & 0xFF) + 32);
43 
44     SkScalar x = SkIntToScalar(10);
45     SkScalar y = SkIntToScalar(20);
46 
47     canvas->drawColor(SK_ColorWHITE);
48     for (int i = 9; i < 36; i++)
49     {
50         SkPaint::FontMetrics m;
51 
52         paint.setTextSize(SkIntToScalar(i));
53         paint.getFontMetrics(&m);
54         canvas->drawText(text, sizeof(text), x, y, paint);
55         y += m.fDescent - m.fAscent;
56     }
57 }
58 
59 static bool gDone;
60 
measure_proc(void * context)61 static void* measure_proc(void* context) {
62     while (!gDone) {
63         call_measure();
64     }
65     return nullptr;
66 }
67 
draw_proc(void * context)68 static void* draw_proc(void* context) {
69     SkBitmap* bm = (SkBitmap*)context;
70     SkCanvas    canvas(*bm);
71 
72     while (!gDone) {
73         call_draw(&canvas);
74     }
75     return nullptr;
76 }
77 
78 class FontCacheView : public SampleView {
79 public:
80     enum { N = 4 };
81 
82     pthread_t   fMThreads[N];
83     pthread_t   fDThreads[N];
84     SkBitmap    fBitmaps[N];
85 
FontCacheView()86     FontCacheView() {
87         gDone = false;
88         for (int i = 0; i < N; i++) {
89             int status;
90 
91             status = pthread_create(&fMThreads[i], nullptr,  measure_proc, nullptr);
92             SkASSERT(0 == status);
93 
94             fBitmaps[i].allocPixels(SkImageInfo::Make(320, 240,
95                                                       kRGB_565_SkColorType,
96                                                       kOpaque_SkAlphaType));
97             status = pthread_create(&fDThreads[i], nullptr,  draw_proc, &fBitmaps[i]);
98             SkASSERT(0 == status);
99         }
100         this->setBGColor(0xFFDDDDDD);
101     }
102 
~FontCacheView()103     virtual ~FontCacheView() {
104         gDone = true;
105         for (int i = 0; i < N; i++) {
106             void* ret;
107             int status = pthread_join(fMThreads[i], &ret);
108             SkASSERT(0 == status);
109             status = pthread_join(fDThreads[i], &ret);
110             SkASSERT(0 == status);
111         }
112     }
113 
114 protected:
115     // overrides from SkEventSink
onQuery(SkEvent * evt)116     virtual bool onQuery(SkEvent* evt) {
117         if (SampleCode::TitleQ(*evt)) {
118             SampleCode::TitleR(evt, "FontCache");
119             return true;
120         }
121         return this->INHERITED::onQuery(evt);
122     }
123 
onDrawContent(SkCanvas * canvas)124     virtual void onDrawContent(SkCanvas* canvas) {
125         SkScalar x = 0;
126         SkScalar y = 0;
127         for (int i = 0; i < N; i++) {
128             canvas->drawBitmap(fBitmaps[i], x, y);
129             x += SkIntToScalar(fBitmaps[i].width());
130         }
131         this->inval(nullptr);
132     }
133 
134 private:
135     typedef SampleView INHERITED;
136 };
137 
138 //////////////////////////////////////////////////////////////////////////////
139 
MyFactory()140 static SkView* MyFactory() { return new FontCacheView; }
141 static SkViewRegister reg(MyFactory);
142