Mercurial > hg > release > icedtea7-forest-2.2 > jdk
changeset 5323:30d09929e234
8005007: Better glyph processing
Reviewed-by: srl, mschoene, bae
author | prr |
---|---|
date | Sun, 31 Mar 2013 09:05:58 -0700 |
parents | 0eef3cfc5e5f |
children | dcbf1fdad11c |
files | src/share/classes/sun/font/ExtendedTextSourceLabel.java src/share/native/sun/font/layout/LEGlyphStorage.cpp src/share/native/sun/font/layout/LookupProcessor.cpp |
diffstat | 3 files changed, 24 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/src/share/classes/sun/font/ExtendedTextSourceLabel.java Tue Mar 19 21:13:09 2013 +0400 +++ b/src/share/classes/sun/font/ExtendedTextSourceLabel.java Sun Mar 31 09:05:58 2013 -0700 @@ -367,6 +367,9 @@ validate(index); float[] charinfo = getCharinfo(); index = l2v(index) * numvals; + if ((index+vish) >= charinfo.length) { + return new Rectangle2D.Float(); + } return new Rectangle2D.Float( charinfo[index + visx], charinfo[index + visy], @@ -456,6 +459,10 @@ int length = source.getLength(); --start; while (width >= 0 && ++start < length) { + int cidx = l2v(start) * numvals + advx; + if (cidx >= charinfo.length) { + break; // layout bailed for some reason + } float adv = charinfo[l2v(start) * numvals + advx]; width -= adv; } @@ -469,7 +476,11 @@ float[] charinfo = getCharinfo(); --start; while (++start < limit) { - a += charinfo[l2v(start) * numvals + advx]; + int cidx = l2v(start) * numvals + advx; + if (cidx >= charinfo.length) { + break; // layout bailed for some reason + } + a += charinfo[cidx]; } return a;
--- a/src/share/native/sun/font/layout/LEGlyphStorage.cpp Tue Mar 19 21:13:09 2013 +0400 +++ b/src/share/native/sun/font/layout/LEGlyphStorage.cpp Sun Mar 31 09:05:58 2013 -0700 @@ -584,7 +584,7 @@ { le_int32 growAmount = fInsertionList->getGrowAmount(); - if (growAmount == 0) { + if (growAmount <= 0) { return fGlyphCount; } @@ -613,7 +613,9 @@ fAuxData = (le_uint32 *)newAuxData; } - fSrcIndex = fGlyphCount - 1; + if (fGlyphCount > 0) { + fSrcIndex = fGlyphCount - 1; + } fDestIndex = newGlyphCount - 1; #if 0 @@ -653,6 +655,10 @@ } #endif + if (atPosition < 0 || fSrcIndex < 0 || fDestIndex < 0) { + return FALSE; + } + if (fAuxData != NULL) { le_int32 src = fSrcIndex, dest = fDestIndex; @@ -665,7 +671,7 @@ } } - while (fSrcIndex > atPosition) { + while (fSrcIndex > atPosition && fSrcIndex >= 0 && fDestIndex >= 0) { fGlyphs[fDestIndex] = fGlyphs[fSrcIndex]; fCharIndices[fDestIndex] = fCharIndices[fSrcIndex]; @@ -673,7 +679,7 @@ fSrcIndex -= 1; } - for (le_int32 i = count - 1; i >= 0; i -= 1) { + for (le_int32 i = count - 1; i >= 0 && fDestIndex >= 0; i -= 1) { fGlyphs[fDestIndex] = newGlyphs[i]; fCharIndices[fDestIndex] = fCharIndices[atPosition]; @@ -682,7 +688,7 @@ // the source glyph we're pointing at // just got replaced by the insertion - fSrcIndex -= 1; + fSrcIndex -= 1; return FALSE; }
--- a/src/share/native/sun/font/layout/LookupProcessor.cpp Tue Mar 19 21:13:09 2013 +0400 +++ b/src/share/native/sun/font/layout/LookupProcessor.cpp Sun Mar 31 09:05:58 2013 -0700 @@ -61,7 +61,7 @@ delta = applySubtable(lookupSubtable, lookupType, glyphIterator, fontInstance, success); - if (delta > 0 && LE_FAILURE(success)) { + if (delta > 0 || LE_FAILURE(success)) { return 1; }