From 3151d4c729e227d110cb77b7c78f7cb4a086183a Mon Sep 17 00:00:00 2001 From: megacz Date: Fri, 30 Jan 2004 07:40:08 +0000 Subject: [PATCH] 2003/10/28 10:10:19 darcs-hash:20040130074008-2ba56-55002d544f347cb818637ad50627c3b601ae7696.gz --- src/org/xwt/translators/Freetype.java | 96 +++++++++++++++++---------------- 1 file changed, 50 insertions(+), 46 deletions(-) diff --git a/src/org/xwt/translators/Freetype.java b/src/org/xwt/translators/Freetype.java index 3a7f3ca..67a1688 100644 --- a/src/org/xwt/translators/Freetype.java +++ b/src/org/xwt/translators/Freetype.java @@ -12,57 +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.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); - - 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); + 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++) { + 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); } - - glyphCache.put(res, new Integer((g << 16) | pointsize), glyph); } } catch (Exception e) { Log.log(Freetype.class, e); -- 1.7.10.4