Index: src/gpu/text/GrAtlasGlyphCache.cpp |
diff --git a/src/gpu/text/GrAtlasGlyphCache.cpp b/src/gpu/text/GrAtlasGlyphCache.cpp |
index 803dbb48e1afe40dc26f27c0b49ad0a4a23b2344..5d85f4919d52eda736b476f84d0bf355ecdcaf9b 100644 |
--- a/src/gpu/text/GrAtlasGlyphCache.cpp |
+++ b/src/gpu/text/GrAtlasGlyphCache.cpp |
@@ -14,6 +14,7 @@ |
#include "SkString.h" |
#include "SkDistanceFieldGen.h" |
+#include "GrDistanceFieldGenFromVector.h" |
bool GrAtlasGlyphCache::initAtlas(GrMaskFormat format) { |
int index = MaskFormatToAtlasIndex(format); |
@@ -320,29 +321,57 @@ static bool get_packed_glyph_df_image(SkGlyphCache* cache, const SkGlyph& glyph, |
int width, int height, void* dst) { |
SkASSERT(glyph.fWidth + 2*SK_DistanceFieldPad == width); |
SkASSERT(glyph.fHeight + 2*SK_DistanceFieldPad == height); |
- const void* image = cache->findImage(glyph); |
- if (nullptr == image) { |
+ |
+#ifndef SK_USE_LEGACY_DISTANCE_FIELDS |
+ const SkPath* path = cache->findPath(glyph); |
+ if (nullptr == path) { |
return false; |
} |
+ |
+ SkDEBUGCODE(SkRect glyphBounds = SkRect::MakeXYWH(glyph.fLeft, |
+ glyph.fTop, |
+ glyph.fWidth, |
+ glyph.fHeight)); |
+ SkASSERT(glyphBounds.contains(path->getBounds())); |
+ |
// now generate the distance field |
SkASSERT(dst); |
- SkMask::Format maskFormat = static_cast<SkMask::Format>(glyph.fMaskFormat); |
- if (SkMask::kA8_Format == maskFormat) { |
- // make the distance field from the image |
- SkGenerateDistanceFieldFromA8Image((unsigned char*)dst, |
- (unsigned char*)image, |
- glyph.fWidth, glyph.fHeight, |
- glyph.rowBytes()); |
- } else if (SkMask::kBW_Format == maskFormat) { |
- // make the distance field from the image |
- SkGenerateDistanceFieldFromBWImage((unsigned char*)dst, |
- (unsigned char*)image, |
- glyph.fWidth, glyph.fHeight, |
- glyph.rowBytes()); |
- } else { |
- return false; |
- } |
+ SkMatrix drawMatrix; |
+ drawMatrix.setTranslate((SkScalar)-glyph.fLeft, (SkScalar)-glyph.fTop); |
+ // Generate signed distance field directly from SkPath |
+ bool succeed = GrGenerateDistanceFieldFromPath((unsigned char*)dst, |
+ *path, drawMatrix, |
+ width, height, width * sizeof(unsigned char)); |
+ |
+ if (!succeed) { |
+#endif |
+ const void* image = cache->findImage(glyph); |
+ if (nullptr == image) { |
+ return false; |
+ } |
+ |
+ // now generate the distance field |
+ SkASSERT(dst); |
+ SkMask::Format maskFormat = static_cast<SkMask::Format>(glyph.fMaskFormat); |
+ if (SkMask::kA8_Format == maskFormat) { |
+ // make the distance field from the image |
+ SkGenerateDistanceFieldFromA8Image((unsigned char*)dst, |
+ (unsigned char*)image, |
+ glyph.fWidth, glyph.fHeight, |
+ glyph.rowBytes()); |
+ } else if (SkMask::kBW_Format == maskFormat) { |
+ // make the distance field from the image |
+ SkGenerateDistanceFieldFromBWImage((unsigned char*)dst, |
+ (unsigned char*)image, |
+ glyph.fWidth, glyph.fHeight, |
+ glyph.rowBytes()); |
+ } else { |
+ return false; |
+ } |
+#ifndef SK_USE_LEGACY_DISTANCE_FIELDS |
+ } |
+#endif |
return true; |
} |