diff options
-rw-r--r-- | gm/fontcache.cpp | 119 | ||||
-rw-r--r-- | gyp/gmslides.gypi | 1 |
2 files changed, 120 insertions, 0 deletions
diff --git a/gm/fontcache.cpp b/gm/fontcache.cpp new file mode 100644 index 0000000000..b428b0c2b8 --- /dev/null +++ b/gm/fontcache.cpp @@ -0,0 +1,119 @@ +/* + * Copyright 2013 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "gm.h" +#include "SkCanvas.h" +#include "SkGraphics.h" +#include "SkTypeface.h" + +// GM to stress the GPU font cache + +const char* gFamilyNames[] = { + "sans-serif", "serif", "monospace" +}; + +const SkTypeface::Style gStyles[] = { + SkTypeface::kNormal, SkTypeface::kItalic +}; + +const int gTextSizes[] = { + 12, 14, 16, 18, 20, 22, 24, 26, 28, 30 +}; + +#define TYPEFACE_COUNT (SK_ARRAY_COUNT(gFamilyNames)*SK_ARRAY_COUNT(gStyles)) + +static SkScalar draw_string(SkCanvas* canvas, const SkString& text, SkScalar x, + SkScalar y, const SkPaint& paint) { + canvas->drawText(text.c_str(), text.size(), x, y, paint); + return x + paint.measureText(text.c_str(), text.size()); +} + +class FontCacheGM : public skiagm::GM { +public: + FontCacheGM() { + fName.set("fontcache"); + } + + virtual ~FontCacheGM() { + for (size_t i = 0; i < TYPEFACE_COUNT; ++i) { + SkSafeUnref(fTypefaces[i]); + } + } + +protected: + virtual SkString onShortName() SK_OVERRIDE { + return fName; + } + + virtual SkISize onISize() SK_OVERRIDE { + return SkISize::Make(640, 320); + } + + virtual void onOnceBeforeDraw() SK_OVERRIDE { + int typefaceCount = 0; + for (size_t i = 0; i < SK_ARRAY_COUNT(gFamilyNames); ++i) { + for (size_t j = 0; j < SK_ARRAY_COUNT(gStyles); ++j) { + fTypefaces[typefaceCount++] = SkTypeface::CreateFromName(gFamilyNames[i], + gStyles[j]); + } + } + } + + virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { + SkScalar y = 32; + SkPaint paint; + paint.setAntiAlias(true); + paint.setLCDRenderText(true); + paint.setSubpixelText(true); + + SkString text("Ham"); + + // draw some initial text to partially fill the GPU cache + for (size_t i = 0; i < 2; ++i) { + paint.setTypeface(fTypefaces[i]); + SkScalar x = 20; + + for (size_t j = 0; j < SK_ARRAY_COUNT(gTextSizes); ++j) { + paint.setTextSize(gTextSizes[j]); + x = draw_string(canvas, text, x, y, paint) + 19; + } + y += 32; + } + + // force a flush + canvas->flush(); + + // draw again, and more to overflow the cache + for (size_t i = 0; i < TYPEFACE_COUNT; ++i) { + paint.setTypeface(fTypefaces[i]); + SkScalar x = 20; + + for (size_t j = 0; j < SK_ARRAY_COUNT(gTextSizes); ++j) { + paint.setTextSize(gTextSizes[j]); + x = draw_string(canvas, text, x, y, paint) + 19; + } + y += 32; + } + + } + + virtual uint32_t onGetFlags() const SK_OVERRIDE { + // this GM is meant only for the GPU + return kGPUOnly_Flag; + } + +private: + SkTypeface* fTypefaces[TYPEFACE_COUNT]; + SkString fName; + typedef GM INHERITED; +}; + + +////////////////////////////////////////////////////////////////////////////// + +DEF_GM( return SkNEW(FontCacheGM); ) + diff --git a/gyp/gmslides.gypi b/gyp/gmslides.gypi index 9307388850..a9d2234823 100644 --- a/gyp/gmslides.gypi +++ b/gyp/gmslides.gypi @@ -54,6 +54,7 @@ '../gm/filltypes.cpp', '../gm/filltypespersp.cpp', '../gm/filterbitmap.cpp', + '../gm/fontcache.cpp', '../gm/fontmgr.cpp', '../gm/fontscaler.cpp', '../gm/gammatext.cpp', |