From 167534f477e8a6f3ef097df28cb4f1b4b80fb3ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=F8=EDk?= Date: Mon, 23 Sep 2013 08:37:12 +0200 Subject: [PATCH] GFx fonts caching (faster viewing) --- .../flash/tags/GFxDefineCompactedFont.java | 57 ++++++++++++++++--- .../flash/types/shaperecords/SHAPERECORD.java | 9 --- 2 files changed, 50 insertions(+), 16 deletions(-) diff --git a/trunk/src/com/jpexs/decompiler/flash/tags/GFxDefineCompactedFont.java b/trunk/src/com/jpexs/decompiler/flash/tags/GFxDefineCompactedFont.java index 34fb33144..8dfa21db9 100644 --- a/trunk/src/com/jpexs/decompiler/flash/tags/GFxDefineCompactedFont.java +++ b/trunk/src/com/jpexs/decompiler/flash/tags/GFxDefineCompactedFont.java @@ -36,6 +36,7 @@ import com.jpexs.decompiler.flash.types.shaperecords.CurvedEdgeRecord; import com.jpexs.decompiler.flash.types.shaperecords.SHAPERECORD; import com.jpexs.decompiler.flash.types.shaperecords.StraightEdgeRecord; import com.jpexs.decompiler.flash.types.shaperecords.StyleChangeRecord; +import com.jpexs.helpers.Cache; import com.jpexs.helpers.Helper; import java.awt.Color; import java.awt.Font; @@ -44,13 +45,17 @@ import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; import java.io.OutputStream; +import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Stack; import java.util.logging.Level; import java.util.logging.Logger; +import javax.imageio.ImageIO; import javax.swing.JPanel; /** @@ -63,6 +68,35 @@ public class GFxDefineCompactedFont extends FontTag implements DrawableTag { public static final int ID = 1005; public int fontId; public List fonts; + private List shapeCache; + private static Cache imageCache = Cache.getInstance(false); + + private static class SerializableImage implements Serializable { + + transient BufferedImage image; + + public BufferedImage getImage() { + return image; + } + + public void setImage(BufferedImage image) { + this.image = image; + } + + public SerializableImage(BufferedImage image) { + this.image = image; + } + + private void writeObject(ObjectOutputStream out) throws IOException { + out.defaultWriteObject(); + ImageIO.write(image, "png", out); + } + + private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { + in.defaultReadObject(); + image = ImageIO.read(in); + } + } /** * Gets data bytes @@ -104,18 +138,25 @@ public class GFxDefineCompactedFont extends FontTag implements DrawableTag { while (sis.available() > 0) { fonts.add(new FontType(new GFxInputStream(sis))); } + rebuildShapeCache(); + } + + public void rebuildShapeCache() { + shapeCache = fonts.get(0).getGlyphShapes(); } @Override public BufferedImage toImage(int frame, List tags, RECT displayRect, HashMap characters, Stack visited) { + if (imageCache.contains("font" + fontId)) { + return ((SerializableImage) imageCache.get("font" + fontId)).getImage(); + } List shapes = new ArrayList<>(); - for (FontType f : fonts) { - shapes.addAll(f.getGlyphShapes()); + for (int i = 0; i < shapeCache.size(); i++) { + shapes.add(SHAPERECORD.resizeSHAPE(shapeCache.get(i), 20)); } - for (int i = 0; i < shapes.size(); i++) { - shapes.set(i, SHAPERECORD.resizeSHAPE(shapes.get(i), 20)); - } - return SHAPERECORD.shapeListToImage(shapes, 500, 500, Color.black); + BufferedImage ret = SHAPERECORD.shapeListToImage(shapes, 500, 500, Color.black); + imageCache.put("font" + fontId, new SerializableImage(ret)); + return ret; } @Override @@ -152,7 +193,7 @@ public class GFxDefineCompactedFont extends FontTag implements DrawableTag { @Override public List getGlyphShapeTable() { - return fonts.get(0).getGlyphShapes(); + return shapeCache; } @Override @@ -180,6 +221,8 @@ public class GFxDefineCompactedFont extends FontTag implements DrawableTag { int advance = (int) Math.round(fnt.createGlyphVector((new JPanel()).getFontMetrics(fnt).getFontRenderContext(), "" + character).getGlyphMetrics(0).getAdvanceX()); font.glyphInfo.add(pos, new GlyphInfoType(code, advance, 0)); font.glyphs.add(pos, new GlyphType(shp.shapeRecords)); + shapeCache.add(pos, font.glyphs.get(pos).toSHAPE()); + imageCache.remove("font" + fontId); } @Override diff --git a/trunk/src/com/jpexs/decompiler/flash/types/shaperecords/SHAPERECORD.java b/trunk/src/com/jpexs/decompiler/flash/types/shaperecords/SHAPERECORD.java index ca8b42669..9aa00392e 100644 --- a/trunk/src/com/jpexs/decompiler/flash/types/shaperecords/SHAPERECORD.java +++ b/trunk/src/com/jpexs/decompiler/flash/types/shaperecords/SHAPERECORD.java @@ -886,15 +886,6 @@ public abstract class SHAPERECORD implements Cloneable, NeedsCharacters, Seriali int w1 = images.get(pos).getWidth(); int h1 = images.get(pos).getHeight(); - - /*int h = h1 * mw / w1; - int w; - if (h > mh) { - w = w1 * mh / h1; - h = mh; - } else { - w = mw; - }*/ int w = Math.round(ratio * w1); int h = Math.round(ratio * h1); int px = x * mw + mw / 2 - w / 2;