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