v0.7.5b: first major portion of rewriting text rendering

some rough edges still need smoothing out
This commit is contained in:
Evan Debenham
2019-10-10 22:20:23 -04:00
parent bbee1a1372
commit b985ed3bf5
14 changed files with 393 additions and 214 deletions
@@ -251,16 +251,12 @@ public class SPDSettings extends GameSettings {
public static void systemFont(boolean value){
put(KEY_SYSTEMFONT, value);
if (!value) {
RenderedText.setFont("pixelfont.ttf");
} else {
RenderedText.setFont( null );
}
ShatteredPixelDungeon.seamlessResetScene();
}
public static boolean systemFont(){
return getBoolean(KEY_SYSTEMFONT,
(language() == Languages.KOREAN || language() == Languages.CHINESE));
(language() == Languages.KOREAN || language() == Languages.CHINESE || language() == Languages.JAPANESE));
}
}
@@ -173,11 +173,6 @@ public class ShatteredPixelDungeon extends Game {
Assets.SND_DEGRADE,
Assets.SND_MIMIC );
if (!SPDSettings.systemFont()) {
RenderedText.setFont("pixelfont.ttf");
} else {
RenderedText.setFont( null );
}
}
@@ -25,6 +25,8 @@ import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Badges;
import com.shatteredpixel.shatteredpixeldungeon.SPDSettings;
import com.shatteredpixel.shatteredpixeldungeon.effects.BadgeBanner;
import com.shatteredpixel.shatteredpixeldungeon.messages.Languages;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.ui.RenderedTextMultiline;
import com.shatteredpixel.shatteredpixeldungeon.ui.Window;
import com.watabou.glwrap.Blending;
@@ -133,6 +135,24 @@ public class PixelScene extends Scene {
font2x.tracking = -4;
font2x.texture.filter(Texture.LINEAR, Texture.NEAREST);*/
}
//set up the texture size which rendered text will use for any new glyphs.
int renderedTextPageSize;
if (defaultZoom <= 3){
renderedTextPageSize = 256;
} else if (defaultZoom <= 8){
renderedTextPageSize = 512;
} else {
renderedTextPageSize = 1024;
}
//asian languages have many more unique characters, so increase texture size to anticipate that
if (Messages.lang() == Languages.KOREAN ||
Messages.lang() == Languages.CHINESE ||
Messages.lang() == Languages.JAPANESE){
renderedTextPageSize *= 2;
}
Game.platform.setupFontGenerators(renderedTextPageSize, SPDSettings.systemFont());
}
//FIXME this system currently only works for a subset of windows
@@ -29,13 +29,14 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
//TODO gdx-freetype can manage multi-line layouts for us, and is more efficient. Should consider migrating to that.
public class RenderedTextMultiline extends Component {
private int maxWidth = Integer.MAX_VALUE;
public int nLines;
private String text;
private List<String> tokens;
private String[] tokens;
private ArrayList<RenderedText> words = new ArrayList<>();
private int size;
@@ -66,9 +67,9 @@ public class RenderedTextMultiline extends Component {
chinese = text.replaceAll("\\p{Han}", "").length() != text.length();
if (chinese){
tokens = Arrays.asList(text.split(""));
tokens = text.split("");
} else {
tokens = Arrays.asList(text.split("(?<= )|(?= )|(?<=\n)|(?=\n)"));
tokens = text.split("(?<= )|(?= )|(?<=\n)|(?=\n)");
}
build();
}
@@ -82,6 +83,10 @@ public class RenderedTextMultiline extends Component {
public String text(){
return text;
}
public float baseLine(){
return size * zoom;
}
public void maxWidth(int maxWidth){
if (this.maxWidth != maxWidth){
@@ -189,8 +194,9 @@ public class RenderedTextMultiline extends Component {
word.y = y;
PixelScene.align(word);
x += word.width();
if (!chinese) x ++;
else x--;
else x -= 0.5f;
if ((x - this.x) > width) width = (x - this.x);
@@ -73,7 +73,6 @@ public class WndLangs extends Window {
@Override
public void beforeCreate() {
SPDSettings.language(langs.get(langIndex));
RenderedText.clearCache();
}
@Override
public void afterCreate() {
@@ -237,5 +236,20 @@ public class WndLangs extends Window {
}
}
@Override
public void hide() {
super.hide();
//resets generators because there's no need to retain chars for languages not selected
ShatteredPixelDungeon.seamlessResetScene(new Game.SceneChangeCallback() {
@Override
public void beforeCreate() {
Game.platform.resetGenerators();
}
@Override
public void afterCreate() {
//do nothing
}
});
}
}