blob: 75d35b8d4db3b56e30c649e7d1c747a767ae3b56 [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001/*
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 */
Mike Kleinc0bd9f92019-04-23 12:05:21 -05007#include "include/core/SkCanvas.h"
8#include "include/core/SkGraphics.h"
9#include "include/utils/SkRandom.h"
10#include "samplecode/Sample.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +000011
12#include <pthread.h>
13
reed@google.com961ddb02011-05-05 14:03:48 +000014static void call_measure() {
reed@android.com8a1c16f2008-12-17 15:59:43 +000015 SkPaint paint;
16 uint16_t text[32];
commit-bot@chromium.orge0e7cfe2013-09-09 20:09:12 +000017 SkRandom rand;
rmistry@google.comae933ce2012-08-23 18:19:56 +000018
reed@android.com8a1c16f2008-12-17 15:59:43 +000019 paint.setAntiAlias(true);
Ben Wagner51e15a62019-05-07 15:38:46 -040020 paint.setTextEncoding(SkTextEncoding::kUTF16);
reed@android.com8a1c16f2008-12-17 15:59:43 +000021 for (int j = 0; j < SK_ARRAY_COUNT(text); j++)
22 text[j] = (uint16_t)((rand.nextU() & 0xFF) + 32);
rmistry@google.comae933ce2012-08-23 18:19:56 +000023
reed@google.com961ddb02011-05-05 14:03:48 +000024 for (int i = 9; i < 36; i++) {
Mike Reedb5784ac2018-11-12 09:35:15 -050025 SkFontMetrics m;
rmistry@google.comae933ce2012-08-23 18:19:56 +000026
reed@android.com8a1c16f2008-12-17 15:59:43 +000027 paint.setTextSize(SkIntToScalar(i));
28 paint.getFontMetrics(&m);
29 paint.measureText(text, sizeof(text));
30 }
31}
32
reed@google.com961ddb02011-05-05 14:03:48 +000033static void call_draw(SkCanvas* canvas) {
reed@android.com8a1c16f2008-12-17 15:59:43 +000034 SkPaint paint;
35 uint16_t text[32];
commit-bot@chromium.orge0e7cfe2013-09-09 20:09:12 +000036 SkRandom rand;
rmistry@google.comae933ce2012-08-23 18:19:56 +000037
reed@android.com8a1c16f2008-12-17 15:59:43 +000038 paint.setAntiAlias(true);
Ben Wagner51e15a62019-05-07 15:38:46 -040039 paint.setTextEncoding(SkTextEncoding::kUTF16);
reed@android.com8a1c16f2008-12-17 15:59:43 +000040 for (int j = 0; j < SK_ARRAY_COUNT(text); j++)
41 text[j] = (uint16_t)((rand.nextU() & 0xFF) + 32);
rmistry@google.comae933ce2012-08-23 18:19:56 +000042
reed@android.com8a1c16f2008-12-17 15:59:43 +000043 SkScalar x = SkIntToScalar(10);
44 SkScalar y = SkIntToScalar(20);
rmistry@google.comae933ce2012-08-23 18:19:56 +000045
reed@android.com8a1c16f2008-12-17 15:59:43 +000046 canvas->drawColor(SK_ColorWHITE);
47 for (int i = 9; i < 36; i++)
48 {
Mike Reedb5784ac2018-11-12 09:35:15 -050049 SkFontMetrics m;
rmistry@google.comae933ce2012-08-23 18:19:56 +000050
reed@android.com8a1c16f2008-12-17 15:59:43 +000051 paint.setTextSize(SkIntToScalar(i));
52 paint.getFontMetrics(&m);
53 canvas->drawText(text, sizeof(text), x, y, paint);
54 y += m.fDescent - m.fAscent;
55 }
56}
57
58static bool gDone;
59
reed@google.com961ddb02011-05-05 14:03:48 +000060static void* measure_proc(void* context) {
61 while (!gDone) {
reed@android.com8a1c16f2008-12-17 15:59:43 +000062 call_measure();
63 }
halcanary96fcdcc2015-08-27 07:41:13 -070064 return nullptr;
reed@android.com8a1c16f2008-12-17 15:59:43 +000065}
66
reed@google.com961ddb02011-05-05 14:03:48 +000067static void* draw_proc(void* context) {
reed@android.com8a1c16f2008-12-17 15:59:43 +000068 SkBitmap* bm = (SkBitmap*)context;
69 SkCanvas canvas(*bm);
70
reed@google.com961ddb02011-05-05 14:03:48 +000071 while (!gDone) {
reed@android.com8a1c16f2008-12-17 15:59:43 +000072 call_draw(&canvas);
73 }
halcanary96fcdcc2015-08-27 07:41:13 -070074 return nullptr;
reed@android.com8a1c16f2008-12-17 15:59:43 +000075}
76
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040077class FontCacheView : public Sample {
reed@android.com8a1c16f2008-12-17 15:59:43 +000078public:
79 enum { N = 4 };
rmistry@google.comae933ce2012-08-23 18:19:56 +000080
reed@android.com8a1c16f2008-12-17 15:59:43 +000081 pthread_t fMThreads[N];
82 pthread_t fDThreads[N];
83 SkBitmap fBitmaps[N];
84
rmistry@google.comae933ce2012-08-23 18:19:56 +000085 FontCacheView() {
reed@android.com8a1c16f2008-12-17 15:59:43 +000086 gDone = false;
reed@google.com961ddb02011-05-05 14:03:48 +000087 for (int i = 0; i < N; i++) {
reed@android.com7d970c72010-04-22 16:07:49 +000088 int status;
rmistry@google.comae933ce2012-08-23 18:19:56 +000089
halcanary96fcdcc2015-08-27 07:41:13 -070090 status = pthread_create(&fMThreads[i], nullptr, measure_proc, nullptr);
reed@android.com8a1c16f2008-12-17 15:59:43 +000091 SkASSERT(0 == status);
92
commit-bot@chromium.orga8c18312014-02-17 02:55:57 +000093 fBitmaps[i].allocPixels(SkImageInfo::Make(320, 240,
94 kRGB_565_SkColorType,
95 kOpaque_SkAlphaType));
halcanary96fcdcc2015-08-27 07:41:13 -070096 status = pthread_create(&fDThreads[i], nullptr, draw_proc, &fBitmaps[i]);
reed@android.com8a1c16f2008-12-17 15:59:43 +000097 SkASSERT(0 == status);
98 }
reed@google.com961ddb02011-05-05 14:03:48 +000099 this->setBGColor(0xFFDDDDDD);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000100 }
rmistry@google.comae933ce2012-08-23 18:19:56 +0000101
reed@google.com961ddb02011-05-05 14:03:48 +0000102 virtual ~FontCacheView() {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000103 gDone = true;
reed@google.com961ddb02011-05-05 14:03:48 +0000104 for (int i = 0; i < N; i++) {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000105 void* ret;
106 int status = pthread_join(fMThreads[i], &ret);
107 SkASSERT(0 == status);
108 status = pthread_join(fDThreads[i], &ret);
109 SkASSERT(0 == status);
110 }
111 }
rmistry@google.comae933ce2012-08-23 18:19:56 +0000112
reed@android.com8a1c16f2008-12-17 15:59:43 +0000113protected:
Ben Wagnerb2c4ea62018-08-08 11:36:17 -0400114 virtual bool onQuery(Sample::Event* evt) {
115 if (Sample::TitleQ(*evt)) {
116 Sample::TitleR(evt, "FontCache");
reed@android.com8a1c16f2008-12-17 15:59:43 +0000117 return true;
118 }
119 return this->INHERITED::onQuery(evt);
120 }
rmistry@google.comae933ce2012-08-23 18:19:56 +0000121
reed@google.com961ddb02011-05-05 14:03:48 +0000122 virtual void onDrawContent(SkCanvas* canvas) {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000123 SkScalar x = 0;
124 SkScalar y = 0;
reed@google.com961ddb02011-05-05 14:03:48 +0000125 for (int i = 0; i < N; i++) {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000126 canvas->drawBitmap(fBitmaps[i], x, y);
127 x += SkIntToScalar(fBitmaps[i].width());
128 }
halcanary96fcdcc2015-08-27 07:41:13 -0700129 this->inval(nullptr);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000130 }
rmistry@google.comae933ce2012-08-23 18:19:56 +0000131
reed@android.com8a1c16f2008-12-17 15:59:43 +0000132private:
Ben Wagnerb2c4ea62018-08-08 11:36:17 -0400133 typedef Sample INHERITED;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000134};
135
136//////////////////////////////////////////////////////////////////////////////
137
Ben Wagnerb2c4ea62018-08-08 11:36:17 -0400138static Sample* MyFactory() { return new FontCacheView; }
139static SampleRegister reg(MyFactory);