diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java index 464ce4018..017984d3f 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java @@ -1547,9 +1547,11 @@ public final class SWF implements SWFContainerItem, Timelined { for (int c : library) { CharacterTag ch = fswf.getCharacter(c); if (ch instanceof FontTag) { - fos.write(Utf8Helper.getBytes("function " + getTypePrefix(ch) + c + "(ctx,ch,textColor){\r\n")); - fos.write(Utf8Helper.getBytes(((FontTag) ch).toHtmlCanvas(1))); - fos.write(Utf8Helper.getBytes("}\r\n\r\n")); + StringBuilder sb = new StringBuilder(); + sb.append("function ").append(getTypePrefix(ch)).append(c).append("(ctx,ch,textColor){\r\n"); + ((FontTag) ch).toHtmlCanvas(sb, 1); + sb.append("}\r\n\r\n"); + fos.write(Utf8Helper.getBytes(sb.toString())); } else { if (ch instanceof ImageTag) { ImageTag image = (ImageTag) ch; @@ -1560,7 +1562,9 @@ public final class SWF implements SWFContainerItem, Timelined { } fos.write(Utf8Helper.getBytes("function " + getTypePrefix(ch) + c + "(ctx,ctrans,frame,ratio,time){\r\n")); if (ch instanceof DrawableTag) { - fos.write(Utf8Helper.getBytes(((DrawableTag) ch).toHtmlCanvas(1))); + StringBuilder sb = new StringBuilder(); + ((DrawableTag) ch).toHtmlCanvas(sb, 1); + fos.write(Utf8Helper.getBytes(sb.toString())); } fos.write(Utf8Helper.getBytes("}\r\n\r\n")); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScriptParser.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScriptParser.java index 67612caed..f20e46a4c 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScriptParser.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScriptParser.java @@ -106,6 +106,7 @@ import com.jpexs.decompiler.graph.model.TernarOpItem; import com.jpexs.decompiler.graph.model.UnboundedTypeItem; import com.jpexs.decompiler.graph.model.WhileItem; import com.jpexs.helpers.Helper; +import com.jpexs.helpers.utf8.Utf8Helper; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; @@ -2410,7 +2411,7 @@ public class ActionScriptParser { initPlayer(); ABC abc = new ABC(null); ActionScriptParser parser = new ActionScriptParser(abc, playerABCs); - parser.addScript(new String(Helper.readFile(src), "UTF-8"), true, src, classPos); + parser.addScript(new String(Helper.readFile(src), Utf8Helper.charset), true, src, classPos); try (OutputStream fos = new BufferedOutputStream(new FileOutputStream(new File(dst)))) { abc.saveToStream(fos); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/FrameExporter.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/FrameExporter.java index cf8257ffc..3ca672ef2 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/FrameExporter.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/FrameExporter.java @@ -210,50 +210,52 @@ public class FrameExporter { String currentName = ftim.id == 0 ? "main" : SWF.getTypePrefix(fswf.getCharacter(ftim.id)) + ftim.id; - fos.write(Utf8Helper.getBytes("function " + currentName + "(ctx,ctrans,frame,ratio,time){\r\n")); - fos.write(Utf8Helper.getBytes("\tctx.save();\r\n")); - fos.write(Utf8Helper.getBytes("\tctx.transform(1,0,0,1," + (-ftim.displayRect.Xmin * settings.zoom / SWF.unitDivisor) + "," + (-ftim.displayRect.Ymin * settings.zoom / SWF.unitDivisor) + ");\r\n")); - fos.write(Utf8Helper.getBytes(framesToHtmlCanvas(SWF.unitDivisor / settings.zoom, ftim, fframes, 0, null, 0, ftim.displayRect, new ColorTransform(), fbackgroundColor))); - fos.write(Utf8Helper.getBytes("\tctx.restore();\r\n")); - fos.write(Utf8Helper.getBytes("}\r\n\r\n")); + StringBuilder sb = new StringBuilder(); + sb.append("function ").append(currentName).append("(ctx,ctrans,frame,ratio,time){\r\n"); + sb.append("\tctx.save();\r\n"); + sb.append("\tctx.transform(1,0,0,1,").append(-ftim.displayRect.Xmin * settings.zoom / SWF.unitDivisor).append(",").append(-ftim.displayRect.Ymin * settings.zoom / SWF.unitDivisor).append(");\r\n"); + framesToHtmlCanvas(sb, SWF.unitDivisor / settings.zoom, ftim, fframes, 0, null, 0, ftim.displayRect, new ColorTransform(), fbackgroundColor); + sb.append("\tctx.restore();\r\n"); + sb.append("}\r\n\r\n"); - fos.write(Utf8Helper.getBytes("var frame = -1;\r\n")); - fos.write(Utf8Helper.getBytes("var time = 0;\r\n")); - fos.write(Utf8Helper.getBytes("var frames = [];\r\n")); + sb.append("var frame = -1;\r\n"); + sb.append("var time = 0;\r\n"); + sb.append("var frames = [];\r\n"); for (int i : fframes) { - fos.write(Utf8Helper.getBytes("frames.push(" + i + ");\r\n")); + sb.append("frames.push(").append(i).append(");\r\n"); } - fos.write(Utf8Helper.getBytes("\r\n")); + sb.append("\r\n"); RGB backgroundColor1 = new RGB(255, 255, 255); for (Tag t : fswf.tags) { if (t instanceof SetBackgroundColorTag) { - SetBackgroundColorTag sb = (SetBackgroundColorTag) t; - backgroundColor1 = sb.backgroundColor; + SetBackgroundColorTag sbgct = (SetBackgroundColorTag) t; + backgroundColor1 = sbgct.backgroundColor; } } - fos.write(Utf8Helper.getBytes("var backgroundColor = \"" + backgroundColor1.toHexRGB() + "\";\r\n")); - fos.write(Utf8Helper.getBytes("var originalWidth = " + width + ";\r\n")); - fos.write(Utf8Helper.getBytes("var originalHeight= " + height + ";\r\n")); - fos.write(Utf8Helper.getBytes("function nextFrame(ctx,ctrans){\r\n")); - fos.write(Utf8Helper.getBytes("\tvar oldframe = frame;\r\n")); - fos.write(Utf8Helper.getBytes("\tframe = (frame+1)%frames.length;\r\n")); - fos.write(Utf8Helper.getBytes("\tif(frame==oldframe){time++;}else{time=0;};\r\n")); - fos.write(Utf8Helper.getBytes("\tdrawFrame();\r\n")); - fos.write(Utf8Helper.getBytes("}\r\n\r\n")); + sb.append("var backgroundColor = \"").append(backgroundColor1.toHexRGB()).append("\";\r\n"); + sb.append("var originalWidth = ").append(width).append(";\r\n"); + sb.append("var originalHeight= ").append(height).append(";\r\n"); + sb.append("function nextFrame(ctx,ctrans){\r\n"); + sb.append("\tvar oldframe = frame;\r\n"); + sb.append("\tframe = (frame+1)%frames.length;\r\n"); + sb.append("\tif(frame==oldframe){time++;}else{time=0;};\r\n"); + sb.append("\tdrawFrame();\r\n"); + sb.append("}\r\n\r\n"); - fos.write(Utf8Helper.getBytes("function drawFrame(){\r\n")); - fos.write(Utf8Helper.getBytes("\tctx.fillStyle = backgroundColor;\r\n")); - fos.write(Utf8Helper.getBytes("\tctx.fillRect(0,0,canvas.width,canvas.height);\r\n")); - fos.write(Utf8Helper.getBytes("\tctx.save();\r\n")); - fos.write(Utf8Helper.getBytes("\tctx.transform(canvas.width/originalWidth,0,0,canvas.height/originalHeight,0,0);\r\n")); - fos.write(Utf8Helper.getBytes("\t" + currentName + "(ctx,ctrans,frames[frame],0,time);\r\n")); - fos.write(Utf8Helper.getBytes("\tctx.restore();\r\n")); - fos.write(Utf8Helper.getBytes("}\r\n\r\n")); + sb.append("function drawFrame(){\r\n"); + sb.append("\tctx.fillStyle = backgroundColor;\r\n"); + sb.append("\tctx.fillRect(0,0,canvas.width,canvas.height);\r\n"); + sb.append("\tctx.save();\r\n"); + sb.append("\tctx.transform(canvas.width/originalWidth,0,0,canvas.height/originalHeight,0,0);\r\n"); + sb.append("\t").append(currentName).append("(ctx,ctrans,frames[frame],0,time);\r\n"); + sb.append("\tctx.restore();\r\n"); + sb.append("}\r\n\r\n"); if (ftim.swf.frameRate > 0) { - fos.write(Utf8Helper.getBytes("window.setInterval(function(){nextFrame(ctx,ctrans);}," + (int) (1000.0 / ftim.swf.frameRate) + ");\r\n")); + sb.append("window.setInterval(function(){nextFrame(ctx,ctrans);},").append((int) (1000.0 / ftim.swf.frameRate)).append(");\r\n"); } - fos.write(Utf8Helper.getBytes("nextFrame(ctx,ctrans);\r\n")); + sb.append("nextFrame(ctx,ctrans);\r\n"); + fos.write(Utf8Helper.getBytes(sb.toString())); } boolean packed = false; @@ -455,8 +457,7 @@ public class FrameExporter { } } - public static String framesToHtmlCanvas(double unitDivisor, Timeline timeline, List frames, int time, DepthState stateUnderCursor, int mouseButton, RECT displayRect, ColorTransform colorTransform, Color backGroundColor) { - StringBuilder sb = new StringBuilder(); + public static void framesToHtmlCanvas(StringBuilder result, double unitDivisor, Timeline timeline, List frames, int time, DepthState stateUnderCursor, int mouseButton, RECT displayRect, ColorTransform colorTransform, Color backGroundColor) { if (frames == null) { frames = new ArrayList<>(); for (int i = 0; i < timeline.getFrameCount(); i++) { @@ -464,29 +465,29 @@ public class FrameExporter { } } - sb.append("\tvar clips = [];\r\n"); - sb.append("\tvar frame_cnt = ").append(timeline.getFrameCount()).append(";\r\n"); - sb.append("\tframe = frame % frame_cnt;\r\n"); - sb.append("\tswitch(frame){\r\n"); + result.append("\tvar clips = [];\r\n"); + result.append("\tvar frame_cnt = ").append(timeline.getFrameCount()).append(";\r\n"); + result.append("\tframe = frame % frame_cnt;\r\n"); + result.append("\tswitch(frame){\r\n"); int maxDepth = timeline.getMaxDepth(); Stack clipDepths = new Stack<>(); for (int frame : frames) { - sb.append("\t\tcase ").append(frame).append(":\r\n"); + result.append("\t\tcase ").append(frame).append(":\r\n"); Frame frameObj = timeline.getFrame(frame); for (int i = 1; i <= maxDepth + 1; i++) { while (!clipDepths.isEmpty() && clipDepths.peek() <= i) { clipDepths.pop(); - sb.append("\t\t\tvar o = clips.pop();\r\n"); - sb.append("\t\t\tctx.globalCompositeOperation = \"destination-in\";\r\n"); - sb.append("\t\t\tctx.setTransform(1,0,0,1,0,0);\r\n"); - sb.append("\t\t\tctx.drawImage(o.clipCanvas,0,0);\r\n"); - sb.append("\t\t\tvar ms=o.ctx._matrix;\r\n"); - sb.append("\t\t\to.ctx.setTransform(1,0,0,1,0,0);\r\n"); - sb.append("\t\t\to.ctx.globalCompositeOperation = \"source-over\";\r\n"); - sb.append("\t\t\to.ctx.drawImage(canvas,0,0);\r\n"); - sb.append("\t\t\to.ctx.applyTransforms(ms);\r\n"); - sb.append("\t\t\tctx = o.ctx;\r\n"); - sb.append("\t\t\tcanvas = o.canvas;\r\n"); + result.append("\t\t\tvar o = clips.pop();\r\n"); + result.append("\t\t\tctx.globalCompositeOperation = \"destination-in\";\r\n"); + result.append("\t\t\tctx.setTransform(1,0,0,1,0,0);\r\n"); + result.append("\t\t\tctx.drawImage(o.clipCanvas,0,0);\r\n"); + result.append("\t\t\tvar ms=o.ctx._matrix;\r\n"); + result.append("\t\t\to.ctx.setTransform(1,0,0,1,0,0);\r\n"); + result.append("\t\t\to.ctx.globalCompositeOperation = \"source-over\";\r\n"); + result.append("\t\t\to.ctx.drawImage(canvas,0,0);\r\n"); + result.append("\t\t\to.ctx.applyTransforms(ms);\r\n"); + result.append("\t\t\tctx = o.ctx;\r\n"); + result.append("\t\t\tcanvas = o.canvas;\r\n"); } if (!frameObj.layers.containsKey(i)) { continue; @@ -525,22 +526,22 @@ public class FrameExporter { if (layer.clipDepth != -1) { clipDepths.push(layer.clipDepth); - sb.append("\t\t\tclips.push({ctx:ctx,canvas:canvas});\r\n"); - sb.append("\t\t\tvar ccanvas = createCanvas(canvas.width,canvas.height);\r\n"); - sb.append("\t\t\tvar cctx = ccanvas.getContext(\"2d\");\r\n"); - sb.append("\t\t\tenhanceContext(cctx);\r\n"); - sb.append("\t\t\tcctx.applyTransforms(ctx._matrix);\r\n"); - sb.append("\t\t\tcanvas = ccanvas;\r\n"); - sb.append("\t\t\tctx = cctx;\r\n"); + result.append("\t\t\tclips.push({ctx:ctx,canvas:canvas});\r\n"); + result.append("\t\t\tvar ccanvas = createCanvas(canvas.width,canvas.height);\r\n"); + result.append("\t\t\tvar cctx = ccanvas.getContext(\"2d\");\r\n"); + result.append("\t\t\tenhanceContext(cctx);\r\n"); + result.append("\t\t\tcctx.applyTransforms(ctx._matrix);\r\n"); + result.append("\t\t\tcanvas = ccanvas;\r\n"); + result.append("\t\t\tctx = cctx;\r\n"); } if (layer.filters != null && layer.filters.size() > 0) { - sb.append("\t\t\tvar oldctx = ctx;\r\n"); - sb.append("\t\t\tvar fcanvas = createCanvas(canvas.width,canvas.height);"); - sb.append("\t\t\tvar fctx = fcanvas.getContext(\"2d\");\r\n"); - sb.append("\t\t\tenhanceContext(fctx);\r\n"); - sb.append("\t\t\tfctx.applyTransforms(ctx._matrix);\r\n"); - sb.append("\t\t\tctx = fctx;\r\n"); + result.append("\t\t\tvar oldctx = ctx;\r\n"); + result.append("\t\t\tvar fcanvas = createCanvas(canvas.width,canvas.height);"); + result.append("\t\t\tvar fctx = fcanvas.getContext(\"2d\");\r\n"); + result.append("\t\t\tenhanceContext(fctx);\r\n"); + result.append("\t\t\tfctx.applyTransforms(ctx._matrix);\r\n"); + result.append("\t\t\tctx = fctx;\r\n"); } ColorTransform ctrans = layer.colorTransForm; @@ -553,7 +554,7 @@ public class FrameExporter { + ctrans.getRedMulti() + "," + ctrans.getGreenMulti() + "," + ctrans.getBlueMulti() + "," + ctrans.getAlphaMulti() + "))"; } - sb.append("\t\t\tplace(\"").append(SWF.getTypePrefix(character)).append(layer.characterId).append("\",canvas,ctx,[").append(placeMatrix.scaleX).append(",") + result.append("\t\t\tplace(\"").append(SWF.getTypePrefix(character)).append(layer.characterId).append("\",canvas,ctx,[").append(placeMatrix.scaleX).append(",") .append(placeMatrix.rotateSkew0).append(",") .append(placeMatrix.rotateSkew1).append(",") .append(placeMatrix.scaleY).append(",") @@ -564,15 +565,15 @@ public class FrameExporter { for (FILTER filter : layer.filters) { if (filter instanceof COLORMATRIXFILTER) { COLORMATRIXFILTER cmf = (COLORMATRIXFILTER) filter; - sb.append("\t\t\tfcanvas = Filters.colorMatrix(fcanvas,fcanvas.getContext(\"2d\"),["); + result.append("\t\t\tfcanvas = Filters.colorMatrix(fcanvas,fcanvas.getContext(\"2d\"),["); for (int k = 0; k < cmf.matrix.length; k++) { if (k > 0) { - sb.append(","); + result.append(","); } - sb.append(cmf.matrix[k]); + result.append(cmf.matrix[k]); } - sb.append("]"); - sb.append(");\r\n"); + result.append("]"); + result.append(");\r\n"); } if (filter instanceof CONVOLUTIONFILTER) { @@ -593,17 +594,17 @@ public class FrameExporter { mat += matrix2[k]; } mat += "]"; - sb.append("\t\t\tfcanvas = Filters.convolution(fcanvas,fcanvas.getContext(\"2d\"),").append(mat).append(",false);\r\n"); + result.append("\t\t\tfcanvas = Filters.convolution(fcanvas,fcanvas.getContext(\"2d\"),").append(mat).append(",false);\r\n"); } if (filter instanceof GLOWFILTER) { GLOWFILTER gf = (GLOWFILTER) filter; - sb.append("\t\t\tfcanvas = Filters.glow(fcanvas,fcanvas.getContext(\"2d\"),").append(gf.blurX).append(",").append(gf.blurY).append(",").append(gf.strength).append(",").append(jsArrColor(gf.glowColor)).append(",").append(gf.innerGlow ? "true" : "false").append(",").append(gf.knockout ? "true" : "false").append(",").append(gf.passes).append(");\r\n"); + result.append("\t\t\tfcanvas = Filters.glow(fcanvas,fcanvas.getContext(\"2d\"),").append(gf.blurX).append(",").append(gf.blurY).append(",").append(gf.strength).append(",").append(jsArrColor(gf.glowColor)).append(",").append(gf.innerGlow ? "true" : "false").append(",").append(gf.knockout ? "true" : "false").append(",").append(gf.passes).append(");\r\n"); } if (filter instanceof DROPSHADOWFILTER) { DROPSHADOWFILTER ds = (DROPSHADOWFILTER) filter; - sb.append("\t\t\tfcanvas = Filters.dropShadow(fcanvas,fcanvas.getContext(\"2d\"),").append(ds.blurX).append(",").append(ds.blurY).append(",").append((int) (ds.angle * 180 / Math.PI)).append(",").append(ds.distance).append(",").append(jsArrColor(ds.dropShadowColor)).append(",").append(ds.innerShadow ? "true" : "false").append(",").append(ds.passes).append(",").append(ds.strength).append(",").append(ds.knockout ? "true" : "false").append(");\r\n"); + result.append("\t\t\tfcanvas = Filters.dropShadow(fcanvas,fcanvas.getContext(\"2d\"),").append(ds.blurX).append(",").append(ds.blurY).append(",").append((int) (ds.angle * 180 / Math.PI)).append(",").append(ds.distance).append(",").append(jsArrColor(ds.dropShadowColor)).append(",").append(ds.innerShadow ? "true" : "false").append(",").append(ds.passes).append(",").append(ds.strength).append(",").append(ds.knockout ? "true" : "false").append(");\r\n"); } if (filter instanceof BEVELFILTER) { BEVELFILTER bv = (BEVELFILTER) filter; @@ -613,7 +614,7 @@ public class FrameExporter { } else if (!bv.innerShadow) { type = "Filters.OUTER"; } - sb.append("\t\t\tfcanvas = Filters.bevel(fcanvas,fcanvas.getContext(\"2d\"),").append(bv.blurX).append(",").append(bv.blurY).append(",").append(bv.strength).append(",").append(type).append(",").append(jsArrColor(bv.highlightColor)).append(",").append(jsArrColor(bv.shadowColor)).append(",").append((int) (bv.angle * 180 / Math.PI)).append(",").append(bv.distance).append(",").append(bv.knockout ? "true" : "false").append(",").append(bv.passes).append(");\r\n"); + result.append("\t\t\tfcanvas = Filters.bevel(fcanvas,fcanvas.getContext(\"2d\"),").append(bv.blurX).append(",").append(bv.blurY).append(",").append(bv.strength).append(",").append(type).append(",").append(jsArrColor(bv.highlightColor)).append(",").append(jsArrColor(bv.shadowColor)).append(",").append((int) (bv.angle * 180 / Math.PI)).append(",").append(bv.distance).append(",").append(bv.knockout ? "true" : "false").append(",").append(bv.passes).append(");\r\n"); } if (filter instanceof GRADIENTBEVELFILTER) { @@ -637,7 +638,7 @@ public class FrameExporter { type = "Filters.OUTER"; } - sb.append("\t\t\tfcanvas = Filters.gradientBevel(fcanvas,fcanvas.getContext(\"2d\"),").append(colArr).append(",").append(ratArr).append(",").append(gbf.blurX).append(",").append(gbf.blurY).append(",").append(gbf.strength).append(",").append(type).append(",").append((int) (gbf.angle * 180 / Math.PI)).append(",").append(gbf.distance).append(",").append(gbf.knockout ? "true" : "false").append(",").append(gbf.passes).append(");\r\n"); + result.append("\t\t\tfcanvas = Filters.gradientBevel(fcanvas,fcanvas.getContext(\"2d\"),").append(colArr).append(",").append(ratArr).append(",").append(gbf.blurX).append(",").append(gbf.blurY).append(",").append(gbf.strength).append(",").append(type).append(",").append((int) (gbf.angle * 180 / Math.PI)).append(",").append(gbf.distance).append(",").append(gbf.knockout ? "true" : "false").append(",").append(gbf.passes).append(");\r\n"); } if (filter instanceof GRADIENTGLOWFILTER) { @@ -661,28 +662,27 @@ public class FrameExporter { type = "Filters.OUTER"; } - sb.append("\t\t\tfcanvas = Filters.gradientGlow(fcanvas,fcanvas.getContext(\"2d\"),").append(ggf.blurX).append(",").append(ggf.blurY).append(",").append((int) (ggf.angle * 180 / Math.PI)).append(",").append(ggf.distance).append(",").append(colArr).append(",").append(ratArr).append(",").append(type).append(",").append(ggf.passes).append(",").append(ggf.strength).append(",").append(ggf.knockout ? "true" : "false").append(");\r\n"); + result.append("\t\t\tfcanvas = Filters.gradientGlow(fcanvas,fcanvas.getContext(\"2d\"),").append(ggf.blurX).append(",").append(ggf.blurY).append(",").append((int) (ggf.angle * 180 / Math.PI)).append(",").append(ggf.distance).append(",").append(colArr).append(",").append(ratArr).append(",").append(type).append(",").append(ggf.passes).append(",").append(ggf.strength).append(",").append(ggf.knockout ? "true" : "false").append(");\r\n"); } } - sb.append("\t\t\tctx = oldctx;\r\n"); - sb.append("\t\t\tvar ms=ctx._matrix;\r\n"); - sb.append("\t\t\tctx.setTransform(1,0,0,1,0,0);\r\n"); - sb.append("\t\t\tctx.drawImage(fcanvas,0,0);\r\n"); - sb.append("\t\t\tctx.applyTransforms(ms);\r\n"); + result.append("\t\t\tctx = oldctx;\r\n"); + result.append("\t\t\tvar ms=ctx._matrix;\r\n"); + result.append("\t\t\tctx.setTransform(1,0,0,1,0,0);\r\n"); + result.append("\t\t\tctx.drawImage(fcanvas,0,0);\r\n"); + result.append("\t\t\tctx.applyTransforms(ms);\r\n"); } if (layer.clipDepth != -1) { - sb.append("\t\t\tclips[clips.length-1].clipCanvas = canvas;\r\n"); - sb.append("\t\t\tcanvas = createCanvas(canvas.width,canvas.height);\r\n"); - sb.append("\t\t\tvar nctx = canvas.getContext(\"2d\");\r\n"); - sb.append("\t\t\tenhanceContext(nctx);\r\n"); - sb.append("\t\t\tnctx.applyTransforms(ctx._matrix);\r\n"); - sb.append("\t\t\tctx = nctx;\r\n"); + result.append("\t\t\tclips[clips.length-1].clipCanvas = canvas;\r\n"); + result.append("\t\t\tcanvas = createCanvas(canvas.width,canvas.height);\r\n"); + result.append("\t\t\tvar nctx = canvas.getContext(\"2d\");\r\n"); + result.append("\t\t\tenhanceContext(nctx);\r\n"); + result.append("\t\t\tnctx.applyTransforms(ctx._matrix);\r\n"); + result.append("\t\t\tctx = nctx;\r\n"); } } - sb.append("\t\t\tbreak;\r\n"); + result.append("\t\t\tbreak;\r\n"); } - sb.append("\t}\r\n"); - return sb.toString(); + result.append("\t}\r\n"); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/MorphShapeExporter.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/MorphShapeExporter.java index 22d21160d..cd0c4d8e4 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/MorphShapeExporter.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/MorphShapeExporter.java @@ -112,7 +112,7 @@ public class MorphShapeExporter { ct.getNeededCharactersDeep(needed); ByteArrayOutputStream baos = new ByteArrayOutputStream(); SWF.writeLibrary(ct.getSwf(), needed, baos); - fos.write(Utf8Helper.getBytes(cse.getHtml(new String(baos.toByteArray(), "UTF-8"), SWF.getTypePrefix(mst) + mst.getCharacterId(), mst.getRect()))); + fos.write(Utf8Helper.getBytes(cse.getHtml(new String(baos.toByteArray(), Utf8Helper.charset), SWF.getTypePrefix(mst) + mst.getCharacterId(), mst.getRect()))); } break; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/ShapeExporter.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/ShapeExporter.java index 97c58468b..a6ac44545 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/ShapeExporter.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/ShapeExporter.java @@ -144,7 +144,7 @@ public class ShapeExporter { st.getNeededCharactersDeep(needed); ByteArrayOutputStream baos = new ByteArrayOutputStream(); SWF.writeLibrary(st.getSwf(), needed, baos); - fos.write(Utf8Helper.getBytes(cse.getHtml(new String(baos.toByteArray(), "UTF-8"), SWF.getTypePrefix(st) + st.getCharacterId(), st.getRect()))); + fos.write(Utf8Helper.getBytes(cse.getHtml(new String(baos.toByteArray(), Utf8Helper.charset), SWF.getTypePrefix(st) + st.getCharacterId(), st.getRect()))); } break; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineEditTextTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineEditTextTag.java index 97208e00c..92891ff32 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineEditTextTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineEditTextTag.java @@ -920,21 +920,20 @@ public class DefineEditTextTag extends TextTag { @Override public void toImage(int frame, int time, int ratio, RenderContext renderContext, SerializableImage image, Matrix transformation, ColorTransform colorTransform) { - render(TextRenderMode.BITMAP, image, null, transformation, colorTransform, 1); + render(TextRenderMode.BITMAP, image, null, null, transformation, colorTransform, 1); } @Override public void toSVG(SVGExporter exporter, int ratio, ColorTransform colorTransform, int level, double zoom) { - render(TextRenderMode.SVG, null, exporter, new Matrix(), colorTransform, zoom); + render(TextRenderMode.SVG, null, exporter, null, new Matrix(), colorTransform, zoom); } @Override - public String toHtmlCanvas(double unitDivisor) { - return render(TextRenderMode.HTML5_CANVAS, null, null, new Matrix(), new ColorTransform(), unitDivisor); + public void toHtmlCanvas(StringBuilder result, double unitDivisor) { + render(TextRenderMode.HTML5_CANVAS, null, null, result, new Matrix(), new ColorTransform(), unitDivisor); } - private String render(TextRenderMode renderMode, SerializableImage image, SVGExporter svgExporter, Matrix transformation, ColorTransform colorTransform, double zoom) { - String result = ""; + private void render(TextRenderMode renderMode, SerializableImage image, SVGExporter svgExporter, StringBuilder htmlCanvasBuilder, Matrix transformation, ColorTransform colorTransform, double zoom) { if (border) { // border is always black, fill color is always white? RGB borderColor = new RGBA(Color.black); @@ -944,7 +943,7 @@ public class DefineEditTextTag extends TextTag { drawBorder(swf, image, borderColor, fillColor, getRect(), getTextMatrix(), transformation, colorTransform); break; case HTML5_CANVAS: - result += drawBorderHtmlCanvas(swf, borderColor, fillColor, getRect(), getTextMatrix(), colorTransform, zoom); + drawBorderHtmlCanvas(swf, htmlCanvasBuilder, borderColor, fillColor, getRect(), getTextMatrix(), colorTransform, zoom); break; case SVG: drawBorderSVG(swf, svgExporter, borderColor, fillColor, getRect(), getTextMatrix(), colorTransform, zoom); @@ -1131,15 +1130,13 @@ public class DefineEditTextTag extends TextTag { staticTextToImage(swf, allTextRecords, 2, image, getTextMatrix(), transformation, colorTransform); break; case HTML5_CANVAS: - result += staticTextToHtmlCanvas(zoom, swf, allTextRecords, 2, getBounds(), getTextMatrix(), colorTransform); + staticTextToHtmlCanvas(zoom, swf, allTextRecords, 2, htmlCanvasBuilder, getBounds(), getTextMatrix(), colorTransform); break; case SVG: staticTextToSVG(swf, allTextRecords, 2, svgExporter, getBounds(), getTextMatrix(), colorTransform, zoom); break; } } - - return result; } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineSpriteTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineSpriteTag.java index c68b750dd..7de474d70 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineSpriteTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineSpriteTag.java @@ -351,8 +351,8 @@ public class DefineSpriteTag extends CharacterTag implements DrawableTag, Timeli } @Override - public String toHtmlCanvas(double unitDivisor) { - return getTimeline().toHtmlCanvas(unitDivisor, null); + public void toHtmlCanvas(StringBuilder result, double unitDivisor) { + getTimeline().toHtmlCanvas(result, unitDivisor, null); } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/ButtonTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/ButtonTag.java index 5837c52b5..337e1de16 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/ButtonTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/ButtonTag.java @@ -93,7 +93,7 @@ public abstract class ButtonTag extends CharacterTag implements DrawableTag, Tim } @Override - public String toHtmlCanvas(double unitDivisor) { - return getTimeline().toHtmlCanvas(unitDivisor, Arrays.asList(0)); //TODO: handle states? + public void toHtmlCanvas(StringBuilder result, double unitDivisor) { + getTimeline().toHtmlCanvas(result, unitDivisor, Arrays.asList(0)); //TODO: handle states? } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/DrawableTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/DrawableTag.java index 5eb64139e..aa03ec872 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/DrawableTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/DrawableTag.java @@ -43,7 +43,7 @@ public interface DrawableTag extends BoundedTag { public void toSVG(SVGExporter exporter, int ratio, ColorTransform colorTransform, int level, double zoom) throws IOException; - public String toHtmlCanvas(double unitDivisor); + public void toHtmlCanvas(StringBuilder result, double unitDivisor); public int getNumFrames(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/FontTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/FontTag.java index 91333d03a..41c1cbe90 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/FontTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/FontTag.java @@ -317,23 +317,21 @@ public abstract class FontTag extends CharacterTag implements AloneTag, Drawable } @Override - public String toHtmlCanvas(double unitDivisor) { + public void toHtmlCanvas(StringBuilder result, double unitDivisor) { List shapes = getGlyphShapeTable(); - StringBuilder sb = new StringBuilder(); - sb.append("\tdefaultFill = textColor;\r\n"); - sb.append("\tswitch(ch){\r\n"); + result.append("\tdefaultFill = textColor;\r\n"); + result.append("\tswitch(ch){\r\n"); for (int i = 0; i < shapes.size(); i++) { char c = glyphToChar(i); String cs = "" + c; cs = cs.replace("\\", "\\\\").replace("\"", "\\\""); - sb.append("\t\tcase \"").append(cs).append("\":\r\n"); + result.append("\t\tcase \"").append(cs).append("\":\r\n"); CanvasShapeExporter exporter = new CanvasShapeExporter(null, unitDivisor, swf, shapes.get(i), new ColorTransform(), 0, 0); exporter.export(); - sb.append("\t\t").append(exporter.getShapeData().replaceAll("\r\n", "\r\n\t\t")); - sb.append("\tbreak;\r\n"); + result.append("\t\t").append(exporter.getShapeData().replaceAll("\r\n", "\r\n\t\t")); + result.append("\tbreak;\r\n"); } - sb.append("\t}\r\n"); - return sb.toString(); + result.append("\t}\r\n"); } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/ImageTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/ImageTag.java index 7be657c57..f35d6519c 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/ImageTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/ImageTag.java @@ -259,10 +259,10 @@ public abstract class ImageTag extends CharacterTag implements DrawableTag { } @Override - public String toHtmlCanvas(double unitDivisor) { + public void toHtmlCanvas(StringBuilder result, double unitDivisor) { CanvasShapeExporter cse = new CanvasShapeExporter(null, unitDivisor, swf, getShape(), new ColorTransform(), 0, 0); cse.export(); - return cse.getShapeData(); + result.append(cse.getShapeData()); } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/MorphShapeTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/MorphShapeTag.java index b5bfe14ea..3dcb96062 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/MorphShapeTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/MorphShapeTag.java @@ -319,9 +319,9 @@ public abstract class MorphShapeTag extends CharacterTag implements DrawableTag } @Override - public String toHtmlCanvas(double unitDivisor) { + public void toHtmlCanvas(StringBuilder result, double unitDivisor) { CanvasMorphShapeExporter cmse = new CanvasMorphShapeExporter(swf, getShapeAtRatio(0), getShapeAtRatio(MAX_RATIO), new ColorTransform(), unitDivisor, 0, 0); cmse.export(); - return cmse.getShapeData(); + result.append(cmse.getShapeData()); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/ShapeTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/ShapeTag.java index 6a3f3b473..d24184573 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/ShapeTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/ShapeTag.java @@ -182,10 +182,10 @@ public abstract class ShapeTag extends CharacterTag implements DrawableTag, Lazy } @Override - public String toHtmlCanvas(double unitDivisor) { + public void toHtmlCanvas(StringBuilder result, double unitDivisor) { CanvasShapeExporter cse = new CanvasShapeExporter(null, unitDivisor, swf, getShapes(), new ColorTransform(), 0, 0); cse.export(); - return cse.getShapeData(); + result.append(cse.getShapeData()); } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/StaticTextTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/StaticTextTag.java index 29763508e..0c210cfde 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/StaticTextTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/StaticTextTag.java @@ -642,7 +642,7 @@ public abstract class StaticTextTag extends TextTag { } @Override - public String toHtmlCanvas(double unitDivisor) { - return staticTextToHtmlCanvas(unitDivisor, swf, textRecords, getTextNum(), textBounds, textMatrix, new ColorTransform()); + public void toHtmlCanvas(StringBuilder result, double unitDivisor) { + staticTextToHtmlCanvas(unitDivisor, swf, textRecords, getTextNum(), result, textBounds, textMatrix, new ColorTransform()); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/TextTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/TextTag.java index 19cd1ce23..8543315af 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/TextTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/TextTag.java @@ -395,17 +395,15 @@ public abstract class TextTag extends CharacterTag implements DrawableTag { BitmapExporter.export(swf, getBorderShape(borderColor, fillColor, rect), null, image, mat, colorTransform); } - public static String drawBorderHtmlCanvas(SWF swf, RGB borderColor, RGB fillColor, RECT rect, MATRIX textMatrix, ColorTransform colorTransform, double unitDivisor) { - String ret = ""; + public static void drawBorderHtmlCanvas(SWF swf, StringBuilder result, RGB borderColor, RGB fillColor, RECT rect, MATRIX textMatrix, ColorTransform colorTransform, double unitDivisor) { Matrix mat = new Matrix(textMatrix); - ret += "\tctx.save();\r\n"; - ret += "\tctx.transform(" + mat.scaleX + "," + mat.rotateSkew0 + "," + mat.rotateSkew1 + "," + mat.scaleY + "," + mat.translateX + "," + mat.translateY + ");\r\n"; + result.append("\tctx.save();\r\n"); + result.append("\tctx.transform(").append(mat.scaleX).append(",").append(mat.rotateSkew0).append(",").append(mat.rotateSkew1).append(",").append(mat.scaleY).append(",").append(mat.translateX).append(",").append(mat.translateY).append(");\r\n"); SHAPE shape = getBorderShape(borderColor, fillColor, rect); CanvasShapeExporter cse = new CanvasShapeExporter(null, unitDivisor, swf, shape, colorTransform, 0, 0); cse.export(); - ret += cse.getShapeData(); - ret += "\tctx.restore();\r\n"; - return ret; + result.append(cse.getShapeData()); + result.append("\tctx.restore();\r\n"); } public static void drawBorderSVG(SWF swf, SVGExporter exporter, RGB borderColor, RGB fillColor, RECT rect, MATRIX textMatrix, ColorTransform colorTransform, double zoom) { @@ -564,9 +562,8 @@ public abstract class TextTag extends CharacterTag implements DrawableTag { } } - public static String staticTextToHtmlCanvas(double unitDivisor, SWF swf, List textRecords, int numText, RECT bounds, MATRIX textMatrix, ColorTransform colorTransform) { + public static void staticTextToHtmlCanvas(double unitDivisor, SWF swf, List textRecords, int numText, StringBuilder result, RECT bounds, MATRIX textMatrix, ColorTransform colorTransform) { int textColor = 0; - String ret = ""; FontTag font = null; int fontId = -1; int textHeight = 12; @@ -597,20 +594,19 @@ public abstract class TextTag extends CharacterTag implements DrawableTag { double rat = textHeight / 1024.0 / font.getDivider(); - ret += "\tvar textColor = " + CanvasShapeExporter.color(textColor) + ";\r\n"; + result.append("\tvar textColor = ").append(CanvasShapeExporter.color(textColor)).append(";\r\n"); for (GLYPHENTRY entry : rec.glyphEntries) { Matrix mat = (new Matrix(textMatrix).concatenate(Matrix.getTranslateInstance(x, y))).concatenate(Matrix.getScaleInstance(rat)); if (entry.glyphIndex != -1) { // shapeNum: 1 - ret += "\tctx.save();\r\n"; - ret += "\tctx.transform(" + mat.scaleX + "," + mat.rotateSkew0 + "," + mat.rotateSkew1 + "," + mat.scaleY + "," + mat.translateX + "," + mat.translateY + ");\r\n"; - ret += "\tfont" + fontId + "(ctx,\"" + ("" + font.glyphToChar(entry.glyphIndex)).replace("\\", "\\\\").replace("\"", "\\\"") + "\",textColor);\r\n"; - ret += "\tctx.restore();\r\n"; + result.append("\tctx.save();\r\n"); + result.append("\tctx.transform(").append(mat.scaleX).append(",").append(mat.rotateSkew0).append(",").append(mat.rotateSkew1).append(",").append(mat.scaleY).append(",").append(mat.translateX).append(",").append(mat.translateY).append(");\r\n"); + result.append("\tfont").append(fontId).append("(ctx,\"").append(("" + font.glyphToChar(entry.glyphIndex)).replace("\\", "\\\\").replace("\"", "\\\"")).append("\",textColor);\r\n"); + result.append("\tctx.restore();\r\n"); x += entry.glyphAdvance; } } } - return ret; } public static void staticTextToSVG(SWF swf, List textRecords, int numText, SVGExporter exporter, RECT bounds, MATRIX textMatrix, ColorTransform colorTransform, double zoom) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/timeline/Timeline.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/timeline/Timeline.java index d1f67d936..57e2589c6 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/timeline/Timeline.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/timeline/Timeline.java @@ -507,8 +507,8 @@ public class Timeline { SWF.frameToImage(this, frame, time, renderContext, image, transformation, colorTransform); } - public String toHtmlCanvas(double unitDivisor, List frames) { - return FrameExporter.framesToHtmlCanvas(unitDivisor, this, frames, 0, null, 0, displayRect, new ColorTransform(), null); + public void toHtmlCanvas(StringBuilder result, double unitDivisor, List frames) { + FrameExporter.framesToHtmlCanvas(result, unitDivisor, this, frames, 0, null, 0, displayRect, new ColorTransform(), null); } public void getSounds(int frame, int time, DepthState stateUnderCursor, int mouseButton, List sounds, List soundClasses) { diff --git a/src/com/jpexs/decompiler/flash/gui/debugger/Debugger.java b/src/com/jpexs/decompiler/flash/gui/debugger/Debugger.java index c25dcf063..c45927e49 100644 --- a/src/com/jpexs/decompiler/flash/gui/debugger/Debugger.java +++ b/src/com/jpexs/decompiler/flash/gui/debugger/Debugger.java @@ -16,6 +16,7 @@ */ package com.jpexs.decompiler.flash.gui.debugger; +import com.jpexs.helpers.utf8.Utf8Helper; import java.io.ByteArrayOutputStream; import java.io.EOFException; import java.io.IOException; @@ -90,7 +91,7 @@ public class Debugger { } buf[i] = (byte) rd; } - return new String(buf, "UTF-8"); + return new String(buf, Utf8Helper.charset); } @Override