X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Forg%2Fxwt%2Ftranslators%2FFreetype.java;h=de5e0c0b420cd5562b6403e28d942a5236a69d6c;hb=bbfe17b34980e100bcf26ec0c0b1b3fde1992793;hp=1608a750f82216cd52430fa47e0df1db101be386;hpb=745fb6aad79e10eb8c402b8fa6a591769c0fcdfb;p=org.ibex.core.git diff --git a/src/org/xwt/translators/Freetype.java b/src/org/xwt/translators/Freetype.java index 1608a75..de5e0c0 100644 --- a/src/org/xwt/translators/Freetype.java +++ b/src/org/xwt/translators/Freetype.java @@ -3,73 +3,68 @@ import org.xwt.*; import org.xwt.util.*; import java.io.*; import java.util.zip.*; +import java.util.*; // FEATURE: use streams, not memoryfont's // FEATURE: kerning pairs public class Freetype { - Freetype() { } + public Freetype() { } - private static org.xwt.mips.Interpreter vm = null; + private static byte[] image = null; + private static final int FONT_RESERVED = 256*1024; - public static synchronized void renderGlyphs(Res res, int pointsize, int firstGlyph, int lastGlyph, Cache glyphCache) { - try { - - if (vm == null) { + private org.xwt.mips.Interpreter vm = null; - InputStream bis = Platform.getBuiltinInputStream(); - ZipInputStream zis = new ZipInputStream(bis); - for(ZipEntry ze = zis.getNextEntry(); ze != null && !ze.getName().equals("freetype.mips"); ze = zis.getNextEntry()) { } - byte[] image = InputStreamToByteArray.convert(zis); - vm = new org.xwt.mips.Interpreter(image); - vm.start(new String[]{ "freetype.mips" }); - vm.execute(); - } + private Res loadedStream = null; - int FONT_RESERVED = 256*1024; + public void loadFontByteStream(Res res) { + try { + Log.log(this, "loading font " + res.getDescriptiveName()); + loadedStream = res; + InputStream is = res.getInputStream(); + byte[] fontstream = InputStreamToByteArray.convert(is); + if (image == null) image = InputStreamToByteArray.convert(Main.builtin.getInputStream("freetype.mips")); + vm = new org.xwt.mips.Interpreter(image); int baseAddr = vm.sbrk(FONT_RESERVED); - - byte[] fontstream = InputStreamToByteArray.convert(res.getInputStream()); vm.copyout(fontstream, baseAddr, fontstream.length); vm.setUserInfo(0, baseAddr); vm.setUserInfo(1, fontstream.length); - vm.setUserInfo(2, firstGlyph); - vm.setUserInfo(3, lastGlyph); - vm.setUserInfo(4, pointsize); - + vm.start(new String[]{ "freetype.mips" }); + vm.execute(); + } catch (Exception e) { + Log.log(this, e); + } + } + + public synchronized void renderGlyph(Font.Glyph glyph) { + try { + if (loadedStream != glyph.font.res) loadFontByteStream(glyph.font.res); + vm.setUserInfo(2, (int)glyph.c); + vm.setUserInfo(3, (int)glyph.c); + vm.setUserInfo(4, glyph.font.pointsize); long start = System.currentTimeMillis(); + vm.execute(); + glyph.font.max_ascent = vm.getUserInfo(8); + glyph.font.max_descent = vm.getUserInfo(9); + glyph.baseline = vm.getUserInfo(10); + glyph.advance = vm.getUserInfo(11); - for(int g = firstGlyph; g <= lastGlyph; g++) { - vm.execute(); + int width = vm.getUserInfo(6); + int height = vm.getUserInfo(7); + if (width == 0 || height == 0) { + Log.log(Freetype.class, "warning glyph has zero width/height"); + glyph.p = Platform.createAlphaOnlyPicture(new byte[] { }, 0, 0); - Glyph glyph = new Glyph(); - glyph.max_ascent = vm.getUserInfo(8); - glyph.max_descent = vm.getUserInfo(9) - glyph.max_ascent; - glyph.baseline = vm.getUserInfo(10); - glyph.advance = vm.getUserInfo(11); - glyph.c = (char)g; - - int width = vm.getUserInfo(6); - int height = vm.getUserInfo(7); + } else { byte[] data = new byte[width * height]; int addr = vm.getUserInfo(5); - vm.copyin(addr,data,width*height); - - /*for(int i=0; i= 0; k--) { - if (i + k < width * height) - data[i + k] = (val & 0xff) << 24; - val >>>= 8; - } - }*/ - glyph.p = Platform.createAlphaOnlyPicture(data, width, height); - glyphCache.put(res, new Integer((g << 16) | pointsize), glyph); } + } catch (Exception e) { - Log.log(Freetype.class, e); + Log.log(this, e); } } }