blob: 99554a2c325d8fb6d304eeaecc6e5b4089d51db3 [file] [log] [blame]
commit-bot@chromium.org338a49f2013-10-09 18:12:23 +00001/*
2 * Copyright 2013 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
8#include "gm.h"
9#include "SkCanvas.h"
10#include "SkGraphics.h"
11#include "SkTypeface.h"
12
skia.committer@gmail.comf29c3802013-10-10 07:01:40 +000013// GM to stress the GPU font cache
commit-bot@chromium.org338a49f2013-10-09 18:12:23 +000014
15const char* gFamilyNames[] = {
jvanverth3f541752014-09-03 08:44:59 -070016 "sans-serif", "serif"
commit-bot@chromium.org338a49f2013-10-09 18:12:23 +000017};
18
19const SkTypeface::Style gStyles[] = {
jvanverth3f541752014-09-03 08:44:59 -070020 SkTypeface::kNormal, SkTypeface::kItalic, SkTypeface::kBold
commit-bot@chromium.org338a49f2013-10-09 18:12:23 +000021};
22
23const SkScalar gTextSizes[] = {
jvanverth3f541752014-09-03 08:44:59 -070024 192, 194, 196, 198, 200, 202, 204, 206
commit-bot@chromium.org338a49f2013-10-09 18:12:23 +000025};
26
27#define TYPEFACE_COUNT (SK_ARRAY_COUNT(gFamilyNames)*SK_ARRAY_COUNT(gStyles))
28
29static SkScalar draw_string(SkCanvas* canvas, const SkString& text, SkScalar x,
30 SkScalar y, const SkPaint& paint) {
31 canvas->drawText(text.c_str(), text.size(), x, y, paint);
32 return x + paint.measureText(text.c_str(), text.size());
33}
34
35class FontCacheGM : public skiagm::GM {
36public:
37 FontCacheGM() {
38 for (size_t i = 0; i < TYPEFACE_COUNT; ++i) {
39 fTypefaces[i] = NULL;
40 }
41 }
42
43 virtual ~FontCacheGM() {
44 for (size_t i = 0; i < TYPEFACE_COUNT; ++i) {
45 SkSafeUnref(fTypefaces[i]);
46 }
47 }
skia.committer@gmail.comf29c3802013-10-10 07:01:40 +000048
commit-bot@chromium.org338a49f2013-10-09 18:12:23 +000049protected:
50 virtual SkString onShortName() SK_OVERRIDE {
jvanverth@google.com73d13d72013-10-09 18:53:35 +000051 return SkString("fontcache");
commit-bot@chromium.org338a49f2013-10-09 18:12:23 +000052 }
53
54 virtual SkISize onISize() SK_OVERRIDE {
jvanverth3f541752014-09-03 08:44:59 -070055 return SkISize::Make(1280, 640);
commit-bot@chromium.org338a49f2013-10-09 18:12:23 +000056 }
57
58 virtual void onOnceBeforeDraw() SK_OVERRIDE {
59 int typefaceCount = 0;
60 for (size_t i = 0; i < SK_ARRAY_COUNT(gFamilyNames); ++i) {
61 for (size_t j = 0; j < SK_ARRAY_COUNT(gStyles); ++j) {
Cary Clark992c7b02014-07-31 08:58:44 -040062 fTypefaces[typefaceCount++] = sk_tool_utils::create_portable_typeface(gFamilyNames[i],
63 gStyles[j]);
commit-bot@chromium.org338a49f2013-10-09 18:12:23 +000064 }
65 }
66 }
skia.committer@gmail.comf29c3802013-10-10 07:01:40 +000067
commit-bot@chromium.org338a49f2013-10-09 18:12:23 +000068 virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
69 SkScalar y = 32;
70 SkPaint paint;
71 paint.setAntiAlias(true);
72 paint.setLCDRenderText(true);
73 paint.setSubpixelText(true);
74
jvanverth3f541752014-09-03 08:44:59 -070075 SkString text("H");
commit-bot@chromium.org338a49f2013-10-09 18:12:23 +000076
jvanverth3f541752014-09-03 08:44:59 -070077 // draw enough to overflow the cache
commit-bot@chromium.org338a49f2013-10-09 18:12:23 +000078 for (size_t i = 0; i < TYPEFACE_COUNT; ++i) {
79 paint.setTypeface(fTypefaces[i]);
80 SkScalar x = 20;
skia.committer@gmail.comf29c3802013-10-10 07:01:40 +000081
commit-bot@chromium.org338a49f2013-10-09 18:12:23 +000082 for (size_t j = 0; j < SK_ARRAY_COUNT(gTextSizes); ++j) {
83 paint.setTextSize(gTextSizes[j]);
jvanverth3f541752014-09-03 08:44:59 -070084 x = draw_string(canvas, text, x, y, paint) + 10;
commit-bot@chromium.org338a49f2013-10-09 18:12:23 +000085 }
jvanverth3f541752014-09-03 08:44:59 -070086 y += 128;
commit-bot@chromium.org338a49f2013-10-09 18:12:23 +000087 }
Mike Klein6a25bd02014-08-29 10:03:59 -040088
commit-bot@chromium.org338a49f2013-10-09 18:12:23 +000089 }
90
91 virtual uint32_t onGetFlags() const SK_OVERRIDE {
92 // this GM is meant only for the GPU
93 return kGPUOnly_Flag;
94 }
95
96private:
97 SkTypeface* fTypefaces[TYPEFACE_COUNT];
commit-bot@chromium.org338a49f2013-10-09 18:12:23 +000098 typedef GM INHERITED;
99};
100
101
102//////////////////////////////////////////////////////////////////////////////
103
104DEF_GM( return SkNEW(FontCacheGM); )