From: joshualitt Date: Mon, 11 May 2015 20:04:28 +0000 (-0700) Subject: fix for cached textblobs look garbled X-Git-Tag: accepted/tizen/5.0/unified/20181102.025319~2449 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e4cee1f283c435618343f0c7b298207d5a9a3e1c;p=platform%2Fupstream%2FlibSkiaSharp.git fix for cached textblobs look garbled BUG=skia: Review URL: https://codereview.chromium.org/1135813007 --- diff --git a/gm/textblobgeometrychange.cpp b/gm/textblobgeometrychange.cpp new file mode 100644 index 0000000..fec1ac0 --- /dev/null +++ b/gm/textblobgeometrychange.cpp @@ -0,0 +1,81 @@ +/* + * Copyright 2015 Google Inc. + * + * Use of this source code is governed by a BD-style license that can be + * found in the LICENSE file. + */ + +#include "gm.h" + +#include "SkCanvas.h" +#include "SkSurface.h" +#include "SkTextBlob.h" + +// This tests that we don't try to reuse textblobs from the GPU textblob cache across pixel geometry +// changes when we have LCD. crbug/486744 +namespace skiagm { +class TextBlobGeometryChange : public GM { +public: + TextBlobGeometryChange() { } + +protected: + SkString onShortName() override { + return SkString("textblobgeometrychange"); + } + + SkISize onISize() override { + return SkISize::Make(kWidth, kHeight); + } + + void onDraw(SkCanvas* canvas) override { + const char text[] = "Hamburgefons"; + + SkPaint paint; + sk_tool_utils::set_portable_typeface(&paint); + paint.setTextSize(20); + paint.setAntiAlias(true); + paint.setLCDRenderText(true); + + SkTextBlobBuilder builder; + + sk_tool_utils::add_to_text_blob(&builder, text, paint, 10, 10); + + SkAutoTUnref blob(builder.build()); + + SkImageInfo info = SkImageInfo::MakeN32Premul(200, 200); + SkSurfaceProps props(0, kUnknown_SkPixelGeometry); + SkAutoTUnref surface(canvas->newSurface(info, &props)); + if (surface) { + SkCanvas* c = surface->getCanvas(); + + // LCD text on white background + SkRect rect = SkRect::MakeLTRB(0.f, 0.f, SkIntToScalar(kWidth), kHeight / 2.f); + SkPaint rectPaint; + rectPaint.setColor(0xffffffff); + canvas->drawRect(rect, rectPaint); + canvas->drawTextBlob(blob.get(), 10, 50, paint); + + // This should not look garbled since we should disable LCD text in this case + // (i.e., unknown pixel geometry) + c->clear(0x00ffffff); + c->drawTextBlob(blob.get(), 10, 150, paint); + surface->draw(canvas, 0, 0, nullptr); + } else { + const char* text = "This test requires a surface"; + size_t len = strlen(text); + SkPaint paint; + canvas->drawText(text, len, 10, 100, paint); + } + } + +private: + static const int kWidth = 200; + static const int kHeight = 200; + + typedef GM INHERITED; +}; + +////////////////////////////////////////////////////////////////////////////// + +DEF_GM( return SkNEW(TextBlobGeometryChange); ) +} diff --git a/gyp/gmslides.gypi b/gyp/gmslides.gypi index b57d609..b11ac66 100644 --- a/gyp/gmslides.gypi +++ b/gyp/gmslides.gypi @@ -218,6 +218,7 @@ '../gm/textblob.cpp', '../gm/textbloblooper.cpp', '../gm/textblobcolortrans.cpp', + '../gm/textblobgeometrychange.cpp', '../gm/textblobshader.cpp', '../gm/textblobtransforms.cpp', '../gm/texturedomaineffect.cpp', diff --git a/src/gpu/GrAtlasTextContext.cpp b/src/gpu/GrAtlasTextContext.cpp index c908137..227ba1f 100644 --- a/src/gpu/GrAtlasTextContext.cpp +++ b/src/gpu/GrAtlasTextContext.cpp @@ -366,12 +366,18 @@ void GrAtlasTextContext::drawTextBlob(GrRenderTarget* rt, const GrClip& clip, if (canCache) { bool hasLCD = HasLCD(blob); + + // We canonicalize all non-lcd draws to use kUnknown_SkPixelGeometry + SkPixelGeometry pixelGeometry = hasLCD ? fDeviceProperties.pixelGeometry() : + kUnknown_SkPixelGeometry; + // TODO we want to figure out a way to be able to use the canonical color on LCD text, // see the note on ComputeCanonicalColor above. We pick a dummy value for LCD text to // ensure we always match the same key GrColor canonicalColor = hasLCD ? SK_ColorTRANSPARENT : ComputeCanonicalColor(skPaint, hasLCD); + key.fPixelGeometry = pixelGeometry; key.fUniqueID = blob->uniqueID(); key.fStyle = skPaint.getStyle(); key.fHasBlur = SkToBool(mf); diff --git a/src/gpu/GrAtlasTextContext.h b/src/gpu/GrAtlasTextContext.h index 55597cf..f2e46cc 100644 --- a/src/gpu/GrAtlasTextContext.h +++ b/src/gpu/GrAtlasTextContext.h @@ -163,12 +163,13 @@ private: sk_bzero(this, sizeof(Key)); } uint32_t fUniqueID; - SkPaint::Style fStyle; // Color may affect the gamma of the mask we generate, but in a fairly limited way. // Each color is assigned to on of a fixed number of buckets based on its // luminance. For each luminance bucket there is a "canonical color" that // represents the bucket. This functionality is currently only supported for A8 SkColor fCanonicalColor; + SkPaint::Style fStyle; + SkPixelGeometry fPixelGeometry; bool fHasBlur; bool operator==(const Key& other) const {