pageIndex = 0;
List allGlyphs = new ArrayList(512);
for (Iterator pageIter = unicodeFont.getGlyphPages().iterator(); pageIter.hasNext();) {
GlyphPage page = (GlyphPage)pageIter.next();
for (Iterator glyphIter = page.getGlyphs().iterator(); glyphIter.hasNext();) {
Glyph glyph = (Glyph)glyphIter.next();
glyphMetrics = getGlyphMetrics(font, glyph.getCodePoint());
int xOffset = glyphMetrics[0];
xAdvance = glyphMetrics[1];
out.println("char id=" + glyph.getCodePoint() + " " + "x="
+ (int)(glyph.getImage().getTextureOffsetX() * pageWidth) + " y="
+ (int)(glyph.getImage().getTextureOffsetY() * pageHeight) + " width=" + glyph.getWidth() + " height="
+ glyph.getHeight() + " xoffset=" + xOffset + " yoffset=" + glyph.getYOffset() + " xadvance="
+ xAdvance + " page=" + pageIndex + " chnl=0 ");
}
allGlyphs.addAll(page.getGlyphs());
pageIndex++;
}
String ttfFileRef = unicodeFont.getFontFile();
if (ttfFileRef == null)
Log.warn("Kerning information could not be output because a TTF font file was not specified.");
else {
Kerning kerning = new Kerning();
try {
kerning.load(ResourceLoader.getResourceAsStream(ttfFileRef), font.getSize());
} catch (IOException ex) {
Log.warn("Unable to read kerning information from font: " + ttfFileRef);
}
Map glyphCodeToCodePoint = new HashMap();
for (Iterator iter = allGlyphs.iterator(); iter.hasNext();) {
Glyph glyph = (Glyph)iter.next();
glyphCodeToCodePoint.put(new Integer(getGlyphCode(font, glyph.getCodePoint())), new Integer(glyph.getCodePoint()));
}
List kernings = new ArrayList(256);
class KerningPair {
public int firstCodePoint, secondCodePoint, offset;
}
for (Iterator iter1 = allGlyphs.iterator(); iter1.hasNext();) {
Glyph firstGlyph = (Glyph)iter1.next();
int firstGlyphCode = getGlyphCode(font, firstGlyph.getCodePoint());
int[] values = kerning.getValues(firstGlyphCode);
if (values == null) continue;
for (int i = 0; i < values.length; i++) {
Integer secondCodePoint = (Integer)glyphCodeToCodePoint.get(new Integer(values[i] & 0xffff));
if (secondCodePoint == null) continue; // We may not be outputting the second character.
int offset = values[i] >> 16;
KerningPair pair = new KerningPair();
pair.firstCodePoint = firstGlyph.getCodePoint();
pair.secondCodePoint = secondCodePoint.intValue();
pair.offset = offset;
kernings.add(pair);
}
}