import java.io.*;
import java.util.zip.*;
import java.util.*;
+import org.bouncycastle.util.encoders.Base64;
// FEATURE: use streams, not memoryfont's
// FEATURE: kerning pairs
}
}
- public synchronized void renderGlyph(Font.Glyph glyph) {
- try {
+ public synchronized void renderGlyph(Font.Glyph glyph) throws IOException {
+ int width = 0;
+ int height = 0;
+ byte[] data = null;
+ String key = glyph.font.res.getDescriptiveName() + ":" + glyph.c;
+ key = new String(Base64.encode(key.getBytes()));
+ File cacheFile = new java.io.File(System.getProperty("user.home") +
+ java.io.File.separatorChar + ".xwt" +
+ java.io.File.separatorChar + "caches" +
+ java.io.File.separatorChar + "glyphs" +
+ java.io.File.separatorChar +
+ key);
+ new java.io.File(cacheFile.getParent()).mkdirs();
+
+ if (cacheFile.exists()) {
+ DataInputStream dis = new DataInputStream(new FileInputStream(cacheFile));
+ width = dis.readInt();
+ height = dis.readInt();
+ glyph.font.max_ascent = dis.readInt();
+ glyph.font.max_descent = dis.readInt();
+ glyph.baseline = dis.readInt();
+ glyph.advance = dis.readInt();
+ data = new byte[width * height];
+ if (width != 0 && height != 0) dis.readFully(data);
+
+ } else try {
+ System.out.println("cache miss!");
if (loadedStream != glyph.font.res) loadFontByteStream(glyph.font.res);
vm.setUserInfo(2, (int)glyph.c);
vm.setUserInfo(3, (int)glyph.c);
glyph.baseline = vm.getUserInfo(10);
glyph.advance = vm.getUserInfo(11);
- 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);
-
- } 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);
- }
+ width = vm.getUserInfo(6);
+ height = vm.getUserInfo(7);
+
+ data = new byte[width * height];
+ int addr = vm.getUserInfo(5);
+ vm.copyin(addr,data,width*height);
+ File tmp = new File(cacheFile.getCanonicalPath() + ".tmp");
+ DataOutputStream dis = new DataOutputStream(new FileOutputStream(tmp));
+ dis.writeInt(width);
+ dis.writeInt(height);
+ dis.writeInt(glyph.font.max_ascent);
+ dis.writeInt(glyph.font.max_descent);
+ dis.writeInt(glyph.baseline);
+ dis.writeInt(glyph.advance);
+ if (width != 0 && height != 0) dis.write(data, 0, data.length);
+ dis.close();
+ tmp.renameTo(cacheFile);
} catch (Exception e) {
Log.log(this, e);
}
+
+ if (width == 0 || height == 0) Log.log(Freetype.class, "warning glyph has zero width/height");
+ glyph.p = Platform.createAlphaOnlyPicture(data, width, height);
}
}