2003/10/28 10:10:19
authormegacz <megacz@xwt.org>
Fri, 30 Jan 2004 07:40:08 +0000 (07:40 +0000)
committermegacz <megacz@xwt.org>
Fri, 30 Jan 2004 07:40:08 +0000 (07:40 +0000)
darcs-hash:20040130074008-2ba56-55002d544f347cb818637ad50627c3b601ae7696.gz

src/org/xwt/translators/Freetype.java

index 3a7f3ca..67a1688 100644 (file)
@@ -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);