From 36a9ca659d971db6c29591184232e055c0f99332 Mon Sep 17 00:00:00 2001 From: "honfika@gmail.com" Date: Thu, 10 Mar 2016 13:10:40 +0100 Subject: [PATCH] create domdocument.xml with xml writer 3 --- .../decompiler/flash/xfl/XFLConverter.java | 688 +++++++++--------- .../decompiler/flash/xfl/XFLXmlWriter.java | 44 +- 2 files changed, 389 insertions(+), 343 deletions(-) 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 152aa9eda..e12fda2cf 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 @@ -229,22 +229,22 @@ public class XFLConverter { return "normal"; } - private static void convertLineStyle(LINESTYLE ls, int shapeNum, StringBuilder ret) { - ret.append("" + ""); if (!(ls instanceof LINESTYLE2) || !((LINESTYLE2) ls).hasFillFlag) { - ret.append(""); } else { // todo: line fill } - ret.append("" + writer.append("" + ""); } - private static void convertLineStyle(HashMap characters, LINESTYLE2 ls, int shapeNum, StringBuilder ret) { + private static void convertLineStyle(HashMap characters, LINESTYLE2 ls, int shapeNum, XFLXmlWriter writer) throws XMLStreamException { StringBuilder params = new StringBuilder(); if (ls.pixelHintingFlag) { params.append(" pixelHinting=\"true\""); @@ -275,24 +275,24 @@ public class XFLConverter { break; } - ret.append(""); - ret.append(""); + writer.append(""); + writer.append(""); if (!ls.hasFillFlag) { RGBA color = (RGBA) ls.color; - ret.append(""); } else { - convertFillStyle(null/* FIXME */, characters, ls.fillType, shapeNum, ret); + convertFillStyle(null/* FIXME */, characters, ls.fillType, shapeNum, writer); } - ret.append(""); - ret.append(""); + writer.append(""); + writer.append(""); } - private static void convertFillStyle(MATRIX mat, HashMap characters, FILLSTYLE fs, int shapeNum, StringBuilder ret) { + private static void convertFillStyle(MATRIX mat, HashMap characters, FILLSTYLE fs, int shapeNum, XFLXmlWriter writer) throws XMLStreamException { /* todo: use matrix if (mat == null) { mat = new MATRIX(); @@ -300,13 +300,13 @@ public class XFLConverter { //ret.append(""); switch (fs.fillStyleType) { case FILLSTYLE.SOLID: - ret.append("= 3) { - ret.append(" alpha=\"").append(((RGBA) fs.color).getAlphaFloat()).append("\""); + writer.append(" alpha=\"").append(((RGBA) fs.color).getAlphaFloat()).append("\""); } - ret.append(" />"); + writer.append(" />"); break; case FILLSTYLE.REPEATING_BITMAP: case FILLSTYLE.CLIPPED_BITMAP: @@ -315,43 +315,43 @@ public class XFLConverter { CharacterTag bitmapCh = characters.get(fs.bitmapId); if (bitmapCh instanceof ImageTag) { ImageTag it = (ImageTag) bitmapCh; - ret.append(""); + writer.append(""); return; } - ret.append("\""); + writer.append("\""); if ((fs.fillStyleType == FILLSTYLE.CLIPPED_BITMAP) || (fs.fillStyleType == FILLSTYLE.NON_SMOOTHED_CLIPPED_BITMAP)) { - ret.append(" bitmapIsClipped=\"true\""); + writer.append(" bitmapIsClipped=\"true\""); } - ret.append(">"); - ret.append(""); - convertMatrix(fs.bitmapMatrix, ret); - ret.append(""); - ret.append(""); + writer.append(">"); + writer.append(""); + convertMatrix(fs.bitmapMatrix, writer); + writer.append(""); + writer.append(""); break; case FILLSTYLE.LINEAR_GRADIENT: case FILLSTYLE.RADIAL_GRADIENT: case FILLSTYLE.FOCAL_RADIAL_GRADIENT: if (fs.fillStyleType == FILLSTYLE.LINEAR_GRADIENT) { - ret.append(""); + writer.append(">"); - ret.append(""); - convertMatrix(fs.gradientMatrix, ret); - ret.append(""); + writer.append(""); + convertMatrix(fs.gradientMatrix, writer); + writer.append(""); GRADRECORD[] records; if (fs.fillStyleType == FILLSTYLE.FOCAL_RADIAL_GRADIENT) { records = fs.gradient.gradientRecords; @@ -393,67 +393,65 @@ public class XFLConverter { records = fs.gradient.gradientRecords; } for (GRADRECORD rec : records) { - ret.append("= 3) { - ret.append(" alpha=\"").append(((RGBA) rec.color).getAlphaFloat()).append("\""); + writer.append(" alpha=\"").append(((RGBA) rec.color).getAlphaFloat()).append("\""); } - ret.append(" ratio=\"").append(rec.getRatioFloat()).append("\""); - ret.append(" />"); + writer.append(" ratio=\"").append(rec.getRatioFloat()).append("\""); + writer.append(" />"); } if (fs.fillStyleType == FILLSTYLE.LINEAR_GRADIENT) { - ret.append(""); + writer.append(""); } else { - ret.append(""); + writer.append(""); } break; } //ret.append(""); } - private static void convertMatrix(MATRIX matrix, StringBuilder ret) { + private static void convertMatrix(MATRIX matrix, XFLXmlWriter writer) throws XMLStreamException { Matrix m = new Matrix(matrix); - ret.append(""); + writer.writeEndElement(); } - private static boolean shapeHasMultiLayers(HashMap characters, MATRIX mat, int shapeNum, List shapeRecords, FILLSTYLEARRAY fillStyles, LINESTYLEARRAY lineStyles) { + private static boolean shapeHasMultiLayers(HashMap characters, MATRIX mat, int shapeNum, List shapeRecords, FILLSTYLEARRAY fillStyles, LINESTYLEARRAY lineStyles) throws XMLStreamException { List layers = getShapeLayers(characters, mat, shapeNum, shapeRecords, fillStyles, lineStyles, false); return layers.size() > 1; } - private static String convertShape(HashMap characters, MATRIX mat, int shapeNum, List shapeRecords, FILLSTYLEARRAY fillStyles, LINESTYLEARRAY lineStyles, boolean morphshape, boolean useLayers) { - StringBuilder ret = new StringBuilder(); + private static void convertShape(HashMap characters, MATRIX mat, int shapeNum, List shapeRecords, FILLSTYLEARRAY fillStyles, LINESTYLEARRAY lineStyles, boolean morphshape, boolean useLayers, XFLXmlWriter writer) throws XMLStreamException { List layers = getShapeLayers(characters, mat, shapeNum, shapeRecords, fillStyles, lineStyles, morphshape); if (!useLayers) { for (int l = layers.size() - 1; l >= 0; l--) { - ret.append(layers.get(l)); + writer.append(layers.get(l)); } } else { int layer = 1; for (int l = layers.size() - 1; l >= 0; l--) { - ret.append(""); //color=\"#4FFF4F\" - ret.append(""); - ret.append(""); - ret.append(""); - ret.append(layers.get(l)); - ret.append(""); - ret.append(""); - ret.append(""); - ret.append(""); + writer.append(""); //color=\"#4FFF4F\" + writer.append(""); + writer.append(""); + writer.append(""); + writer.append(layers.get(l)); + writer.append(""); + writer.append(""); + writer.append(""); + writer.append(""); } } - return ret.toString(); } /** @@ -516,7 +514,7 @@ public class XFLConverter { return ret; } - private static List getShapeLayers(HashMap characters, MATRIX mat, int shapeNum, List shapeRecords, FILLSTYLEARRAY fillStyles, LINESTYLEARRAY lineStyles, boolean morphshape) { + private static List getShapeLayers(HashMap characters, MATRIX mat, int shapeNum, List shapeRecords, FILLSTYLEARRAY fillStyles, LINESTYLEARRAY lineStyles, boolean morphshape) throws XMLStreamException { if (mat == null) { mat = new MATRIX(); } @@ -526,8 +524,8 @@ public class XFLConverter { int fillStyle0 = -1; int fillStyle1 = -1; int strokeStyle = -1; - StringBuilder fillsStr = new StringBuilder(); - StringBuilder strokesStr = new StringBuilder(); + XFLXmlWriter fillsStr = new XFLXmlWriter(); + XFLXmlWriter strokesStr = new XFLXmlWriter(); fillsStr.append(""); strokesStr.append(""); List layers = new ArrayList<>(); @@ -835,17 +833,22 @@ public class XFLConverter { HashMap usages = new HashMap<>(); walkShapeUsages(tags, characters, usages); List ret = new ArrayList<>(); - for (int ch : usages.keySet()) { - if (usages.get(ch) < 2) { - if (characters.get(ch) instanceof ShapeTag) { - ShapeTag shp = (ShapeTag) characters.get(ch); - if (!shapeHasMultiLayers(characters, null, shp.getShapeNum(), shp.getShapes().shapeRecords, shp.getShapes().fillStyles, shp.getShapes().lineStyles)) { - ret.add(ch); + try { + for (int ch : usages.keySet()) { + if (usages.get(ch) < 2) { + if (characters.get(ch) instanceof ShapeTag) { + ShapeTag shp = (ShapeTag) characters.get(ch); + if (!shapeHasMultiLayers(characters, null, shp.getShapeNum(), shp.getShapes().shapeRecords, shp.getShapes().fillStyles, shp.getShapes().lineStyles)) { + ret.add(ch); + } } - } + } } + } catch (XMLStreamException ex) { + Logger.getLogger(XFLConverter.class.getName()).log(Level.SEVERE, null, ex); } + return ret; } @@ -909,148 +912,147 @@ public class XFLConverter { return ds; } - private static void convertFilter(FILTER filter, StringBuilder ret) { + private static void convertFilter(FILTER filter, XFLXmlWriter writer) { if (filter instanceof DROPSHADOWFILTER) { DROPSHADOWFILTER dsf = (DROPSHADOWFILTER) filter; - ret.append(""); + writer.append(" quality=\"").append(dsf.passes).append("\""); + writer.append(" strength=\"").append(doubleToString(dsf.strength, 2)).append("\""); + writer.append(" />"); } else if (filter instanceof BLURFILTER) { BLURFILTER bf = (BLURFILTER) filter; - ret.append(""); + writer.append(""); } else if (filter instanceof GLOWFILTER) { GLOWFILTER gf = (GLOWFILTER) filter; - ret.append(""); + writer.append(" quality=\"").append(gf.passes).append("\""); + writer.append(" strength=\"").append(doubleToString(gf.strength, 2)).append("\""); + writer.append(" />"); } else if (filter instanceof BEVELFILTER) { BEVELFILTER bf = (BEVELFILTER) filter; - ret.append(""); + writer.append(" />"); } else if (filter instanceof GRADIENTGLOWFILTER) { GRADIENTGLOWFILTER ggf = (GRADIENTGLOWFILTER) filter; - ret.append(""); + writer.append(">"); for (int g = 0; g < ggf.gradientColors.length; g++) { RGBA gc = ggf.gradientColors[g]; - ret.append(""); + writer.append(" ratio=\"").append(doubleToString(((float) ggf.gradientRatio[g]) / 255.0)).append("\""); + writer.append("/>"); } - ret.append(""); + writer.append(""); } else if (filter instanceof GRADIENTBEVELFILTER) { GRADIENTBEVELFILTER gbf = (GRADIENTBEVELFILTER) filter; - ret.append(""); + writer.append(">"); for (int g = 0; g < gbf.gradientColors.length; g++) { RGBA gc = gbf.gradientColors[g]; - ret.append(""); + writer.append(" ratio=\"").append(doubleToString(((float) gbf.gradientRatio[g]) / 255.0)).append("\""); + writer.append("/>"); } - ret.append(""); + writer.append(""); } else if (filter instanceof COLORMATRIXFILTER) { COLORMATRIXFILTER cmf = (COLORMATRIXFILTER) filter; - convertAdjustColorFilter(cmf, ret); + convertAdjustColorFilter(cmf, writer); } } - 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, ReadOnlyTagList tags, FLAVersion flaVersion) { - StringBuilder ret = new StringBuilder(); + private static void convertSymbolInstance(String name, MATRIX matrix, ColorTransform colorTransform, boolean cacheAsBitmap, int blendMode, List filters, boolean isVisible, RGBA backgroundColor, CLIPACTIONS clipActions, CharacterTag tag, HashMap characters, ReadOnlyTagList tags, FLAVersion flaVersion, XFLXmlWriter writer) throws XMLStreamException { if (matrix == null) { matrix = new MATRIX(); } @@ -1066,110 +1068,109 @@ public class XFLConverter { } } - ret.append("= FLAVersion.CS5_5.ordinal()) { - ret.append(" isVisible=\"false\""); + writer.append(" isVisible=\"false\""); } - ret.append(">"); - ret.append(""); - convertMatrix(matrix, ret); - ret.append(""); - ret.append(""); + writer.append(">"); + writer.append(""); + convertMatrix(matrix, writer); + writer.append(""); + writer.append(""); if (backgroundColor != null) { - ret.append(""); + writer.append("/>"); } if (colorTransform != null) { - ret.append(""); + writer.append("/>"); } if (filters != null) { - ret.append(""); + writer.append(""); for (FILTER f : filters) { - convertFilter(f, ret); + convertFilter(f, writer); } - ret.append(""); + writer.append(""); } if (tag instanceof DefineButtonTag) { - ret.append(""); + writer.append(""); } if (tag instanceof DefineButton2Tag) { DefineButton2Tag db2 = (DefineButton2Tag) tag; if (!db2.actions.isEmpty()) { - ret.append(""); + writer.append("]]>"); } } if (clipActions != null) { - ret.append(""); + writer.append("]]>"); } - ret.append(""); - return ret.toString(); + writer.append(""); } private static String convertActionScript(ASMSource as) { @@ -1288,19 +1289,20 @@ public class XFLConverter { } CharacterTag character = characters.get(rec.characterId); MATRIX matrix = rec.placeMatrix; - String recCharStr; + XFLXmlWriter recCharWriter = new XFLXmlWriter(); int characterId = character.getCharacterId(); if ((character instanceof ShapeTag) && (nonLibraryShapes.contains(characterId))) { ShapeTag shape = (ShapeTag) character; - recCharStr = convertShape(characters, matrix, shape.getShapeNum(), shape.getShapes().shapeRecords, shape.getShapes().fillStyles, shape.getShapes().lineStyles, false, false); + convertShape(characters, matrix, shape.getShapeNum(), shape.getShapes().shapeRecords, shape.getShapes().fillStyles, shape.getShapes().lineStyles, false, false, recCharWriter); } else if (character instanceof TextTag) { - recCharStr = convertText(null, (TextTag) character, matrix, filters, null); + convertText(null, (TextTag) character, matrix, filters, null, recCharWriter); } else if (character instanceof DefineVideoStreamTag) { - recCharStr = convertVideoInstance(null, matrix, (DefineVideoStreamTag) character, null); + convertVideoInstance(null, matrix, (DefineVideoStreamTag) character, null, recCharWriter); } else { - recCharStr = convertSymbolInstance(null, matrix, colorTransformAlpha, false, blendMode, filters, true, null, null, characters.get(rec.characterId), characters, tags, flaVersion); + convertSymbolInstance(null, matrix, colorTransformAlpha, false, blendMode, filters, true, null, null, characters.get(rec.characterId), characters, tags, flaVersion, recCharWriter); } + int duration = frame - lastFrame; lastFrame = frame; if (duration > 0) { @@ -1319,7 +1321,7 @@ public class XFLConverter { symbolStr.append("\""); symbolStr.append(" keyMode=\"").append(KEY_MODE_NORMAL).append("\">"); symbolStr.append(""); - symbolStr.append(recCharStr); + symbolStr.append(recCharWriter); symbolStr.append(""); symbolStr.append(""); } @@ -1346,7 +1348,9 @@ public class XFLConverter { symbolStr.append(""); SHAPEWITHSTYLE shapeWithStyle = shape.getShapes(); if (shapeWithStyle != null) { - symbolStr.append(convertShape(characters, null, shape.getShapeNum(), shapeWithStyle.shapeRecords, shapeWithStyle.fillStyles, shapeWithStyle.lineStyles, false, true)); + XFLXmlWriter writer2 = new XFLXmlWriter(); + convertShape(characters, null, shape.getShapeNum(), shapeWithStyle.shapeRecords, shapeWithStyle.fillStyles, shapeWithStyle.lineStyles, false, true, writer2); + symbolStr.append(writer2.toString()); } symbolStr.append(""); @@ -1719,7 +1723,7 @@ public class XFLConverter { } } - private static void convertFrame(boolean shapeTween, HashMap characters, ReadOnlyTagList tags, SoundStreamHeadTypeTag soundStreamHead, StartSoundTag startSound, int frame, int duration, String actionScript, String elements, HashMap files, StringBuilder ret) { + private static void convertFrame(boolean shapeTween, HashMap characters, ReadOnlyTagList tags, SoundStreamHeadTypeTag soundStreamHead, StartSoundTag startSound, int frame, int duration, String actionScript, String elements, HashMap files, XFLXmlWriter writer) throws XMLStreamException { DefineSoundTag sound = null; if (startSound != null) { for (Tag t : tags) { @@ -1733,44 +1737,46 @@ public class XFLConverter { } } - ret.append(" 1) { - ret.append(" duration=\"").append(duration).append("\""); + writer.writeAttribute("duration", duration); } if (shapeTween) { - ret.append(" tweenType=\"shape\" keyMode=\"").append(KEY_MODE_SHAPE_TWEEN).append("\""); + writer.writeAttribute("tweenType", "shape"); + writer.writeAttribute("keyMode", KEY_MODE_SHAPE_TWEEN); } else { - ret.append(" keyMode=\"").append(KEY_MODE_NORMAL).append("\""); + writer.writeAttribute("keyMode", KEY_MODE_NORMAL); } String soundEnvelopeStr = ""; if (soundStreamHead != null && startSound == null) { String soundName = "sound" + soundStreamHead.getCharacterId() + "." + soundStreamHead.getExportFormat().toString().toLowerCase(); - ret.append(" soundName=\"").append(soundName).append("\""); - ret.append(" soundSync=\"stream\""); + writer.writeAttribute("soundName", soundName); + writer.writeAttribute("soundSync", "stream"); soundEnvelopeStr += ""; soundEnvelopeStr += ""; soundEnvelopeStr += ""; } if (startSound != null && sound != null) { String soundName = "sound" + sound.soundId + "." + sound.getExportFormat().toString().toLowerCase(); - ret.append(" soundName=\"").append(soundName).append("\""); + writer.writeAttribute("soundName", soundName); if (startSound.soundInfo.hasInPoint) { - ret.append(" inPoint44=\"").append(startSound.soundInfo.inPoint).append("\""); + writer.writeAttribute("inPoint44", startSound.soundInfo.inPoint); } if (startSound.soundInfo.hasOutPoint) { - ret.append(" outPoint44=\"").append(startSound.soundInfo.outPoint).append("\""); + writer.writeAttribute("outPoint44", startSound.soundInfo.outPoint); } if (startSound.soundInfo.hasLoops) { if (startSound.soundInfo.loopCount == 32767) { - ret.append(" soundLoopMode=\"loop\""); + writer.writeAttribute("soundLoopMode", "loop"); } - ret.append(" soundLoop=\"").append(startSound.soundInfo.loopCount).append("\""); + writer.writeAttribute("soundLoop", startSound.soundInfo.loopCount); } if (startSound.soundInfo.syncStop) { - ret.append(" soundSync=\"stop\""); + writer.writeAttribute("soundSync", "stop"); } else if (startSound.soundInfo.syncNoMultiple) { - ret.append(" soundSync=\"start\""); + writer.writeAttribute("soundSync", "start"); } soundEnvelopeStr += ""; if (startSound.soundInfo.hasEnvelope) { @@ -1783,12 +1789,12 @@ public class XFLConverter { && envelopeRecords[0].leftLevel == 32768 && envelopeRecords[0].pos44 == 0 && envelopeRecords[0].rightLevel == 0) { - ret.append(" soundEffect=\"left channel\""); + writer.writeAttribute("soundEffect", "left channel"); } else if (envelopeRecords.length == 1 && envelopeRecords[0].leftLevel == 0 && envelopeRecords[0].pos44 == 0 && envelopeRecords[0].rightLevel == 32768) { - ret.append(" soundEffect=\"right channel\""); + writer.writeAttribute("soundEffect", "right channel"); } else if (envelopeRecords.length == 2 && envelopeRecords[0].leftLevel == 32768 && envelopeRecords[0].pos44 == 0 @@ -1796,7 +1802,7 @@ public class XFLConverter { && envelopeRecords[1].leftLevel == 0 && envelopeRecords[1].pos44 == sound.soundSampleCount && envelopeRecords[1].rightLevel == 32768) { - ret.append(" soundEffect=\"fade left to right\""); + writer.writeAttribute("soundEffect", "fade left to right"); } else if (envelopeRecords.length == 2 && envelopeRecords[0].leftLevel == 0 && envelopeRecords[0].pos44 == 0 @@ -1804,9 +1810,9 @@ public class XFLConverter { && envelopeRecords[1].leftLevel == 32768 && envelopeRecords[1].pos44 == sound.soundSampleCount && envelopeRecords[1].rightLevel == 0) { - ret.append(" soundEffect=\"fade right to left\""); + writer.writeAttribute("soundEffect", "fade right to left"); } else { - ret.append(" soundEffect=\"custom\""); + writer.writeAttribute("soundEffect", "custom"); } //TODO: fade in, fade out @@ -1815,42 +1821,43 @@ public class XFLConverter { } soundEnvelopeStr += ""; } - ret.append(">"); - ret.append(soundEnvelopeStr); + writer.writeCharactersRaw(soundEnvelopeStr); if (!actionScript.isEmpty()) { - ret.append(""); + writer.writeStartElement("Actionscript"); + writer.writeStartElement("script"); + writer.writeCData(actionScript); + writer.writeEndElement(); + writer.writeEndElement(); } - ret.append(""); - ret.append(elements); - ret.append(""); - ret.append(""); + writer.writeStartElement("elements"); + writer.writeCharactersRaw(elements); + writer.writeEndElement(); + writer.writeEndElement(); } - private static String convertVideoInstance(String instanceName, MATRIX matrix, DefineVideoStreamTag video, CLIPACTIONS clipActions) { - StringBuilder ret = new StringBuilder(); - ret.append(""); - ret.append(""); - convertMatrix(matrix, ret); - ret.append(""); - ret.append(""); - ret.append(""); - ret.append(""); - ret.append(""); - return ret.toString(); + + writer.writeStartElement("matrix"); + convertMatrix(matrix, writer); + writer.writeEndElement(); + writer.writeStartElement("transformationPoint"); + writer.writeEmptyElement("Point"); + writer.writeEndElement(); + writer.writeEndElement(); } private static void convertFrames(String prevStr, String afterStr, List nonLibraryShapes, ReadOnlyTagList tags, ReadOnlyTagList timelineTags, HashMap characters, int depth, FLAVersion flaVersion, HashMap files, XFLXmlWriter writer) throws XMLStreamException { - StringBuilder ret2 = new StringBuilder(); + XFLXmlWriter writer2 = new XFLXmlWriter(); prevStr += ""; int frame = -1; - String elements; String lastElements = ""; int duration = 1; @@ -1971,33 +1978,33 @@ public class XFLConverter { } if (t instanceof ShowFrameTag) { + XFLXmlWriter elementsWriter = new XFLXmlWriter(); 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); + convertShape(characters, matrix, shape.getShapeNum(), shape.getShapes().shapeRecords, shape.getShapes().fillStyles, shape.getShapes().lineStyles, false, false, elementsWriter); 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); + convertShape(characters, matrix, 3, m.getStartEdges().shapeRecords, m.getFillStyles().getStartFillStyles(), m.getLineStyles().getStartLineStyles(m.getShapeNum()), true, false, elementsWriter); shapeTween = true; } else { shapeTween = false; if (character instanceof TextTag) { - elements = convertText(instanceName, (TextTag) character, matrix, filters, clipActions); + convertText(instanceName, (TextTag) character, matrix, filters, clipActions, elementsWriter); } else if (character instanceof DefineVideoStreamTag) { - elements = convertVideoInstance(instanceName, matrix, (DefineVideoStreamTag) character, clipActions); + convertVideoInstance(instanceName, matrix, (DefineVideoStreamTag) character, clipActions, elementsWriter); } else { - elements = convertSymbolInstance(instanceName, matrix, colorTransForm, cacheAsBitmap, blendMode, filters, isVisible, backGroundColor, clipActions, character, characters, tags, flaVersion); + convertSymbolInstance(instanceName, matrix, colorTransForm, cacheAsBitmap, blendMode, filters, isVisible, backGroundColor, clipActions, character, characters, tags, flaVersion, elementsWriter); } } - } else { - elements = ""; } frame++; + String elements = elementsWriter.toString(); if (!elements.equals(lastElements) && frame > 0) { - convertFrame(lastShapeTween, characters, tags, null, null, frame - duration, duration, "", lastElements, files, ret2); + convertFrame(lastShapeTween, characters, tags, null, null, frame - duration, duration, "", lastElements, files, writer2); duration = 1; } else if (frame == 0) { duration = 1; @@ -2011,13 +2018,13 @@ public class XFLConverter { } if (!lastElements.isEmpty()) { frame++; - convertFrame(lastShapeTween, characters, tags, null, null, (frame - duration < 0 ? 0 : frame - duration), duration, "", lastElements, files, ret2); + convertFrame(lastShapeTween, characters, tags, null, null, (frame - duration < 0 ? 0 : frame - duration), duration, "", lastElements, files, writer2); } afterStr = "" + afterStr; - if (ret2.length() > 0) { + if (writer2.length() > 0) { writer.writeCharactersRaw(prevStr); - writer.writeCharactersRaw(ret2.toString()); + writer.writeCharactersRaw(writer2.toString()); writer.writeCharactersRaw(afterStr); } } @@ -2242,7 +2249,7 @@ public class XFLConverter { } private void convertSoundLayer(int layerIndex, String backgroundColor, HashMap characters, ReadOnlyTagList tags, ReadOnlyTagList timeLineTags, HashMap files, XFLXmlWriter writer) throws XMLStreamException { - StringBuilder ret2 = new StringBuilder(); + XFLXmlWriter writer2 = new XFLXmlWriter(); StartSoundTag lastStartSound = null; SoundStreamHeadTypeTag lastSoundStreamHead = null; StartSoundTag startSound = null; @@ -2275,7 +2282,7 @@ public class XFLConverter { if (t instanceof ShowFrameTag) { if (soundStreamHead != null || startSound != null) { if (lastSoundStreamHead != null || lastStartSound != null) { - convertFrame(false, characters, tags, lastSoundStreamHead, lastStartSound, frame, duration, "", "", files, ret2); + convertFrame(false, characters, tags, lastSoundStreamHead, lastStartSound, frame, duration, "", "", files, writer2); } frame += duration; duration = 1; @@ -2293,13 +2300,13 @@ public class XFLConverter { frame = 0; duration = 1; } - convertFrame(false, characters, tags, lastSoundStreamHead, lastStartSound, frame, duration, "", "", files, ret2); + convertFrame(false, characters, tags, lastSoundStreamHead, lastStartSound, frame, duration, "", "", files, writer2); } - if (ret2.length() > 0) { + if (writer2.length() > 0) { writer.writeStartElement("DOMLayer", new String[]{"name", "Layer " + layerIndex, "color", randomOutlineColor()}); writer.writeStartElement("frames"); - writer.writeCharactersRaw(ret2.toString()); + writer.writeCharactersRaw(writer2.toString()); writer.writeEndElement(); writer.writeEndElement(); } @@ -2444,12 +2451,10 @@ public class XFLConverter { return ret; } - private static String convertText(String instanceName, TextTag tag, MATRIX m, List filters, CLIPACTIONS clipActions) { - StringBuilder ret = new StringBuilder(); - + private static void convertText(String instanceName, TextTag tag, MATRIX m, List filters, CLIPACTIONS clipActions, XFLXmlWriter writer) throws XMLStreamException { MATRIX matrix = new MATRIX(m); CSMTextSettingsTag csmts = null; - StringBuilder filterStr = new StringBuilder(); + XFLXmlWriter filterStr = new XFLXmlWriter(); if (filters != null) { filterStr.append(""); for (FILTER f : filters) { @@ -2485,7 +2490,7 @@ public class XFLConverter { MATRIX textMatrix = tag.getTextMatrix(); left = " left=\"" + doubleToString((textMatrix.translateX) / SWF.unitDivisor) + "\""; } - StringBuilder matStr = new StringBuilder(); + XFLXmlWriter matStr = new XFLXmlWriter(); matStr.append(""); convertMatrix(matrix, matStr); matStr.append(""); @@ -2507,15 +2512,15 @@ public class XFLConverter { } } - ret.append(" attrs = TextTag.getTextRecordsAttributes(textRecords, swf); // todo: remove System.err.println("///////////============="); - ret.append(" width=\"").append(tag.getBounds().getWidth() / 2).append("\" height=\"").append(tag.getBounds().getHeight()).append("\" autoExpand=\"true\" isSelectable=\"false\">"); - ret.append(matStr); + writer.append(" width=\"").append(tag.getBounds().getWidth() / 2).append("\" height=\"").append(tag.getBounds().getHeight()).append("\" autoExpand=\"true\" isSelectable=\"false\">"); + writer.append(matStr.toString()); - ret.append(""); + writer.append(""); int fontId = -1; FontTag font = null; String fontName = null; @@ -2584,32 +2589,32 @@ public class XFLConverter { } firstRun = false; if (font != null) { - ret.append(""); - ret.append("").append(Helper.escapeHTML((newline ? "\r" : "") + rec.getText(font))).append(""); - ret.append(""); + writer.append(""); + writer.append("").append(Helper.escapeHTML((newline ? "\r" : "") + rec.getText(font))).append(""); + writer.append(""); - ret.append(""); + writer.append(" face=\"").append(psFontName).append("\""); + writer.append("/>"); - ret.append(""); - ret.append(""); + writer.append(""); + writer.append(""); } } - ret.append(""); - ret.append(filterStr); - ret.append(""); + writer.append(""); + writer.append(filterStr.toString()); + writer.append(""); } else if (tag instanceof DefineEditTextTag) { DefineEditTextTag det = (DefineEditTextTag) tag; String tagName; @@ -2627,14 +2632,14 @@ public class XFLConverter { } else { tagName = "DOMInputText"; } - ret.append("<").append(tagName); + writer.append("<").append(tagName); if (fontRenderingMode != null) { - ret.append(" fontRenderingMode=\"").append(fontRenderingMode).append("\""); + writer.append(" fontRenderingMode=\"").append(fontRenderingMode).append("\""); } if (instanceName != null) { - ret.append(" name=\"").append(Helper.escapeHTML(instanceName)).append("\""); + writer.append(" name=\"").append(Helper.escapeHTML(instanceName)).append("\""); } - ret.append(antiAlias); + writer.append(antiAlias); double width = twipToPixel(bounds.getWidth()); double height = twipToPixel(bounds.getHeight()); //There is usually 4px difference between width/height and XML width/height @@ -2646,43 +2651,43 @@ public class XFLConverter { width -= twipToPixel(det.rightMargin); width -= twipToPixel(det.leftMargin); } - ret.append(" width=\"").append(width).append("\""); - ret.append(" height=\"").append(height).append("\""); + writer.append(" width=\"").append(width).append("\""); + writer.append(" height=\"").append(height).append("\""); if (det.border) { - ret.append(" border=\"true\""); + writer.append(" border=\"true\""); } if (det.html) { - ret.append(" renderAsHTML=\"true\""); + writer.append(" renderAsHTML=\"true\""); } if (det.noSelect) { - ret.append(" isSelectable=\"false\""); + writer.append(" isSelectable=\"false\""); } if (det.multiline && det.wordWrap) { - ret.append(" lineType=\"multiline\""); + writer.append(" lineType=\"multiline\""); } else if (det.multiline && (!det.wordWrap)) { - ret.append(" lineType=\"multiline no wrap\""); + writer.append(" lineType=\"multiline no wrap\""); } else if (det.password) { - ret.append(" lineType=\"password\""); + writer.append(" lineType=\"password\""); } if (det.hasMaxLength) { - ret.append(" maxCharacters=\"").append(det.maxLength).append("\""); + writer.append(" maxCharacters=\"").append(det.maxLength).append("\""); } if (!det.variableName.isEmpty()) { - ret.append(" variableName=\"").append(det.variableName).append("\""); + writer.append(" variableName=\"").append(det.variableName).append("\""); } - ret.append(">"); - ret.append(matStr); - ret.append(""); + writer.append(">"); + writer.append(matStr.toString()); + writer.append(""); String txt = ""; if (det.hasText) { txt = det.initialText; } if (det.html) { - ret.append(convertHTMLText(swf.getTags(), det, txt)); + writer.append(convertHTMLText(swf.getTags(), det, txt)); } else { - ret.append(""); - ret.append("").append(Helper.escapeHTML(txt)).append(""); + writer.append(""); + writer.append("").append(Helper.escapeHTML(txt)).append(""); int leftMargin = -1; int rightMargin = -1; int indent = -1; @@ -2739,43 +2744,42 @@ public class XFLConverter { alignment = "unknown"; } } - ret.append(""); - ret.append(""); + writer.append(" -1) { - ret.append(" indent=\"").append(twipToPixel(indent)).append("\""); + writer.append(" indent=\"").append(twipToPixel(indent)).append("\""); } if (leftMargin > -1) { - ret.append(" leftMargin=\"").append(twipToPixel(leftMargin)).append("\""); + writer.append(" leftMargin=\"").append(twipToPixel(leftMargin)).append("\""); } if (lineSpacing > -1) { - ret.append(" lineSpacing=\"").append(twipToPixel(lineSpacing)).append("\""); + writer.append(" lineSpacing=\"").append(twipToPixel(lineSpacing)).append("\""); } if (rightMargin > -1) { - ret.append(" rightMargin=\"").append(twipToPixel(rightMargin)).append("\""); + writer.append(" rightMargin=\"").append(twipToPixel(rightMargin)).append("\""); } if (size > -1) { - ret.append(" size=\"").append(twipToPixel(size)).append("\""); - ret.append(" bitmapSize=\"").append(size).append("\""); + writer.append(" size=\"").append(twipToPixel(size)).append("\""); + writer.append(" bitmapSize=\"").append(size).append("\""); } if (fontFace != null) { - ret.append(" face=\"").append(fontFace).append("\""); + writer.append(" face=\"").append(fontFace).append("\""); } if (textColor != null) { - ret.append(" fillColor=\"").append(textColor.toHexRGB()).append("\" alpha=\"").append(textColor.getAlphaFloat()).append("\""); + writer.append(" fillColor=\"").append(textColor.toHexRGB()).append("\" alpha=\"").append(textColor.getAlphaFloat()).append("\""); } - ret.append("/>"); - ret.append(""); - ret.append(""); + writer.append("/>"); + writer.append(""); + writer.append(""); } - ret.append(""); - ret.append(filterStr); - ret.append(""); + writer.append(""); + writer.append(filterStr.toString()); + writer.append(""); } - return ret.toString(); } public void convertSWF(AbortRetryIgnoreHandler handler, SWF swf, String swfFileName, String outfile, XFLExportSettings settings, String generator, String generatorVerName, String generatorVersion, boolean parallel, FLAVersion flaVersion) throws IOException, InterruptedException { @@ -3257,7 +3261,7 @@ public class XFLConverter { return a == b ? true : Math.abs(a - b) < EPSILON; } - private static void convertAdjustColorFilter(COLORMATRIXFILTER filter, StringBuilder ret) { + private static void convertAdjustColorFilter(COLORMATRIXFILTER filter, XFLXmlWriter writer) { float[][] matrix = new float[5][5]; int index = 0; for (int i = 0; i < 4; i++) { @@ -3301,7 +3305,7 @@ public class XFLConverter { h = 0; } - ret.append(""); + writer.append(""); } private static String convertHTMLText(ReadOnlyTagList tags, DefineEditTextTag det, String html) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/xfl/XFLXmlWriter.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/xfl/XFLXmlWriter.java index d63f945b4..e67b7ba97 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/xfl/XFLXmlWriter.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/xfl/XFLXmlWriter.java @@ -54,7 +54,36 @@ public class XFLXmlWriter implements XMLStreamWriter { return this; } - private XFLXmlWriter append(String text) { + // todo: remove + public XFLXmlWriter append(StringBuilder stringBuilder) { + sb.append(stringBuilder); + newLine = false; + return this; + } + + // todo: remove + public XFLXmlWriter append(int value) { + sb.append(value); + newLine = false; + return this; + } + + // todo: remove + public XFLXmlWriter append(float value) { + sb.append(value); + newLine = false; + return this; + } + + // todo: remove + public XFLXmlWriter append(double value) { + sb.append(value); + newLine = false; + return this; + } + + // todo: make this private + public XFLXmlWriter append(String text) { sb.append(text); newLine = false; return this; @@ -216,6 +245,14 @@ public class XFLXmlWriter implements XMLStreamWriter { append(' ').append(localName).append("=\"").append(escapeAttribute(value)).append('"'); } + public void writeAttribute(String localName, double value) throws XMLStreamException { + writeAttribute(localName, Double.toString(value)); + } + + public void writeAttribute(String localName, int value) throws XMLStreamException { + writeAttribute(localName, Integer.toString(value)); + } + @Override public void writeAttribute(String prefix, String namespaceURI, String localName, String value) throws XMLStreamException { setPrefix(prefix, namespaceURI); @@ -350,4 +387,9 @@ public class XFLXmlWriter implements XMLStreamWriter { public int length() { return sb.length(); } + + // todo: remove + void setLength(int newLength) { + sb.setLength(newLength); + } }