11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/* 31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc. 41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * 51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be 61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file. 71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */ 80b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SampleCode.h" 90b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkView.h" 100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkCanvas.h" 110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkGraphics.h" 120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkRandom.h" 130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include <pthread.h> 150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic void call_measure() { 170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkPaint paint; 180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger uint16_t text[32]; 190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkRandom rand; 200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setAntiAlias(true); 220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setTextEncoding(SkPaint::kUTF16_TextEncoding); 230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger for (int j = 0; j < SK_ARRAY_COUNT(text); j++) 240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger text[j] = (uint16_t)((rand.nextU() & 0xFF) + 32); 250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 260b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger for (int i = 9; i < 36; i++) { 270b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkPaint::FontMetrics m; 280b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 290b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setTextSize(SkIntToScalar(i)); 300b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.getFontMetrics(&m); 310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.measureText(text, sizeof(text)); 320b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 330b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger} 340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic void call_draw(SkCanvas* canvas) { 360b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkPaint paint; 370b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger uint16_t text[32]; 380b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkRandom rand; 390b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 400b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setAntiAlias(true); 410b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setTextEncoding(SkPaint::kUTF16_TextEncoding); 420b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger for (int j = 0; j < SK_ARRAY_COUNT(text); j++) 430b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger text[j] = (uint16_t)((rand.nextU() & 0xFF) + 32); 440b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 450b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkScalar x = SkIntToScalar(10); 460b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkScalar y = SkIntToScalar(20); 470b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 480b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->drawColor(SK_ColorWHITE); 490b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger for (int i = 9; i < 36; i++) 500b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger { 510b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkPaint::FontMetrics m; 520b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 530b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setTextSize(SkIntToScalar(i)); 540b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.getFontMetrics(&m); 550b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->drawText(text, sizeof(text), x, y, paint); 560b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger y += m.fDescent - m.fAscent; 570b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 580b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger} 590b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 600b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic bool gDone; 610b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 620b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic void* measure_proc(void* context) { 630b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger while (!gDone) { 640b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger call_measure(); 650b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 660b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return NULL; 670b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger} 680b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 690b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic void* draw_proc(void* context) { 700b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkBitmap* bm = (SkBitmap*)context; 710b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkCanvas canvas(*bm); 720b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 730b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger while (!gDone) { 740b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger call_draw(&canvas); 750b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 760b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return NULL; 770b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger} 780b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 790b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerclass FontCacheView : public SampleView { 800b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerpublic: 810b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger enum { N = 4 }; 820b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 830b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger pthread_t fMThreads[N]; 840b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger pthread_t fDThreads[N]; 850b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkBitmap fBitmaps[N]; 860b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 870b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger FontCacheView() { 880b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger gDone = false; 890b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger for (int i = 0; i < N; i++) { 900b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger int status; 910b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 920b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger status = pthread_create(&fMThreads[i], NULL, measure_proc, NULL); 930b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkASSERT(0 == status); 940b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 950b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger fBitmaps[i].setConfig(SkBitmap::kRGB_565_Config, 320, 240); 960b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger fBitmaps[i].allocPixels(); 970b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger status = pthread_create(&fDThreads[i], NULL, draw_proc, &fBitmaps[i]); 980b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkASSERT(0 == status); 990b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 1000b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger this->setBGColor(0xFFDDDDDD); 1010b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 1020b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1030b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger virtual ~FontCacheView() { 1040b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger gDone = true; 1050b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger for (int i = 0; i < N; i++) { 1060b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger void* ret; 1070b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger int status = pthread_join(fMThreads[i], &ret); 1080b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkASSERT(0 == status); 1090b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger status = pthread_join(fDThreads[i], &ret); 1100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkASSERT(0 == status); 1110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 1120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 1130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerprotected: 1150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger // overrides from SkEventSink 1160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger virtual bool onQuery(SkEvent* evt) { 1170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger if (SampleCode::TitleQ(*evt)) { 1180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SampleCode::TitleR(evt, "FontCache"); 1190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return true; 1200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 1210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return this->INHERITED::onQuery(evt); 1220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 1230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger virtual void onDrawContent(SkCanvas* canvas) { 1250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkScalar x = 0; 1260b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkScalar y = 0; 1270b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger for (int i = 0; i < N; i++) { 1280b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->drawBitmap(fBitmaps[i], x, y); 1290b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger x += SkIntToScalar(fBitmaps[i].width()); 1300b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 1310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger this->inval(NULL); 1320b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 1330b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerprivate: 1350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger typedef SampleView INHERITED; 1360b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}; 1370b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1380b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger////////////////////////////////////////////////////////////////////////////// 1390b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1400b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic SkView* MyFactory() { return new FontCacheView; } 1410b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic SkViewRegister reg(MyFactory); 1420b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 143