| Index: src/gpu/GrTextStrike.cpp
|
| diff --git a/src/gpu/GrTextStrike.cpp b/src/gpu/GrTextStrike.cpp
|
| index 65ead0f0bbf08268d7247e5c8cb95cbaeaa9aaaa..29d1b91e8e2f65ef475a751f304828118cd9dedb 100644
|
| --- a/src/gpu/GrTextStrike.cpp
|
| +++ b/src/gpu/GrTextStrike.cpp
|
| @@ -214,10 +214,6 @@ void GrFontCache::dump() const {
|
| static int gCounter;
|
| #endif
|
|
|
| -// this acts as the max magnitude for the distance field,
|
| -// as well as the pad we need around the glyph
|
| -#define DISTANCE_FIELD_RANGE 4
|
| -
|
| /*
|
| The text strike is specific to a given font/style/matrix setup, which is
|
| represented by the GrHostFontScaler object we are given in getGlyph().
|
| @@ -260,20 +256,17 @@ GrTextStrike::~GrTextStrike() {
|
| GrGlyph* GrTextStrike::generateGlyph(GrGlyph::PackedID packed,
|
| GrFontScaler* scaler) {
|
| SkIRect bounds;
|
| - if (!scaler->getPackedGlyphBounds(packed, &bounds)) {
|
| - return NULL;
|
| + if (fUseDistanceField) {
|
| + if (!scaler->getPackedGlyphDFBounds(packed, &bounds)) {
|
| + return NULL;
|
| + }
|
| + } else {
|
| + if (!scaler->getPackedGlyphBounds(packed, &bounds)) {
|
| + return NULL;
|
| + }
|
| }
|
|
|
| GrGlyph* glyph = fPool.alloc();
|
| - // expand bounds to hold full distance field data
|
| - // + room for bilerp
|
| - int pad = DISTANCE_FIELD_RANGE+1;
|
| - if (fUseDistanceField) {
|
| - bounds.fLeft -= pad;
|
| - bounds.fRight += pad;
|
| - bounds.fTop -= pad;
|
| - bounds.fBottom += pad;
|
| - }
|
| glyph->init(packed, bounds);
|
| fCache.insert(packed, glyph);
|
| return glyph;
|
| @@ -306,56 +299,27 @@ bool GrTextStrike::addGlyphToAtlas(GrGlyph* glyph, GrFontScaler* scaler) {
|
|
|
| int bytesPerPixel = GrMaskFormatBytesPerPixel(fMaskFormat);
|
|
|
| - GrPlot* plot;
|
| + size_t size = glyph->fBounds.area() * bytesPerPixel;
|
| + SkAutoSMalloc<1024> storage(size);
|
| if (fUseDistanceField) {
|
| - // we've already expanded the glyph dimensions to match the final size
|
| - // but must shrink back down to get the packed glyph data
|
| - int dfWidth = glyph->width();
|
| - int dfHeight = glyph->height();
|
| - int pad = DISTANCE_FIELD_RANGE+1;
|
| - int width = dfWidth - 2*pad;
|
| - int height = dfHeight - 2*pad;
|
| - int stride = width*bytesPerPixel;
|
| -
|
| - size_t size = width * height * bytesPerPixel;
|
| - SkAutoSMalloc<1024> storage(size);
|
| - if (!scaler->getPackedGlyphImage(glyph->fPackedID, width, height, stride, storage.get())) {
|
| + if (!scaler->getPackedGlyphDFImage(glyph->fPackedID, glyph->width(),
|
| + glyph->height(),
|
| + storage.get())) {
|
| return false;
|
| }
|
| -
|
| - // alloc storage for distance field glyph
|
| - size_t dfSize = dfWidth * dfHeight * bytesPerPixel;
|
| - SkAutoSMalloc<1024> dfStorage(dfSize);
|
| -
|
| - if (1 == bytesPerPixel) {
|
| - (void) SkGenerateDistanceFieldFromImage((unsigned char*)dfStorage.get(),
|
| - (unsigned char*)storage.get(),
|
| - width, height, DISTANCE_FIELD_RANGE);
|
| - } else {
|
| - // distance fields should only be used to represent alpha masks
|
| - SkASSERT(false);
|
| - return false;
|
| - }
|
| -
|
| - // copy to atlas
|
| - plot = fAtlasMgr->addToAtlas(&fAtlas, dfWidth, dfHeight, dfStorage.get(),
|
| - &glyph->fAtlasLocation);
|
| -
|
| } else {
|
| - size_t size = glyph->fBounds.area() * bytesPerPixel;
|
| - SkAutoSMalloc<1024> storage(size);
|
| if (!scaler->getPackedGlyphImage(glyph->fPackedID, glyph->width(),
|
| glyph->height(),
|
| glyph->width() * bytesPerPixel,
|
| storage.get())) {
|
| return false;
|
| }
|
| -
|
| - plot = fAtlasMgr->addToAtlas(&fAtlas, glyph->width(),
|
| - glyph->height(), storage.get(),
|
| - &glyph->fAtlasLocation);
|
| }
|
|
|
| + GrPlot* plot = fAtlasMgr->addToAtlas(&fAtlas, glyph->width(),
|
| + glyph->height(), storage.get(),
|
| + &glyph->fAtlasLocation);
|
| +
|
| if (NULL == plot) {
|
| return false;
|
| }
|
|
|