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 "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