diff --git a/sdk/jme3-angelfont/nbproject/project.properties b/sdk/jme3-angelfont/nbproject/project.properties
index 5571d6b52..df192b859 100644
--- a/sdk/jme3-angelfont/nbproject/project.properties
+++ b/sdk/jme3-angelfont/nbproject/project.properties
@@ -1,3 +1,3 @@
javac.source=1.5
javac.compilerargs=-Xlint -Xlint:-serial
-spec.version.base=0.1.0
+spec.version.base=0.6.0
diff --git a/sdk/jme3-angelfont/src/com/jme3/gde/angelfont/AngelFont.java b/sdk/jme3-angelfont/src/com/jme3/gde/angelfont/AngelFont.java
new file mode 100644
index 000000000..d1a105214
--- /dev/null
+++ b/sdk/jme3-angelfont/src/com/jme3/gde/angelfont/AngelFont.java
@@ -0,0 +1,55 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+package com.jme3.gde.angelfont;
+
+import java.awt.image.BufferedImage;
+
+/**
+ *
+ * @author normenhansen
+ */
+public class AngelFont {
+ private BufferedImage image;
+ private String description;
+
+ public AngelFont() {
+ }
+
+ public AngelFont(BufferedImage image, String description) {
+ this.image = image;
+ this.description = description;
+ }
+
+ /**
+ * @return the image
+ */
+ public BufferedImage getImage() {
+ return image;
+ }
+
+ /**
+ * @param image the image to set
+ */
+ public void setImage(BufferedImage image) {
+ this.image = image;
+ }
+
+ /**
+ * @return the description
+ */
+ public String getDescription() {
+ return description;
+ }
+
+ /**
+ * @param description the description to set
+ */
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+
+}
diff --git a/sdk/jme3-angelfont/src/com/jme3/gde/angelfont/AngelFontVisualPanel1.java b/sdk/jme3-angelfont/src/com/jme3/gde/angelfont/AngelFontVisualPanel1.java
index 7c1be8e99..8f6900d29 100644
--- a/sdk/jme3-angelfont/src/com/jme3/gde/angelfont/AngelFontVisualPanel1.java
+++ b/sdk/jme3-angelfont/src/com/jme3/gde/angelfont/AngelFontVisualPanel1.java
@@ -88,7 +88,7 @@ public final class AngelFontVisualPanel1 extends JPanel {
}// //GEN-END:initComponents
private void updateFont(javax.swing.event.ListSelectionEvent evt) {//GEN-FIRST:event_updateFont
- jLabel1.setIcon(new ImageIcon(FontCreator.buildFont((String) jList1.getSelectedValue(), 256)));
+ jLabel1.setIcon(new ImageIcon(FontCreator.buildFont((String) jList1.getSelectedValue(), 256).getImage()));
selectedFont = (String) jList1.getSelectedValue();
}//GEN-LAST:event_updateFont
// Variables declaration - do not modify//GEN-BEGIN:variables
diff --git a/sdk/jme3-angelfont/src/com/jme3/gde/angelfont/AngelFontVisualPanel2.form b/sdk/jme3-angelfont/src/com/jme3/gde/angelfont/AngelFontVisualPanel2.form
index ca90cb061..d6bfb1549 100644
--- a/sdk/jme3-angelfont/src/com/jme3/gde/angelfont/AngelFontVisualPanel2.form
+++ b/sdk/jme3-angelfont/src/com/jme3/gde/angelfont/AngelFontVisualPanel2.form
@@ -16,13 +16,82 @@
-
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/sdk/jme3-angelfont/src/com/jme3/gde/angelfont/AngelFontVisualPanel2.java b/sdk/jme3-angelfont/src/com/jme3/gde/angelfont/AngelFontVisualPanel2.java
index 9891e4831..312d52c6d 100644
--- a/sdk/jme3-angelfont/src/com/jme3/gde/angelfont/AngelFontVisualPanel2.java
+++ b/sdk/jme3-angelfont/src/com/jme3/gde/angelfont/AngelFontVisualPanel2.java
@@ -4,10 +4,15 @@
*/
package com.jme3.gde.angelfont;
+import javax.swing.ImageIcon;
import javax.swing.JPanel;
public final class AngelFontVisualPanel2 extends JPanel {
+ String fontName = "";
+ int fontSize = 16;
+ int imageSize = 256;
+
/** Creates new form AngelFontVisualPanel2 */
public AngelFontVisualPanel2() {
initComponents();
@@ -15,7 +20,18 @@ public final class AngelFontVisualPanel2 extends JPanel {
@Override
public String getName() {
- return "Step #2";
+ return "Configure Font";
+ }
+
+ public void setFont(String name) {
+ this.fontName = name;
+ updateFont();
+ }
+
+ private void updateFont() {
+ jLabel3.setIcon(new ImageIcon(FontCreator.buildFont(fontName, imageSize, fontSize, true).getImage()));
+ jLabel3.repaint();
+ jPanel1.repaint();
}
/** This method is called from within the constructor to
@@ -26,17 +42,77 @@ public final class AngelFontVisualPanel2 extends JPanel {
// //GEN-BEGIN:initComponents
private void initComponents() {
+ jPanel1 = new javax.swing.JPanel();
+ jLabel3 = new javax.swing.JLabel();
+ jToolBar1 = new javax.swing.JToolBar();
+ jLabel1 = new javax.swing.JLabel();
+ jSpinner1 = new javax.swing.JSpinner();
+ jLabel2 = new javax.swing.JLabel();
+ jSpinner2 = new javax.swing.JSpinner();
+
+ jPanel1.setBackground(new java.awt.Color(0, 0, 0));
+ jPanel1.setLayout(new javax.swing.BoxLayout(jPanel1, javax.swing.BoxLayout.LINE_AXIS));
+
+ org.openide.awt.Mnemonics.setLocalizedText(jLabel3, org.openide.util.NbBundle.getMessage(AngelFontVisualPanel2.class, "AngelFontVisualPanel2.jLabel3.text")); // NOI18N
+ jPanel1.add(jLabel3);
+
+ jToolBar1.setFloatable(false);
+ jToolBar1.setRollover(true);
+
+ org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(AngelFontVisualPanel2.class, "AngelFontVisualPanel2.jLabel1.text")); // NOI18N
+ jToolBar1.add(jLabel1);
+
+ jSpinner1.setModel(new javax.swing.SpinnerNumberModel(Integer.valueOf(16), Integer.valueOf(1), null, Integer.valueOf(1)));
+ jSpinner1.addChangeListener(new javax.swing.event.ChangeListener() {
+ public void stateChanged(javax.swing.event.ChangeEvent evt) {
+ updateFontSize(evt);
+ }
+ });
+ jToolBar1.add(jSpinner1);
+
+ org.openide.awt.Mnemonics.setLocalizedText(jLabel2, org.openide.util.NbBundle.getMessage(AngelFontVisualPanel2.class, "AngelFontVisualPanel2.jLabel2.text")); // NOI18N
+ jToolBar1.add(jLabel2);
+
+ jSpinner2.setModel(new javax.swing.SpinnerNumberModel(Integer.valueOf(256), Integer.valueOf(64), null, Integer.valueOf(1)));
+ jSpinner2.addChangeListener(new javax.swing.event.ChangeListener() {
+ public void stateChanged(javax.swing.event.ChangeEvent evt) {
+ updateImageSize(evt);
+ }
+ });
+ jToolBar1.add(jSpinner2);
+
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGap(0, 360, Short.MAX_VALUE)
+ .addComponent(jToolBar1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 441, Short.MAX_VALUE)
+ .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, 441, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGap(0, 256, Short.MAX_VALUE)
+ .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
+ .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, 307, Short.MAX_VALUE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(jToolBar1, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE))
);
}// //GEN-END:initComponents
+
+ private void updateFontSize(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_updateFontSize
+ fontSize = (Integer) jSpinner1.getValue();
+ updateFont();
+ }//GEN-LAST:event_updateFontSize
+
+ private void updateImageSize(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_updateImageSize
+ imageSize = (Integer) jSpinner2.getValue();
+ updateFont();
+ }//GEN-LAST:event_updateImageSize
// Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JLabel jLabel1;
+ private javax.swing.JLabel jLabel2;
+ private javax.swing.JLabel jLabel3;
+ private javax.swing.JPanel jPanel1;
+ private javax.swing.JSpinner jSpinner1;
+ private javax.swing.JSpinner jSpinner2;
+ private javax.swing.JToolBar jToolBar1;
// End of variables declaration//GEN-END:variables
}
diff --git a/sdk/jme3-angelfont/src/com/jme3/gde/angelfont/AngelFontWizardIterator.java b/sdk/jme3-angelfont/src/com/jme3/gde/angelfont/AngelFontWizardIterator.java
index f3829a2fb..85cee53da 100644
--- a/sdk/jme3-angelfont/src/com/jme3/gde/angelfont/AngelFontWizardIterator.java
+++ b/sdk/jme3-angelfont/src/com/jme3/gde/angelfont/AngelFontWizardIterator.java
@@ -9,6 +9,7 @@ import java.awt.Component;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
+import java.io.OutputStreamWriter;
import java.nio.ByteBuffer;
import java.util.Collections;
import java.util.Iterator;
@@ -72,19 +73,23 @@ public final class AngelFontWizardIterator implements WizardDescriptor.Instantia
public Set instantiate() throws IOException {
String name = (String) wizard.getProperty("font_name");
+ int fontSize = (Integer) wizard.getProperty("font_size");
+ int imageSize = (Integer) wizard.getProperty("image_size");
Project project = (Project) wizard.getProperty("project");
ProjectAssetManager pm = project.getLookup().lookup(ProjectAssetManager.class);
if (pm == null) {
Logger.getLogger(AngelFontWizardIterator.class.getName()).log(Level.WARNING, "No ProjectAssetManager found!");
return Collections.EMPTY_SET;
}
- BufferedImage fontImage = FontCreator.buildFont(name);
+ AngelFont font = FontCreator.buildFont(name, imageSize, fontSize);
+ BufferedImage fontImage = font.getImage();
ByteBuffer scratch = ByteBuffer.allocateDirect(4 * fontImage.getWidth() * fontImage.getHeight());
byte[] data = (byte[]) fontImage.getRaster().getDataElements(0, 0,
fontImage.getWidth(), fontImage.getHeight(), null);
scratch.clear();
scratch.put(data);
scratch.rewind();
+ name = name.replaceAll(" ", "");
File outputFile;
try {
if (pm.getAssetFolder().getFileObject("Interface") == null) {
@@ -95,10 +100,18 @@ public final class AngelFontWizardIterator implements WizardDescriptor.Instantia
}
outputFile = FileUtil.toFile(pm.getAssetFolder().getFileObject("Interface/Fonts"));
if (!outputFile.getName().endsWith(".png")) {
- outputFile = new File(outputFile.getAbsoluteFile() + File.separator + name.replaceAll(" ", "") + ".png");
+ outputFile = new File(outputFile.getAbsoluteFile() + File.separator + name + ".png");
}
// write png file
ImageIO.write(fontImage, "PNG", outputFile);
+
+ FileObject object = pm.getAssetFolder().getFileObject("Interface/Fonts/" + name, "fnt");
+ if (object == null) {
+ object = pm.getAssetFolder().getFileObject("Interface/Fonts").createData(name, "fnt");
+ }
+ OutputStreamWriter out = new OutputStreamWriter(object.getOutputStream());
+ out.write(font.getDescription());
+ out.close();
} catch (Exception e) {
Exceptions.printStackTrace(e);
return Collections.EMPTY_SET;
@@ -108,11 +121,6 @@ public final class AngelFontWizardIterator implements WizardDescriptor.Instantia
public void initialize(WizardDescriptor wizard) {
this.wizard = wizard;
- System.out.println("FOLDERRRR:" + wizard.getProperty("folder"));
- for (Iterator> it = wizard.getProperties().entrySet().iterator(); it.hasNext();) {
- Entry entry = it.next();
- System.out.println(entry.getKey() + ": " + wizard.getProperty(entry.getKey()));
- }
}
public void uninitialize(WizardDescriptor wizard) {
diff --git a/sdk/jme3-angelfont/src/com/jme3/gde/angelfont/AngelFontWizardPanel2.java b/sdk/jme3-angelfont/src/com/jme3/gde/angelfont/AngelFontWizardPanel2.java
index c76214a41..9c80245b0 100644
--- a/sdk/jme3-angelfont/src/com/jme3/gde/angelfont/AngelFontWizardPanel2.java
+++ b/sdk/jme3-angelfont/src/com/jme3/gde/angelfont/AngelFontWizardPanel2.java
@@ -15,7 +15,7 @@ public class AngelFontWizardPanel2 implements WizardDescriptor.Panel {
* The visual component that displays this panel. If you need to access the
* component from this class, just use getComponent().
*/
- private Component component;
+ private AngelFontVisualPanel2 component;
// Get the visual component for the panel. In this template, the component
// is kept separate. This can be more efficient: if the wizard is created
@@ -79,8 +79,11 @@ public class AngelFontWizardPanel2 implements WizardDescriptor.Panel {
// WizardDescriptor.getProperty & putProperty to store information entered
// by the user.
public void readSettings(Object settings) {
+ component.setFont((String)((WizardDescriptor)settings).getProperty("font_name"));
}
public void storeSettings(Object settings) {
+ ((WizardDescriptor)settings).putProperty("font_size", component.fontSize);
+ ((WizardDescriptor)settings).putProperty("image_size", component.imageSize);
}
}
diff --git a/sdk/jme3-angelfont/src/com/jme3/gde/angelfont/Bundle.properties b/sdk/jme3-angelfont/src/com/jme3/gde/angelfont/Bundle.properties
index 2f83cb823..f2b63de34 100644
--- a/sdk/jme3-angelfont/src/com/jme3/gde/angelfont/Bundle.properties
+++ b/sdk/jme3-angelfont/src/com/jme3/gde/angelfont/Bundle.properties
@@ -1,7 +1,10 @@
OpenIDE-Module-Display-Category=jMonkeyPlatform
OpenIDE-Module-Long-Description=\
Font Support for jMonkeyPlatform, create AngelFont files from system fonts
-OpenIDE-Module-Name=jME3 Font Creator
+OpenIDE-Module-Name=Font Creator
OpenIDE-Module-Short-Description=Create AngelFont files from system fonts
Templates/GUI/angelFont=Font
AngelFontVisualPanel1.jLabel1.text=
+AngelFontVisualPanel2.jLabel1.text=Font Size:
+AngelFontVisualPanel2.jLabel2.text=Image Size:
+AngelFontVisualPanel2.jLabel3.text=jLabel3
diff --git a/sdk/jme3-angelfont/src/com/jme3/gde/angelfont/FontCreator.java b/sdk/jme3-angelfont/src/com/jme3/gde/angelfont/FontCreator.java
index e7ae1096b..b49bf1629 100644
--- a/sdk/jme3-angelfont/src/com/jme3/gde/angelfont/FontCreator.java
+++ b/sdk/jme3-angelfont/src/com/jme3/gde/angelfont/FontCreator.java
@@ -24,117 +24,99 @@ public abstract class FontCreator {
public FontCreator() {
}
- public static BufferedImage buildFont(String fontName) {
+ public static AngelFont buildFont(String fontName) {
return buildFont(fontName, 512);
}
- public static BufferedImage buildFont(String fontName, int bitmapSize) {
- return buildFont(fontName, bitmapSize, 63);
+ public static AngelFont buildFont(String fontName, int bitmapSize) {
+ return buildFont(fontName, bitmapSize, 16, false);
}
- public static BufferedImage buildFont(String fontName, int bitmapSize, int offset) {
+ public static AngelFont buildFont(String fontName, int bitmapSize, int fontSize) {
+ return buildFont(fontName, bitmapSize, fontSize, false);
+ }
+
+ public static AngelFont buildFont(String fontName, int bitmapSize, int fontSize, boolean debug) {
BufferedImage fontImage;
Font font;
- boolean sizeFound = false;
- boolean directionSet = false;
- int delta = 0;
- int fontSize = 24;
-
String charLocs = "";
- /*
- * To find out how much space a Font takes, you need to use a the
- * FontMetrics class. To get the FontMetrics, you need to get it from a
- * Graphics context. A Graphics context is only available from a
- * displayable surface, ie any class that subclasses Component or any
- * Image. First the font is set on a Graphics object. Then get the
- * FontMetrics and find out the width and height of the widest character
- * (W). Then take the largest of the 2 values and find the maximum size
- * font that will fit in the size allocated.
- */
- while (!sizeFound) {
- font = new Font(fontName, Font.PLAIN, fontSize); // Font Name
- // use BufferedImage.TYPE_4BYTE_ABGR to allow alpha blending
- fontImage = new BufferedImage(bitmapSize, bitmapSize,
- BufferedImage.TYPE_4BYTE_ABGR);
- Graphics2D g = (Graphics2D) fontImage.getGraphics();
- g.setFont(font);
- FontMetrics fm = g.getFontMetrics();
- int width = fm.stringWidth("W");
- int height = fm.getHeight();
- int lineWidth = (width > height) ? width * 16 : height * 16;
- if (!directionSet) {
- if (lineWidth > bitmapSize) {
- delta = -2;
- } else {
- delta = 2;
- }
- directionSet = true;
- }
- if (delta > 0) {
- if (lineWidth < bitmapSize) {
- fontSize += delta;
- } else {
- sizeFound = true;
- fontSize -= delta;
- }
- } else if (delta < 0) {
- if (lineWidth > bitmapSize) {
- fontSize += delta;
- } else {
- sizeFound = true;
- fontSize -= delta;
- }
- }
- }
-
- /*
- * Now that a font size has been determined, create the final image, set
- * the font and draw the standard/extended ASCII character set for that
- * font.
- */
font = new Font(fontName, Font.BOLD, fontSize); // Font Name
// use BufferedImage.TYPE_4BYTE_ABGR to allow alpha blending
fontImage = new BufferedImage(bitmapSize, bitmapSize,
BufferedImage.TYPE_4BYTE_ABGR);
Graphics2D g = (Graphics2D) fontImage.getGraphics();
g.setFont(font);
- g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
- RenderingHints.VALUE_ANTIALIAS_ON);
+ if (!debug) {
+ g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
+ RenderingHints.VALUE_ANTIALIAS_ON);
+ }
g.setColor(OPAQUE_WHITE);
g.setBackground(TRANSPARENT_BLACK);
FontMetrics fm = g.getFontMetrics();
+ if (debug) {
+ g.setColor(Color.WHITE);
+ g.drawRect(0, 0, bitmapSize - 1, bitmapSize - 1);
+ }
+ int xPos = 0;
+ int yPos = 0;
+ int height = 0;
for (int i = 0; i < 256; i++) {
- int x = i % 16;
- int y = i / 16;
char ch[] = {(char) i};
String temp = new String(ch);
Rectangle2D bounds = fm.getStringBounds(temp, g);
-
- int xPos = (int) ((x * 32) + (16 - (bounds.getWidth() / 2)));
- int yPos = (y * 32) + fm.getAscent() - offset;
+ height = fm.getDescent() + fm.getAscent();
+ if (yPos == 0) {
+ yPos = height;
+ }
+ if (xPos + bounds.getWidth() > bitmapSize) {
+ xPos = 0;
+ yPos += height;
+ }
g.drawString(temp, xPos, yPos);
- //TODO: AngelFont support!
-// g.setColor(Color.BLUE);
-// g.drawRect(xPos, yPos-(int)bounds.getHeight(), (int)bounds.getWidth(), (int)bounds.getHeight()+fm.getDescent());
-// g.setColor(Color.WHITE);
-//
-// charLocs=charLocs+
-// "char id="+i+
-// " x="+xPos +
-// " y="+(yPos-(int)bounds.getHeight()-fm.getAscent())+
-// " width="+(int)bounds.getWidth()+
-// " height="+(int)bounds.getHeight()+
-// " xoffset=0" +
-// " yoffset=0" +
-// " xadvance=0" +
-// " page=0" +
-// " chnl=15\n";
+ if (debug) {
+ g.setColor(Color.BLUE);
+ g.drawRect(xPos, yPos - fm.getAscent(), (int) bounds.getWidth(), height);
+ g.setColor(Color.WHITE);
+ }
+ charLocs = charLocs
+ + "char id=" + i
+ + " x=" + xPos
+ + " y=" + (yPos - fm.getAscent())
+ + " width=" + (int) bounds.getWidth()
+ + " height=" + (int) bounds.getHeight()
+ + " xoffset=0"
+ + " yoffset=0"
+ + " xadvance=" + ((int) bounds.getWidth() - 1) + " "
+ + " page=0"
+ + " chnl=0\n";
+ xPos += bounds.getWidth();
}
-// System.out.println(charLocs);
- return fontImage;
+ charLocs = "info face=null "
+ + "size=" + fontSize + " "
+ + "bold=0 "
+ + "italic=0 "
+ + "charset=ASCII "
+ + "unicode=0 "
+ + "stretchH=100 "
+ + "smooth=1 "
+ + "aa=1 "
+ + "paiing=0,0,0,0 "
+ + "spacing=1,1 "
+ + "\n"
+ + "common lineHeight=" + height + " "
+ + "base=26 "
+ + "scaleW=" + bitmapSize + " "
+ + "scaleH=" + bitmapSize + " "
+ + "pages=1 "
+ + "packed=0 "
+ + "\n"
+ + "page id=0 file=\"" + fontName.replaceAll(" ", "") + ".png\"\n"
+ + "chars count=255\n"
+ + charLocs;
+ return new AngelFont(fontImage, charLocs);
}
}