| 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;
|
| }
|
|
|
|
|