diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWFInputStream.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWFInputStream.java index ff2c883ee..da2ee6209 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWFInputStream.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWFInputStream.java @@ -2844,7 +2844,7 @@ public class SWFInputStream implements AutoCloseable { cer.controlDeltaX = (int) readSB(cer.numBits + 2, "controlDeltaX"); cer.controlDeltaY = (int) readSB(cer.numBits + 2, "controlDeltaY"); cer.anchorDeltaX = (int) readSB(cer.numBits + 2, "anchorDeltaX"); - cer.anchorDeltaY = (int) readSB(cer.numBits + 2, "anchorDeltaY"); + cer.anchorDeltaY = (int) readSB(cer.numBits + 2, "anchorDeltaY"); ret = cer; } } 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 c37dcfb63..9b43f0ea3 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 @@ -358,6 +358,7 @@ public class SvgImporter { serclose.deltaX = (int) Math.round(p.x - prevPoint.x); serclose.deltaY = (int) Math.round(p.y - prevPoint.y); serclose.generalLineFlag = true; + serclose.calculateBits(); newRecords.add(serclose); if (lineStyle != 0) { @@ -455,6 +456,8 @@ public class SvgImporter { serz.deltaY = (int) Math.round(p.y - prevPoint.y); prevPoint = new Point(prevPoint.x + serz.deltaX, prevPoint.y + serz.deltaY); serz.generalLineFlag = true; + serz.simplify(); + serz.calculateBits(); newRecords.add(serz); if (lineStyle2Obj != null) { lineStyle2Obj.noClose = false; @@ -472,6 +475,7 @@ public class SvgImporter { prevPoint = new Point(prevPoint.x + serl.deltaX, prevPoint.y + serl.deltaY); serl.generalLineFlag = true; serl.simplify(); + serl.calculateBits(); newRecords.add(serl); empty = false; break; @@ -486,6 +490,7 @@ public class SvgImporter { prevPoint = new Point(prevPoint.x + serh.deltaX, prevPoint.y + serh.deltaY); serh.generalLineFlag = true; serh.simplify(); + serh.calculateBits(); newRecords.add(serh); empty = false; break; @@ -501,6 +506,7 @@ public class SvgImporter { prevPoint = new Point(prevPoint.x + serv.deltaX, prevPoint.y + serv.deltaY); serv.generalLineFlag = true; serv.simplify(); + serv.calculateBits(); newRecords.add(serv); empty = false; break; @@ -521,6 +527,7 @@ public class SvgImporter { cer.anchorDeltaX = (int) Math.round(p.x - prevPoint.x); cer.anchorDeltaY = (int) Math.round(p.y - prevPoint.y); prevPoint = new Point(prevPoint.x + cer.anchorDeltaX, prevPoint.y + cer.anchorDeltaY); + cer.calculateBits(); newRecords.add(cer); empty = false; break; @@ -558,6 +565,7 @@ public class SvgImporter { cerc.anchorDeltaX = (int) Math.round(p.x - prevPoint.x); cerc.anchorDeltaY = (int) Math.round(p.y - prevPoint.y); prevPoint = new Point(prevPoint.x + cerc.anchorDeltaX, prevPoint.y + cerc.anchorDeltaY); + cerc.calculateBits(); newRecords.add(cerc); } 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 968ff5a52..1db45201f 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 @@ -217,15 +217,19 @@ public abstract class ImageTag extends DrawableTag { StraightEdgeRecord top = new StraightEdgeRecord(); top.generalLineFlag = true; top.deltaX = rect.getWidth(); + top.calculateBits(); StraightEdgeRecord right = new StraightEdgeRecord(); right.generalLineFlag = true; right.deltaY = rect.getHeight(); + right.calculateBits(); StraightEdgeRecord bottom = new StraightEdgeRecord(); bottom.generalLineFlag = true; bottom.deltaX = -rect.getWidth(); + bottom.calculateBits(); StraightEdgeRecord left = new StraightEdgeRecord(); left.generalLineFlag = true; left.deltaY = -rect.getHeight(); + left.calculateBits(); shape.shapeRecords.add(top); shape.shapeRecords.add(right); shape.shapeRecords.add(bottom); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/MorphShapeTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/MorphShapeTag.java index 2eb6e56a6..91d4b64c4 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/MorphShapeTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/MorphShapeTag.java @@ -277,6 +277,7 @@ public abstract class MorphShapeTag extends DrawableTag { endPosY += cer2.controlDeltaY + cer2.anchorDeltaY; posX += cer.controlDeltaX + cer.anchorDeltaX; posY += cer.controlDeltaY + cer.anchorDeltaY; + cer.calculateBits(); finalRecords.add(cer); } else { StraightEdgeRecord ser1 = null; @@ -301,6 +302,8 @@ public abstract class MorphShapeTag extends DrawableTag { endPosY += ser2.deltaY; posX += ser.deltaX; posY += ser.deltaX; + ser.simplify(); + ser.calculateBits(); finalRecords.add(ser); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/TextTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/TextTag.java index 2f4e991ac..8e4a24a0e 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/TextTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/TextTag.java @@ -402,15 +402,23 @@ public abstract class TextTag extends DrawableTag { StraightEdgeRecord top = new StraightEdgeRecord(); top.generalLineFlag = true; top.deltaX = rect.getWidth(); + top.simplify(); + top.calculateBits(); StraightEdgeRecord right = new StraightEdgeRecord(); right.generalLineFlag = true; right.deltaY = rect.getHeight(); + right.simplify(); + right.calculateBits(); StraightEdgeRecord bottom = new StraightEdgeRecord(); bottom.generalLineFlag = true; bottom.deltaX = -rect.getWidth(); + bottom.simplify(); + bottom.calculateBits(); StraightEdgeRecord left = new StraightEdgeRecord(); left.generalLineFlag = true; left.deltaY = -rect.getHeight(); + left.simplify(); + left.calculateBits(); shape.shapeRecords.add(top); shape.shapeRecords.add(right); shape.shapeRecords.add(bottom); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/gfx/DefineCompactedFont.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/gfx/DefineCompactedFont.java index 1bc1b11a8..09ef76b0f 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/gfx/DefineCompactedFont.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/gfx/DefineCompactedFont.java @@ -426,6 +426,7 @@ public final class DefineCompactedFont extends FontTag { StraightEdgeRecord ser = (StraightEdgeRecord) c; ser.deltaX = resize(ser.deltaX); ser.deltaY = resize(ser.deltaY); + ser.simplify(); ser.calculateBits(); } recs.add(c); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/types/gfx/ContourType.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/types/gfx/ContourType.java index bb9e9674e..1bc0cb736 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/types/gfx/ContourType.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/types/gfx/ContourType.java @@ -129,6 +129,7 @@ public class ContourType implements Serializable { closeSer.generalLineFlag = true; closeSer.deltaX = (src.moveDeltaX - x); closeSer.deltaY = (src.moveDeltaY - y); + closeSer.simplify(); closeSer.calculateBits(); recs.add(closeSer); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/types/gfx/EdgeType.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/types/gfx/EdgeType.java index 027cf3633..cd009bf02 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/types/gfx/EdgeType.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/types/gfx/EdgeType.java @@ -134,6 +134,7 @@ public class EdgeType implements Serializable { ser = new StraightEdgeRecord(); ser.generalLineFlag = false; ser.deltaX = data[1] * multiplier; + ser.simplify(); ser.calculateBits(); return ser; case Edge_VLine: @@ -148,6 +149,7 @@ public class EdgeType implements Serializable { ser.generalLineFlag = true; ser.deltaX = data[1] * multiplier; ser.deltaY = data[2] * multiplier; + ser.simplify(); ser.calculateBits(); return ser; case Edge_Quad: diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/types/shaperecords/CurvedEdgeRecord.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/types/shaperecords/CurvedEdgeRecord.java index 4f1bee9e4..c9a8ecbdc 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/types/shaperecords/CurvedEdgeRecord.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/types/shaperecords/CurvedEdgeRecord.java @@ -71,6 +71,7 @@ public class CurvedEdgeRecord extends SHAPERECORD { tmp = controlDeltaY; controlDeltaY = -anchorDeltaY; anchorDeltaY = -tmp; + calculateBits(); } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/types/shaperecords/SHAPERECORD.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/types/shaperecords/SHAPERECORD.java index c3d114cae..df9102e7e 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/types/shaperecords/SHAPERECORD.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/types/shaperecords/SHAPERECORD.java @@ -195,6 +195,7 @@ public abstract class SHAPERECORD implements Cloneable, NeedsCharacters, Seriali ret.controlDeltaY = ser.deltaY / 2; ret.anchorDeltaX = ser.deltaX - ret.controlDeltaX; ret.anchorDeltaY = ser.deltaY - ret.controlDeltaY; + ret.calculateBits(); return ret; } @@ -345,14 +346,9 @@ public abstract class SHAPERECORD implements Cloneable, NeedsCharacters, Seriali ser.deltaX = multiplier * (((int) Math.round(points[0])) - lastX); ser.deltaY = multiplier * (((int) Math.round(points[1])) - lastY); - ser.generalLineFlag = ser.deltaX != 0 && ser.deltaY != 0; - if (ser.deltaX == 0) { - ser.vertLineFlag = true; - } - ser.numBits = SWFOutputStream.getNeededBitsS(ser.deltaX, ser.deltaY) - 2; - if (ser.numBits < 0) { - ser.numBits = 0; - } + ser.generalLineFlag = true; + ser.simplify(); + ser.calculateBits(); retList.add(ser); lastX = (int) Math.round(points[0]); lastY = (int) Math.round(points[1]); @@ -371,10 +367,7 @@ public abstract class SHAPERECORD implements Cloneable, NeedsCharacters, Seriali cer.controlDeltaY = multiplier * (((int) Math.round(quadCoords[i][1])) - lastY); cer.anchorDeltaX = multiplier * (((int) Math.round(quadCoords[i][2])) - ((int) Math.round(quadCoords[i][0]))); cer.anchorDeltaY = multiplier * (((int) Math.round(quadCoords[i][3])) - ((int) Math.round(quadCoords[i][1]))); - cer.numBits = SWFOutputStream.getNeededBitsS(cer.controlDeltaX, cer.controlDeltaY, cer.anchorDeltaX, cer.anchorDeltaY) - 2; - if (cer.numBits < 0) { - cer.numBits = 0; - } + cer.calculateBits(); lastX = (int) Math.round(quadCoords[i][2]); lastY = (int) Math.round(quadCoords[i][3]); retList.add(cer); @@ -386,10 +379,7 @@ public abstract class SHAPERECORD implements Cloneable, NeedsCharacters, Seriali cer.controlDeltaY = multiplier * (((int) Math.round(points[1])) - lastY); cer.anchorDeltaX = multiplier * (((int) Math.round(points[2])) - (int) Math.round(points[0])); cer.anchorDeltaY = multiplier * (((int) Math.round(points[3])) - (int) Math.round(points[1])); - cer.numBits = SWFOutputStream.getNeededBitsS(cer.controlDeltaX, cer.controlDeltaY, cer.anchorDeltaX, cer.anchorDeltaY) - 2; - if (cer.numBits < 0) { - cer.numBits = 0; - } + cer.calculateBits(); retList.add(cer); lastX = (int) Math.round(points[2]); lastY = (int) Math.round(points[3]); @@ -402,10 +392,8 @@ public abstract class SHAPERECORD implements Cloneable, NeedsCharacters, Seriali closeSer.generalLineFlag = true; closeSer.deltaX = multiplier * ((int) Math.round((startX - lastX))); closeSer.deltaY = multiplier * ((int) Math.round((startY - lastY))); - closeSer.numBits = SWFOutputStream.getNeededBitsS(closeSer.deltaX, closeSer.deltaY) - 2; - if (closeSer.numBits < 0) { - closeSer.numBits = 0; - } + closeSer.simplify(); + closeSer.calculateBits(); retList.add(closeSer); lastX = startX; lastY = startY; @@ -515,6 +503,8 @@ public abstract class SHAPERECORD implements Cloneable, NeedsCharacters, Seriali StraightEdgeRecord ser = (StraightEdgeRecord) c; ser.deltaX = (int) (multiplierX * ser.deltaX); ser.deltaY = (int) (multiplierY * ser.deltaY); + ser.generalLineFlag = true; + ser.simplify(); ser.calculateBits(); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/types/shaperecords/StraightEdgeRecord.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/types/shaperecords/StraightEdgeRecord.java index 91be6181c..608ac61f7 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/types/shaperecords/StraightEdgeRecord.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/types/shaperecords/StraightEdgeRecord.java @@ -91,6 +91,7 @@ public class StraightEdgeRecord extends SHAPERECORD { public void flip() { deltaX = -deltaX; deltaY = -deltaY; + calculateBits(); } @Override 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 197cc65f2..ac88e1903 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 @@ -611,6 +611,7 @@ public class XFLConverter { cer.anchorDeltaX = anchorShouldBeX - (hintedX + cer.controlDeltaX); cer.anchorDeltaY = anchorShouldBeY - (hintedY + cer.controlDeltaY); + cer.calculateBits(); hintedX = anchorShouldBeX; hintedY = anchorShouldBeY; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/xfl/shapefixer/CurvedEdgeRecordAdvanced.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/xfl/shapefixer/CurvedEdgeRecordAdvanced.java index 15a45b6d5..efbe4f317 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/xfl/shapefixer/CurvedEdgeRecordAdvanced.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/xfl/shapefixer/CurvedEdgeRecordAdvanced.java @@ -63,6 +63,7 @@ public class CurvedEdgeRecordAdvanced extends ShapeRecordAdvanced { ret.controlDeltaY = (int) Math.round(controlDeltaY); ret.anchorDeltaX = (int) Math.round(anchorDeltaX); ret.anchorDeltaY = (int) Math.round(anchorDeltaY); + ret.calculateBits(); return ret; } diff --git a/src/com/jpexs/decompiler/flash/gui/PreviewPanel.java b/src/com/jpexs/decompiler/flash/gui/PreviewPanel.java index 288cb0b0a..4e3927f68 100644 --- a/src/com/jpexs/decompiler/flash/gui/PreviewPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/PreviewPanel.java @@ -812,6 +812,7 @@ public class PreviewPanel extends JPersistentSplitPane implements TagEditorPanel if (scr.stateMoveTo) { scr.moveDeltaX = points.get(pointsPos).x; scr.moveDeltaY = points.get(pointsPos).y; + scr.calculateBits(); pointsPos++; } } @@ -820,8 +821,9 @@ public class PreviewPanel extends JPersistentSplitPane implements TagEditorPanel ser.generalLineFlag = true; ser.deltaX = points.get(pointsPos).x - x; ser.deltaY = points.get(pointsPos).y - y; - pointsPos += 1; ser.simplify(); + ser.calculateBits(); + pointsPos += 1; } if (rec instanceof CurvedEdgeRecord) { CurvedEdgeRecord cer = (CurvedEdgeRecord) rec; @@ -829,6 +831,7 @@ public class PreviewPanel extends JPersistentSplitPane implements TagEditorPanel cer.controlDeltaY = points.get(pointsPos).y - y; cer.anchorDeltaX = points.get(pointsPos + 1).x - points.get(pointsPos).x; cer.anchorDeltaY = points.get(pointsPos + 1).y - points.get(pointsPos).y; + cer.calculateBits(); pointsPos += 2; } x = rec.changeX(x); @@ -962,6 +965,8 @@ public class PreviewPanel extends JPersistentSplitPane implements TagEditorPanel cer.anchorDeltaX = (int) Math.round(left.get(2).getX() - left.get(1).getX()); cer.anchorDeltaY = (int) Math.round(left.get(2).getY() - left.get(1).getY()); + cer.calculateBits(); + CurvedEdgeRecord newCer = new CurvedEdgeRecord(); newCer.controlDeltaX = (int) Math.round(right.get(1).getX() - right.get(0).getX()); newCer.controlDeltaY = (int) Math.round(right.get(1).getY() - right.get(0).getY()); @@ -969,6 +974,7 @@ public class PreviewPanel extends JPersistentSplitPane implements TagEditorPanel newCer.anchorDeltaY = (int) Math.round(right.get(2).getY() - right.get(1).getY()); selectedRecords.add(i + 1, newCer); importantRecordPosRef.setVal(importantRecordPos); + newCer.calculateBits(); return true; } pointsPos += 2; @@ -2075,6 +2081,7 @@ public class PreviewPanel extends JPersistentSplitPane implements TagEditorPanel cer.controlDeltaY = controlPoint2.y - currentPoint2.y; cer.anchorDeltaX = anchorPoint2.x - controlPoint2.x; cer.anchorDeltaY = anchorPoint2.y - controlPoint2.y; + cer.calculateBits(); } } }