Search in sources :

Example 1 with IntIntMap

use of com.badlogic.gdx.utils.IntIntMap in project libgdx by libgdx.

the class BMFontUtil method save.

public void save(File outputBMFontFile) throws IOException {
    File outputDir = outputBMFontFile.getParentFile();
    String outputName = outputBMFontFile.getName();
    if (outputName.endsWith(".fnt"))
        outputName = outputName.substring(0, outputName.length() - 4);
    // Always include space and the missing gyph.
    getGlyph(' ');
    getGlyph('');
    unicodeFont.loadGlyphs();
    PrintStream out = new PrintStream(new FileOutputStream(new File(outputDir, outputName + ".fnt")));
    Font font = unicodeFont.getFont();
    int pageWidth = unicodeFont.getGlyphPageWidth();
    int pageHeight = unicodeFont.getGlyphPageHeight();
    out.println("info face=\"" + font.getFontName() + "\" size=" + font.getSize() + " bold=" + (font.isBold() ? 1 : 0) + " italic=" + (font.isItalic() ? 1 : 0) + " charset=\"\" unicode=0 stretchH=100 smooth=1 aa=1 padding=" + unicodeFont.getPaddingTop() + "," + unicodeFont.getPaddingRight() + "," + unicodeFont.getPaddingBottom() + "," + unicodeFont.getPaddingLeft() + " spacing=" + unicodeFont.getPaddingAdvanceX() + "," + unicodeFont.getPaddingAdvanceY());
    out.println("common lineHeight=" + unicodeFont.getLineHeight() + " base=" + unicodeFont.getAscent() + " scaleW=" + pageWidth + " scaleH=" + pageHeight + " pages=" + unicodeFont.getGlyphPages().size() + " packed=0");
    int pageIndex = 0, glyphCount = 0;
    for (Iterator pageIter = unicodeFont.getGlyphPages().iterator(); pageIter.hasNext(); ) {
        GlyphPage page = (GlyphPage) pageIter.next();
        String fileName;
        if (pageIndex == 0 && !pageIter.hasNext())
            fileName = outputName + ".png";
        else
            fileName = outputName + (pageIndex + 1) + ".png";
        out.println("page id=" + pageIndex + " file=\"" + fileName + "\"");
        glyphCount += page.getGlyphs().size();
        pageIndex++;
    }
    out.println("chars count=" + glyphCount);
    pageIndex = 0;
    List allGlyphs = new ArrayList(512);
    for (Iterator pageIter = unicodeFont.getGlyphPages().iterator(); pageIter.hasNext(); ) {
        GlyphPage page = (GlyphPage) pageIter.next();
        List<Glyph> glyphs = page.getGlyphs();
        Collections.sort(glyphs, new Comparator<Glyph>() {

            public int compare(Glyph o1, Glyph o2) {
                return o1.getCodePoint() - o2.getCodePoint();
            }
        });
        for (Iterator glyphIter = page.getGlyphs().iterator(); glyphIter.hasNext(); ) {
            Glyph glyph = (Glyph) glyphIter.next();
            writeGlyph(out, pageWidth, pageHeight, pageIndex, glyph);
        }
        allGlyphs.addAll(page.getGlyphs());
        pageIndex++;
    }
    String ttfFileRef = unicodeFont.getFontFile();
    if (ttfFileRef == null)
        System.out.println("Kerning information could not be output because a TTF font file was not specified.");
    else {
        Kerning kerning = new Kerning();
        try {
            kerning.load(Gdx.files.internal(ttfFileRef).read(), font.getSize());
        } catch (IOException ex) {
            System.out.println("Unable to read kerning information from font: " + ttfFileRef);
            ex.printStackTrace();
        }
        IntIntMap glyphCodeToCodePoint = new IntIntMap();
        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 (IntIntMap.Entry entry : kerning.getKernings()) {
            int firstGlyphCode = entry.key >> 16;
            int secondGlyphCode = entry.key & 0xffff;
            int offset = entry.value;
            int firstCodePoint = glyphCodeToCodePoint.get(firstGlyphCode, -1);
            int secondCodePoint = glyphCodeToCodePoint.get(secondGlyphCode, -1);
            if (firstCodePoint == -1 || secondCodePoint == -1 || offset == 0) {
                // We are not outputting one or both of these glyphs, or the offset is zero anyway.
                continue;
            }
            KerningPair pair = new KerningPair();
            pair.firstCodePoint = firstCodePoint;
            pair.secondCodePoint = secondCodePoint;
            pair.offset = offset;
            kernings.add(pair);
        }
        out.println("kernings count=" + kernings.size());
        for (Iterator iter = kernings.iterator(); iter.hasNext(); ) {
            KerningPair pair = (KerningPair) iter.next();
            out.println("kerning first=" + pair.firstCodePoint + " second=" + pair.secondCodePoint + " amount=" + pair.offset);
        }
    }
    out.close();
    int width = unicodeFont.getGlyphPageWidth();
    int height = unicodeFont.getGlyphPageHeight();
    IntBuffer buffer = BufferUtils.createIntBuffer(width * height);
    BufferedImage pageImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
    int[] row = new int[width];
    pageIndex = 0;
    for (Iterator pageIter = unicodeFont.getGlyphPages().iterator(); pageIter.hasNext(); ) {
        GlyphPage page = (GlyphPage) pageIter.next();
        String fileName;
        if (pageIndex == 0 && !pageIter.hasNext())
            fileName = outputName + ".png";
        else
            fileName = outputName + (pageIndex + 1) + ".png";
        page.getTexture().bind();
        buffer.clear();
        GL11.glGetTexImage(GL11.GL_TEXTURE_2D, 0, GL12.GL_BGRA, GL11.GL_UNSIGNED_BYTE, buffer);
        WritableRaster raster = pageImage.getRaster();
        for (int y = 0; y < height; y++) {
            buffer.get(row);
            raster.setDataElements(0, y, width, 1, row);
        }
        File imageOutputFile = new File(outputDir, fileName);
        ImageIO.write(pageImage, "png", imageOutputFile);
        pageIndex++;
    }
}
Also used : PrintStream(java.io.PrintStream) ArrayList(java.util.ArrayList) IOException(java.io.IOException) Font(java.awt.Font) UnicodeFont(com.badlogic.gdx.tools.hiero.unicodefont.UnicodeFont) BufferedImage(java.awt.image.BufferedImage) IntIntMap(com.badlogic.gdx.utils.IntIntMap) GlyphPage(com.badlogic.gdx.tools.hiero.unicodefont.GlyphPage) WritableRaster(java.awt.image.WritableRaster) FileOutputStream(java.io.FileOutputStream) Glyph(com.badlogic.gdx.tools.hiero.unicodefont.Glyph) IntBuffer(java.nio.IntBuffer) Iterator(java.util.Iterator) ArrayList(java.util.ArrayList) List(java.util.List) File(java.io.File)

Aggregations

Glyph (com.badlogic.gdx.tools.hiero.unicodefont.Glyph)1 GlyphPage (com.badlogic.gdx.tools.hiero.unicodefont.GlyphPage)1 UnicodeFont (com.badlogic.gdx.tools.hiero.unicodefont.UnicodeFont)1 IntIntMap (com.badlogic.gdx.utils.IntIntMap)1 Font (java.awt.Font)1 BufferedImage (java.awt.image.BufferedImage)1 WritableRaster (java.awt.image.WritableRaster)1 File (java.io.File)1 FileOutputStream (java.io.FileOutputStream)1 IOException (java.io.IOException)1 PrintStream (java.io.PrintStream)1 IntBuffer (java.nio.IntBuffer)1 ArrayList (java.util.ArrayList)1 Iterator (java.util.Iterator)1 List (java.util.List)1