From 67dc925d8e37416462aba1d9279c6968b6ef9eeb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sat, 6 Mar 2021 15:54:08 +0100 Subject: [PATCH] Fixed: FLA Export - mutliple FrameLabel layers --- CHANGELOG.md | 1 + .../decompiler/flash/xfl/XFLConverter.java | 53 ++++++---- .../as3_frames/exported/LIBRARY/Symbol 3.xml | 59 +++++++++++ .../as3_frames/exported/LIBRARY/Symbol 5.xml | 95 ++++++++++++++++++ .../as3_frames/exported/LIBRARY/bitmap1.png | Bin 0 -> 1978 bytes .../testdata/as3_frames/exported/acorn.as | 15 +++ 6 files changed, 202 insertions(+), 21 deletions(-) create mode 100644 libsrc/ffdec_lib/testdata/as3_frames/exported/LIBRARY/Symbol 3.xml create mode 100644 libsrc/ffdec_lib/testdata/as3_frames/exported/LIBRARY/Symbol 5.xml create mode 100644 libsrc/ffdec_lib/testdata/as3_frames/exported/LIBRARY/bitmap1.png create mode 100644 libsrc/ffdec_lib/testdata/as3_frames/exported/acorn.as diff --git a/CHANGELOG.md b/CHANGELOG.md index fbd66be25..7dbb5adec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ All notable changes to this project will be documented in this file. ### Fixed - Exception when switching from nonribbon interface to ribbon - [#1396], [#1254] FLA Export - AS3 frame scripts +- FLA Export - mutliple FrameLabel layers ## [14.1.0] - 2021-03-05 ### Added 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 291f11172..d62cc53ea 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 @@ -2169,6 +2169,7 @@ public class XFLConverter { writer.writeEndElement(); // SoundEnvelope } } + private static void convertFrame(boolean shapeTween, SoundStreamHeadTypeTag soundStreamHead, StartSoundTag startSound, int frame, int duration, String actionScript, String elements, HashMap files, XFLXmlWriter writer) throws XMLStreamException { DefineSoundTag sound = null; if (startSound != null) { @@ -2696,25 +2697,40 @@ public class XFLConverter { private boolean convertLabelsLayer(int spriteId, ReadOnlyTagList tags, ReadOnlyTagList timeLineTags, String backgroundColor, XFLXmlWriter writer) throws XMLStreamException { boolean hasLabel = false; - int duration = 0; + Map> frameToLabels = new HashMap<>(); int frame = 0; - String frameLabel = ""; - boolean isAnchor = false; + int layerCount = 0; for (Tag t : timeLineTags) { if (t instanceof FrameLabelTag) { - FrameLabelTag fl = (FrameLabelTag) t; - frameLabel = fl.getLabelName(); - isAnchor = fl.isNamedAnchor(); + FrameLabelTag frameLabel = (FrameLabelTag) t; + if (!frameToLabels.containsKey(frame)) { + frameToLabels.put(frame, new ArrayList<>()); + } + frameToLabels.get(frame).add(frameLabel); + if (frameToLabels.get(frame).size() > layerCount) { + layerCount = frameToLabels.get(frame).size(); + } } else if (t instanceof ShowFrameTag) { - if (frameLabel.isEmpty()) { + frame++; + } + } + int frameCount = frame; + + for (int lay = 0; lay < layerCount; lay++) { + writer.writeStartElement("DOMLayer", new String[]{"name", "Labels Layer" + (layerCount > 1 ? " " + (lay + 1) : ""), "color", randomOutlineColor()}); + writer.writeStartElement("frames"); + int duration = 0; + for (int i = 0; i < frameCount; i++) { + List frameLabels = frameToLabels.get(i); + FrameLabelTag frameLabel = null; + if (frameLabels != null) { + if (frameLabels.size() > lay) { + frameLabel = frameLabels.get(lay); + } + } + if (frameLabel == null) { duration++; } else { - if (!hasLabel) { - writer.writeStartElement("DOMLayer", new String[]{"name", "Labels Layer", "color", randomOutlineColor()}); - writer.writeStartElement("frames"); - hasLabel = true; - } - if (duration > 0) { writer.writeStartElement("DOMFrame", new String[]{"index", Integer.toString(frame - duration)}); if (duration > 1) { @@ -2724,11 +2740,10 @@ public class XFLConverter { writer.writeElementValue("elements", ""); writer.writeEndElement(); } - writer.writeStartElement("DOMFrame", new String[]{"index", Integer.toString(frame)}); writer.writeAttribute("keyMode", KEY_MODE_NORMAL); - writer.writeAttribute("name", frameLabel); - if (isAnchor) { + writer.writeAttribute("name", frameLabel.name); + if (frameLabel.namedAnchor) { writer.writeAttribute("labelType", "anchor"); writer.writeAttribute("bookmark", true); } else { @@ -2736,14 +2751,10 @@ public class XFLConverter { } writer.writeElementValue("elements", ""); writer.writeEndElement(); - frameLabel = ""; duration = 0; } - frame++; - } - } - if (hasLabel) { + } writer.writeEndElement(); // frames writer.writeEndElement(); // DOMLayer } diff --git a/libsrc/ffdec_lib/testdata/as3_frames/exported/LIBRARY/Symbol 3.xml b/libsrc/ffdec_lib/testdata/as3_frames/exported/LIBRARY/Symbol 3.xml new file mode 100644 index 000000000..352ac80a3 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/as3_frames/exported/LIBRARY/Symbol 3.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/libsrc/ffdec_lib/testdata/as3_frames/exported/LIBRARY/Symbol 5.xml b/libsrc/ffdec_lib/testdata/as3_frames/exported/LIBRARY/Symbol 5.xml new file mode 100644 index 000000000..cf217c40a --- /dev/null +++ b/libsrc/ffdec_lib/testdata/as3_frames/exported/LIBRARY/Symbol 5.xml @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/libsrc/ffdec_lib/testdata/as3_frames/exported/LIBRARY/bitmap1.png b/libsrc/ffdec_lib/testdata/as3_frames/exported/LIBRARY/bitmap1.png new file mode 100644 index 0000000000000000000000000000000000000000..15a544e4d47607e189863603d8306a29cb02fca3 GIT binary patch literal 1978 zcmV;r2SxaaP)A7BQ$12@)a#Ee!|~B7&@ftPM5|2*{#9(2o zTP^teNC)m+uEGz)ZTNPu4xiWOp(^tTPR0s;Js$4q&AyRaV@_72_rHW8ds^svw%l*e z6@}zbZ`1bDRD5^!JZ?4Q<8Q;QxLKc%M>m@>)KrM?uQ%dOXBi&dXu?Q`1k$ua$T+fZ z)N#$4x$OHmKeuHi$-%hQdIK{&Yx*r zX56$yqo*<0`Oc(;&HD-KTb1A8kJm_hn@PRJR zCB#YtU74Zy_vl6ZG~9{dnr!6zY(|Q+Ir^n3ctl3jiVoueg}x~#nu|a;<$C;51txkc zxkv~@-0-Q#)=FB_fK){u^fXcQG??ujzE%elttI$jpaxe{TriO0iYuvmFeHh=7(FjO zunqaX_PBTD9ID7emWBpu(Yu$c(Q!HnW0ZGh$h8XvNDOp=;bJXa-ZWZOaj$`bPuv!L z{A0Ks4_kB4AM1dgh%M+iY=fqQ@1V}l8a2Mw=oR~;ryv$0*EP6an~k$c2l357E$V1S zjFb26R3of)zv?-QX1YEq*m;N6pCb>PEQ($Rvwh<2RuH@clK{cc27gcm;ZaPVUs zc`y?NC%ri)!ItW{+b+R)Sp>niq9@9p;G2JgR}=h8aG%Nb3OJaSu|4J-Xc{md#Uqgk*z4vDA8)Wdv7sE5REriH%KGN(oA>6D1;U;yor5`}v{;k|pl*9*M zl%Vxlk+|Jniar`<^?5Nkyw|arn97q4P~jUY4)o^7Vkpy#;4J4;;Uym%{RYpVu*=|D zoQfRgQ7Yy`?4X6FL_Q>8?iiyqND~9OdC-^}i{aK{T&d1Nl+QMnh9`!RroYiF+;7Q4 zFN25uUU1Wb(>04mw(}z7Y}ZBJjzx(1lQKGs;xJ0BSdkjS!P{sok5D9HeVswf`I8OM z@i&@{F=+(4!Zs0n!wcc*_Szhr-OJ!_a=)M4rAO~BM}dnT61SP4gu3E(M=5HkAlZi0 zcSiJI0~Sm+U_pS15^m%O{s6c>PPrMN#N80_?`qI!PD5Ej5QbV#)A)|&BJorM4w$N- zi+a5wXevBs$Kn~mi``eE>=P5@?^=eU;14mXQa(XRPa0|L!d(ROGfY6PpM zz{O4rW(1cIyxh|aRX*m3vp0g|SP*Vf_#0^Bx=;{@P*3|?#MF7hfFN@to)5d56L z8o4``Bl`WND5V-`DNdqYaSz-a*QO9pk0-Y!Yq_pa&WhcrgW^2~uMDpdu)V?pA#cw` zI&H20jmmSDpsn>LP<0c@k04!n|2IrpRP*=LE!b=q(@P-e5 zbWk~Hp^hL6HL#h%DP4ORtK4>2q9mes*OM;eJ)_8`BkbP_Gh!Z37Cz?1o1~^ZnL)Os zTjZ2g_gYdTo@{q}Zjrr=Fi%*EGJ{wpv-v$)*)wJ+J8Hj_*Z*_*4@oz?$T#W-t^fc4 M07*qoM6N<$f^Htb2><{9 literal 0 HcmV?d00001 diff --git a/libsrc/ffdec_lib/testdata/as3_frames/exported/acorn.as b/libsrc/ffdec_lib/testdata/as3_frames/exported/acorn.as new file mode 100644 index 000000000..82d672a8b --- /dev/null +++ b/libsrc/ffdec_lib/testdata/as3_frames/exported/acorn.as @@ -0,0 +1,15 @@ + +package +{ + import flash.display.BitmapData; + + public dynamic class acorn extends BitmapData + { + + + public function acorn(param1:int = 32, param2:int = 32) + { + super(param1,param2); + } + } +}