Fix for bug when assigning an empty text string to a BitmapText already showing content

git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@9389 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
3.0
sky..ok 13 years ago
parent eca1fae8bc
commit 96fce01608
  1. 75
      engine/src/core/com/jme3/font/BitmapText.java
  2. 18
      engine/src/core/com/jme3/font/BitmapTextPage.java
  3. 37
      engine/src/core/com/jme3/font/LetterQuad.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();

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

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

Loading…
Cancel
Save