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 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 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 61 static void* measure_proc(void* context) { 62 while (!gDone) { 63 call_measure(); 64 } 65 return nullptr; 66 } 67 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 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 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 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 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 140 static SkView* MyFactory() { return new FontCacheView; } 141 static SkViewRegister reg(MyFactory); 142