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