aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--gm/textblobgeometrychange.cpp81
-rw-r--r--gyp/gmslides.gypi1
-rw-r--r--src/gpu/GrAtlasTextContext.cpp6
-rw-r--r--src/gpu/GrAtlasTextContext.h3
4 files changed, 90 insertions, 1 deletions
diff --git a/gm/textblobgeometrychange.cpp b/gm/textblobgeometrychange.cpp
new file mode 100644
index 0000000000..fec1ac050d
--- /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<const SkTextBlob> blob(builder.build());
+
+ SkImageInfo info = SkImageInfo::MakeN32Premul(200, 200);
+ SkSurfaceProps props(0, kUnknown_SkPixelGeometry);
+ SkAutoTUnref<SkSurface> 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 b57d609c9b..b11ac667e7 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 c908137477..227ba1f65e 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 55597cfccc..f2e46cc85f 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 {