From e49109f3b599afa1f9fe85d241aa68e842a7264e Mon Sep 17 00:00:00 2001 From: joshualitt Date: Fri, 17 Jul 2015 12:47:39 -0700 Subject: adding unit test for textblob cache / GrBatchAtlas BUG=skia: Review URL: https://codereview.chromium.org/1233253003 --- tests/TextBlobCacheTest.cpp | 123 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 tests/TextBlobCacheTest.cpp (limited to 'tests/TextBlobCacheTest.cpp') diff --git a/tests/TextBlobCacheTest.cpp b/tests/TextBlobCacheTest.cpp new file mode 100644 index 0000000000..b15af9083a --- /dev/null +++ b/tests/TextBlobCacheTest.cpp @@ -0,0 +1,123 @@ +/* + * Copyright 2015 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "sk_tool_utils.h" +#include "SkCanvas.h" +#include "SkPaint.h" +#include "SkPoint.h" +#include "SkTextBlob.h" +#include "SkFontMgr.h" +#include "SkGraphics.h" +#include "SkSurface.h" +#include "SkTypeface.h" + +#ifdef SK_BUILD_FOR_WIN + #include "SkTypeface_win.h" +#endif + +#include "Test.h" + +#if SK_SUPPORT_GPU +#include "GrContextFactory.h" + +struct TextBlobWrapper { + explicit TextBlobWrapper(const SkTextBlob* blob) : fBlob(SkRef(blob)) {} + TextBlobWrapper(const TextBlobWrapper& blob) : fBlob(SkRef(blob.fBlob.get())) {} + + SkAutoTUnref fBlob; +}; + +static void draw(SkCanvas* canvas, int redraw, const SkTArray& blobs) { + for (int r = 0; r < redraw; r++) { + for (int i = 0; i < blobs.count(); i++) { + SkPaint paint; + canvas->drawTextBlob(blobs[i].fBlob.get(), 0, 0, paint); + } + } +} + +// limit this just so we don't take too long to draw +#define MAX_TOTAL_TEXT 4096 +#define MAX_CHAR 256 +#define MAX_FAMILIES 5 + +// This test hammers the GPU textblobcache and font atlas +DEF_TEST(TextBlobCache, reporter) { + SkAutoTDelete grFactory(SkNEW(GrContextFactory)); + + // setup surface + uint32_t flags = 0; + SkSurfaceProps props(flags, SkSurfaceProps::kLegacyFontHost_InitType); + + GrContext* ctx = grFactory->get(GrContextFactory::kNative_GLContextType); + SkImageInfo info = SkImageInfo::Make(1024, 768, kN32_SkColorType, kPremul_SkAlphaType); + SkAutoTUnref surface(SkSurface::NewRenderTarget(ctx, SkSurface::kNo_Budgeted, info, + 0, &props)); + REPORTER_ASSERT(reporter, surface); + if (!surface) { + return; + } + + SkCanvas* canvas = surface->getCanvas(); + + SkAutoTUnref fm(SkFontMgr::RefDefault()); + + int count = SkMin32(fm->countFamilies(), MAX_FAMILIES); + + // make a ton of text + uint16_t text[MAX_TOTAL_TEXT]; + for (int i = 0; i < MAX_TOTAL_TEXT; i++) { + text[i] = i % MAX_CHAR; + } + + // generate textblobs + SkTArray blobs; + for (int i = 0; i < count; i++) { + SkPaint paint; + paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding); + paint.setTextSize(256); // draw big glyphs to really stress the atlas + + SkString familyName; + fm->getFamilyName(i, &familyName); + SkAutoTUnref set(fm->createStyleSet(i)); + for (int j = 0; j < set->count(); ++j) { + SkFontStyle fs; + set->getStyle(j, &fs, NULL); + + SkSafeUnref(paint.setTypeface(set->createTypeface(j))); + + SkTextBlobBuilder builder; + for (int aa = 0; aa < 2; aa++) { + for (int subpixel = 0; subpixel < 2; subpixel++) { + for (int lcd = 0; lcd < 2; lcd++) { + paint.setAntiAlias(SkToBool(aa)); + paint.setSubpixelText(SkToBool(subpixel)); + paint.setLCDRenderText(SkToBool(lcd)); + const SkTextBlobBuilder::RunBuffer& run = builder.allocRun(paint, + MAX_TOTAL_TEXT, + 0, 0, + NULL); + memcpy(run.glyphs, text, MAX_TOTAL_TEXT * sizeof(uint16_t)); + } + } + } + SkNEW_APPEND_TO_TARRAY(&blobs, TextBlobWrapper, (builder.build())); + } + } + + // test redraw + draw(canvas, 2, blobs); + + // test draw after free + ctx->freeGpuResources(); + draw(canvas, 1, blobs); + + // test draw after abandon + ctx->abandonContext(); + draw(canvas, 1, blobs); +} +#endif -- cgit v1.2.3