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