All Downloads are FREE. Search and download functionalities are using the official Maven repository.

de.lessvoid.nifty.renderer.lwjgl.render.font.AngelCodeFont Maven / Gradle / Ivy

There is a newer version: 1.4.3
Show newest version
package de.lessvoid.nifty.renderer.lwjgl.render.font;

import de.lessvoid.nifty.tools.resourceloader.NiftyResourceLoader;

import javax.annotation.Nonnull;
import java.io.*;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

/**
 * AngelCodeFont loading.
 *
 * @author void
 */
public class AngelCodeFont {

  /**
   * name of font.
   */
  private String name;

  /**
   * Texture HashMap for the font.
   * Key = page index
   * Value = filename of texture
   */
  @Nonnull
  private final HashMap textures = new HashMap();

  /**
   * 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 final Map chars;

  private final NiftyResourceLoader resourceLoader;

  public AngelCodeFont(final NiftyResourceLoader resourceLoader) {
    chars = new HashMap();
    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) {
    BufferedReader reader = null;
    try {
      InputStream in = resourceLoader.getResourceAsStream(filename);
      if (in == null) {
        return false;
      }
      reader = new BufferedReader(new InputStreamReader(in));
      while (true) {
        String line = reader.readLine();
        if (line == null) {
          break;
        }

        if (line.startsWith("info")) {
          HashMap values = getInfoLine(line);
          parseInfo(values);
        } else if (line.startsWith("common")) {
          HashMap values = splitToInteger(line);
          parseCommon(values);
        } else if (line.startsWith("page")) {
          HashMap values = getPageLine(line);
          parsePage(values);
        } else if (line.startsWith("chars")) {
          HashMap values = splitToInteger(line);
          parseChars(values);
        } else if (line.startsWith("char")) {
          HashMap values = splitToInteger(line);
          parseChar(values);
        } else if (line.startsWith("kernings")) {
          HashMap values = splitToInteger(line);
          parseKernings(values);
        } else if (line.startsWith("kerning")) {
          HashMap values = splitToInteger(line);
          parseKerning(values);
        }
      }
    } catch (IOException e) {
      return false;
    } finally {
      if (reader != null) {
        try {
          reader.close();
        } catch (IOException ignored) {
        }
      }
    }
    return true;
  }

  /**
   * parse info.
   *
   * @param line line with info
   */
  private void parseInfo(@Nonnull final HashMap line) {
    name = line.get("face");
  }

  private void parseCommon(@Nonnull HashMap line) {
    width = line.get("scaleW");
    height = line.get("scaleH");
  }

  private void parsePage(@Nonnull HashMap line) {
    Integer id = Integer.parseInt(line.get("id"));
    textures.put(id, line.get("file"));
  }

  private void parseChars(HashMap line) {
  }

  private void parseChar(@Nonnull HashMap 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 line) {
  }

  private void parseKerning(@Nonnull HashMap line) {
    int first = line.get("first");
    int second = line.get("second");
    int amount = line.get("amount");
    CharacterInfo info = chars.get((char) first);
    info.getKerning().put((char) second, amount);
  }

  @Nonnull
  private HashMap splitToInteger(@Nonnull String line) {
    HashMap table = new HashMap();

    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 getInfoLine(@Nonnull String line) {
    HashMap table = new HashMap();

    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 getPageLine(@Nonnull String line) {
    HashMap table = new HashMap();

    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 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(c);
  }

  @Nonnull
  public Map getChars() {
    return chars;
  }

  public int getHeight() {
    return height;
  }

  public int getWidth() {
    return width;
  }

  public int getLineHeight() {
    return lineHeight;
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy