diff --git a/CHANGELOG.md b/CHANGELOG.md
index 375800f14..2be177648 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -71,8 +71,9 @@ All notable changes to this project will be documented in this file.
- [#2136] FLA Export - optimized Shape fixer speed, repeated shape on timeline not exported twice
- [#2139] FLA Export - labels layer not counted as layer index causing masked layer parentindex wrong
- [#2138] Nested clipping (masks) display
-- [#2138] Missing morphshapes (incorrect holes calculation)
-- [#2138] Mask layer was visible when did not contain a masked layer
+- [#2138] FLA Export - Missing morphshapes (incorrect holes calculation)
+- [#2138] FLA Export - Mask layer was visible when did not contain a masked layer
+- FLA Export - frame numbering problem
### Changed
- [#2120] Exported assets no longer take names from assigned classes if there is more than 1 assigned class
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 5b70003b4..f67402233 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
@@ -1877,7 +1877,7 @@ public class XFLConverter {
symbolStr.writeEndElement();
}
symbolStr.writeStartElement("DOMFrame", new String[]{
- "index", Integer.toString(frame - 1),
+ "index", Integer.toString(frame),
"keyMode", Integer.toString(KEY_MODE_NORMAL)});
symbolStr.writeStartElement("elements");
symbolStr.writeCharactersRaw(recCharWriter.toString());
@@ -2548,7 +2548,7 @@ public class XFLConverter {
boolean lastIn = true;
XFLXmlWriter writer2 = new XFLXmlWriter();
prevStr += "";
- int frame = -1;
+ int frame = -1;
String lastElements = "";
CharacterTag lastCharacter = null;
MATRIX lastMatrix = null;
@@ -2572,7 +2572,9 @@ public class XFLConverter {
MorphShapeTag shapeTweener = null;
List morphShapeRatios = new ArrayList<>();
int lastTweenRatio = -1;
-
+ MorphShapeTag standaloneShapeTweener = null;
+ MATRIX standaloneShapeTweenerMatrix = null;
+
//Add ShowFrameTag to the end when there is one last missing
List timTags = timelineTags.toArrayList();
boolean needsFrameAdd = false;
@@ -2589,8 +2591,7 @@ public class XFLConverter {
timTags.add(new ShowFrameTag(swf));
}
- MorphShapeTag standaloneShapeTweener = null;
- MATRIX standaloneShapeTweenerMatrix = null;
+
for (Tag t : timTags) {
if (t instanceof PlaceObjectTypeTag) {
PlaceObjectTypeTag po = (PlaceObjectTypeTag) t;
@@ -2658,22 +2659,10 @@ public class XFLConverter {
ratio = po.getRatio();
clipActions = po.getClipActions();
}
-
}
}
}
-
- /*if (t instanceof ShowFrameTag) {
- if (t == timTags.get(timTags.size() - 1)) {
- if (shapeTween && character != null && (character instanceof MorphShapeTag)) {
- MorphShapeTag m = (MorphShapeTag) character;
- shapeTweener = m;
- shapeTween = false;
- lastTweenRatio = ratio;
- character = null;
- }
- }
- }*/
+
if (t instanceof RemoveTag) {
RemoveTag rt = (RemoveTag) t;
if (rt.getDepth() == depth) {
@@ -2699,137 +2688,121 @@ public class XFLConverter {
}
if (t instanceof ShowFrameTag) {
- /*if (prevWasShapeTween) {
- prevWasShapeTween = false;
- continue;
- }*/
-
- boolean shapeTweenNow = false;
- if (frame + 1 >= startFrame && (onlyFrames == null || onlyFrames.contains(frame + 1))) {
-
- XFLXmlWriter elementsWriter = new XFLXmlWriter();
-
- if (frame + 1 <= endFrame) {
- lastIn = true;
- if (shapeTweener != null) {
- MorphShapeTag m = shapeTweener;
- XFLXmlWriter addLastWriter = new XFLXmlWriter();
- SHAPEWITHSTYLE endShape = m.getShapeAtRatio(65535); //lastTweenRatio);
- convertShape(swf, characters, matrix, m.getShapeNum() == 1 ? 3 : 4, endShape.shapeRecords, m.getFillStyles().getFillStylesAt(65535), m.getLineStyles().getLineStylesAt(m.getShapeNum(), 65535), true, false, addLastWriter);
- Integer ease = Easing.getEaseFromShapeRatios(morphShapeRatios);
- Integer acceleration = null;
- if (ease != null) {
- acceleration = -ease;
- }
- convertFrame(scene, true, null, null, frame - duration, duration, "", lastElements, files, writer2, acceleration);
- duration = 1;
- lastElements = addLastWriter.toString();
- lastCharacter = m;
- lastMatrix = matrix;
- shapeTweener = null;
- shapeTweenNow = true;
- morphShapeRatios.clear();
- }
- if (!shapeTweenNow) {
- if (character instanceof ShapeTag && standaloneShapeTweener != null) {
- convertSymbolInstance(instanceName, standaloneShapeTweenerMatrix, colorTransForm, cacheAsBitmap, blendMode, filters, isVisible, backGroundColor, clipActions, metadata, standaloneShapeTweener, characters, tags, flaVersion, elementsWriter);
- standaloneShapeTweener = null;
- } else if ((character instanceof ShapeTag) && (nonLibraryShapes.contains(characterId))) { // || shapeTweener != null)) {
- if (lastCharacter == character && Objects.equals(matrix, lastMatrix)) {
- elementsWriter.writeCharactersRaw(lastElements);
- } else {
- ShapeTag shape = (ShapeTag) character;
- statusStack.pushStatus(character.toString());
- convertShape(swf, characters, matrix, shape.getShapeNum(), shape.getShapes().shapeRecords, shape.getShapes().fillStyles, shape.getShapes().lineStyles, false, false, elementsWriter);
- statusStack.popStatus();
- }
- lastCharacter = character;
- lastMatrix = matrix;
- shapeTween = false;
- shapeTweener = null;
- } else if (character != null) {
- if (character instanceof MorphShapeTag) {
- MorphShapeTag m = (MorphShapeTag) character;
- if (multiUsageMorphShapes.contains(m.getCharacterId())) {
- shapeTween = false;
- shapeTweener = null;
- standaloneShapeTweener = m;
- standaloneShapeTweenerMatrix = matrix;
- convertSymbolInstance(instanceName, matrix, colorTransForm, cacheAsBitmap, blendMode, filters, isVisible, backGroundColor, clipActions, metadata, character, characters, tags, flaVersion, elementsWriter);
- } else {
- morphShapeRatios.add(ratio == -1 ? 0 : ratio);
- if (lastCharacter == m && Objects.equals(matrix, lastMatrix)) {
- elementsWriter.writeCharactersRaw(lastElements);
- } else {
- statusStack.pushStatus(m.toString());
- convertShape(swf, characters, matrix, m.getShapeNum() == 1 ? 3 : 4, m.getStartEdges().shapeRecords, m.getFillStyles().getStartFillStyles(), m.getLineStyles().getStartLineStyles(m.getShapeNum()), true, false, elementsWriter);
- statusStack.popStatus();
- }
-
- lastCharacter = m;
- lastMatrix = matrix;
- shapeTween = true;
- }
- } else {
- shapeTween = false;
- if (character instanceof TextTag) {
- statusStack.pushStatus(character.toString());
- convertText(instanceName, (TextTag) character, matrix, filters, clipActions, elementsWriter);
- statusStack.popStatus();
- } else if (character instanceof DefineVideoStreamTag) {
- convertVideoInstance(instanceName, matrix, (DefineVideoStreamTag) character, clipActions, elementsWriter);
- } else if (character instanceof ImageTag) {
- convertImageInstance(instanceName, matrix, (ImageTag) character, clipActions, elementsWriter);
- } else {
- convertSymbolInstance(instanceName, matrix, colorTransForm, cacheAsBitmap, blendMode, filters, isVisible, backGroundColor, clipActions, metadata, character, characters, tags, flaVersion, elementsWriter);
- }
- }
- }
- }
- }
- if (!shapeTweenNow) {
- frame++;
- String elements = elementsWriter.toString();
- if (!elements.equals(lastElements) && frame > 0) {
- convertFrame(scene, false, null, null, frame - duration, duration, "", lastElements, files, writer2, null);
- duration = 1;
- } else if (frame == 0) {
- duration = 1;
- } else {
- duration++;
- }
-
- lastElements = elements;
- lastCharacter = character;
- lastMatrix = matrix;
- if (frame > endFrame) {
- if (lastIn) {
- lastElements = "";
- lastIn = false;
- lastCharacter = null;
- lastMatrix = null;
- }
- }
- }
- } else {
+ frame++;
+ if (frame < startFrame || frame > endFrame || (onlyFrames != null && !onlyFrames.contains(frame))) {
if (lastIn) {
lastElements = "";
lastIn = false;
lastCharacter = null;
lastMatrix = null;
}
- frame++;
if (frame == 0) {
duration = 1;
} else {
duration++;
}
+ continue;
}
+ lastIn = true;
+
+ XFLXmlWriter elementsWriter = new XFLXmlWriter();
+
+ if (shapeTweener != null) {
+ MorphShapeTag m = shapeTweener;
+ XFLXmlWriter addLastWriter = new XFLXmlWriter();
+
+ if ((character instanceof MorphShapeTag) && (!multiUsageMorphShapes.contains(character.getCharacterId()))) {
+ MorphShapeTag m2 = (MorphShapeTag) character;
+ statusStack.pushStatus(m2.toString());
+ convertShape(swf, characters, matrix, m2.getShapeNum() == 1 ? 3 : 4, m2.getStartEdges().shapeRecords, m2.getFillStyles().getStartFillStyles(), m2.getLineStyles().getStartLineStyles(m2.getShapeNum()), true, false, addLastWriter);
+ statusStack.popStatus();
+ shapeTween = true;
+ } else {
+ SHAPEWITHSTYLE endShape = m.getShapeAtRatio(65535); //lastTweenRatio);
+ convertShape(swf, characters, matrix, m.getShapeNum() == 1 ? 3 : 4, endShape.shapeRecords, m.getFillStyles().getFillStylesAt(65535), m.getLineStyles().getLineStylesAt(m.getShapeNum(), 65535), true, false, addLastWriter);
+ }
+
+ Integer ease = Easing.getEaseFromShapeRatios(morphShapeRatios);
+ Integer acceleration = null;
+ if (ease != null) {
+ acceleration = -ease;
+ }
+ convertFrame(scene, true, null, null, frame - duration, duration, "", lastElements, files, writer2, acceleration);
+ duration = 1;
+ lastElements = addLastWriter.toString();
+ lastMatrix = matrix;
+ lastCharacter = character;
+ shapeTweener = null;
+ morphShapeRatios.clear();
+ continue;
+ }
+
+ if (character instanceof ShapeTag && standaloneShapeTweener != null) {
+ convertSymbolInstance(instanceName, standaloneShapeTweenerMatrix, colorTransForm, cacheAsBitmap, blendMode, filters, isVisible, backGroundColor, clipActions, metadata, standaloneShapeTweener, characters, tags, flaVersion, elementsWriter);
+ standaloneShapeTweener = null;
+ } else if ((character instanceof ShapeTag) && (nonLibraryShapes.contains(characterId))) {
+ if (lastCharacter == character && Objects.equals(matrix, lastMatrix)) {
+ elementsWriter.writeCharactersRaw(lastElements);
+ } else {
+ ShapeTag shape = (ShapeTag) character;
+ statusStack.pushStatus(character.toString());
+ convertShape(swf, characters, matrix, shape.getShapeNum(), shape.getShapes().shapeRecords, shape.getShapes().fillStyles, shape.getShapes().lineStyles, false, false, elementsWriter);
+ statusStack.popStatus();
+ }
+ shapeTween = false;
+ shapeTweener = null;
+ } else if (character instanceof MorphShapeTag) {
+ MorphShapeTag m = (MorphShapeTag) character;
+ if (multiUsageMorphShapes.contains(m.getCharacterId())) {
+ shapeTween = false;
+ shapeTweener = null;
+ standaloneShapeTweener = m;
+ standaloneShapeTweenerMatrix = matrix;
+ convertSymbolInstance(instanceName, matrix, colorTransForm, cacheAsBitmap, blendMode, filters, isVisible, backGroundColor, clipActions, metadata, character, characters, tags, flaVersion, elementsWriter);
+ } else {
+ morphShapeRatios.add(ratio == -1 ? 0 : ratio);
+ if (lastCharacter == m && Objects.equals(matrix, lastMatrix)) {
+ elementsWriter.writeCharactersRaw(lastElements);
+ } else {
+ statusStack.pushStatus(m.toString());
+ convertShape(swf, characters, matrix, m.getShapeNum() == 1 ? 3 : 4, m.getStartEdges().shapeRecords, m.getFillStyles().getStartFillStyles(), m.getLineStyles().getStartLineStyles(m.getShapeNum()), true, false, elementsWriter);
+ statusStack.popStatus();
+ }
+ shapeTween = true;
+ }
+ } else {
+ shapeTween = false;
+ if (character instanceof TextTag) {
+ statusStack.pushStatus(character.toString());
+ convertText(instanceName, (TextTag) character, matrix, filters, clipActions, elementsWriter);
+ statusStack.popStatus();
+ } else if (character instanceof DefineVideoStreamTag) {
+ convertVideoInstance(instanceName, matrix, (DefineVideoStreamTag) character, clipActions, elementsWriter);
+ } else if (character instanceof ImageTag) {
+ convertImageInstance(instanceName, matrix, (ImageTag) character, clipActions, elementsWriter);
+ } else if (character != null) {
+ convertSymbolInstance(instanceName, matrix, colorTransForm, cacheAsBitmap, blendMode, filters, isVisible, backGroundColor, clipActions, metadata, character, characters, tags, flaVersion, elementsWriter);
+ }
+ }
+
+ String elements = elementsWriter.toString();
+ if (!elements.equals(lastElements) && frame > 0) {
+ convertFrame(scene, false, null, null, frame - duration, duration, "", lastElements, files, writer2, null);
+ duration = 1;
+ } else if (frame == 0) {
+ duration = 1;
+ } else {
+ duration++;
+ }
+ lastElements = elements;
+ lastCharacter = character;
+ lastMatrix = matrix;
}
}
+
if (!lastElements.isEmpty() || writer2.length() > 0) {
frame++;
- convertFrame(scene, false, null, null, (frame - duration < 0 ? 0 : frame - duration), duration, "", lastElements, files, writer2, null);
+ convertFrame(scene, false, null, null, frame - duration, duration, "", lastElements, files, writer2, null);
}
afterStr = "" + afterStr;
diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/xfl/shapefixer/MorphShapeFixer.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/xfl/shapefixer/MorphShapeFixer.java
index 5e13e9666..bc7995998 100644
--- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/xfl/shapefixer/MorphShapeFixer.java
+++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/xfl/shapefixer/MorphShapeFixer.java
@@ -27,6 +27,7 @@ import java.awt.Rectangle;
import java.awt.geom.GeneralPath;
import java.awt.geom.PathIterator;
import java.awt.geom.Point2D;
+import java.awt.geom.Rectangle2D;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedHashMap;
@@ -266,12 +267,23 @@ public class MorphShapeFixer extends ShapeFixer {
px = r.getX() + r.getWidth() * Math.random();
py = r.getY() + r.getHeight() * Math.random();
} while (!region.contains(px, py));*/
+
+
PathIterator pi = region.getPathIterator(null);
if (!pi.isDone()) {
double[] points = new double[6];
int type = pi.currentSegment(points);
- if (type == PathIterator.SEG_MOVETO) {
- if (!path.contains(points[0], points[1])) {
+ if (type == PathIterator.SEG_MOVETO) {
+ double x = points[0];
+ double y = points[1];
+ Rectangle2D bounds = region.getBounds2D();
+ double centerX = bounds.getCenterX();
+ double centerY = bounds.getCenterY();
+
+ double p = Math.sqrt((centerX - x) * (centerX - x) + (centerY - y) * (centerY - y));
+ double x1 = (centerX - x) * 0.1 / p;
+ double y1 = (centerY - y) * 0.1 / p;
+ if (!path.contains(x + x1, y + y1)) {
closedHolesI.add(i);
}
}
diff --git a/libsrc/ffdec_lib/testdata/morphshape_ease/exp/morphshape_ease/DOMDocument.xml b/libsrc/ffdec_lib/testdata/morphshape_ease/exp/morphshape_ease/DOMDocument.xml
deleted file mode 100644
index f6c5bd73f..000000000
--- a/libsrc/ffdec_lib/testdata/morphshape_ease/exp/morphshape_ease/DOMDocument.xml
+++ /dev/null
@@ -1,59 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/libsrc/ffdec_lib/testdata/morphshape_ease/exp/morphshape_ease/PublishSettings.xml b/libsrc/ffdec_lib/testdata/morphshape_ease/exp/morphshape_ease/PublishSettings.xml
deleted file mode 100644
index 40c6cbef7..000000000
--- a/libsrc/ffdec_lib/testdata/morphshape_ease/exp/morphshape_ease/PublishSettings.xml
+++ /dev/null
@@ -1,206 +0,0 @@
-
-
-
- 1
- 1
- 0
- 0
- 1
- 0
- 0
- 0
- 0
- 0
- 0
- 1
- 1
- 1
- 1
- 1
- 1
- 1
- 1
- 1
- 1
- morphshape_ease.swf
- morphshape_ease.exe
- morphshape_ease.app
- morphshape_ease.html
- morphshape_ease.gif
- morphshape_ease.jpg
- morphshape_ease.png
- 1
- morphshape_ease.smil
- morphshape_ease.swc
-
-
- 0
- 12,0,0,0;11,2,0,0;11,1,0,0;10,3,0,0;10,2,153,0;10,1,52,0;9,0,124,0;8,0,24,0;7,0,14,0;6,0,79,0;5,0,58,0;4,0,32,0;3,0,8,0;2,0,1,12;1,0,0,1;
- 1
- 1
- morphshape_ease_content.html
- morphshape_ease_alternate.html
- 0
-
- 550.0
- 400.0
- 0
- 0
- 1
- 0
- 0
- 1
- 1
- 4
- 0
- 0
- 1
- 0
-
- 1
-
-
-
-
- 0
- 0
- 0
- 80
- 0
- 0
- 7
- 0
- 7
- 0
- 15
- FlashPlayer11.2
- 2
- 1
-
- .
- CONFIG::FLASH_AUTHORING="true";
- 0
-
- 1
- 0
- 1
- 0
- 0
- 0
- 0
-
- 2
- 4
- 4096
- AS3
- 1
- 1
- 0
- 15
- 1
- 0
- 4102
- rsl
- wrap
- $(AppConfig)/ActionScript 3.0/rsls/loader_animation.swf
-
-
- $(AppConfig)/ActionScript 3.0/libs
- merge
-
-
- $(AppConfig)/ActionScript 3.0/libs/11.0/textLayout.swc
- rsl
- http://fpdownload.adobe.com/pub/swz/tlf/2.0.0.232/textLayout_2.0.0.232.swz
- http://fpdownload.adobe.com/pub/swz/crossdomain.xml
- textLayout_2.0.0.232.swz
-
-
-
-
- $(AppConfig)/ActionScript 3.0/libs/11.0/textLayout.swc
-
- http://fpdownload.adobe.com/pub/swz/tlf/2.0.0.232/textLayout_2.0.0.232.swz
- http://fpdownload.adobe.com/pub/swz/crossdomain.xml
- textLayout_2.0.0.232.swz
-
-
-
-
- 550.0
- 400.0
- 0
- 4718592
- 0
- 80
- 1
-
-
- 1
- 0
- 1
- 0
- 0
- 100000
- 1
- 1
- 0
- 0
- 0
- 0
- 0
- 0
- 1
-
-
- 550.0
- 400.0
- 0
- 1
- 1
-
- 1
- 0
- 1
- 0
- 0
-
- 128
-
-
- 255
-
-
-
- 550.0
- 400.0
- 1
- 0
- 0
- 1
- 0
- 0
- 1
-
-
-
- 24-bit with Alpha
- 255
-
-
-
- 550.0
- 400.0
- 1
- 0
-
-
- 00000000
- 0
- 0
- 0
- 0
- 1
-
-
-
\ No newline at end of file
diff --git a/libsrc/ffdec_lib/testdata/morphshape_ease/morphshape_ease/DOMDocument.xml b/libsrc/ffdec_lib/testdata/morphshape_ease/morphshape_ease/DOMDocument.xml
new file mode 100644
index 000000000..a1f15ede5
--- /dev/null
+++ b/libsrc/ffdec_lib/testdata/morphshape_ease/morphshape_ease/DOMDocument.xml
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/libsrc/ffdec_lib/testdata/morphshape_timeline/morphshape_timeline.html b/libsrc/ffdec_lib/testdata/morphshape_timeline/morphshape_timeline.html
new file mode 100644
index 000000000..97cdf7583
--- /dev/null
+++ b/libsrc/ffdec_lib/testdata/morphshape_timeline/morphshape_timeline.html
@@ -0,0 +1,49 @@
+
+
+
+ morphshape_timeline
+
+
+
+
+
+
+
+
+
diff --git a/libsrc/ffdec_lib/testdata/morphshape_timeline/morphshape_timeline.swf b/libsrc/ffdec_lib/testdata/morphshape_timeline/morphshape_timeline.swf
new file mode 100644
index 000000000..a77b381fc
Binary files /dev/null and b/libsrc/ffdec_lib/testdata/morphshape_timeline/morphshape_timeline.swf differ
diff --git a/libsrc/ffdec_lib/testdata/morphshape_timeline/morphshape_timeline/DOMDocument.xml b/libsrc/ffdec_lib/testdata/morphshape_timeline/morphshape_timeline/DOMDocument.xml
new file mode 100644
index 000000000..336da3be4
--- /dev/null
+++ b/libsrc/ffdec_lib/testdata/morphshape_timeline/morphshape_timeline/DOMDocument.xml
@@ -0,0 +1,148 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/libsrc/ffdec_lib/testdata/morphshape_timeline/morphshape_timeline/META-INF/metadata.xml b/libsrc/ffdec_lib/testdata/morphshape_timeline/morphshape_timeline/META-INF/metadata.xml
new file mode 100644
index 000000000..8246fb6eb
--- /dev/null
+++ b/libsrc/ffdec_lib/testdata/morphshape_timeline/morphshape_timeline/META-INF/metadata.xml
@@ -0,0 +1,68 @@
+
+
+
+
+ Adobe Flash Professional CS6 - build 481
+ 2023-12-09T10:14:52-08:00
+ 2023-12-09T12:45:21-08:00
+ 2023-12-09T12:45:21-08:00
+
+
+ application/vnd.adobe.fla
+
+
+ xmp.iid:C88F451FCC96EE119313910734F6A093
+ xmp.did:C88F451FCC96EE119313910734F6A093
+ xmp.did:FF0A2AA52D76EE119313910734F6A093
+
+
+
+ created
+ xmp.iid:FF0A2AA52D76EE119313910734F6A093
+ 2023-12-09T10:14:52-08:00
+ Adobe Flash Professional CS6 - build 481
+
+
+ saved
+ xmp.iid:C88F451FCC96EE119313910734F6A093
+ 2023-12-09T12:45:21-08:00
+ Adobe Flash Professional CS6 - build 481
+ /
+
+
+
+
+ xmp.iid:FF0A2AA52D76EE119313910734F6A093
+ xmp.did:FF0A2AA52D76EE119313910734F6A093
+ xmp.did:FF0A2AA52D76EE119313910734F6A093
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/libsrc/ffdec_lib/testdata/morphshape_timeline/morphshape_timeline/MobileSettings.xml b/libsrc/ffdec_lib/testdata/morphshape_timeline/morphshape_timeline/MobileSettings.xml
new file mode 100644
index 000000000..e69de29bb
diff --git a/libsrc/ffdec_lib/testdata/morphshape_timeline/morphshape_timeline/PublishSettings.xml b/libsrc/ffdec_lib/testdata/morphshape_timeline/morphshape_timeline/PublishSettings.xml
new file mode 100644
index 000000000..1e03326ec
--- /dev/null
+++ b/libsrc/ffdec_lib/testdata/morphshape_timeline/morphshape_timeline/PublishSettings.xml
@@ -0,0 +1,206 @@
+
+
+
+ 1
+ 1
+ 0
+ 0
+ 1
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ testtimes.swf
+ testtimes.exe
+ testtimes.app
+ testtimes.html
+ testtimes.gif
+ testtimes.jpg
+ testtimes.png
+ testtimes.mov
+ testtimes.smil
+ testtimes.swc
+
+
+ 0
+ 12,0,0,0;11,2,0,0;11,1,0,0;10,3,0,0;10,2,153,0;10,1,52,0;9,0,124,0;8,0,24,0;7,0,14,0;6,0,79,0;5,0,58,0;4,0,32,0;3,0,8,0;2,0,1,12;1,0,0,1;
+ 1
+ 1
+ testtimes.xfl_content.html
+ testtimes.xfl_alternate.html
+ 0
+
+ 550
+ 400
+ 0
+ 0
+ 1
+ 0
+ 0
+ 1
+ 1
+ 4
+ 0
+ 0
+ 1
+ 0
+ C:\Users\MyUser\AppData\Local\Adobe\Flash CS6\en_US\Configuration\HTML\Default.html
+ 1
+
+
+
+
+ 0
+ 0
+ 0
+ 80
+ 0
+ 0
+ 7
+ 0
+ 7
+ 0
+ 15
+ FlashPlayer11.2
+ 2
+ 1
+
+ .
+ CONFIG::FLASH_AUTHORING="true";
+ 0
+
+ 1
+ 0
+ 1
+ 0
+ 0
+ 0
+ 0
+
+ 2
+ 4
+ 4096
+ AS3
+ 1
+ 1
+ 0
+ 15
+ 1
+ 0
+ 4102
+ rsl
+ wrap
+ $(AppConfig)/ActionScript 3.0/rsls/loader_animation.swf
+
+
+ $(AppConfig)/ActionScript 3.0/libs
+ merge
+
+
+ $(AppConfig)/ActionScript 3.0/libs/11.0/textLayout.swc
+ rsl
+ http://fpdownload.adobe.com/pub/swz/tlf/2.0.0.232/textLayout_2.0.0.232.swz
+ http://fpdownload.adobe.com/pub/swz/crossdomain.xml
+ textLayout_2.0.0.232.swz
+
+
+
+
+ $(AppConfig)/ActionScript 3.0/libs/11.0/textLayout.swc
+
+ http://fpdownload.adobe.com/pub/swz/tlf/2.0.0.232/textLayout_2.0.0.232.swz
+ http://fpdownload.adobe.com/pub/swz/crossdomain.xml
+ textLayout_2.0.0.232.swz
+
+
+
+
+ 550
+ 400
+ 0
+ 4718592
+ 0
+ 80
+ 1
+
+
+ 1
+ 0
+ 1
+ 0
+ 0
+ 100000
+ 1
+ 1
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 1
+
+
+ 550
+ 400
+ 0
+ 1
+ 1
+
+ 1
+ 0
+ 1
+ 0
+ 0
+
+ 128
+
+
+ 255
+
+
+
+ 550
+ 400
+ 1
+ 0
+ 0
+ 1
+ 0
+ 0
+ 1
+
+
+
+ 24-bit with Alpha
+ 255
+
+
+
+ 550
+ 400
+ 1
+ 0
+
+
+ 00000000
+ 0
+ 0
+ 0
+ 0
+ 1
+
+
+
\ No newline at end of file
diff --git a/libsrc/ffdec_lib/testdata/morphshape_timeline/morphshape_timeline/bin/SymDepend.cache b/libsrc/ffdec_lib/testdata/morphshape_timeline/morphshape_timeline/bin/SymDepend.cache
new file mode 100644
index 000000000..420aca5c8
Binary files /dev/null and b/libsrc/ffdec_lib/testdata/morphshape_timeline/morphshape_timeline/bin/SymDepend.cache differ
diff --git a/libsrc/ffdec_lib/testdata/morphshape_ease/exp/morphshape_ease/morphshape_ease.xfl b/libsrc/ffdec_lib/testdata/morphshape_timeline/morphshape_timeline/morphshape_timeline.xfl
similarity index 100%
rename from libsrc/ffdec_lib/testdata/morphshape_ease/exp/morphshape_ease/morphshape_ease.xfl
rename to libsrc/ffdec_lib/testdata/morphshape_timeline/morphshape_timeline/morphshape_timeline.xfl