final char[] input = str.toCharArray();
GlyphMetrics glMetrics;
Color col = g.getColor();
Font font = g.getFont();
int length = str.length();
@SuppressWarnings("deprecation")
final FontPeerImpl peer = ((FontPeerImpl)font.getPeer());
AffineTransform fontAT = (AffineTransform)font.getTransform().clone();
Point.Float pos = new Point.Float();
Paint paint = g.getPaint();
boolean isAntialias = g.getRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING) == RenderingHints.VALUE_TEXT_ANTIALIAS_ON;
try {
fontAT.inverseTransform(new Point.Double(x + fontAT.getTranslateX(), y + fontAT.getTranslateY()), pos);
} catch (NoninvertibleTransformException e) {
// TODO determinant equals 0 => point or line
g.fill(font.createGlyphVector(g.getFontRenderContext(), str).getOutline(x, y));
return;
}
fontAT.translate(pos.x,pos.y);
g.transform(fontAT);
HashCode hash = new HashCode();
hash.append(peer);
hash.append(getFactor(g.getTransform()));
hash.append(paint);
hash.append(isAntialias);
Integer intHash = Integer.valueOf(hash.hashCode());
GlyphHashtable glyphHash =
(GlyphHashtable) (intHash2glyphHash.containsKey(intHash) ?
intHash2glyphHash.get(intHash) : null);
if ( glyphHash == null) {
glyphHash = new GlyphHashtable();
intHash2glyphHash.put(intHash, glyphHash);
}
activateVars();
for (int i = 0; i - length < 0; i ++) {
final char c = input[i];
final Character ch = Character.valueOf(c);
if (ESCAPE.contains(ch)) {
continue;
}
final Glyph glyph = peer.getGlyph(input[i]);
if (c == ' ') {
glMetrics = glyph.getGlyphPointMetrics();
gl.glTranslated(
glMetrics.getAdvanceX(),