diff --git a/CHANGELOG.md b/CHANGELOG.md index 2441ae966..2ac0c421c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ All notable changes to this project will be documented in this file. - [#2397] DefineScalingGrid - improper scaling on negative Xmin, Ymin - [#2425] ZIP/SWC reading - "Only DEFLATED entries can have EXT descriptor" message - Drawing points and shape paths highlighting did not respect UI scale factor +- [#2416] FLA export - shape fixing in some cases ## [22.0.2] - 2025-01-17 ### Added @@ -3714,6 +3715,7 @@ Major version of SWF to XML export changed to 2. [#2418]: https://www.free-decompiler.com/flash/issues/2418 [#2397]: https://www.free-decompiler.com/flash/issues/2397 [#2425]: https://www.free-decompiler.com/flash/issues/2425 +[#2416]: https://www.free-decompiler.com/flash/issues/2416 [#2375]: https://www.free-decompiler.com/flash/issues/2375 [#2374]: https://www.free-decompiler.com/flash/issues/2374 [#2389]: https://www.free-decompiler.com/flash/issues/2389 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 8a88c1c19..067db2371 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 @@ -111,7 +111,7 @@ public class ShapeFixer { //int oldpct = 0; loopi1: for (int i1 = 0; i1 < shapes.size(); i1++) { - int layer = layers.get(i1); + int layer = layers.get(i1); /*if (i1 % 10 == 0) { int pct = i1 * 100 / shapes.size(); if (oldpct != pct) { @@ -132,6 +132,20 @@ public class ShapeFixer { if (layers.get(i2) != layer) { continue; } + + + //its with fills vs stroke only, we can ignore these, I hope + if (fillStyles0.get(i1) == 0 + && fillStyles1.get(i1) == 0 + && (fillStyles0.get(i2) != 0 || fillStyles1.get(i2) != 0)) { + continue; + } + if (fillStyles0.get(i2) == 0 + && fillStyles1.get(i2) == 0 + && (fillStyles0.get(i1) != 0 || fillStyles1.get(i1) != 0)) { + continue; + } + loopj2: for (int j2 = 0; j2 < shapes.get(i2).size(); j2++) { BezierEdge be2 = shapes.get(i2).get(j2); @@ -158,7 +172,8 @@ public class ShapeFixer { } //duplicated edge - if (be1.equals(be2) || be1.equalsReverse(be2)) { + if ((be1.equals(be2) || be1.equalsReverse(be2)) + && (lineStyles.get(i1) == lineStyles.get(i2))) { shapes.get(i2).remove(j2); if (i1 == i2 && j1 > j2) { j1--; @@ -204,8 +219,8 @@ public class ShapeFixer { && (t2Ref.get(0) == 0 || t2Ref.get(0) == 1)) { continue; } - } - + } + if (DEBUG_PRINT) { System.err.println("intersects " + be1.toSvg() + " " + be2.toSvg()); System.err.println(" fillstyle0: " + fillStyles0.get(i1) + " , " + fillStyles0.get(i2));