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