diff --git a/trunk/src/com/jpexs/decompiler/flash/SWF.java b/trunk/src/com/jpexs/decompiler/flash/SWF.java index f8b835ab4..46f6b946f 100644 --- a/trunk/src/com/jpexs/decompiler/flash/SWF.java +++ b/trunk/src/com/jpexs/decompiler/flash/SWF.java @@ -2138,9 +2138,9 @@ public final class SWF implements TreeItem { float unzoom = (float) SWF.unitDivisor; int fixX = -displayRect.Xmin; int fixY = -displayRect.Ymin; + displayRect = fixRect(displayRect); int width = displayRect.getWidth(); int height = displayRect.getHeight(); - displayRect = fixRect(displayRect); SerializableImage ret = new SerializableImage((int) (width / unzoom), (int) (height / unzoom), SerializableImage.TYPE_INT_ARGB); ret.bounds = new Rectangle2D.Double(-fixX / unzoom, -fixY / unzoom, width / unzoom, height / unzoom); diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/GenericTagPanel.java b/trunk/src/com/jpexs/decompiler/flash/gui/GenericTagPanel.java index 1c368a77a..7e3ad5535 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/GenericTagPanel.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/GenericTagPanel.java @@ -90,6 +90,8 @@ public class GenericTagPanel extends JPanel implements ChangeListener { remove(genericTagPropertiesEditorPaneScrollPanel); add(genericTagPropertiesEditPanelScrollPanel); } else { + genericTagPropertiesEditPanel.removeAll(); + genericTagPropertiesEditPanel.setSize(0, 0); remove(genericTagPropertiesEditPanelScrollPanel); add(genericTagPropertiesEditorPaneScrollPanel); } diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/ImagePanel.java b/trunk/src/com/jpexs/decompiler/flash/gui/ImagePanel.java index f67a5437d..150afd98d 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/ImagePanel.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/ImagePanel.java @@ -157,10 +157,7 @@ public final class ImagePanel extends JPanel implements ActionListener, FlashDis if (drawable == null) { return 0; } - int ret = (int) Math.ceil(percent * drawable.getNumFrames() / 100.0); - if (ret == 0) { - ret = 1; - } + int ret = percent * (drawable.getNumFrames() - 1) / 100; return ret; } @@ -184,7 +181,7 @@ public final class ImagePanel extends JPanel implements ActionListener, FlashDis if (drawable == null) { return; } - int nframe = percent * drawable.getNumFrames() / 100; + int nframe = percent * (drawable.getNumFrames() - 1) / 100; if (nframe != frame) { Matrix mat = new Matrix(); mat.translateX = swf.displayRect.Xmin; diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/MainPanel.java b/trunk/src/com/jpexs/decompiler/flash/gui/MainPanel.java index d2a0c06b4..387d0667f 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/MainPanel.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/MainPanel.java @@ -662,7 +662,6 @@ public final class MainPanel extends JPanel implements ActionListener, TreeSelec textValue = new LineMarkedEditorPane(); textTopPanel.add(new JScrollPane(textValue), BorderLayout.CENTER); textValue.setEditable(false); - //textValue.setFont(UIManager.getFont("TextField.font")); JPanel textButtonsPanel = new JPanel(); textButtonsPanel.setLayout(new FlowLayout()); @@ -2443,6 +2442,7 @@ public final class MainPanel extends JPanel implements ActionListener, TreeSelec previewSplitPane.setDividerLocation(Configuration.guiPreviewSplitPaneDividerLocation.get(previewSplitPane.getWidth() / 2)); showDetailWithPreview(CARDTEXTPANEL); textValue.setContentType("text/swf_text"); + //textValue.setFont(new Font("Monospaced", Font.PLAIN, 13)); textValue.setText(textTag.getFormattedText()); textValue.setCaretPosition(0); } else if (tagObj instanceof FontTag) { diff --git a/trunk/src/com/jpexs/decompiler/flash/tags/DefineMorphShape2Tag.java b/trunk/src/com/jpexs/decompiler/flash/tags/DefineMorphShape2Tag.java index 45574d94b..82ce828f0 100644 --- a/trunk/src/com/jpexs/decompiler/flash/tags/DefineMorphShape2Tag.java +++ b/trunk/src/com/jpexs/decompiler/flash/tags/DefineMorphShape2Tag.java @@ -202,70 +202,112 @@ public class DefineMorphShape2Tag extends CharacterTag implements BoundedTag, Mo List finalRecords = new ArrayList<>(); FILLSTYLEARRAY fillStyles = morphFillStyles.getFillStylesAt(frame); LINESTYLEARRAY lineStyles = morphLineStyles.getLineStylesAt(getShapeNum(), frame); - int endIndex = 0; - for (int startIndex = 0; startIndex < startEdges.shapeRecords.size(); startIndex++, endIndex++) { + int startPosX = 0, startPosY = 0; + int endPosX = 0, endPosY = 0; + int posX = 0, posY = 0; + + for (int startIndex = 0, endIndex = 0; + startIndex < startEdges.shapeRecords.size() && + endIndex < endEdges.shapeRecords.size(); startIndex++, endIndex++) { - if (startIndex == 0) { - StyleChangeRecord scr1 = (StyleChangeRecord) startEdges.shapeRecords.get(startIndex); - StyleChangeRecord scr2 = (StyleChangeRecord) startEdges.shapeRecords.get(endIndex); - StyleChangeRecord scr = (StyleChangeRecord) scr1.clone(); - if (scr1.stateMoveTo && scr2.stateMoveTo) { - scr.moveDeltaX = scr1.moveDeltaX + (scr2.moveDeltaX - scr1.moveDeltaX) * frame / 65535; - scr.moveDeltaY = scr1.moveDeltaY + (scr2.moveDeltaY - scr1.moveDeltaY) * frame / 65535; - finalRecords.add(scr); - continue; - } - } - SHAPERECORD edge1 = null; - do { - edge1 = startEdges.shapeRecords.get(startIndex); - if (edge1 instanceof StyleChangeRecord) { - finalRecords.add(edge1); - edge1 = null; - startIndex++; - } - } while (edge1 == null); + SHAPERECORD edge1 = startEdges.shapeRecords.get(startIndex); SHAPERECORD edge2 = endEdges.shapeRecords.get(endIndex); + if (edge1 instanceof StyleChangeRecord || edge2 instanceof StyleChangeRecord) { + StyleChangeRecord scr1; + if (edge1 instanceof StyleChangeRecord) { + scr1 = (StyleChangeRecord) edge1; + if (scr1.stateMoveTo) { + startPosX = scr1.moveDeltaX; + startPosY = scr1.moveDeltaY; + } + } else { + scr1 = new StyleChangeRecord(); + startIndex--; + } + StyleChangeRecord scr2; + if (edge2 instanceof StyleChangeRecord) { + scr2 = (StyleChangeRecord) edge2; + if (scr2.stateMoveTo) { + endPosX = scr2.moveDeltaX; + endPosY = scr2.moveDeltaY; + } + } else { + scr2 = new StyleChangeRecord(); + endIndex--; + } + StyleChangeRecord scr = (StyleChangeRecord) scr1.clone(); + if (scr1.stateMoveTo || scr2.stateMoveTo) { + scr.moveDeltaX = startPosX + (endPosX - startPosX) * frame / 65535; + scr.moveDeltaY = startPosY + (endPosY - startPosY) * frame / 65535; + scr.stateMoveTo = scr.moveDeltaX != posX || scr.moveDeltaY != posY; + } + finalRecords.add(scr); + continue; + } + if (edge1 instanceof EndShapeRecord) { finalRecords.add(edge1); break; } if (edge2 instanceof EndShapeRecord) { + finalRecords.add(edge2); break; } - if ((edge1 instanceof StyleChangeRecord) && (edge2 instanceof StyleChangeRecord)) { - StyleChangeRecord scr1 = (StyleChangeRecord) edge1; - StyleChangeRecord scr2 = (StyleChangeRecord) edge2; - StyleChangeRecord scr = (StyleChangeRecord) scr1.clone(); - if (scr1.stateMoveTo && scr2.stateMoveTo) { - scr.moveDeltaX = scr1.moveDeltaX + (scr2.moveDeltaX - scr1.moveDeltaX) * frame / 65535; - scr.moveDeltaY = scr1.moveDeltaY + (scr2.moveDeltaY - scr1.moveDeltaY) * frame / 65535; - finalRecords.add(scr); + + if (edge1 instanceof CurvedEdgeRecord || edge2 instanceof CurvedEdgeRecord) { + CurvedEdgeRecord cer1 = null; + if (edge1 instanceof CurvedEdgeRecord) { + cer1 = (CurvedEdgeRecord) edge1; + } else if (edge1 instanceof StraightEdgeRecord) { + cer1 = SHAPERECORD.straightToCurve((StraightEdgeRecord) edge1); + } + CurvedEdgeRecord cer2 = null; + if (edge2 instanceof CurvedEdgeRecord) { + cer2 = (CurvedEdgeRecord) edge2; + } else if (edge2 instanceof StraightEdgeRecord) { + cer2 = SHAPERECORD.straightToCurve((StraightEdgeRecord) edge2); + } + if ((cer2 == null) || (cer1 == null)) { continue; } + CurvedEdgeRecord cer = new CurvedEdgeRecord(); + cer.controlDeltaX = cer1.controlDeltaX + (cer2.controlDeltaX - cer1.controlDeltaX) * frame / 65535; + cer.controlDeltaY = cer1.controlDeltaY + (cer2.controlDeltaY - cer1.controlDeltaY) * frame / 65535; + cer.anchorDeltaX = cer1.anchorDeltaX + (cer2.anchorDeltaX - cer1.anchorDeltaX) * frame / 65535; + cer.anchorDeltaY = cer1.anchorDeltaY + (cer2.anchorDeltaY - cer1.anchorDeltaY) * frame / 65535; + startPosX += cer1.controlDeltaX + cer1.anchorDeltaX; + startPosY += cer1.controlDeltaY + cer1.anchorDeltaY; + endPosX += cer2.controlDeltaX + cer2.anchorDeltaX; + endPosY += cer2.controlDeltaY + cer2.anchorDeltaY; + posX += cer.controlDeltaX + cer.anchorDeltaX; + posY += cer.controlDeltaY + cer.anchorDeltaY; + finalRecords.add(cer); + } else { + StraightEdgeRecord ser1 = null; + if (edge1 instanceof StraightEdgeRecord) { + ser1 = (StraightEdgeRecord) edge1; + } + StraightEdgeRecord ser2 = null; + if (edge2 instanceof StraightEdgeRecord) { + ser2 = (StraightEdgeRecord) edge2; + } + if ((ser2 == null) || (ser1 == null)) { + continue; + } + StraightEdgeRecord ser = new StraightEdgeRecord(); + ser.generalLineFlag = true; + ser.vertLineFlag = false; + ser.deltaX = ser1.deltaX + (ser2.deltaX - ser1.deltaX) * frame / 65535; + ser.deltaY = ser1.deltaY + (ser2.deltaY - ser1.deltaY) * frame / 65535; + startPosX += ser1.deltaX; + startPosY += ser1.deltaY; + endPosX += ser2.deltaX; + endPosY += ser2.deltaY; + posX += ser.deltaX; + posY += ser.deltaX; + finalRecords.add(ser); } - CurvedEdgeRecord cer1 = null; - if (edge1 instanceof CurvedEdgeRecord) { - cer1 = (CurvedEdgeRecord) edge1; - } else if (edge1 instanceof StraightEdgeRecord) { - cer1 = SHAPERECORD.straightToCurve((StraightEdgeRecord) edge1); - } - CurvedEdgeRecord cer2 = null; - if (edge2 instanceof CurvedEdgeRecord) { - cer2 = (CurvedEdgeRecord) edge2; - } else if (edge2 instanceof StraightEdgeRecord) { - cer2 = SHAPERECORD.straightToCurve((StraightEdgeRecord) edge2); - } - if ((cer2 == null) || (cer1 == null)) { - continue; - } - CurvedEdgeRecord cer = new CurvedEdgeRecord(); - cer.controlDeltaX = cer1.controlDeltaX + (cer2.controlDeltaX - cer1.controlDeltaX) * frame / 65535; - cer.controlDeltaY = cer1.controlDeltaY + (cer2.controlDeltaY - cer1.controlDeltaY) * frame / 65535; - cer.anchorDeltaX = cer1.anchorDeltaX + (cer2.anchorDeltaX - cer1.anchorDeltaX) * frame / 65535; - cer.anchorDeltaY = cer1.anchorDeltaY + (cer2.anchorDeltaY - cer1.anchorDeltaY) * frame / 65535; - finalRecords.add(cer); } SHAPEWITHSTYLE shape = new SHAPEWITHSTYLE(); shape.fillStyles = fillStyles; diff --git a/trunk/src/com/jpexs/decompiler/flash/tags/DefineMorphShapeTag.java b/trunk/src/com/jpexs/decompiler/flash/tags/DefineMorphShapeTag.java index 19b9233a2..14985474f 100644 --- a/trunk/src/com/jpexs/decompiler/flash/tags/DefineMorphShapeTag.java +++ b/trunk/src/com/jpexs/decompiler/flash/tags/DefineMorphShapeTag.java @@ -186,18 +186,44 @@ public class DefineMorphShapeTag extends CharacterTag implements BoundedTag, Mor FILLSTYLEARRAY fillStyles = morphFillStyles.getFillStylesAt(frame); LINESTYLEARRAY lineStyles = morphLineStyles.getLineStylesAt(getShapeNum(), frame); - for (int startIndex = 0; startIndex < startEdges.shapeRecords.size(); startIndex++) { + int startPosX = 0, startPosY = 0; + int endPosX = 0, endPosY = 0; + int posX = 0, posY = 0; + + for (int startIndex = 0, endIndex = 0; + startIndex < startEdges.shapeRecords.size() && + endIndex < endEdges.shapeRecords.size(); startIndex++, endIndex++) { SHAPERECORD edge1 = startEdges.shapeRecords.get(startIndex); - SHAPERECORD edge2 = endEdges.shapeRecords.get(startIndex); + SHAPERECORD edge2 = endEdges.shapeRecords.get(endIndex); if (edge1 instanceof StyleChangeRecord || edge2 instanceof StyleChangeRecord) { - StyleChangeRecord scr1 = (StyleChangeRecord) edge1; - StyleChangeRecord scr2 = (StyleChangeRecord) edge2; + StyleChangeRecord scr1; + if (edge1 instanceof StyleChangeRecord) { + scr1 = (StyleChangeRecord) edge1; + if (scr1.stateMoveTo) { + startPosX = scr1.moveDeltaX; + startPosY = scr1.moveDeltaY; + } + } else { + scr1 = new StyleChangeRecord(); + startIndex--; + } + StyleChangeRecord scr2; + if (edge2 instanceof StyleChangeRecord) { + scr2 = (StyleChangeRecord) edge2; + if (scr2.stateMoveTo) { + endPosX = scr2.moveDeltaX; + endPosY = scr2.moveDeltaY; + } + } else { + scr2 = new StyleChangeRecord(); + endIndex--; + } StyleChangeRecord scr = (StyleChangeRecord) scr1.clone(); if (scr1.stateMoveTo || scr2.stateMoveTo) { - scr.stateMoveTo = true; - scr.moveDeltaX = scr1.moveDeltaX + (scr2.moveDeltaX - scr1.moveDeltaX) * frame / 65535; - scr.moveDeltaY = scr1.moveDeltaY + (scr2.moveDeltaY - scr1.moveDeltaY) * frame / 65535; + scr.moveDeltaX = startPosX + (endPosX - startPosX) * frame / 65535; + scr.moveDeltaY = startPosY + (endPosY - startPosY) * frame / 65535; + scr.stateMoveTo = scr.moveDeltaX != posX || scr.moveDeltaY != posY; } finalRecords.add(scr); continue; @@ -233,6 +259,12 @@ public class DefineMorphShapeTag extends CharacterTag implements BoundedTag, Mor cer.controlDeltaY = cer1.controlDeltaY + (cer2.controlDeltaY - cer1.controlDeltaY) * frame / 65535; cer.anchorDeltaX = cer1.anchorDeltaX + (cer2.anchorDeltaX - cer1.anchorDeltaX) * frame / 65535; cer.anchorDeltaY = cer1.anchorDeltaY + (cer2.anchorDeltaY - cer1.anchorDeltaY) * frame / 65535; + startPosX += cer1.controlDeltaX + cer1.anchorDeltaX; + startPosY += cer1.controlDeltaY + cer1.anchorDeltaY; + endPosX += cer2.controlDeltaX + cer2.anchorDeltaX; + endPosY += cer2.controlDeltaY + cer2.anchorDeltaY; + posX += cer.controlDeltaX + cer.anchorDeltaX; + posY += cer.controlDeltaY + cer.anchorDeltaY; finalRecords.add(cer); } else { StraightEdgeRecord ser1 = null; @@ -251,6 +283,12 @@ public class DefineMorphShapeTag extends CharacterTag implements BoundedTag, Mor ser.vertLineFlag = false; ser.deltaX = ser1.deltaX + (ser2.deltaX - ser1.deltaX) * frame / 65535; ser.deltaY = ser1.deltaY + (ser2.deltaY - ser1.deltaY) * frame / 65535; + startPosX += ser1.deltaX; + startPosY += ser1.deltaY; + endPosX += ser2.deltaX; + endPosY += ser2.deltaY; + posX += ser.deltaX; + posY += ser.deltaX; finalRecords.add(ser); } }