| Index: src/gpu/GrTextStrike.cpp
|
| diff --git a/src/gpu/GrTextStrike.cpp b/src/gpu/GrTextStrike.cpp
|
| index 8ae10cc8ddafc937230b61be62408e830914012c..81be3418f7ca1d8c71596bdbfb0afb55f16b602e 100644
|
| --- a/src/gpu/GrTextStrike.cpp
|
| +++ b/src/gpu/GrTextStrike.cpp
|
| @@ -80,20 +80,7 @@ static int mask_format_to_atlas_index(GrMaskFormat format) {
|
| }
|
|
|
| GrTextStrike* GrFontCache::generateStrike(GrFontScaler* scaler) {
|
| - GrMaskFormat format = scaler->getMaskFormat();
|
| - GrPixelConfig config = mask_format_to_pixel_config(format);
|
| - int atlasIndex = mask_format_to_atlas_index(format);
|
| - if (NULL == fAtlases[atlasIndex]) {
|
| - SkISize textureSize = SkISize::Make(GR_ATLAS_TEXTURE_WIDTH,
|
| - GR_ATLAS_TEXTURE_HEIGHT);
|
| - fAtlases[atlasIndex] = SkNEW_ARGS(GrAtlas, (fGpu, config, kNone_GrTextureFlags,
|
| - textureSize,
|
| - GR_NUM_PLOTS_X,
|
| - GR_NUM_PLOTS_Y,
|
| - true));
|
| - }
|
| - GrTextStrike* strike = SkNEW_ARGS(GrTextStrike,
|
| - (this, scaler->getKey(), format, fAtlases[atlasIndex]));
|
| + GrTextStrike* strike = SkNEW_ARGS(GrTextStrike, (this, scaler->getKey()));
|
| fCache.add(strike);
|
|
|
| if (fHead) {
|
| @@ -130,10 +117,30 @@ void GrFontCache::purgeStrike(GrTextStrike* strike) {
|
| delete strike;
|
| }
|
|
|
| -bool GrFontCache::freeUnusedPlot(GrTextStrike* preserveStrike) {
|
| +
|
| +GrPlot* GrFontCache::addToAtlas(GrMaskFormat format, GrAtlas::ClientPlotUsage* usage,
|
| + int width, int height, const void* image,
|
| + SkIPoint16* loc) {
|
| + GrPixelConfig config = mask_format_to_pixel_config(format);
|
| + int atlasIndex = mask_format_to_atlas_index(format);
|
| + if (NULL == fAtlases[atlasIndex]) {
|
| + SkISize textureSize = SkISize::Make(GR_ATLAS_TEXTURE_WIDTH,
|
| + GR_ATLAS_TEXTURE_HEIGHT);
|
| + fAtlases[atlasIndex] = SkNEW_ARGS(GrAtlas, (fGpu, config, kNone_GrTextureFlags,
|
| + textureSize,
|
| + GR_NUM_PLOTS_X,
|
| + GR_NUM_PLOTS_Y,
|
| + true));
|
| + }
|
| + return fAtlases[atlasIndex]->addToAtlas(usage, width, height, image, loc);
|
| +}
|
| +
|
| +
|
| +bool GrFontCache::freeUnusedPlot(GrTextStrike* preserveStrike, const GrGlyph* glyph) {
|
| SkASSERT(preserveStrike);
|
|
|
| - GrAtlas* atlas = preserveStrike->fAtlas;
|
| + int index = mask_format_to_atlas_index(glyph->fMaskFormat);
|
| + GrAtlas* atlas = fAtlases[index];
|
| GrPlot* plot = atlas->getUnusedPlot();
|
| if (NULL == plot) {
|
| return false;
|
| @@ -141,13 +148,7 @@ bool GrFontCache::freeUnusedPlot(GrTextStrike* preserveStrike) {
|
| plot->resetRects();
|
|
|
| GrTextStrike* strike = fHead;
|
| - GrMaskFormat maskFormat = preserveStrike->fMaskFormat;
|
| while (strike) {
|
| - if (maskFormat != strike->fMaskFormat) {
|
| - strike = strike->fNext;
|
| - continue;
|
| - }
|
| -
|
| GrTextStrike* strikeToPurge = strike;
|
| strike = strikeToPurge->fNext;
|
| strikeToPurge->removePlot(plot);
|
| @@ -228,16 +229,11 @@ void GrFontCache::dump() const {
|
| atlas and a position within that texture.
|
| */
|
|
|
| -GrTextStrike::GrTextStrike(GrFontCache* cache, const GrFontDescKey* key,
|
| - GrMaskFormat format,
|
| - GrAtlas* atlas) : fPool(64) {
|
| +GrTextStrike::GrTextStrike(GrFontCache* cache, const GrFontDescKey* key) : fPool(64) {
|
| fFontScalerKey = key;
|
| fFontScalerKey->ref();
|
|
|
| fFontCache = cache; // no need to ref, it won't go away before we do
|
| - fAtlas = atlas; // no need to ref, it won't go away before we do
|
| -
|
| - fMaskFormat = format;
|
|
|
| #ifdef SK_DEBUG
|
| // GrPrintf(" GrTextStrike %p %d\n", this, gCounter);
|
| @@ -271,9 +267,10 @@ GrGlyph* GrTextStrike::generateGlyph(GrGlyph::PackedID packed,
|
| return NULL;
|
| }
|
| }
|
| -
|
| + GrMaskFormat format = scaler->getPackedGlyphMaskFormat(packed);
|
| +
|
| GrGlyph* glyph = fPool.alloc();
|
| - glyph->init(packed, bounds);
|
| + glyph->init(packed, bounds, format);
|
| fCache.add(glyph);
|
| return glyph;
|
| }
|
| @@ -317,7 +314,7 @@ bool GrTextStrike::addGlyphToAtlas(GrGlyph* glyph, GrFontScaler* scaler) {
|
|
|
| SkAutoUnref ar(SkSafeRef(scaler));
|
|
|
| - int bytesPerPixel = GrMaskFormatBytesPerPixel(fMaskFormat);
|
| + int bytesPerPixel = GrMaskFormatBytesPerPixel(glyph->fMaskFormat);
|
|
|
| size_t size = glyph->fBounds.area() * bytesPerPixel;
|
| GrAutoMalloc<1024> storage(size);
|
| @@ -337,9 +334,9 @@ bool GrTextStrike::addGlyphToAtlas(GrGlyph* glyph, GrFontScaler* scaler) {
|
| }
|
| }
|
|
|
| - GrPlot* plot = fAtlas->addToAtlas(&fPlotUsage, glyph->width(),
|
| - glyph->height(), storage.get(),
|
| - &glyph->fAtlasLocation);
|
| + GrPlot* plot = fFontCache->addToAtlas(glyph->fMaskFormat, &fPlotUsage,
|
| + glyph->width(), glyph->height(),
|
| + storage.get(), &glyph->fAtlasLocation);
|
|
|
| if (NULL == plot) {
|
| return false;
|
|
|