X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Forg%2Fxwt%2Ftranslators%2FFreetype.java;h=67a16884d98f1e24fc3a79f89446d9b214696ae0;hb=3151d4c729e227d110cb77b7c78f7cb4a086183a;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..67a1688 100644 --- a/src/org/xwt/translators/Freetype.java +++ b/src/org/xwt/translators/Freetype.java @@ -12,61 +12,61 @@ public class Freetype { private static org.xwt.mips.Interpreter vm = null; - public static synchronized void renderGlyphs(Res res, int pointsize, int firstGlyph, int lastGlyph, Cache glyphCache) { - try { - - if (vm == null) { + public static void renderGlyphs(Res res, int pointsize, int firstGlyph, int lastGlyph, Cache glyphCache) { - 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(); - } + try { + InputStream is = res.getInputStream(); + byte[] fontstream = InputStreamToByteArray.convert(is); - int FONT_RESERVED = 256*1024; - 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); - - long start = System.currentTimeMillis(); - - for(int g = firstGlyph; g <= lastGlyph; g++) { - vm.execute(); + synchronized(Freetype.class) { + if (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(); + } - 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 FONT_RESERVED = 256*1024; + int baseAddr = vm.sbrk(FONT_RESERVED); - int width = vm.getUserInfo(6); - int height = vm.getUserInfo(7); - byte[] data = new byte[width * height]; - int addr = vm.getUserInfo(5); - - vm.copyin(addr,data,width*height); + 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); - /*for(int i=0; i= 0; k--) { - if (i + k < width * height) - data[i + k] = (val & 0xff) << 24; - val >>>= 8; - } - }*/ + long start = System.currentTimeMillis(); - glyph.p = Platform.createAlphaOnlyPicture(data, width, height); - glyphCache.put(res, new Integer((g << 16) | pointsize), glyph); + for(int g = firstGlyph; g <= lastGlyph; g++) { + Log.log(Freetype.class, "rendering glyph " + g); + vm.execute(); + + Glyph glyph = new Glyph(); + glyph.max_ascent = vm.getUserInfo(8); + glyph.max_descent = vm.getUserInfo(9); + glyph.baseline = vm.getUserInfo(10); + glyph.advance = vm.getUserInfo(11); + glyph.c = (char)g; + + int width = vm.getUserInfo(6); + int height = vm.getUserInfo(7); + + if (width == 0 || height == 0) { + Log.log(Freetype.class, "warning glyph " + g + " has zero width/height"); + + } else { + byte[] data = new byte[width * height]; + int addr = vm.getUserInfo(5); + vm.copyin(addr,data,width*height); + glyph.p = Platform.createAlphaOnlyPicture(data, width, height); + } + + glyphCache.put(res, new Integer((g << 16) | pointsize), glyph); + } } } catch (Exception e) { Log.log(Freetype.class, e);