From e2e52e46ca63540d429656baeee48fd3a402be26 Mon Sep 17 00:00:00 2001 From: Herb Derby Date: Thu, 21 Jun 2018 16:03:47 -0400 Subject: Remove drawTextBlob from device use drawGlyphRunList Convert all backends to use GlyphRunList instead of text blobs. If the device did not originally implement drawTextBlob it will be simulated by drawPosText on the device. Other changes: Change to using an origin from absolulte positioning. The GPU code uses origin change to update blobs under translation. Change cluster to use const uint32_t instead of just uint32_t. Add SkPaint to runs. The draw filter is hosted up to the canavas level and applied there. Change-Id: Ib105b6bd26b67db55f1c954e37c79fbdcaa9d4a2 Reviewed-on: https://skia-review.googlesource.com/137224 Reviewed-by: Herb Derby Reviewed-by: Khusal Sagar Reviewed-by: Hal Canary Reviewed-by: Jim Van Verth Commit-Queue: Herb Derby --- tests/GlyphRunTest.cpp | 4 ++-- tests/SkRemoteGlyphCacheTest.cpp | 46 ++++++++++++++++++++++++++++++++++++++-- 2 files changed, 46 insertions(+), 4 deletions(-) (limited to 'tests') diff --git a/tests/GlyphRunTest.cpp b/tests/GlyphRunTest.cpp index cd2a221719..8107f2075c 100644 --- a/tests/GlyphRunTest.cpp +++ b/tests/GlyphRunTest.cpp @@ -75,7 +75,7 @@ DEF_TEST(GlyphRunBlob, reporter) { paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding); SkGlyphRunBuilder runBuilder; - runBuilder.prepareTextBlob(font, *blob, SkPoint::Make(0, 0)); + runBuilder.prepareTextBlob(font, *blob, SkPoint::Make(0, 0), nullptr); auto runList = runBuilder.useGlyphRunList(); @@ -96,4 +96,4 @@ DEF_TEST(GlyphRunBlob, reporter) { runIndex += 1; } -} \ No newline at end of file +} diff --git a/tests/SkRemoteGlyphCacheTest.cpp b/tests/SkRemoteGlyphCacheTest.cpp index 4a7bd86dc0..6986a7bb03 100644 --- a/tests/SkRemoteGlyphCacheTest.cpp +++ b/tests/SkRemoteGlyphCacheTest.cpp @@ -69,6 +69,8 @@ sk_sp buildTextBlob(sk_sp tf, int glyphCount) { font.setStyle(SkPaint::kFill_Style); font.setHinting(SkPaint::kNormal_Hinting); font.setTextSize(1u); + font.setAntiAlias(true); + font.setSubpixelText(true); SkTextBlobBuilder builder; SkRect bounds = SkRect::MakeWH(10, 10); @@ -99,12 +101,13 @@ SkTextBlobCacheDiffCanvas::Settings MakeSettings(GrContext* context) { } SkBitmap RasterBlob(sk_sp blob, int width, int height, const SkPaint& paint, - GrContext* context, const SkMatrix* matrix = nullptr) { + GrContext* context, const SkMatrix* matrix = nullptr, + SkScalar x = 0) { const SkImageInfo info = SkImageInfo::Make(width, height, kN32_SkColorType, kPremul_SkAlphaType); auto surface = SkSurface::MakeRenderTarget(context, SkBudgeted::kNo, info); if (matrix) surface->getCanvas()->concat(*matrix); - surface->getCanvas()->drawTextBlob(blob.get(), 0u, 0u, paint); + surface->getCanvas()->drawTextBlob(blob.get(), x, 0, paint); SkBitmap bitmap; bitmap.allocN32Pixels(width, height); surface->readPixels(bitmap, 0, 0); @@ -332,6 +335,45 @@ DEF_GPUTEST_FOR_RENDERING_CONTEXTS(SkRemoteGlyphCache_DrawTextAsPath, reporter, discardableManager->unlockAndDeleteAll(); } +DEF_GPUTEST_FOR_RENDERING_CONTEXTS(SkRemoteGlyphCache_DrawTextXY, reporter, ctxInfo) { + sk_sp discardableManager = sk_make_sp(); + SkStrikeServer server(discardableManager.get()); + SkStrikeClient client(discardableManager, false); + SkPaint paint; + paint.setAntiAlias(true); + paint.setSubpixelText(true); + paint.setLCDRenderText(true); + + // Server. + auto serverTf = SkTypeface::MakeFromName("monospace", SkFontStyle()); + auto serverTfData = server.serializeTypeface(serverTf.get()); + + int glyphCount = 10; + auto serverBlob = buildTextBlob(serverTf, glyphCount); + const SkSurfaceProps props(SkSurfaceProps::kLegacyFontHost_InitType); + SkTextBlobCacheDiffCanvas cache_diff_canvas(10, 10, SkMatrix::I(), props, &server, + MakeSettings(ctxInfo.grContext())); + cache_diff_canvas.drawTextBlob(serverBlob.get(), 0.5, 0, paint); + + std::vector serverStrikeData; + server.writeStrikeData(&serverStrikeData); + + // Client. + auto clientTf = client.deserializeTypeface(serverTfData->data(), serverTfData->size()); + REPORTER_ASSERT(reporter, + client.readStrikeData(serverStrikeData.data(), serverStrikeData.size())); + auto clientBlob = buildTextBlob(clientTf, glyphCount); + + SkBitmap expected = RasterBlob(serverBlob, 10, 10, paint, ctxInfo.grContext(), nullptr, 0.5); + SkBitmap actual = RasterBlob(clientBlob, 10, 10, paint, ctxInfo.grContext(), nullptr, 0.5); + COMPARE_BLOBS(expected, actual, reporter); + REPORTER_ASSERT(reporter, !discardableManager->hasCacheMiss()); + SkStrikeCache::ValidateGlyphCacheDataSize(); + + // Must unlock everything on termination, otherwise valgrind complains about memory leaks. + discardableManager->unlockAndDeleteAll(); +} + DEF_GPUTEST_FOR_RENDERING_CONTEXTS(SkRemoteGlyphCache_DrawTextAsDFT, reporter, ctxInfo) { sk_sp discardableManager = sk_make_sp(); SkStrikeServer server(discardableManager.get()); -- cgit v1.2.3