mirror of
https://git.huckle.dev/Huckles-Minecraft-Archive/jpexs-decompiler.git
synced 2026-05-28 07:36:19 +00:00
html5 export: use stringbuilder
This commit is contained in:
@@ -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"));
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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<Integer> 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<Integer> 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<Integer> 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");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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?
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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<SHAPE> 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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<TEXTRECORD> textRecords, int numText, RECT bounds, MATRIX textMatrix, ColorTransform colorTransform) {
|
||||
public static void staticTextToHtmlCanvas(double unitDivisor, SWF swf, List<TEXTRECORD> 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<TEXTRECORD> textRecords, int numText, SVGExporter exporter, RECT bounds, MATRIX textMatrix, ColorTransform colorTransform, double zoom) {
|
||||
|
||||
@@ -507,8 +507,8 @@ public class Timeline {
|
||||
SWF.frameToImage(this, frame, time, renderContext, image, transformation, colorTransform);
|
||||
}
|
||||
|
||||
public String toHtmlCanvas(double unitDivisor, List<Integer> frames) {
|
||||
return FrameExporter.framesToHtmlCanvas(unitDivisor, this, frames, 0, null, 0, displayRect, new ColorTransform(), null);
|
||||
public void toHtmlCanvas(StringBuilder result, double unitDivisor, List<Integer> 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<Integer> sounds, List<String> soundClasses) {
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user