diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/xfl/XFLConverter.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/xfl/XFLConverter.java
index 3e052ed44..dd238b1e8 100644
--- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/xfl/XFLConverter.java
+++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/xfl/XFLConverter.java
@@ -317,7 +317,9 @@ public class XFLConverter {
}
ret.append(">");
- ret.append("").append(convertMatrix(fs.bitmapMatrix)).append("");
+ ret.append("");
+ convertMatrix(fs.bitmapMatrix, ret);
+ ret.append("");
ret.append("");
break;
case FILLSTYLE.LINEAR_GRADIENT:
@@ -366,7 +368,9 @@ public class XFLConverter {
ret.append(">");
- ret.append("").append(convertMatrix(fs.gradientMatrix)).append("");
+ ret.append("");
+ convertMatrix(fs.gradientMatrix, ret);
+ ret.append("");
GRADRECORD[] records;
if (fs.fillStyleType == FILLSTYLE.FOCAL_RADIAL_GRADIENT) {
records = fs.gradient.gradientRecords;
@@ -392,15 +396,8 @@ public class XFLConverter {
//ret.append("");
}
- private static String convertMatrix(MATRIX m) {
- return convertMatrix(new Matrix(m));
- }
-
- private static String convertMatrix(Matrix m) {
- StringBuilder ret = new StringBuilder();
- if (m == null) {
- m = new Matrix();
- }
+ private static void convertMatrix(MATRIX matrix, StringBuilder ret) {
+ Matrix m = new Matrix(matrix);
ret.append("");
- return ret.toString();
}
- /*
- public static String convertShape(HashMap characters, MATRIX mat, int shapeNum, SHAPE shape) {
- return convertShape(characters, mat, shapeNum, shape.shapeRecords);
- }
-
- public static String convertShape(HashMap characters, MATRIX mat, int shapeNum, SHAPEWITHSTYLE shape,boolean morphShape) {
- return convertShape(characters, mat, shapeNum, shape.shapeRecords, shape.fillStyles, shape.lineStyles, morphShape);
- }
-
- public static String convertShape(HashMap characters, MATRIX mat, ShapeTag shape, boolean morphShape) {
- return convertShape(characters, mat, shape.getShapeNum(), shape.getShapes(),morphShape);
- }
-
- public static String convertShape(HashMap characters, MATRIX mat, int shapeNum, List shapeRecords,boolean useLayers) {
- return convertShape(characters, mat, shapeNum, shapeRecords, null, null, false,true);
- }*/
private static boolean shapeHasMultiLayers(HashMap characters, MATRIX mat, int shapeNum, List shapeRecords, FILLSTYLEARRAY fillStyles, LINESTYLEARRAY lineStyles) {
List layers = getShapeLayers(characters, mat, shapeNum, shapeRecords, fillStyles, lineStyles, false);
@@ -909,8 +889,7 @@ public class XFLConverter {
return ds;
}
- private static String convertFilter(FILTER filter) {
- StringBuilder ret = new StringBuilder();
+ private static void convertFilter(FILTER filter, StringBuilder ret) {
if (filter instanceof DROPSHADOWFILTER) {
DROPSHADOWFILTER dsf = (DROPSHADOWFILTER) filter;
ret.append("");
} else if (filter instanceof COLORMATRIXFILTER) {
COLORMATRIXFILTER cmf = (COLORMATRIXFILTER) filter;
- ret.append(convertAdjustColorFilter(cmf));
+ convertAdjustColorFilter(cmf, ret);
}
- return ret.toString();
}
private static String convertSymbolInstance(String name, MATRIX matrix, ColorTransform colorTransform, boolean cacheAsBitmap, int blendMode, List filters, boolean isVisible, RGBA backgroundColor, CLIPACTIONS clipActions, CharacterTag tag, HashMap characters, List tags, FLAVersion flaVersion) {
@@ -1098,7 +1076,7 @@ public class XFLConverter {
}
ret.append(">");
ret.append("");
- ret.append(convertMatrix(matrix));
+ convertMatrix(matrix, ret);
ret.append("");
ret.append("");
@@ -1142,7 +1120,7 @@ public class XFLConverter {
if (filters != null) {
ret.append("");
for (FILTER f : filters) {
- ret.append(convertFilter(f));
+ convertFilter(f, ret);
}
ret.append("");
}
@@ -1189,11 +1167,10 @@ public class XFLConverter {
return date.getTime() / 1000;
}
- private static String convertLibrary(SWF swf, Map characterVariables, Map characterClasses, List nonLibraryShapes, String backgroundColor, List tags, HashMap characters, HashMap files, HashMap datfiles, FLAVersion flaVersion) {
+ private static void convertLibrary(SWF swf, Map characterVariables, Map characterClasses, List nonLibraryShapes, String backgroundColor, List tags, HashMap characters, HashMap files, HashMap datfiles, FLAVersion flaVersion, StringBuilder ret) {
//TODO: Imported assets
//linkageImportForRS="true" linkageIdentifier="xxx" linkageURL="yyy.swf"
- StringBuilder ret = new StringBuilder();
List media = new ArrayList<>();
List symbols = new ArrayList<>();
for (int ch : characters.keySet()) {
@@ -1636,7 +1613,6 @@ public class XFLConverter {
}
ret.append("");
}
- return ret.toString();
}
private static String prettyFormatXML(String input) {
@@ -1659,8 +1635,7 @@ public class XFLConverter {
}
}
- private static String convertFrame(boolean shapeTween, HashMap characters, List tags, SoundStreamHeadTypeTag soundStreamHead, StartSoundTag startSound, int frame, int duration, String actionScript, String elements, HashMap files) {
- StringBuilder ret = new StringBuilder();
+ private static void convertFrame(boolean shapeTween, HashMap characters, List tags, SoundStreamHeadTypeTag soundStreamHead, StartSoundTag startSound, int frame, int duration, String actionScript, String elements, HashMap files, StringBuilder ret) {
DefineSoundTag sound = null;
if (startSound != null) {
for (Tag t : tags) {
@@ -1768,7 +1743,6 @@ public class XFLConverter {
ret.append(elements);
ret.append("");
ret.append("");
- return ret.toString();
}
private static String convertVideoInstance(String instanceName, MATRIX matrix, DefineVideoStreamTag video, CLIPACTIONS clipActions) {
@@ -1779,7 +1753,7 @@ public class XFLConverter {
}
ret.append(">");
ret.append("");
- ret.append(convertMatrix(matrix));
+ convertMatrix(matrix, ret);
ret.append("");
ret.append("");
ret.append("");
@@ -1788,11 +1762,11 @@ public class XFLConverter {
return ret.toString();
}
- private static String convertFrames(String prevStr, String afterStr, List nonLibraryShapes, List tags, List timelineTags, HashMap characters, int depth, FLAVersion flaVersion, HashMap files) {
- StringBuilder ret = new StringBuilder();
+ private static void convertFrames(String prevStr, String afterStr, List nonLibraryShapes, List tags, List timelineTags, HashMap characters, int depth, FLAVersion flaVersion, HashMap files, StringBuilder ret) {
+ StringBuilder ret2 = new StringBuilder();
prevStr += "";
int frame = -1;
- String elements = "";
+ String elements;
String lastElements = "";
int duration = 1;
@@ -1895,33 +1869,33 @@ public class XFLConverter {
}
if (t instanceof ShowFrameTag) {
- elements = "";
-
if ((character instanceof ShapeTag) && (nonLibraryShapes.contains(characterId) || shapeTweener != null)) {
ShapeTag shape = (ShapeTag) character;
- elements += convertShape(characters, matrix, shape.getShapeNum(), shape.getShapes().shapeRecords, shape.getShapes().fillStyles, shape.getShapes().lineStyles, false, false);
+ elements = convertShape(characters, matrix, shape.getShapeNum(), shape.getShapes().shapeRecords, shape.getShapes().fillStyles, shape.getShapes().lineStyles, false, false);
shapeTween = false;
shapeTweener = null;
} else if (character != null) {
if (character instanceof MorphShapeTag) {
MorphShapeTag m = (MorphShapeTag) character;
- elements += convertShape(characters, matrix, 3, m.getStartEdges().shapeRecords, m.getFillStyles().getStartFillStyles(), m.getLineStyles().getStartLineStyles(m.getShapeNum()), true, false);
+ elements = convertShape(characters, matrix, 3, m.getStartEdges().shapeRecords, m.getFillStyles().getStartFillStyles(), m.getLineStyles().getStartLineStyles(m.getShapeNum()), true, false);
shapeTween = true;
} else {
shapeTween = false;
if (character instanceof TextTag) {
- elements += convertText(instanceName, (TextTag) character, matrix, filters, clipActions);
+ elements = convertText(instanceName, (TextTag) character, matrix, filters, clipActions);
} else if (character instanceof DefineVideoStreamTag) {
- elements += convertVideoInstance(instanceName, matrix, (DefineVideoStreamTag) character, clipActions);
+ elements = convertVideoInstance(instanceName, matrix, (DefineVideoStreamTag) character, clipActions);
} else {
- elements += convertSymbolInstance(instanceName, matrix, colorTransForm, cacheAsBitmap, blendMode, filters, isVisible, backGroundColor, clipActions, character, characters, tags, flaVersion);
+ elements = convertSymbolInstance(instanceName, matrix, colorTransForm, cacheAsBitmap, blendMode, filters, isVisible, backGroundColor, clipActions, character, characters, tags, flaVersion);
}
}
+ } else {
+ elements = "";
}
frame++;
if (!elements.equals(lastElements) && frame > 0) {
- ret.append(convertFrame(lastShapeTween, characters, tags, null, null, frame - duration, duration, "", lastElements, files));
+ convertFrame(lastShapeTween, characters, tags, null, null, frame - duration, duration, "", lastElements, files, ret2);
duration = 1;
} else if (frame == 0) {
duration = 1;
@@ -1935,18 +1909,17 @@ public class XFLConverter {
}
if (!lastElements.isEmpty()) {
frame++;
- ret.append(convertFrame(lastShapeTween, characters, tags, null, null, (frame - duration < 0 ? 0 : frame - duration), duration, "", lastElements, files));
+ convertFrame(lastShapeTween, characters, tags, null, null, (frame - duration < 0 ? 0 : frame - duration), duration, "", lastElements, files, ret2);
}
afterStr = "" + afterStr;
- String retStr = ret.toString();
- if (!retStr.isEmpty()) {
- retStr = prevStr + retStr + afterStr;
+
+ if (ret2.length() > 0) {
+ ret.append(prevStr).append(ret2).append(afterStr);
}
- return retStr;
}
- private static String convertFonts(List tags) {
- StringBuilder ret = new StringBuilder();
+ private static void convertFonts(List tags, StringBuilder ret) {
+ StringBuilder ret2 = new StringBuilder();
for (Tag t : tags) {
if (t instanceof FontTag) {
FontTag font = (FontTag) t;
@@ -2002,17 +1975,14 @@ public class XFLConverter {
if (hasAllRanges) {
embedRanges = "9999";
}
- ret.append("");
+ ret2.append("");
}
}
- String retStr = ret.toString();
- if (!retStr.isEmpty()) {
- retStr = "" + retStr + "";
+ if (ret2.length() > 0) {
+ ret.append("").append(ret2).append("");
}
-
- return retStr;
}
private static String convertActionScriptLayer(int spriteId, List tags, List timeLineTags, String backgroundColor) {
@@ -2133,8 +2103,8 @@ public class XFLConverter {
return retStr;
}
- private static String convertSoundLayer(int layerIndex, String backgroundColor, HashMap characters, List tags, List timeLineTags, HashMap files) {
- StringBuilder ret = new StringBuilder();
+ private static void convertSoundLayer(int layerIndex, String backgroundColor, HashMap characters, List tags, List timeLineTags, HashMap files, StringBuilder ret) {
+ StringBuilder ret2 = new StringBuilder();
StartSoundTag lastStartSound = null;
SoundStreamHeadTypeTag lastSoundStreamHead = null;
StartSoundTag startSound = null;
@@ -2167,7 +2137,7 @@ public class XFLConverter {
if (t instanceof ShowFrameTag) {
if (soundStreamHead != null || startSound != null) {
if (lastSoundStreamHead != null || lastStartSound != null) {
- ret.append(convertFrame(false, characters, tags, lastSoundStreamHead, lastStartSound, frame, duration, "", "", files));
+ convertFrame(false, characters, tags, lastSoundStreamHead, lastStartSound, frame, duration, "", "", files, ret2);
}
frame += duration;
duration = 1;
@@ -2185,15 +2155,14 @@ public class XFLConverter {
frame = 0;
duration = 1;
}
- ret.append(convertFrame(false, characters, tags, lastSoundStreamHead, lastStartSound, frame, duration, "", "", files));
+ convertFrame(false, characters, tags, lastSoundStreamHead, lastStartSound, frame, duration, "", "", files, ret2);
}
- String retStr = ret.toString();
- if (!retStr.isEmpty()) {
- retStr = ""
- + "" + retStr + ""
- + "";
+
+ if (ret2.length() > 0) {
+ ret.append(""
+ + "").append(ret2).append(""
+ + "");
}
- return retStr;
}
private static String randomOutlineColor() {
@@ -2241,7 +2210,7 @@ public class XFLConverter {
ret.append("");
- ret.append(convertFrames("", "", nonLibraryShapes, tags, timelineTags, characters, po.getDepth(), flaVersion, files));
+ convertFrames("", "", nonLibraryShapes, tags, timelineTags, characters, po.getDepth(), flaVersion, files, ret);
ret.append("");
index++;
break;
@@ -2282,16 +2251,16 @@ public class XFLConverter {
}
layerPrev += ">";
String layerAfter = "";
- String cf = convertFrames(layerPrev, layerAfter, nonLibraryShapes, tags, timelineTags, characters, d, flaVersion, files);
- if (cf.isEmpty()) {
+ int prevLength = ret.length();
+ convertFrames(layerPrev, layerAfter, nonLibraryShapes, tags, timelineTags, characters, d, flaVersion, files, ret);
+ if (ret.length() == prevLength) {
index--;
}
- ret.append(cf);
}
int soundLayerIndex = layerCount;
layerCount++;
- ret.append(convertSoundLayer(soundLayerIndex, backgroundColor, characters, tags, timelineTags, files));
+ convertSoundLayer(soundLayerIndex, backgroundColor, characters, tags, timelineTags, files, ret);
ret.append("");
ret.append("");
return ret.toString();
@@ -2338,18 +2307,15 @@ public class XFLConverter {
private static String convertText(String instanceName, TextTag tag, MATRIX m, List filters, CLIPACTIONS clipActions) {
StringBuilder ret = new StringBuilder();
- if (m == null) {
- m = new MATRIX();
- }
- Matrix matrix = new Matrix(m);
+ MATRIX matrix = new MATRIX(m);
CSMTextSettingsTag csmts = null;
- String filterStr = "";
+ StringBuilder filterStr = new StringBuilder();
if (filters != null) {
- filterStr += "";
+ filterStr.append("");
for (FILTER f : filters) {
- filterStr += convertFilter(f);
+ convertFilter(f, ret);
}
- filterStr += "";
+ filterStr.append("");
}
SWF swf = tag.getSwf();
@@ -2373,16 +2339,16 @@ public class XFLConverter {
}
antiAlias = " antiAliasSharpness=\"" + doubleToString(csmts.sharpness) + "\" antiAliasThickness=\"" + doubleToString(csmts.thickness) + "\"";
}
- String matStr = "";
- matStr += "";
String left = "";
RECT bounds = tag.getBounds();
if ((tag instanceof DefineTextTag) || (tag instanceof DefineText2Tag)) {
MATRIX textMatrix = tag.getTextMatrix();
left = " left=\"" + doubleToString((textMatrix.translateX) / SWF.unitDivisor) + "\"";
}
- matStr += convertMatrix(matrix);
- matStr += "";
+ StringBuilder matStr = new StringBuilder();
+ matStr.append("");
+ convertMatrix(matrix, matStr);
+ matStr.append("");
if ((tag instanceof DefineTextTag) || (tag instanceof DefineText2Tag)) {
List textRecords = new ArrayList<>();
if (tag instanceof DefineTextTag) {
@@ -2712,8 +2678,8 @@ public class XFLConverter {
domDocument.append(" height=\"").append(doubleToString(height)).append("\"");
}
domDocument.append(">");
- domDocument.append(convertFonts(swf.tags));
- domDocument.append(convertLibrary(swf, characterVariables, characterClasses, nonLibraryShapes, backgroundColor, swf.tags, characters, files, datfiles, flaVersion));
+ convertFonts(swf.tags, domDocument);
+ convertLibrary(swf, characterVariables, characterClasses, nonLibraryShapes, backgroundColor, swf.tags, characters, files, datfiles, flaVersion, domDocument);
domDocument.append("");
domDocument.append(convertTimeline(0, nonLibraryShapes, backgroundColor, swf.tags, swf.tags, characters, "Scene 1", flaVersion, files));
domDocument.append("");
@@ -3099,7 +3065,7 @@ public class XFLConverter {
return a == b ? true : Math.abs(a - b) < EPSILON;
}
- private static String convertAdjustColorFilter(COLORMATRIXFILTER filter) {
+ private static void convertAdjustColorFilter(COLORMATRIXFILTER filter, StringBuilder ret) {
float[][] matrix = new float[5][5];
int index = 0;
for (int i = 0; i < 4; i++) {
@@ -3143,7 +3109,7 @@ public class XFLConverter {
h = 0;
}
- return "";
+ ret.append("");
}
private static String convertHTMLText(List tags, DefineEditTextTag det, String html) {