package de.lessvoid.nifty.java2d.renderer.fonts; import de.lessvoid.nifty.tools.resourceloader.NiftyResourceLoader; import javax.annotation.Nonnull; import java.io.*; import java.util.Collection; import java.util.HashMap; /** * AngelCodeFont loading. * * @author void * @deprecated it is a copy from the lwjgl renderer, but it has nothing to do with the renderer, * so it could be in another project. */ @Deprecated public class AngelCodeFont { /** * name of font. */ private String name; /** * Texture HashMap for the font. Key = page index Value = filename of * texture */ @Nonnull private HashMap<Integer, String> textures = new HashMap<Integer, String>(); /** * width of single font texture page. */ private int width; /** * height of single font texture page. */ private int height; /** * height of single line. */ private int lineHeight; /** * CharacterInfo for all characters in the font file. */ @Nonnull private HashMap<Character, CharacterInfo> chars = new HashMap<Character, CharacterInfo>(); private NiftyResourceLoader resourceLoader; public AngelCodeFont(final NiftyResourceLoader resourceLoader) { this.resourceLoader = resourceLoader; } /** * load the font with the given name. * * @param filename file to load * @return true on success and false on any error */ public boolean load(@Nonnull final String filename) { InputStream in = resourceLoader.getResourceAsStream(filename); if (in == null) { return false; } return load(in); } public boolean load(@Nonnull InputStream in) { BufferedReader reader = new BufferedReader(new InputStreamReader(in)); try { while (true) { String line = reader.readLine(); if (line == null) { break; } if (line.startsWith("info")) { HashMap<String, String> values = getInfoLine(line); parseInfo(values); } else if (line.startsWith("common")) { HashMap<String, Integer> values = splitToInteger(line); parseCommon(values); } else if (line.startsWith("page")) { HashMap<String, String> values = getPageLine(line); parsePage(values); } else if (line.startsWith("chars")) { HashMap<String, Integer> values = splitToInteger(line); parseChars(values); } else if (line.startsWith("char")) { HashMap<String, Integer> values = splitToInteger(line); parseChar(values); } else if (line.startsWith("kernings")) { HashMap<String, Integer> values = splitToInteger(line); parseKernings(values); } else if (line.startsWith("kerning")) { HashMap<String, Integer> values = splitToInteger(line); parseKerning(values); } } } catch (IOException e) { e.printStackTrace(); return false; } finally { try { in.close(); } catch (IOException ignored) { } } return true; } /** * parse info. * * @param line line with info */ private void parseInfo(@Nonnull final HashMap<String, String> line) { name = line.get("face"); } private void parseCommon(@Nonnull HashMap<String, Integer> line) { width = line.get("scaleW"); height = line.get("scaleH"); } private void parsePage(@Nonnull HashMap<String, String> line) { Integer id = Integer.parseInt(line.get("id")); textures.put(id, line.get("file")); } private void parseChars(HashMap<String, Integer> line) { } private void parseChar(@Nonnull HashMap<String, Integer> line) { CharacterInfo c = new CharacterInfo(); c.setId(line.get("id")); c.setX(line.get("x")); c.setY(line.get("y")); c.setWidth(line.get("width")); c.setHeight(line.get("height")); c.setXoffset(line.get("xoffset")); c.setYoffset(line.get("yoffset")); c.setXadvance(line.get("xadvance")); c.setPage(line.get("page")); chars.put((char) c.getId(), c); lineHeight = Math.max(c.getHeight() + c.getYoffset(), lineHeight); } private void parseKernings(HashMap<String, Integer> line) { } private void parseKerning(@Nonnull HashMap<String, Integer> line) { int first = line.get("first"); int second = line.get("second"); int amount = line.get("amount"); CharacterInfo info = chars.get(Character.valueOf((char) first)); info.getKerning().put((char) second, amount); } @Nonnull private HashMap<String, Integer> splitToInteger(@Nonnull String line) { HashMap<String, Integer> table = new HashMap<String, Integer>(); String[] values = line.split(" "); for (int i = 0; i < values.length; i++) { String[] current = values[i].split("="); if (current.length > 1) { table.put(current[0], Integer.valueOf(current[1])); } else { table.put(current[0], null); } } return table; } /** * @param line * @return */ @Nonnull private HashMap<String, String> getInfoLine(@Nonnull String line) { HashMap<String, String> table = new HashMap<String, String>(); try { StreamTokenizer tokenizer = new StreamTokenizer(new StringReader( line)); tokenizer.whitespaceChars(' ', ' '); tokenizer.parseNumbers(); tokenizer.quoteChar('"'); // info face="Times New Roman" size=24 bold=0 italic=0 charset="" // unicode=1 stretchH=100 smooth=1 aa=4 padding=1,1,1,1 spacing=1,1 // info tokenizer.nextToken(); // face tokenizer.nextToken(); tokenizer.nextToken(); tokenizer.nextToken(); table.put("face", tokenizer.sval); // size tokenizer.nextToken(); tokenizer.nextToken(); tokenizer.nextToken(); table.put("size", Integer.toString((int) tokenizer.nval)); // bold tokenizer.nextToken(); tokenizer.nextToken(); tokenizer.nextToken(); table.put("bold", Integer.toString((int) tokenizer.nval)); // italic tokenizer.nextToken(); tokenizer.nextToken(); tokenizer.nextToken(); table.put("italic", Integer.toString((int) tokenizer.nval)); // charset tokenizer.nextToken(); tokenizer.nextToken(); tokenizer.nextToken(); table.put("charset", tokenizer.sval); // unicode tokenizer.nextToken(); tokenizer.nextToken(); tokenizer.nextToken(); table.put("unicode", Integer.toString((int) tokenizer.nval)); // stretchH tokenizer.nextToken(); tokenizer.nextToken(); tokenizer.nextToken(); table.put("stretchH", Integer.toString((int) tokenizer.nval)); // smooth tokenizer.nextToken(); tokenizer.nextToken(); tokenizer.nextToken(); table.put("smooth", Integer.toString((int) tokenizer.nval)); // aa tokenizer.nextToken(); tokenizer.nextToken(); tokenizer.nextToken(); table.put("aa", Integer.toString((int) tokenizer.nval)); // padding tokenizer.nextToken(); tokenizer.nextToken(); tokenizer.nextToken(); String padding = Integer.toString((int) tokenizer.nval); tokenizer.nextToken(); padding = padding + "," + Integer.toString((int) tokenizer.nval); tokenizer.nextToken(); padding = padding + "," + Integer.toString((int) tokenizer.nval); tokenizer.nextToken(); padding = padding + "," + Integer.toString((int) tokenizer.nval); table.put("padding", padding); // spacing tokenizer.nextToken(); tokenizer.nextToken(); tokenizer.nextToken(); String spacing = Integer.toString((int) tokenizer.nval); tokenizer.nextToken(); spacing = spacing + "," + Integer.toString((int) tokenizer.nval); table.put("spacing", spacing); } catch (IOException e) { e.printStackTrace(); } return table; } @Nonnull private HashMap<String, String> getPageLine(@Nonnull String line) { HashMap<String, String> table = new HashMap<String, String>(); try { StreamTokenizer tokenizer = new StreamTokenizer(new StringReader( line)); tokenizer.whitespaceChars(' ', ' '); tokenizer.parseNumbers(); tokenizer.quoteChar('"'); // page id=0 file="Times New Roman--24_00.tga" // page tokenizer.nextToken(); // id tokenizer.nextToken(); tokenizer.nextToken(); tokenizer.nextToken(); table.put("id", Integer.toString((int) tokenizer.nval)); // file tokenizer.nextToken(); tokenizer.nextToken(); tokenizer.nextToken(); table.put("file", tokenizer.sval); } catch (IOException e) { e.printStackTrace(); } return table; } /** * get the font name * * @return */ public String getName() { return name; } /** * get the font texture * * @return */ @Nonnull public String[] getTextures() { Collection<String> var = textures.values(); return var.toArray(new String[var.size()]); } /** * @return */ public int getNumChars() { return chars.size(); } /** * get character info for the given char * * @param c * @return */ public CharacterInfo getChar(char c) { return chars.get(Character.valueOf(c)); } @Nonnull public HashMap<Character, CharacterInfo> getChars() { return chars; } public int getHeight() { return height; } public int getWidth() { return width; } public int getLineHeight() { return lineHeight; } }