@@ -37,29 +37,36 @@ CacheBlock* CacheBlock::insertBlock(CacheBlock* head, CacheBlock *newBlock) {
3737 newBlock, newBlock->mX , newBlock->mY ,
3838 newBlock->mWidth , newBlock->mHeight );
3939#endif
40+
4041 CacheBlock *currBlock = head;
4142 CacheBlock *prevBlock = NULL ;
43+
4244 while (currBlock && currBlock->mY != TEXTURE_BORDER_SIZE) {
4345 if (newBlock->mWidth < currBlock->mWidth ) {
4446 newBlock->mNext = currBlock;
4547 newBlock->mPrev = prevBlock;
4648 currBlock->mPrev = newBlock;
49+
4750 if (prevBlock) {
4851 prevBlock->mNext = newBlock;
4952 return head;
5053 } else {
5154 return newBlock;
5255 }
5356 }
57+
5458 prevBlock = currBlock;
5559 currBlock = currBlock->mNext ;
5660 }
61+
5762 // new block larger than all others - insert at end (but before the remainder space, if there)
5863 newBlock->mNext = currBlock;
5964 newBlock->mPrev = prevBlock;
65+
6066 if (currBlock) {
6167 currBlock->mPrev = newBlock;
6268 }
69+
6370 if (prevBlock) {
6471 prevBlock->mNext = newBlock;
6572 return head;
@@ -74,18 +81,23 @@ CacheBlock* CacheBlock::removeBlock(CacheBlock* head, CacheBlock *blockToRemove)
7481 blockToRemove, blockToRemove->mX , blockToRemove->mY ,
7582 blockToRemove->mWidth , blockToRemove->mHeight );
7683#endif
84+
7785 CacheBlock* newHead = head;
7886 CacheBlock* nextBlock = blockToRemove->mNext ;
7987 CacheBlock* prevBlock = blockToRemove->mPrev ;
88+
8089 if (prevBlock) {
8190 prevBlock->mNext = nextBlock;
8291 } else {
8392 newHead = nextBlock;
8493 }
94+
8595 if (nextBlock) {
8696 nextBlock->mPrev = prevBlock;
8797 }
98+
8899 delete blockToRemove;
100+
89101 return newHead;
90102}
91103
@@ -100,12 +112,14 @@ bool CacheTexture::fitBitmap(const SkGlyph& glyph, uint32_t *retOriginX, uint32_
100112
101113 uint16_t glyphW = glyph.fWidth + TEXTURE_BORDER_SIZE;
102114 uint16_t glyphH = glyph.fHeight + TEXTURE_BORDER_SIZE;
115+
103116 // roundedUpW equals glyphW to the next multiple of CACHE_BLOCK_ROUNDING_SIZE.
104117 // This columns for glyphs that are close but not necessarily exactly the same size. It trades
105118 // off the loss of a few pixels for some glyphs against the ability to store more glyphs
106119 // of varying sizes in one block.
107120 uint16_t roundedUpW =
108121 (glyphW + CACHE_BLOCK_ROUNDING_SIZE - 1 ) & -CACHE_BLOCK_ROUNDING_SIZE;
122+
109123 CacheBlock *cacheBlock = mCacheBlocks ;
110124 while (cacheBlock) {
111125 // Store glyph in this block iff: it fits the block's remaining space and:
@@ -118,15 +132,18 @@ bool CacheTexture::fitBitmap(const SkGlyph& glyph, uint32_t *retOriginX, uint32_
118132 // Only enough space for this glyph - don't bother rounding up the width
119133 roundedUpW = glyphW;
120134 }
135+
121136 *retOriginX = cacheBlock->mX ;
122137 *retOriginY = cacheBlock->mY ;
138+
123139 // If this is the remainder space, create a new cache block for this column. Otherwise,
124140 // adjust the info about this column.
125141 if (cacheBlock->mY == TEXTURE_BORDER_SIZE) {
126142 uint16_t oldX = cacheBlock->mX ;
127143 // Adjust remainder space dimensions
128144 cacheBlock->mWidth -= roundedUpW;
129145 cacheBlock->mX += roundedUpW;
146+
130147 if (mHeight - glyphH >= glyphH) {
131148 // There's enough height left over to create a new CacheBlock
132149 CacheBlock *newBlock = new CacheBlock (oldX, glyphH + TEXTURE_BORDER_SIZE,
@@ -148,16 +165,20 @@ bool CacheTexture::fitBitmap(const SkGlyph& glyph, uint32_t *retOriginX, uint32_
148165 cacheBlock->mWidth , cacheBlock->mHeight );
149166#endif
150167 }
168+
151169 if (cacheBlock->mHeight < fmin (glyphH, glyphW)) {
152170 // If remaining space in this block is too small to be useful, remove it
153171 mCacheBlocks = CacheBlock::removeBlock (mCacheBlocks , cacheBlock);
154172 }
173+
155174 mDirty = true ;
175+ mNumGlyphs ++;
176+
156177#if DEBUG_FONT_RENDERER
157178 ALOGD (" fitBitmap: current block list:" );
158179 mCacheBlocks ->output ();
159180#endif
160- ++ mNumGlyphs ;
181+
161182 return true ;
162183 }
163184 cacheBlock = cacheBlock->mNext ;
0 commit comments