From 338a49fc55be8555e171419d079a1b6317060a38 Mon Sep 17 00:00:00 2001 From: "commit-bot@chromium.org" Date: Wed, 9 Oct 2013 18:12:23 +0000 Subject: [PATCH] Add new GM to stress test the GPU font cache for cases similar to Chromium issue 303803. BUG=303803 Committed: http://code.google.com/p/skia/source/detail?r=11673 R=robertphillips@google.com Author: jvanverth@google.com Review URL: https://codereview.chromium.org/26699002 git-svn-id: http://skia.googlecode.com/svn/trunk@11680 2bbb7eff-a529-9590-31e7-b0007b416f81 --- gm/fontcache.cpp | 121 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ gyp/gmslides.gypi | 1 + 2 files changed, 122 insertions(+) create mode 100644 gm/fontcache.cpp diff --git a/gm/fontcache.cpp b/gm/fontcache.cpp new file mode 100644 index 0000000..1e01de0 --- /dev/null +++ b/gm/fontcache.cpp @@ -0,0 +1,121 @@ +/* + * 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 SkScalar 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() { + for (size_t i = 0; i < TYPEFACE_COUNT; ++i) { + fTypefaces[i] = NULL; + } + } + + 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 9307388..a9d2234 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', -- 2.7.4