diff --git a/engine/src/core/com/jme3/font/BitmapText.java b/engine/src/core/com/jme3/font/BitmapText.java index 760132462..cedb34e47 100644 --- a/engine/src/core/com/jme3/font/BitmapText.java +++ b/engine/src/core/com/jme3/font/BitmapText.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2010 jMonkeyEngine + * Copyright (c) 2009-2012 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -44,6 +44,7 @@ import java.util.regex.Pattern; * @author YongHoon */ public class BitmapText extends Node { + private BitmapFont font; private StringBlock block; private boolean needRefresh = true; @@ -85,7 +86,7 @@ public class BitmapText extends Node { public BitmapFont getFont() { return font; } - + /** * Changes text size * @param size text size @@ -102,7 +103,7 @@ public class BitmapText extends Node { */ public void setText(CharSequence text) { // note: text.toString() is free if text is already a java.lang.String. - setText( text != null ? text.toString() : null ); + setText(text != null ? text.toString() : null); } /** @@ -110,14 +111,36 @@ public class BitmapText extends Node { * @param text String to change text to */ public void setText(String text) { + System.out.println("HI"); + text = text == null ? "" : text; - if (text == block.getText() || block.getText().equals(text)) { + if (block.getText().equals(text)) { return; + } else { + // If the text is empty, reset + if (text.isEmpty()) { + System.out.println("text is different"); + detachAllChildren(); + + for (int page = 0; page < textPages.length; page++) { + textPages[page] = new BitmapTextPage(font, true, page); + attachChild(textPages[page]); + } + + System.out.println("Creating new StringBlock and Letters"); + block = new StringBlock(); + letters = new Letters(font, block, letters.getQuad().isRightToLeft()); + } + + // Update the text content + block.setText(text); + letters.setText(text); + + // Flat for refresh + needRefresh = true; } - block.setText(text); - letters.setText(text); - needRefresh = true; + } /** @@ -153,14 +176,14 @@ public class BitmapText extends Node { letters.invalidate(); needRefresh = true; } - + /** * @return height of the line */ public float getLineHeight() { return font.getLineHeight(block); } - + /** * @return height of whole textblock */ @@ -168,14 +191,14 @@ public class BitmapText extends Node { if (needRefresh) { assemble(); } - float height = getLineHeight()*block.getLineCount(); + float height = getLineHeight() * block.getLineCount(); Rectangle textBox = block.getTextBox(); if (textBox != null) { return Math.max(height, textBox.height); } return height; } - + /** * @return width of line */ @@ -189,7 +212,7 @@ public class BitmapText extends Node { } return letters.getTotalWidth(); } - + /** * @return line count */ @@ -199,11 +222,11 @@ public class BitmapText extends Node { } return block.getLineCount(); } - + public LineWrapMode getLineWrapMode() { return block.getLineWrapMode(); } - + /** * Set horizontal alignment. Applicable only when text bound is set. * @param align @@ -216,7 +239,7 @@ public class BitmapText extends Node { letters.invalidate(); needRefresh = true; } - + /** * Set vertical alignment. Applicable only when text bound is set. * @param align @@ -229,15 +252,15 @@ public class BitmapText extends Node { letters.invalidate(); needRefresh = true; } - + public BitmapFont.Align getAlignment() { return block.getAlignment(); } - + public BitmapFont.VAlign getVerticalAlignment() { return block.getVerticalAlignment(); } - + /** * Set the font style of substring. If font doesn't contain style, default style is used * @param start start index to set style. inclusive. @@ -247,7 +270,7 @@ public class BitmapText extends Node { public void setStyle(int start, int end, int style) { letters.setStyle(start, end, style); } - + /** * Set the font style of substring. If font doesn't contain style, default style is applied * @param regexp regular expression @@ -260,7 +283,7 @@ public class BitmapText extends Node { setStyle(m.start(), m.end(), style); } } - + /** * Set the color of substring. * @param start start index to set style. inclusive. @@ -272,7 +295,7 @@ public class BitmapText extends Node { letters.invalidate(); needRefresh = true; } - + /** * Set the color of substring. * @param regexp regular expression @@ -287,7 +310,7 @@ public class BitmapText extends Node { letters.invalidate(); needRefresh = true; } - + /** * @param tabs tab positions */ @@ -296,7 +319,7 @@ public class BitmapText extends Node { letters.invalidate(); needRefresh = false; } - + /** * used for the tabs over the last tab position. * @param width tab size @@ -306,7 +329,7 @@ public class BitmapText extends Node { letters.invalidate(); needRefresh = false; } - + /** * for setLineWrapType(LineWrapType.NoWrap), * set the last character when the text exceeds the bound. @@ -344,13 +367,13 @@ public class BitmapText extends Node { private void assemble() { // first generate quadlist letters.update(); - + for (int i = 0; i < textPages.length; i++) { textPages[i].assemble(letters); } needRefresh = false; } - + public void render(RenderManager rm) { for (BitmapTextPage page : textPages) { Material mat = page.getMaterial(); diff --git a/engine/src/core/com/jme3/font/BitmapTextPage.java b/engine/src/core/com/jme3/font/BitmapTextPage.java index f49b5c934..aac50ba93 100644 --- a/engine/src/core/com/jme3/font/BitmapTextPage.java +++ b/engine/src/core/com/jme3/font/BitmapTextPage.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2010 jMonkeyEngine + * Copyright (c) 2009-2012 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -48,7 +48,7 @@ import java.util.LinkedList; * @author Lim, YongHoon */ class BitmapTextPage extends Geometry { - + private final float[] pos; private final float[] tc; private final short[] idx; @@ -86,6 +86,10 @@ class BitmapTextPage extends Geometry { arrayBased = true; + /* + * TODO: Since this is forced to true, should we just lose the conditional? + * - Skye (sbook) + */ if (arrayBased) { pos = new float[4 * 3]; // 4 verticies * 3 floats tc = new float[4 * 2]; // 4 verticies * 2 floats @@ -98,7 +102,7 @@ class BitmapTextPage extends Geometry { color = null; } } - + BitmapTextPage(BitmapFont font, boolean arrayBased) { this(font, arrayBased, 0); } @@ -106,7 +110,7 @@ class BitmapTextPage extends Geometry { BitmapTextPage(BitmapFont font) { this(font, false, 0); } - + Texture2D getTexture() { return texture; } @@ -121,7 +125,7 @@ class BitmapTextPage extends Geometry { void assemble(Letters quads) { pageQuads.clear(); quads.rewind(); - + while (quads.nextCharacter()) { if (quads.isPrintable()) { if (quads.getCharacterSetPage() == page) { @@ -129,7 +133,7 @@ class BitmapTextPage extends Geometry { } } } - + Mesh m = getMesh(); int vertCount = pageQuads.size() * 4; int triCount = pageQuads.size() * 2; @@ -191,7 +195,7 @@ class BitmapTextPage extends Geometry { ftb.rewind(); sib.rewind(); bcb.rewind(); - + updateModelBound(); } } diff --git a/engine/src/core/com/jme3/font/LetterQuad.java b/engine/src/core/com/jme3/font/LetterQuad.java index 09f0e2431..5cc356531 100644 --- a/engine/src/core/com/jme3/font/LetterQuad.java +++ b/engine/src/core/com/jme3/font/LetterQuad.java @@ -1,3 +1,34 @@ +/* + * Copyright (c) 2009-2012 jMonkeyEngine + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'jMonkeyEngine' nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ package com.jme3.font; import com.jme3.math.ColorRGBA; @@ -6,7 +37,7 @@ import java.nio.FloatBuffer; import java.nio.ShortBuffer; /** - * LetterQuad contains the position, color, uv texture information for a character in text. + * LetterQuad contains the position, color, and UV texture information for a character in text. * @author YongHoon */ class LetterQuad { @@ -117,6 +148,10 @@ class LetterQuad { return v1; } + boolean isRightToLeft(){ + return rightToLeft; + } + boolean isInvalid() { return x0 == Integer.MIN_VALUE; }