diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWFOutputStream.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWFOutputStream.java index 6f1a6ed85..5925fc73f 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWFOutputStream.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWFOutputStream.java @@ -1389,7 +1389,7 @@ public class SWFOutputStream extends OutputStream { writeFILLSTYLEARRAY(value.fillStyles, shapeNum); writeLINESTYLEARRAY(value.lineStyles, shapeNum); value.numFillBits = getNeededBitsU(value.fillStyles.fillStyles.length); - value.numLineBits = getNeededBitsU(value.lineStyles.lineStyles.length); + value.numLineBits = getNeededBitsU(shapeNum <= 3 ? value.lineStyles.lineStyles.length : value.lineStyles.lineStyles2.length); writeUB(4, value.numFillBits); writeUB(4, value.numLineBits); writeSHAPERECORDS(value.shapeRecords, value.numFillBits, value.numLineBits, shapeNum); @@ -1474,7 +1474,7 @@ public class SWFOutputStream extends OutputStream { writeFILLSTYLEARRAY(scr.fillStyles, shapeNum); writeLINESTYLEARRAY(scr.lineStyles, shapeNum); fillBits = getNeededBitsU(scr.fillStyles.fillStyles.length); - lineBits = getNeededBitsU(scr.lineStyles.lineStyles.length); + lineBits = getNeededBitsU(shapeNum <= 3 ? scr.lineStyles.lineStyles.length : scr.lineStyles.lineStyles2.length); if (Configuration._debugCopy.get()) { fillBits = Math.max(fillBits, scr.numFillBits); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/morphshape/MorphShapeExporterBase.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/morphshape/MorphShapeExporterBase.java index 55aeae2f2..2ff901b2f 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/morphshape/MorphShapeExporterBase.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/morphshape/MorphShapeExporterBase.java @@ -65,10 +65,13 @@ public abstract class MorphShapeExporterBase implements IMorphShapeExporter { protected ColorTransform colorTransform; + protected int morphShapeNum; + public MorphShapeExporterBase(int morphShapeNum, SHAPE shape, SHAPE endShape, ColorTransform colorTransform) { this.shape = shape; this.shapeEnd = endShape; this.colorTransform = colorTransform; + this.morphShapeNum = morphShapeNum; _fillStyles = new ArrayList<>(); _lineStyles = new ArrayList<>(); if (shape instanceof SHAPEWITHSTYLE) { @@ -97,7 +100,7 @@ public abstract class MorphShapeExporterBase implements IMorphShapeExporter { // Create edge maps _fillEdgeMaps = new ArrayList<>(); _lineEdgeMaps = new ArrayList<>(); - createEdgeMaps(_fillStyles, _lineStyles, _fillStylesEnd, _lineStylesEnd, _fillEdgeMaps, _lineEdgeMaps); + createEdgeMaps(morphShapeNum, _fillStyles, _lineStyles, _fillStylesEnd, _lineStylesEnd, _fillEdgeMaps, _lineEdgeMaps); // Let the doc handler know that a shape export starts beginShape(); @@ -112,7 +115,7 @@ public abstract class MorphShapeExporterBase implements IMorphShapeExporter { endShape(); } - protected void createEdgeMaps(List fillStyles, List lineStyles, + protected void createEdgeMaps(int morphShapeNum, List fillStyles, List lineStyles, List fillStylesEnd, List lineStylesEnd, List>> fillEdgeMaps, List>> lineEdgeMaps) { if (!edgeMapsCreated) { @@ -152,9 +155,17 @@ public abstract class MorphShapeExporterBase implements IMorphShapeExporter { fillStyleIdxOffset = fillStyles.size(); lineStyleIdxOffset = lineStyles.size(); appendFillStyles(fillStyles, styleChangeRecord.fillStyles.fillStyles); - appendLineStyles(lineStyles, styleChangeRecord.lineStyles.lineStyles); + if (morphShapeNum == 2) { + appendLineStyles(lineStyles, styleChangeRecord.lineStyles.lineStyles2); + } else { + appendLineStyles(lineStyles, styleChangeRecord.lineStyles.lineStyles); + } appendFillStyles(fillStylesEnd, styleChangeRecord.fillStyles.fillStyles); - appendLineStyles(lineStylesEnd, styleChangeRecord.lineStyles.lineStyles); + if (morphShapeNum == 2) { + appendLineStyles(lineStylesEnd, styleChangeRecord.lineStyles.lineStyles2); + } else { + appendLineStyles(lineStylesEnd, styleChangeRecord.lineStyles.lineStyles); + } } // Check if all styles are reset to 0. // This (probably) means that a new group starts with the next record @@ -577,7 +588,11 @@ public abstract class MorphShapeExporterBase implements IMorphShapeExporter { v1.addAll(Arrays.asList(v2)); } - protected void appendLineStyles(List v1, ILINESTYLE[] v2) { + protected void appendLineStyles(List v1, LINESTYLE[] v2) { + v1.addAll(Arrays.asList(v2)); + } + + protected void appendLineStyles(List v1, LINESTYLE2[] v2) { v1.addAll(Arrays.asList(v2)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/importers/svg/SvgImporter.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/importers/svg/SvgImporter.java index 1dcbd74d9..589d3b293 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/importers/svg/SvgImporter.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/importers/svg/SvgImporter.java @@ -362,10 +362,9 @@ public class SvgImporter { newRecords.add(scrStyle); - ILINESTYLE lineStyleObj = scrStyle.lineStyles.lineStyles.length < 1 ? null : scrStyle.lineStyles.lineStyles[0]; LINESTYLE2 lineStyle2Obj = null; - if (lineStyleObj instanceof LINESTYLE2) { - lineStyle2Obj = (LINESTYLE2) lineStyleObj; + if (shapeNum == 4) { + lineStyle2Obj = scrStyle.lineStyles.lineStyles2.length < 1 ? null : scrStyle.lineStyles.lineStyles2[0]; lineStyle2Obj.noClose = true; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/ImageTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/ImageTag.java index c054c5b8f..9bebfd794 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/ImageTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/ImageTag.java @@ -32,6 +32,7 @@ import com.jpexs.decompiler.flash.types.ColorTransform; import com.jpexs.decompiler.flash.types.FILLSTYLE; import com.jpexs.decompiler.flash.types.FILLSTYLEARRAY; import com.jpexs.decompiler.flash.types.LINESTYLE; +import com.jpexs.decompiler.flash.types.LINESTYLE2; import com.jpexs.decompiler.flash.types.LINESTYLEARRAY; import com.jpexs.decompiler.flash.types.MATRIX; import com.jpexs.decompiler.flash.types.RECT; @@ -177,6 +178,7 @@ public abstract class ImageTag extends DrawableTag { shape.lineStyles = new LINESTYLEARRAY(); shape.lineStyles.lineStyles = new LINESTYLE[0]; + shape.lineStyles.lineStyles2 = new LINESTYLE2[0]; shape.shapeRecords = new ArrayList<>(); StyleChangeRecord style = new StyleChangeRecord(); style.stateFillStyle0 = true; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/ShapeTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/ShapeTag.java index dab3b67c3..e721315ab 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/ShapeTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/ShapeTag.java @@ -45,6 +45,8 @@ import java.awt.geom.AffineTransform; import java.awt.geom.GeneralPath; import java.awt.geom.PathIterator; import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Set; import java.util.logging.Level; @@ -131,20 +133,37 @@ public abstract class ShapeTag extends DrawableTag implements LazyObject { @Override public RECT getRectWithStrokes() { - int maxWidth = 0; - for (ILINESTYLE ls : getShapes().lineStyles.lineStyles) { - if (ls.getWidth() > maxWidth) { - maxWidth = ls.getWidth(); + List ilineStyles = new ArrayList<>(); + if (getShapeNum() == 4) { + for (ILINESTYLE ls : getShapes().lineStyles.lineStyles2) { + if (ls.getWidth() > maxWidth) { + maxWidth = ls.getWidth(); + } + } + } else { + for (ILINESTYLE ls : getShapes().lineStyles.lineStyles) { + if (ls.getWidth() > maxWidth) { + maxWidth = ls.getWidth(); + } } } + for (SHAPERECORD sr : getShapes().shapeRecords) { if (sr instanceof StyleChangeRecord) { StyleChangeRecord scr = (StyleChangeRecord) sr; if (scr.stateNewStyles) { - for (ILINESTYLE ls : scr.lineStyles.lineStyles) { - if (ls.getWidth() > maxWidth) { - maxWidth = ls.getWidth(); + if (getShapeNum() == 4) { + for (ILINESTYLE ls : scr.lineStyles.lineStyles2) { + if (ls.getWidth() > maxWidth) { + maxWidth = ls.getWidth(); + } + } + } else { + for (ILINESTYLE ls : scr.lineStyles.lineStyles) { + if (ls.getWidth() > maxWidth) { + maxWidth = ls.getWidth(); + } } } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/types/LINESTYLEARRAY.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/types/LINESTYLEARRAY.java index 15d58bb2b..56f7c0bf3 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/types/LINESTYLEARRAY.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/types/LINESTYLEARRAY.java @@ -42,16 +42,30 @@ public class LINESTYLEARRAY implements NeedsCharacters, Serializable { @Override public void getNeededCharacters(Set needed) { - for (ILINESTYLE ls : lineStyles) { - ls.getNeededCharacters(needed); + if (lineStyles != null) { + for (ILINESTYLE ls : lineStyles) { + ls.getNeededCharacters(needed); + } + } + if (lineStyles != null) { + for (ILINESTYLE ls : lineStyles2) { + ls.getNeededCharacters(needed); + } } } @Override public boolean replaceCharacter(int oldCharacterId, int newCharacterId) { boolean modified = false; - for (ILINESTYLE ls : lineStyles) { - modified |= ls.replaceCharacter(oldCharacterId, newCharacterId); + if (lineStyles != null) { + for (ILINESTYLE ls : lineStyles) { + modified |= ls.replaceCharacter(oldCharacterId, newCharacterId); + } + } + if (lineStyles2 != null) { + for (ILINESTYLE ls : lineStyles2) { + modified |= ls.replaceCharacter(oldCharacterId, newCharacterId); + } } return modified; } @@ -59,8 +73,16 @@ public class LINESTYLEARRAY implements NeedsCharacters, Serializable { @Override public boolean removeCharacter(int characterId) { boolean modified = false; - for (ILINESTYLE ls : lineStyles) { - modified |= ls.removeCharacter(characterId); + if (lineStyles != null) { + for (ILINESTYLE ls : lineStyles) { + modified |= ls.removeCharacter(characterId); + } + } + + if (lineStyles2 != null) { + for (ILINESTYLE ls : lineStyles2) { + modified |= ls.removeCharacter(characterId); + } } return modified; } 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 e36225207..46bf291e7 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 @@ -817,7 +817,7 @@ public class XFLConverter { if (shapeNum == 4) { if (strokeStyleOrig > 0) { if (actualLinestyles != null && !((LINESTYLE2) actualLinestyles.lineStyles2[strokeStyleOrig]).hasFillFlag) { - RGBA color = (RGBA) actualLinestyles.lineStyles[strokeStyleOrig].getColor(); + RGBA color = (RGBA) actualLinestyles.lineStyles2[strokeStyleOrig].getColor(); if (color.alpha == 0 && color.red == 0 && color.green == 0 && color.blue == 0) { empty = true; } @@ -916,7 +916,7 @@ public class XFLConverter { if (shapeNum == 4) { if (strokeStyleOrig > 0) { if (actualLinestyles != null && !((LINESTYLE2) actualLinestyles.lineStyles2[strokeStyleOrig]).hasFillFlag) { - RGBA color = (RGBA) actualLinestyles.lineStyles[strokeStyleOrig].getColor(); + RGBA color = (RGBA) actualLinestyles.lineStyles2[strokeStyleOrig].getColor(); if (color.alpha == 0 && color.red == 0 && color.green == 0 && color.blue == 0) { empty = true; } @@ -960,7 +960,7 @@ public class XFLConverter { if (shapeNum == 4) { if (strokeStyleOrig > 0) { if (actualLinestyles != null && !((LINESTYLE2) actualLinestyles.lineStyles2[strokeStyleOrig]).hasFillFlag) { - RGBA color = (RGBA) actualLinestyles.lineStyles[strokeStyleOrig].getColor(); + RGBA color = (RGBA) actualLinestyles.lineStyles2[strokeStyleOrig].getColor(); if (color.alpha == 0 && color.red == 0 && color.green == 0 && color.blue == 0) { empty = true; }