package org.newdawn.slick.font;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.newdawn.slick.SlickException;
import org.newdawn.slick.UnicodeFont;
import org.newdawn.slick.font.effects.ConfigurableEffect;
import org.newdawn.slick.font.effects.ConfigurableEffect.Value;
import org.newdawn.slick.util.ResourceLoader;
/**
* Holds the settings needed to configure a UnicodeFont.
*
* @author Nathan Sweet <misc@n4te.com>
*/
public class HieroSettings {
/** The size of the font to be generated */
private int fontSize = 12;
/** True if the font is rendered bold */
private boolean bold = false;
/** True fi the font if rendered italic */
private boolean italic = false;
/** The padding applied in pixels to the top of the glyph rendered area */
private int paddingTop;
/** The padding applied in pixels to the left of the glyph rendered area */
private int paddingLeft;
/** The padding applied in pixels to the bottom of the glyph rendered area */
private int paddingBottom;
/** The padding applied in pixels to the right of the glyph rendered area */
private int paddingRight;
/** The padding applied in pixels to horizontal advance for each glyph */
private int paddingAdvanceX;
/** The padding applied in pixels to vertical advance for each glyph */
private int paddingAdvanceY;
/** The width of the glyph page generated */
private int glyphPageWidth = 512;
/** The height of the glyph page generated */
private int glyphPageHeight = 512;
/** The list of effects applied */
private final List effects = new ArrayList();
/**
* Default constructor for injection
*/
public HieroSettings() {
}
/**
* Create a new set of configuration from a file
*
* @param hieroFileRef The file system or classpath location of the Hiero settings file.
* @throws SlickException if the file could not be read.
*/
public HieroSettings(String hieroFileRef) throws SlickException {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(ResourceLoader.getResourceAsStream(hieroFileRef)));
while (true) {
String line = reader.readLine();
if (line == null) break;
line = line.trim();
if (line.length() == 0) continue;
String[] pieces = line.split("=", 2);
String name = pieces[0].trim();
String value = pieces[1];
if (name.equals("font.size")) {
fontSize = Integer.parseInt(value);
} else if (name.equals("font.bold")) {
bold = Boolean.valueOf(value).booleanValue();
} else if (name.equals("font.italic")) {
italic = Boolean.valueOf(value).booleanValue();
} else if (name.equals("pad.top")) {
paddingTop = Integer.parseInt(value);
} else if (name.equals("pad.right")) {
paddingRight = Integer.parseInt(value);
} else if (name.equals("pad.bottom")) {
paddingBottom = Integer.parseInt(value);
} else if (name.equals("pad.left")) {
paddingLeft = Integer.parseInt(value);
} else if (name.equals("pad.advance.x")) {
paddingAdvanceX = Integer.parseInt(value);
} else if (name.equals("pad.advance.y")) {
paddingAdvanceY = Integer.parseInt(value);
} else if (name.equals("glyph.page.width")) {
glyphPageWidth = Integer.parseInt(value);
} else if (name.equals("glyph.page.height")) {
glyphPageHeight = Integer.parseInt(value);
} else if (name.equals("effect.class")) {
try {
effects.add(Class.forName(value).newInstance());
} catch (Exception ex) {
throw new SlickException("Unable to create effect instance: " + value, ex);
}
} else if (name.startsWith("effect.")) {
// Set an effect value on the last added effect.
name = name.substring(7);
ConfigurableEffect effect = (ConfigurableEffect)effects.get(effects.size() - 1);
List values = effect.getValues();
for (Iterator iter = values.iterator(); iter.hasNext();) {
Value effectValue = (Value)iter.next();
if (effectValue.getName().equals(name)) {
effectValue.setString(value);
break;
}
}
effect.setValues(values);
}
}
reader.close();
} catch (Exception ex) {
throw new SlickException("Unable to load Hiero font file: " + hieroFileRef, ex);
}
}
/**
* @see UnicodeFont#getPaddingTop()
*
* @return The padding for the top of the glyph area in pixels
*/
public int getPaddingTop () {
return paddingTop;
}
/**
* @see UnicodeFont#setPaddingTop(int)
*
* @param paddingTop The padding for the top of the glyph area in pixels
*/
public void setPaddingTop(int paddingTop) {
this.paddingTop = paddingTop;
}
/**
* @see UnicodeFont#getPaddingLeft()
*
* @return The padding for the left of the glyph area in pixels
*/
public int getPaddingLeft() {
return paddingLeft;
}
/**
* @see UnicodeFont#setPaddingLeft(int)
*
* @param paddingLeft The padding for the left of the glyph area in pixels
*/
public void setPaddingLeft(int paddingLeft) {
this.paddingLeft = paddingLeft;
}
/**
* @see UnicodeFont#getPaddingBottom()
*
* @return The padding for the bottom of the glyph area in pixels
*/
public int getPaddingBottom() {
return paddingBottom;
}
/**
* @see UnicodeFont#setPaddingBottom(int)
*
* @param paddingBottom The padding for the bottom of the glyph area in pixels
*/
public void setPaddingBottom(int paddingBottom) {
this.paddingBottom = paddingBottom;
}
/**
* @see UnicodeFont#getPaddingRight()
*
* @return The padding for the right of the glyph area in pixels
*/
public int getPaddingRight() {
return paddingRight;
}
/**
* @see UnicodeFont#setPaddingRight(int)
*
* @param paddingRight The padding for the right of the glyph area in pixels
*/
public void setPaddingRight(int paddingRight) {
this.paddingRight = paddingRight;
}
/**
* @see UnicodeFont#getPaddingAdvanceX()
*
* @return The padding for the horizontal advance of each glyph
*/
public int getPaddingAdvanceX() {
return paddingAdvanceX;
}
/**
* @see UnicodeFont#setPaddingAdvanceX(int)
*
* @param paddingAdvanceX The padding for the horizontal advance of each glyph
*/
public void setPaddingAdvanceX(int paddingAdvanceX) {
this.paddingAdvanceX = paddingAdvanceX;
}
/**
* @see UnicodeFont#getPaddingAdvanceY()
*
* @return The padding for the vertical advance of each glyph
*/
public int getPaddingAdvanceY() {
return paddingAdvanceY;
}
/**
* @see UnicodeFont#setPaddingAdvanceY(int)
*
* @param paddingAdvanceY The padding for the vertical advance of each glyph
*/
public void setPaddingAdvanceY(int paddingAdvanceY) {
this.paddingAdvanceY = paddingAdvanceY;
}
/**
* @see UnicodeFont#getGlyphPageWidth()
*
* @return The width of the generate glyph pages
*/
public int getGlyphPageWidth() {
return glyphPageWidth;
}
/**
* @see UnicodeFont#setGlyphPageWidth(int)
*
* @param glyphPageWidth The width of the generate glyph pages
*/
public void setGlyphPageWidth(int glyphPageWidth) {
this.glyphPageWidth = glyphPageWidth;
}
/**
* @see UnicodeFont#getGlyphPageHeight()
*
* @return The height of the generate glyph pages
*/
public int getGlyphPageHeight() {
return glyphPageHeight;
}
/**
* @see UnicodeFont#setGlyphPageHeight(int)
*
* @param glyphPageHeight The height of the generate glyph pages
*/
public void setGlyphPageHeight(int glyphPageHeight) {
this.glyphPageHeight = glyphPageHeight;
}
/**
* @see UnicodeFont#UnicodeFont(String, int, boolean, boolean)
* @see UnicodeFont#UnicodeFont(java.awt.Font, int, boolean, boolean)
*
* @return The point size of the font generated
*/
public int getFontSize() {
return fontSize;
}
/**
* @see UnicodeFont#UnicodeFont(String, int, boolean, boolean)
* @see UnicodeFont#UnicodeFont(java.awt.Font, int, boolean, boolean)
*
* @param fontSize The point size of the font generated
*/
public void setFontSize (int fontSize) {
this.fontSize = fontSize;
}
/**
* @see UnicodeFont#UnicodeFont(String, int, boolean, boolean)
* @see UnicodeFont#UnicodeFont(java.awt.Font, int, boolean, boolean)
*
* @return True if the font was generated in bold typeface
*/
public boolean isBold () {
return bold;
}
/**
* @see UnicodeFont#UnicodeFont(String, int, boolean, boolean)
* @see UnicodeFont#UnicodeFont(java.awt.Font, int, boolean, boolean)
*
* @param bold True if the font was generated in bold typeface
*/
public void setBold (boolean bold) {
this.bold = bold;
}
/**
* @see UnicodeFont#UnicodeFont(String, int, boolean, boolean)
* @see UnicodeFont#UnicodeFont(java.awt.Font, int, boolean, boolean)
*
* @return True if the font was generated in italic typeface
*/
public boolean isItalic () {
return italic;
}
/**
* @see UnicodeFont#UnicodeFont(String, int, boolean, boolean)
* @see UnicodeFont#UnicodeFont(java.awt.Font, int, boolean, boolean)
*
* @param italic True if the font was generated in italic typeface
*/
public void setItalic (boolean italic) {
this.italic = italic;
}
/**
* @see UnicodeFont#getEffects()
*
* @return The list of effects applied to the text
*/
public List getEffects() {
return effects;
}
/**
* Saves the settings to a file.
*
* @param file The file we're saving to
* @throws IOException if the file could not be saved.
*/
public void save(File file) throws IOException {
PrintStream out = new PrintStream(new FileOutputStream(file));
out.println("font.size=" + fontSize);
out.println("font.bold=" + bold);
out.println("font.italic=" + italic);
out.println();
out.println("pad.top=" + paddingTop);
out.println("pad.right=" + paddingRight);
out.println("pad.bottom=" + paddingBottom);
out.println("pad.left=" + paddingLeft);
out.println("pad.advance.x=" + paddingAdvanceX);
out.println("pad.advance.y=" + paddingAdvanceY);
out.println();
out.println("glyph.page.width=" + glyphPageWidth);
out.println("glyph.page.height=" + glyphPageHeight);
out.println();
for (Iterator iter = effects.iterator(); iter.hasNext();) {
ConfigurableEffect effect = (ConfigurableEffect)iter.next();
out.println("effect.class=" + effect.getClass().getName());
for (Iterator iter2 = effect.getValues().iterator(); iter2.hasNext();) {
Value value = (Value)iter2.next();
out.println("effect." + value.getName() + "=" + value.getString());
}
out.println();
}
out.close();
}
}