From 81d0c67e310c3d0fc532d3cea3efb48038b0ad16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sat, 9 Dec 2023 11:22:28 +0100 Subject: [PATCH] Fixed #2138 Missing morphshapes (incorrect holes calculation) Fixed #2138 Mask layer was visible when did not contain a masked layer --- CHANGELOG.md | 2 + .../decompiler/flash/xfl/XFLConverter.java | 25 +- .../flash/xfl/shapefixer/MorphShapeFixer.java | 59 +++++ .../flash/xfl/shapefixer/ShapeFixer.java | 218 ++++++++++-------- .../morphshape_holes/morphshape_holes.html | 49 ++++ .../morphshape_holes/morphshape_holes.swf | Bin 0 -> 1034 bytes .../morphshape_holes/DOMDocument.xml | 127 ++++++++++ .../morphshape_holes/META-INF/metadata.xml | 55 +++++ .../morphshape_holes/MobileSettings.xml | 0 .../morphshape_holes/PublishSettings.xml | 206 +++++++++++++++++ .../morphshape_holes/bin/SymDepend.cache | Bin 0 -> 28 bytes .../morphshape_holes/morphshape_holes.xfl | 1 + 12 files changed, 650 insertions(+), 92 deletions(-) create mode 100644 libsrc/ffdec_lib/testdata/morphshape_holes/morphshape_holes.html create mode 100644 libsrc/ffdec_lib/testdata/morphshape_holes/morphshape_holes.swf create mode 100644 libsrc/ffdec_lib/testdata/morphshape_holes/morphshape_holes/DOMDocument.xml create mode 100644 libsrc/ffdec_lib/testdata/morphshape_holes/morphshape_holes/META-INF/metadata.xml create mode 100644 libsrc/ffdec_lib/testdata/morphshape_holes/morphshape_holes/MobileSettings.xml create mode 100644 libsrc/ffdec_lib/testdata/morphshape_holes/morphshape_holes/PublishSettings.xml create mode 100644 libsrc/ffdec_lib/testdata/morphshape_holes/morphshape_holes/bin/SymDepend.cache create mode 100644 libsrc/ffdec_lib/testdata/morphshape_holes/morphshape_holes/morphshape_holes.xfl diff --git a/CHANGELOG.md b/CHANGELOG.md index d40ee4296..508485434 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -70,6 +70,8 @@ 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 ### 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 ceb519f32..cf9743705 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 @@ -237,7 +237,7 @@ public class XFLConverter { /** * Adds "(depth xxx)" to layer name */ - private final boolean DEBUG_EXPORT_LAYER_DEPTHS = false; + private final boolean DEBUG_EXPORT_LAYER_DEPTHS = true; private static final DecimalFormat EDGE_DECIMAL_FORMAT = new DecimalFormat("0.#", DecimalFormatSymbols.getInstance(Locale.ENGLISH)); @@ -4217,6 +4217,29 @@ public class XFLConverter { index++; } } + + if (index == parentIndex + 1) { + //put at least one empty layer as masked, otherwise the mask layer will be visible + writer.writeStartElement("DOMLayer", new String[]{ + "name", "Layer " + (index + 1), + "color", randomOutlineColor(), + "parentLayerIndex", "" + parentIndex, + "locked", "true" + }); + writer.writeStartElement("frames"); + + writer.writeStartElement("DOMFrame"); + writer.writeAttribute("index", 0); + writer.writeAttribute("duration", lastFrame + 1); + writer.writeAttribute("keyMode", KEY_MODE_NORMAL); + writer.writeStartElement("elements"); + writer.writeEndElement(); //elements + writer.writeEndElement(); //DOMFrame + + writer.writeEndElement(); //frames + writer.writeEndElement(); //DOMLayer + index++; + } for (int i = clipFrame; i <= lastFrame; i++) { depthToFramesList.get(po.getDepth()).remove((Integer) i); } 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 5f26047c3..6442e7d5a 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 @@ -64,8 +64,67 @@ public class MorphShapeFixer extends ShapeFixer { mergeWithSamePrefix(shapes, fillStyles0, fillStyles1, lineStyles); clearDuplicatePathsNextToEachOther(shapes, fillStyles0, lineStyles); fixHolesAndAntiClockwise(shapes, fillStyles0, fillStyles1, lineStyles, layers); + mergeSamePathsWithOppositeFillstyles(shapes, fillStyles0, fillStyles1, lineStyles, layers); } + + /** + * shape 1 [FS0:A, FS1:-, LS:n], shape 2 [FS0:-, FS1:B, LS:n] + * => shape 1 [FS0:A, FS1:B], remove shape 2 + * @param shapes + * @param fillStyles0 + * @param fillStyles1 + * @param lineStyles + * @param layers + */ + private void mergeSamePathsWithOppositeFillstyles( + List> shapes, + List fillStyles0, + List fillStyles1, + List lineStyles, + List layers + ) { + for (int i1 = 0; i1 < shapes.size(); i1++) { + for (int i2 = 0; i2 < shapes.size(); i2++) { + if (i1 == i2) { + continue; + } + if (layers.get(i1) != layers.get(i2)) { + continue; + } + if (lineStyles.get(i1) != lineStyles.get(i2)) { + continue; + } + if (!shapes.get(i1).equals(shapes.get(i2))) { + continue; + } + boolean doRemove = false; + if ( + fillStyles0.get(i1) != 0 && fillStyles1.get(i1) == 0 + && fillStyles1.get(i2) != 0 && fillStyles0.get(i2) == 0 + ) { + fillStyles1.set(i1, fillStyles1.get(i2)); + doRemove = true; + } else if ( + fillStyles1.get(i1) != 0 && fillStyles0.get(i1) == 0 + && fillStyles0.get(i2) != 0 && fillStyles1.get(i2) == 0 + ) { + fillStyles0.set(i1, fillStyles0.get(i2)); + doRemove = true; + } + + if (doRemove) { + shapes.remove(i2); + fillStyles0.remove(i2); + fillStyles1.remove(i2); + lineStyles.remove(i2); + layers.remove(i2); + i2--; + } + } + } + } + private boolean isEmptyPath(List path) { for (BezierEdge be : path) { if (!be.isEmpty()) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/xfl/shapefixer/ShapeFixer.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/xfl/shapefixer/ShapeFixer.java index cabd01a49..d6888ae8d 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/xfl/shapefixer/ShapeFixer.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/xfl/shapefixer/ShapeFixer.java @@ -95,94 +95,15 @@ public class ShapeFixer { List lineStyleLayers ) { } - - public List fix( - List records, - int shapeNum, - FILLSTYLEARRAY baseFillStyles, - LINESTYLEARRAY baseLineStyles + + + private void detectOverlappingEdges( + List> shapes, + List fillStyles0, + List fillStyles1, + List lineStyles, + List layers ) { - List> shapes = new ArrayList<>(); - List currentShape = new ArrayList<>(); - List fillStyles0 = new ArrayList<>(); - List fillStyles1 = new ArrayList<>(); - List lineStyles = new ArrayList<>(); - List layers = new ArrayList<>(); - List fillStyleLayers = new ArrayList<>(); - List lineStyleLayers = new ArrayList<>(); - - int fillStyle0 = 0; - int fillStyle1 = 0; - int lineStyle = 0; - int layer = -1; - int x = 0; - int y = 0; - for (SHAPERECORD rec : records) { - if (rec instanceof StyleChangeRecord) { - StyleChangeRecord scr = (StyleChangeRecord) rec; - if (scr.stateMoveTo - || scr.stateNewStyles - || scr.stateFillStyle0 - || scr.stateFillStyle1 - || scr.stateLineStyle) { - if (!currentShape.isEmpty()) { - shapes.add(currentShape); - fillStyles0.add(fillStyle0); - fillStyles1.add(fillStyle1); - lineStyles.add(lineStyle); - layers.add(layer); - currentShape = new ArrayList<>(); - } - } - if (scr.stateNewStyles) { - layer++; - fillStyle0 = 0; - fillStyle1 = 0; - lineStyle = 0; - fillStyleLayers.add(scr.fillStyles); - lineStyleLayers.add(scr.lineStyles); - } - if (scr.stateFillStyle0) { - fillStyle0 = scr.fillStyle0; - } - if (scr.stateFillStyle1) { - fillStyle1 = scr.fillStyle1; - } - if (scr.stateLineStyle) { - lineStyle = scr.lineStyle; - } - } - if (rec instanceof StraightEdgeRecord) { - int x2 = rec.changeX(x); - int y2 = rec.changeY(y); - BezierEdge be = new BezierEdge(x, y, x2, y2); - currentShape.add(be); - } - if (rec instanceof CurvedEdgeRecord) { - CurvedEdgeRecord cer = (CurvedEdgeRecord) rec; - int cx = x + cer.controlDeltaX; - int cy = y + cer.controlDeltaY; - int ax = cx + cer.anchorDeltaX; - int ay = cy + cer.anchorDeltaY; - BezierEdge be = new BezierEdge(x, y, cx, cy, ax, ay); - currentShape.add(be); - } - if (rec instanceof EndShapeRecord) { - if (!currentShape.isEmpty()) { - shapes.add(currentShape); - fillStyles0.add(fillStyle0); - fillStyles1.add(fillStyle1); - lineStyles.add(lineStyle); - layers.add(layer); - currentShape = new ArrayList<>(); - } - } - x = rec.changeX(x); - y = rec.changeY(y); - } - - beforeHandle(shapeNum, shapes, fillStyles0, fillStyles1, lineStyles, layers, baseFillStyles, baseLineStyles, fillStyleLayers, lineStyleLayers); - //------------------- detecting overlapping edges -------------------- List splittedPairs = new ArrayList<>(); @@ -190,7 +111,7 @@ public class ShapeFixer { //int oldpct = 0; loopi1: for (int i1 = 0; i1 < shapes.size(); i1++) { - layer = layers.get(i1); + int layer = layers.get(i1); /*if (i1 % 10 == 0) { int pct = i1 * 100 / shapes.size(); if (oldpct != pct) { @@ -397,10 +318,102 @@ public class ShapeFixer { } } } - + } + + private void splitToLayers( + List records, + List> shapes, + List fillStyles0, + List fillStyles1, + List lineStyles, + List layers, + List fillStyleLayers, + List lineStyleLayers + ) { + List currentShape = new ArrayList<>(); + + int fillStyle0 = 0; + int fillStyle1 = 0; + int lineStyle = 0; + int layer = -1; + int x = 0; + int y = 0; + for (SHAPERECORD rec : records) { + if (rec instanceof StyleChangeRecord) { + StyleChangeRecord scr = (StyleChangeRecord) rec; + if (scr.stateMoveTo + || scr.stateNewStyles + || scr.stateFillStyle0 + || scr.stateFillStyle1 + || scr.stateLineStyle) { + if (!currentShape.isEmpty()) { + shapes.add(currentShape); + fillStyles0.add(fillStyle0); + fillStyles1.add(fillStyle1); + lineStyles.add(lineStyle); + layers.add(layer); + currentShape = new ArrayList<>(); + } + } + if (scr.stateNewStyles) { + layer++; + fillStyle0 = 0; + fillStyle1 = 0; + lineStyle = 0; + fillStyleLayers.add(scr.fillStyles); + lineStyleLayers.add(scr.lineStyles); + } + if (scr.stateFillStyle0) { + fillStyle0 = scr.fillStyle0; + } + if (scr.stateFillStyle1) { + fillStyle1 = scr.fillStyle1; + } + if (scr.stateLineStyle) { + lineStyle = scr.lineStyle; + } + } + if (rec instanceof StraightEdgeRecord) { + int x2 = rec.changeX(x); + int y2 = rec.changeY(y); + BezierEdge be = new BezierEdge(x, y, x2, y2); + currentShape.add(be); + } + if (rec instanceof CurvedEdgeRecord) { + CurvedEdgeRecord cer = (CurvedEdgeRecord) rec; + int cx = x + cer.controlDeltaX; + int cy = y + cer.controlDeltaY; + int ax = cx + cer.anchorDeltaX; + int ay = cy + cer.anchorDeltaY; + BezierEdge be = new BezierEdge(x, y, cx, cy, ax, ay); + currentShape.add(be); + } + if (rec instanceof EndShapeRecord) { + if (!currentShape.isEmpty()) { + shapes.add(currentShape); + fillStyles0.add(fillStyle0); + fillStyles1.add(fillStyle1); + lineStyles.add(lineStyle); + layers.add(layer); + currentShape = new ArrayList<>(); + } + } + x = rec.changeX(x); + y = rec.changeY(y); + } + } + + private List combineLayers( + List> shapes, + List fillStyles0, + List fillStyles1, + List lineStyles, + List layers, + List fillStyleLayers, + List lineStyleLayers + ) { List ret = new ArrayList<>(); - - layer = -1; + int layer = -1; double dx = 0; double dy = 0; for (int i = 0; i < shapes.size(); i++) { @@ -446,6 +459,29 @@ public class ShapeFixer { return ret; } + public List fix( + List records, + int shapeNum, + FILLSTYLEARRAY baseFillStyles, + LINESTYLEARRAY baseLineStyles + ) { + List> shapes = new ArrayList<>(); + List fillStyles0 = new ArrayList<>(); + List fillStyles1 = new ArrayList<>(); + List lineStyles = new ArrayList<>(); + List layers = new ArrayList<>(); + List fillStyleLayers = new ArrayList<>(); + List lineStyleLayers = new ArrayList<>(); + + splitToLayers(records, shapes, fillStyles0, fillStyles1, lineStyles, layers, fillStyleLayers, lineStyleLayers); + + beforeHandle(shapeNum, shapes, fillStyles0, fillStyles1, lineStyles, layers, baseFillStyles, baseLineStyles, fillStyleLayers, lineStyleLayers); + + detectOverlappingEdges(shapes, fillStyles0, fillStyles1, lineStyles, layers); + + return combineLayers(shapes, fillStyles0, fillStyles1, lineStyles, layers, fillStyleLayers, lineStyleLayers); + } + private ShapeRecordAdvanced bezierToAdvancedRecord(BezierEdge be) { if (be.points.size() == 2) { StraightEdgeRecordAdvanced ser = new StraightEdgeRecordAdvanced(); diff --git a/libsrc/ffdec_lib/testdata/morphshape_holes/morphshape_holes.html b/libsrc/ffdec_lib/testdata/morphshape_holes/morphshape_holes.html new file mode 100644 index 000000000..a2676d908 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/morphshape_holes/morphshape_holes.html @@ -0,0 +1,49 @@ + + + + morphshape_holes + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + Get Adobe Flash player + + + + + +
+ + diff --git a/libsrc/ffdec_lib/testdata/morphshape_holes/morphshape_holes.swf b/libsrc/ffdec_lib/testdata/morphshape_holes/morphshape_holes.swf new file mode 100644 index 0000000000000000000000000000000000000000..7d45464b429dda506953cc835ba7366f6ab81c09 GIT binary patch literal 1034 zcmV+l1oitvS5pt@2LJ$goTZgPY}-^A$6qqqf~G*K4Kca`CflJL96RZfC2kwFixV_y z5nUHF2}Xx&JFBT)SU$2sVe~N*$vo6Cjj8>UCufH+I1np z^srGPlav*Mfz;vZH%*P9sKLQO_h74A)lX5LU@%D0UdrnwVFhVq6_d-5im}fXB9H?s z8oVxPrlcx_#ay47GCN!@Y@11HRa?bybAs9@x_LE8WjKxUxM|ArfkjMM7dcbaG6_uFiv|I zx|Q+4eSo3q8tq!;nlvVwoWPmfCb5@+`U7;W_<>q1R|P4N-IjR0l4z$kB)Pq81-=@s zmeOT3FM+2-SxkzGX~1|rC|-eQ5~`l$%n+w(vcz+iA(bJGew7~>zp;R6$kF^3hyt&-fdnn@f1^tnT#}kMKBWyGf4A5N>Uzm-e>>rd?+*p-QS-D|1;Xk<5NGooy=+Y?( z9@#Bi!;$T|ZedaFRn(=lC`5HNiKd`&x*=Lgb+{@~Suvq}8EJD&|K7qTX~j)=ln2@* zt+=WGC#HY2AgY5|&uQx;P2rbdhyY=Gxm=#zc^MDME>uW7NfAN_o|M=+VLnG$crAW#wYRA{N0Mvam z^zj!9lNWvf=^lRaOE7iA=UHhijO|`=A0PkibamG`Twia49f8@M3hF_7@A1{MSCVgL zCmx&nrLCbE97G+1%dn}-8#-zv-*vwB0{{Bzt5bJgdcOF+eSZI*U3q5ZSYh1;zb|k-Z0|cFy@7B#0%Y+kM<%y+KYK^0P)-a=5Q8qIE(q(Fyd>& znEg4#{v75)9&sU$xut-(rGR;K2Jz?&=Dl->_s(I?-A0_djoGn?*s+ND+%n>G%bmd9 zV1vsJX05L+*a6_dfzxp;tsNTcya3|qQgdvnBlqFbXAOPDwm4|}_T;lo%E$+$>AOP% zrO3gr*2V~&j$8LHT`$c{4B1LyWu*MvO|4nGU;O^_H~#$O$nRI*0cb2ctg!&_H)aWc EPArlNRsaA1 literal 0 HcmV?d00001 diff --git a/libsrc/ffdec_lib/testdata/morphshape_holes/morphshape_holes/DOMDocument.xml b/libsrc/ffdec_lib/testdata/morphshape_holes/morphshape_holes/DOMDocument.xml new file mode 100644 index 000000000..a192e7988 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/morphshape_holes/morphshape_holes/DOMDocument.xml @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/libsrc/ffdec_lib/testdata/morphshape_holes/morphshape_holes/META-INF/metadata.xml b/libsrc/ffdec_lib/testdata/morphshape_holes/morphshape_holes/META-INF/metadata.xml new file mode 100644 index 000000000..ca828ef68 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/morphshape_holes/morphshape_holes/META-INF/metadata.xml @@ -0,0 +1,55 @@ + + + + + Adobe Flash Professional CS6 - build 481 + 2023-12-09T01:03:52-08:00 + 2023-12-09T01:04:24-08:00 + 2023-12-09T01:04:24-08:00 + + + application/vnd.adobe.fla + + + xmp.iid:CEDF0DBE6596EE118F9EDF8980AE5CDF + xmp.did:CEDF0DBE6596EE118F9EDF8980AE5CDF + xmp.did:CEDF0DBE6596EE118F9EDF8980AE5CDF + + + + created + xmp.iid:CEDF0DBE6596EE118F9EDF8980AE5CDF + 2023-12-09T01:03:52-08:00 + Adobe Flash Professional CS6 - build 481 + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/libsrc/ffdec_lib/testdata/morphshape_holes/morphshape_holes/MobileSettings.xml b/libsrc/ffdec_lib/testdata/morphshape_holes/morphshape_holes/MobileSettings.xml new file mode 100644 index 000000000..e69de29bb diff --git a/libsrc/ffdec_lib/testdata/morphshape_holes/morphshape_holes/PublishSettings.xml b/libsrc/ffdec_lib/testdata/morphshape_holes/morphshape_holes/PublishSettings.xml new file mode 100644 index 000000000..19c3ec880 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/morphshape_holes/morphshape_holes/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 + morphshape_holes.swf + morphshape_holes.exe + morphshape_holes.app + morphshape_holes.html + morphshape_holes.gif + morphshape_holes.jpg + morphshape_holes.png + morphshape_holes.mov + morphshape_holes.smil + morphshape_holes.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_holes.xfl_content.html + morphshape_holes.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_holes/morphshape_holes/bin/SymDepend.cache b/libsrc/ffdec_lib/testdata/morphshape_holes/morphshape_holes/bin/SymDepend.cache new file mode 100644 index 0000000000000000000000000000000000000000..7dfdc160a8012267ea5f74e1d04fdb914896b7d2 GIT binary patch literal 28 fcmYdiU|@L8&cndQz{$YGz{sEmB; literal 0 HcmV?d00001 diff --git a/libsrc/ffdec_lib/testdata/morphshape_holes/morphshape_holes/morphshape_holes.xfl b/libsrc/ffdec_lib/testdata/morphshape_holes/morphshape_holes/morphshape_holes.xfl new file mode 100644 index 000000000..860a820ec --- /dev/null +++ b/libsrc/ffdec_lib/testdata/morphshape_holes/morphshape_holes/morphshape_holes.xfl @@ -0,0 +1 @@ +PROXY-CS5 \ No newline at end of file