html5 export: use stringbuilder

This commit is contained in:
honfika@gmail.com
2015-06-10 20:23:11 +02:00
parent ed0be348fa
commit fb16daffdf
17 changed files with 143 additions and 146 deletions

View File

@@ -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"));
}

View File

@@ -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);
}

View File

@@ -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");
}
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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

View File

@@ -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

View File

@@ -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?
}
}

View File

@@ -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();

View File

@@ -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

View File

@@ -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

View File

@@ -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());
}
}

View File

@@ -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

View File

@@ -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());
}
}

View File

@@ -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) {

View File

@@ -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) {

View File

@@ -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