Check for too small rect for path

This check was dropped in skia cl/145000. Add it back
in to bring it back into parity with the SkRemoteGlyphCache.

BUG=chromium:873020

Change-Id: I04c12e54145e0ebd1bdec2f01f5f40f26648f78a
Reviewed-on: https://skia-review.googlesource.com/148384
Reviewed-by: Mike Klein <mtklein@google.com>
Commit-Queue: Herb Derby <herb@google.com>
Auto-Submit: Herb Derby <herb@google.com>
This commit is contained in:
Herb Derby 2018-08-21 11:48:17 -04:00 committed by Skia Commit-Bot
parent 9335c28e40
commit 20a6332c94

View File

@ -828,30 +828,6 @@ static bool glyph_too_big_for_atlas(const SkGlyph& glyph) {
return glyph.fWidth >= 256 || glyph.fHeight >= 256;
}
template <typename PerGlyphT, typename PerPathT>
void SkGlyphRunListDrawer::drawGlyphRunAsBMPWithPathFallback(
SkGlyphCache* cache, const SkGlyphRun& glyphRun,
SkPoint origin, const SkMatrix& deviceMatrix,
PerGlyphT perGlyph, PerPathT perPath) {
auto eachGlyph =
[cache, perGlyph{std::move(perGlyph)}, perPath{std::move(perPath)}]
(const SkGlyph& glyph, SkPoint pt, SkPoint mappedPt) {
if (glyph_too_big_for_atlas(glyph)) {
const SkPath* glyphPath = cache->findPath(glyph);
if (glyphPath != nullptr) {
perPath(glyphPath, glyph, mappedPt);
}
} else {
const void* glyphImage = cache->findImage(glyph);
if (glyphImage != nullptr) {
perGlyph(glyph, mappedPt);
}
}
};
this->forEachMappedDrawableGlyph(glyphRun, origin, deviceMatrix, cache, eachGlyph);
}
static SkRect rect_to_draw(
const SkGlyph& glyph, SkPoint origin, SkScalar textScale, GrGlyph::MaskStyle maskStyle) {
@ -875,6 +851,38 @@ static SkRect rect_to_draw(
return SkRect::MakeXYWH(origin.x() + dx, origin.y() + dy, width, height);
}
template <typename PerGlyphT, typename PerPathT>
void SkGlyphRunListDrawer::drawGlyphRunAsBMPWithPathFallback(
SkGlyphCache* cache, const SkGlyphRun& glyphRun,
SkPoint origin, const SkMatrix& deviceMatrix,
PerGlyphT perGlyph, PerPathT perPath) {
auto eachGlyph =
[cache, perGlyph{std::move(perGlyph)}, perPath{std::move(perPath)}]
(const SkGlyph& glyph, SkPoint pt, SkPoint mappedPt) {
if (glyph_too_big_for_atlas(glyph)) {
SkScalar sx = SkScalarFloorToScalar(mappedPt.fX),
sy = SkScalarFloorToScalar(mappedPt.fY);
SkRect glyphRect =
rect_to_draw(glyph, {sx, sy}, SK_Scalar1, GrGlyph::kCoverage_MaskStyle);
if (!glyphRect.isEmpty()) {
const SkPath* glyphPath = cache->findPath(glyph);
if (glyphPath != nullptr) {
perPath(glyphPath, glyph, mappedPt);
}
}
} else {
const void* glyphImage = cache->findImage(glyph);
if (glyphImage != nullptr) {
perGlyph(glyph, mappedPt);
}
}
};
this->forEachMappedDrawableGlyph(glyphRun, origin, deviceMatrix, cache, eachGlyph);
}
template <typename PerSDFT, typename PerPathT, typename PerFallbackT>
void SkGlyphRunListDrawer::drawGlyphRunAsSDFWithFallback(
SkGlyphCache* cache, const SkGlyphRun& glyphRun,