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