diff options
author | ceisserer <none@none> | 2013-11-25 09:38:32 -0800 |
---|---|---|
committer | ceisserer <none@none> | 2013-11-25 09:38:32 -0800 |
commit | 4e7afeb4be22de71899bc6410980a0b90d32b96f (patch) | |
tree | 1c2da3ecea5fa514e24b370b35193d9941d1e595 /src | |
parent | a649658f7a72707d89a701c6011d7822bf16b992 (diff) |
8028722: Render: Drawing strings with exactly 254 glyphs causes hangs
Reviewed-by: prr, bae
Diffstat (limited to 'src')
-rw-r--r-- | src/solaris/classes/sun/font/XRTextRenderer.java | 23 |
1 files changed, 14 insertions, 9 deletions
diff --git a/src/solaris/classes/sun/font/XRTextRenderer.java b/src/solaris/classes/sun/font/XRTextRenderer.java index 308de3ab3..243fa8543 100644 --- a/src/solaris/classes/sun/font/XRTextRenderer.java +++ b/src/solaris/classes/sun/font/XRTextRenderer.java @@ -36,6 +36,10 @@ import sun.java2d.xr.*; * @author Clemens Eisserer */ public class XRTextRenderer extends GlyphListPipe { + // Workarround for a bug in libXrender. + // In case the number of glyphs of an ELT is a multiple of 254, + // a few garbage bytes are sent to the XServer causing hangs. + static final int MAX_ELT_GLYPH_COUNT = 253; XRGlyphCache glyphCache; XRCompositeManager maskBuffer; @@ -92,8 +96,11 @@ public class XRTextRenderer extends GlyphListPipe { int posX = 0, posY = 0; if (gl.usePositions() - || (cacheEntry.getXAdvance() != ((float) cacheEntry.getXOff()) || cacheEntry.getYAdvance() != ((float) cacheEntry.getYOff())) - || eltIndex < 0 || glyphSet != activeGlyphSet) { + || cacheEntry.getXAdvance() != ((float) cacheEntry.getXOff()) + || cacheEntry.getYAdvance() != ((float) cacheEntry.getYOff()) + || glyphSet != activeGlyphSet + || eltIndex < 0 + || eltList.getCharCnt(eltIndex) == MAX_ELT_GLYPH_COUNT) { eltIndex = eltList.getNextIndex(); eltList.setCharCnt(eltIndex, 1); @@ -101,7 +108,7 @@ public class XRTextRenderer extends GlyphListPipe { eltList.setGlyphSet(eltIndex, glyphSet); if (gl.usePositions()) { - // /*In this case advX only stores rounding errors*/ + // In this case advX only stores rounding errors float x = positions[i * 2] + advX; float y = positions[i * 2 + 1] + advY; posX = (int) Math.floor(x); @@ -120,16 +127,14 @@ public class XRTextRenderer extends GlyphListPipe { posX = (int) Math.floor(advX); posY = (int) Math.floor(advY); - // Advance of ELT = difference between stored - // relative + // Advance of ELT = difference between stored relative // positioning information and required float. advX += (cacheEntry.getXAdvance() - cacheEntry.getXOff()); advY += (cacheEntry.getYAdvance() - cacheEntry.getYOff()); } - /* - * Offset of the current glyph is the difference to the last - * glyph and this one - */ + + // Offset of the current glyph is the difference + // to the last glyph and this one eltList.setXOff(eltIndex, (posX - oldPosX)); eltList.setYOff(eltIndex, (posY - oldPosY)); |