From 937d9674571ecbed94b83bfd9d04f6d097d96c6d Mon Sep 17 00:00:00 2001 From: Brian Osman Date: Fri, 5 Apr 2019 11:54:37 -0400 Subject: [PATCH] Always mark bitmap glyph runs as such, to ensure they are properly regenerated If all glyphs were culled (by being too small), we could end up with a run that never called setHasBitmap. That would prevent us from looking at the view matrix on a subsequent draw, when deciding if we needed to regenerate. Bug: skia:8955 Change-Id: Ic7a2539762527f91bdb50ab78bdf5801bfda0034 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/206266 Commit-Queue: Brian Osman Reviewed-by: Mike Klein Reviewed-by: Herb Derby --- gm/skbug_8955.cpp | 28 ++++++++++++++++++++++++++++ gn/gm.gni | 1 + src/core/SkGlyphRunPainter.cpp | 10 +++++----- 3 files changed, 34 insertions(+), 5 deletions(-) create mode 100644 gm/skbug_8955.cpp diff --git a/gm/skbug_8955.cpp b/gm/skbug_8955.cpp new file mode 100644 index 0000000000..82c94c2f2f --- /dev/null +++ b/gm/skbug_8955.cpp @@ -0,0 +1,28 @@ +/* + * Copyright 2019 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 "SkFont.h" +#include "SkPaint.h" +#include "SkTextBlob.h" + +DEF_SIMPLE_GM(skbug_8955, canvas, 100, 100) { + SkPaint p; + SkFont font; + font.setSize(50); + auto blob = SkTextBlob::MakeFromText("+", 1, font); + + // This bug only appeared when drawing the same text blob. We would generate no glyphs on the + // first draw, and fail to mark the blob as having any bitmap runs. That would prevent us from + // re-generating the blob on the second draw, even though the matrix had been restored. + canvas->save(); + canvas->scale(0, 0); + canvas->drawTextBlob(blob, 30, 60, p); + canvas->restore(); + canvas->drawTextBlob(blob, 30, 60, p); +} diff --git a/gn/gm.gni b/gn/gm.gni index 4f7f009299..6f6216d26d 100644 --- a/gn/gm.gni +++ b/gn/gm.gni @@ -309,6 +309,7 @@ gm_sources = [ "$_gm/skbug_4868.cpp", "$_gm/skbug_5321.cpp", "$_gm/skbug_8664.cpp", + "$_gm/skbug_8955.cpp", "$_gm/skbug1719.cpp", "$_gm/skinning.cpp", "$_gm/smallarc.cpp", diff --git a/src/core/SkGlyphRunPainter.cpp b/src/core/SkGlyphRunPainter.cpp index 1a75b3122e..41b233f4a8 100644 --- a/src/core/SkGlyphRunPainter.cpp +++ b/src/core/SkGlyphRunPainter.cpp @@ -564,11 +564,11 @@ void SkGlyphRunListPainter::processGlyphRunList(const SkGlyphRunList& glyphRunLi } if (process) { - if (glyphsWithMaskCount > 0) { - process->processDeviceMasks( - SkSpan{fGlyphPos, SkTo(glyphsWithMaskCount)}, - strike.get()); - } + // processDeviceMasks must be called even if there are no glyphs to make sure runs + // are set correctly. + process->processDeviceMasks( + SkSpan{fGlyphPos, SkTo(glyphsWithMaskCount)}, + strike.get()); if (!fPaths.empty()) { process->processDevicePaths(SkSpan{fPaths}); }