mirror of
https://git.huckle.dev/Huckles-Minecraft-Archive/jpexs-decompiler.git
synced 2026-09-24 21:40:46 +00:00
Library preview
This commit is contained in:
@@ -17,6 +17,7 @@
|
|||||||
package com.jpexs.decompiler.flash.easygui;
|
package com.jpexs.decompiler.flash.easygui;
|
||||||
|
|
||||||
import com.jpexs.decompiler.flash.configuration.Configuration;
|
import com.jpexs.decompiler.flash.configuration.Configuration;
|
||||||
|
import com.jpexs.decompiler.flash.gui.AppStrings;
|
||||||
import com.jpexs.decompiler.flash.gui.View;
|
import com.jpexs.decompiler.flash.gui.View;
|
||||||
import java.awt.GraphicsEnvironment;
|
import java.awt.GraphicsEnvironment;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
@@ -43,7 +44,7 @@ public class EasyGuiMain {
|
|||||||
System.setProperty("sun.java2d.d3d", "false");
|
System.setProperty("sun.java2d.d3d", "false");
|
||||||
System.setProperty("sun.java2d.noddraw", "true");
|
System.setProperty("sun.java2d.noddraw", "true");
|
||||||
|
|
||||||
System.setProperty("sun.java2d.uiScale", "1.0");;
|
System.setProperty("sun.java2d.uiScale", "1.0");
|
||||||
|
|
||||||
System.setProperty("sun.java2d.opengl", "false");
|
System.setProperty("sun.java2d.opengl", "false");
|
||||||
|
|
||||||
@@ -57,6 +58,9 @@ public class EasyGuiMain {
|
|||||||
UIManager.put("Tree.expandedIcon", View.getIcon("expand16"));
|
UIManager.put("Tree.expandedIcon", View.getIcon("expand16"));
|
||||||
UIManager.put("Tree.collapsedIcon", View.getIcon("collapse16"));
|
UIManager.put("Tree.collapsedIcon", View.getIcon("collapse16"));
|
||||||
|
|
||||||
|
AppStrings.setResourceClass(com.jpexs.decompiler.flash.gui.MainFrame.class);
|
||||||
|
|
||||||
|
|
||||||
mainFrame = new MainFrame();
|
mainFrame = new MainFrame();
|
||||||
mainFrame.setVisible(true);
|
mainFrame.setVisible(true);
|
||||||
|
|
||||||
|
|||||||
@@ -231,7 +231,7 @@ public class LibraryTreeTable extends JTreeTable {
|
|||||||
Object o = n.getUserObject();
|
Object o = n.getUserObject();
|
||||||
switch (column) {
|
switch (column) {
|
||||||
case 0:
|
case 0:
|
||||||
return node.toString();
|
return node;
|
||||||
case 1:
|
case 1:
|
||||||
if (o instanceof CharacterTag) {
|
if (o instanceof CharacterTag) {
|
||||||
CharacterTag ct = (CharacterTag) o;
|
CharacterTag ct = (CharacterTag) o;
|
||||||
|
|||||||
@@ -17,6 +17,10 @@
|
|||||||
package com.jpexs.decompiler.flash.easygui;
|
package com.jpexs.decompiler.flash.easygui;
|
||||||
|
|
||||||
import com.jpexs.decompiler.flash.SWF;
|
import com.jpexs.decompiler.flash.SWF;
|
||||||
|
import com.jpexs.decompiler.flash.gui.ImagePanel;
|
||||||
|
import com.jpexs.decompiler.flash.gui.TimelinedMaker;
|
||||||
|
import com.jpexs.decompiler.flash.gui.player.Zoom;
|
||||||
|
import com.jpexs.decompiler.flash.tags.Tag;
|
||||||
import de.javagl.treetable.JTreeTable;
|
import de.javagl.treetable.JTreeTable;
|
||||||
import java.awt.BorderLayout;
|
import java.awt.BorderLayout;
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
@@ -25,11 +29,17 @@ import java.awt.Dimension;
|
|||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import javax.swing.BorderFactory;
|
||||||
import javax.swing.JFrame;
|
import javax.swing.JFrame;
|
||||||
|
import javax.swing.JLabel;
|
||||||
import javax.swing.JPanel;
|
import javax.swing.JPanel;
|
||||||
import javax.swing.JScrollPane;
|
import javax.swing.JScrollPane;
|
||||||
import javax.swing.JSplitPane;
|
import javax.swing.JSplitPane;
|
||||||
import javax.swing.UIManager;
|
import javax.swing.UIManager;
|
||||||
|
import javax.swing.border.BevelBorder;
|
||||||
|
import javax.swing.event.ListSelectionEvent;
|
||||||
|
import javax.swing.event.ListSelectionListener;
|
||||||
|
import javax.swing.tree.DefaultMutableTreeNode;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
@@ -40,6 +50,7 @@ public class MainFrame extends JFrame {
|
|||||||
private SWF swf;
|
private SWF swf;
|
||||||
private LibraryTreeTable libraryTreeTable;
|
private LibraryTreeTable libraryTreeTable;
|
||||||
private JSplitPane splitPane;
|
private JSplitPane splitPane;
|
||||||
|
private ImagePanel libraryPreviewPanel;
|
||||||
public MainFrame() {
|
public MainFrame() {
|
||||||
setTitle("JPEXS FFDec Easy GUI");
|
setTitle("JPEXS FFDec Easy GUI");
|
||||||
setSize(1024, 768);
|
setSize(1024, 768);
|
||||||
@@ -49,10 +60,44 @@ public class MainFrame extends JFrame {
|
|||||||
cnt.setLayout(new BorderLayout());
|
cnt.setLayout(new BorderLayout());
|
||||||
|
|
||||||
libraryTreeTable = new LibraryTreeTable();
|
libraryTreeTable = new LibraryTreeTable();
|
||||||
JScrollPane scrollPane = new JScrollPane(libraryTreeTable);
|
JScrollPane libraryScrollPane = new JScrollPane(libraryTreeTable);
|
||||||
splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, new JPanel(), scrollPane);
|
|
||||||
scrollPane.getViewport().setBackground(UIManager.getColor("Tree.background"));
|
JPanel libraryPanel = new JPanel(new BorderLayout());
|
||||||
|
libraryPanel.add(libraryScrollPane, BorderLayout.CENTER);
|
||||||
|
|
||||||
|
libraryPreviewPanel = new ImagePanel();
|
||||||
|
libraryPreviewPanel.setTopPanelVisible(false);
|
||||||
|
|
||||||
|
JPanel topLibraryPanel = new JPanel(new BorderLayout());
|
||||||
|
JLabel libraryLabel = new JLabel("Library");
|
||||||
|
libraryLabel.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
|
||||||
|
topLibraryPanel.add(libraryLabel, BorderLayout.NORTH);
|
||||||
|
topLibraryPanel.add(libraryPreviewPanel, BorderLayout.CENTER);
|
||||||
|
libraryPanel.add(topLibraryPanel, BorderLayout.NORTH);
|
||||||
|
|
||||||
|
libraryPreviewPanel.setPreferredSize(new Dimension(200,200));
|
||||||
|
|
||||||
|
splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, new JPanel(), libraryPanel);
|
||||||
|
libraryScrollPane.getViewport().setBackground(UIManager.getColor("Tree.background"));
|
||||||
cnt.add(splitPane, BorderLayout.CENTER);
|
cnt.add(splitPane, BorderLayout.CENTER);
|
||||||
|
|
||||||
|
libraryTreeTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
|
||||||
|
@Override
|
||||||
|
public void valueChanged(ListSelectionEvent e) {
|
||||||
|
int row = libraryTreeTable.getSelectedRow();
|
||||||
|
if (row == -1) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
DefaultMutableTreeNode n = (DefaultMutableTreeNode) libraryTreeTable.getModel().getValueAt(row, 0);
|
||||||
|
Object obj = n.getUserObject();
|
||||||
|
if (obj instanceof Tag) {
|
||||||
|
Tag t = (Tag) obj;
|
||||||
|
libraryPreviewPanel.setTimelined(TimelinedMaker.makeTimelined(t), t.getSwf(),
|
||||||
|
-1, false, true, true, true, true, false, true);
|
||||||
|
libraryPreviewPanel.zoomFit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void open(File file) throws IOException, InterruptedException {
|
public void open(File file) throws IOException, InterruptedException {
|
||||||
|
|||||||
@@ -304,6 +304,12 @@ public final class ImagePanel extends JPanel implements MediaDisplay {
|
|||||||
|
|
||||||
private int displayedFrame = 0;
|
private int displayedFrame = 0;
|
||||||
|
|
||||||
|
private JPanel topPanel;
|
||||||
|
|
||||||
|
public void setTopPanelVisible(boolean visible) {
|
||||||
|
topPanel.setVisible(visible);
|
||||||
|
}
|
||||||
|
|
||||||
public void setShowPoints(List<java.awt.Point> showPoints1, List<java.awt.Point> showPoints2) {
|
public void setShowPoints(List<java.awt.Point> showPoints1, List<java.awt.Point> showPoints2) {
|
||||||
this.showPoints1 = showPoints1;
|
this.showPoints1 = showPoints1;
|
||||||
this.showPoints2 = showPoints2;
|
this.showPoints2 = showPoints2;
|
||||||
@@ -2221,7 +2227,7 @@ public final class ImagePanel extends JPanel implements MediaDisplay {
|
|||||||
//labelPan.add(label, new GridBagConstraints());
|
//labelPan.add(label, new GridBagConstraints());
|
||||||
add(iconPanel, BorderLayout.CENTER);
|
add(iconPanel, BorderLayout.CENTER);
|
||||||
|
|
||||||
JPanel topPanel = new JPanel();
|
topPanel = new JPanel();
|
||||||
topPanel.setLayout(new BoxLayout(topPanel, BoxLayout.Y_AXIS));
|
topPanel.setLayout(new BoxLayout(topPanel, BoxLayout.Y_AXIS));
|
||||||
debugLabel.setAlignmentX(JLabel.LEFT_ALIGNMENT);
|
debugLabel.setAlignmentX(JLabel.LEFT_ALIGNMENT);
|
||||||
topPanel.add(debugLabel);
|
topPanel.add(debugLabel);
|
||||||
@@ -2549,17 +2555,24 @@ public final class ImagePanel extends JPanel implements MediaDisplay {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public synchronized void zoom(Zoom zoom) {
|
public synchronized void zoom(Zoom zoom) {
|
||||||
zoom(zoom, false);
|
zoom(zoom, false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private synchronized void zoom(Zoom zoom, boolean useCursor) {
|
public void zoomFit() {
|
||||||
|
Zoom z = new Zoom();
|
||||||
|
z.value = 1.0;
|
||||||
|
z.fit = true;
|
||||||
|
zoom(z, false, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
private synchronized void zoom(Zoom zoom, boolean useCursor, boolean forced) {
|
||||||
if (!zoomAvailable) {
|
if (!zoomAvailable) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
double zoomDoubleBefore = this.zoom.fit ? getZoomToFit() : this.zoom.value;
|
double zoomDoubleBefore = this.zoom.fit ? getZoomToFit() : this.zoom.value;
|
||||||
|
|
||||||
boolean modified = this.zoom.value != zoom.value || this.zoom.fit != zoom.fit;
|
boolean modified = this.zoom.value != zoom.value || this.zoom.fit != zoom.fit;
|
||||||
if (modified) {
|
if (modified || forced) {
|
||||||
Point localCursorPosition = this.cursorPosition;
|
Point localCursorPosition = this.cursorPosition;
|
||||||
if (!useCursor || localCursorPosition == null) {
|
if (!useCursor || localCursorPosition == null) {
|
||||||
localCursorPosition = new Point(iconPanel.getWidth() / 2, iconPanel.getHeight() / 2);
|
localCursorPosition = new Point(iconPanel.getWidth() / 2, iconPanel.getHeight() / 2);
|
||||||
@@ -3894,14 +3907,14 @@ public final class ImagePanel extends JPanel implements MediaDisplay {
|
|||||||
Zoom newZoom = new Zoom();
|
Zoom newZoom = new Zoom();
|
||||||
newZoom.value = currentRealZoom * ZOOM_MULTIPLIER;
|
newZoom.value = currentRealZoom * ZOOM_MULTIPLIER;
|
||||||
newZoom.fit = false;
|
newZoom.fit = false;
|
||||||
zoom(newZoom, true);
|
zoom(newZoom, true, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private synchronized void zoomOut() {
|
private synchronized void zoomOut() {
|
||||||
Zoom newZoom = new Zoom();
|
Zoom newZoom = new Zoom();
|
||||||
newZoom.value = getRealZoom() / ZOOM_MULTIPLIER;
|
newZoom.value = getRealZoom() / ZOOM_MULTIPLIER;
|
||||||
newZoom.fit = false;
|
newZoom.fit = false;
|
||||||
zoom(newZoom, true);
|
zoom(newZoom, true, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -5851,7 +5851,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se
|
|||||||
} else if (treeItem instanceof ImageTag) {
|
} else if (treeItem instanceof ImageTag) {
|
||||||
ImageTag imageTag = (ImageTag) treeItem;
|
ImageTag imageTag = (ImageTag) treeItem;
|
||||||
previewPanel.setImageReplaceButtonVisible(!((Tag) imageTag).isReadOnly() && imageTag.importSupported(), imageTag instanceof DefineBitsJPEG3Tag || imageTag instanceof DefineBitsJPEG4Tag, false, false, false, false, false);
|
previewPanel.setImageReplaceButtonVisible(!((Tag) imageTag).isReadOnly() && imageTag.importSupported(), imageTag instanceof DefineBitsJPEG3Tag || imageTag instanceof DefineBitsJPEG4Tag, false, false, false, false, false);
|
||||||
SWF imageSWF = makeTimelinedImage(imageTag);
|
SWF imageSWF = TimelinedMaker.makeTimelinedImage(imageTag);
|
||||||
previewPanel.showImagePanel(imageSWF, imageSWF, 0, false, true, true, true, true, false, false, true);
|
previewPanel.showImagePanel(imageSWF, imageSWF, 0, false, true, true, true, true, false, false, true);
|
||||||
|
|
||||||
} else if (!isVideoButNotDrawable && (treeItem instanceof DrawableTag) && (!(treeItem instanceof TextTag)) && (!(treeItem instanceof FontTag)) && internalViewer) {
|
} else if (!isVideoButNotDrawable && (treeItem instanceof DrawableTag) && (!(treeItem instanceof TextTag)) && (!(treeItem instanceof FontTag)) && internalViewer) {
|
||||||
@@ -5861,7 +5861,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se
|
|||||||
if (treeItem instanceof Timelined && !(treeItem instanceof ButtonTag)) {
|
if (treeItem instanceof Timelined && !(treeItem instanceof ButtonTag)) {
|
||||||
timelined = (Timelined) tag;
|
timelined = (Timelined) tag;
|
||||||
} else {
|
} else {
|
||||||
timelined = makeTimelined(tag);
|
timelined = TimelinedMaker.makeTimelined(tag);
|
||||||
}
|
}
|
||||||
|
|
||||||
previewPanel.setParametersPanelVisible(false);
|
previewPanel.setParametersPanelVisible(false);
|
||||||
@@ -6464,291 +6464,6 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se
|
|||||||
statusPanel.setErrorState(errorState);
|
statusPanel.setErrorState(errorState);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static SWF makeTimelinedImage(ImageTag imageTag) {
|
|
||||||
SWF swf = new SWF();
|
|
||||||
swf.gfx = imageTag.getSwf().gfx;
|
|
||||||
swf.version = imageTag.getSwf().version;
|
|
||||||
int w = (int) (imageTag.getImageDimension().getWidth() * SWF.unitDivisor);
|
|
||||||
int h = (int) (imageTag.getImageDimension().getHeight() * SWF.unitDivisor);
|
|
||||||
swf.displayRect = new RECT(0, w, 0, h);
|
|
||||||
swf.frameCount = 1;
|
|
||||||
swf.frameRate = 1;
|
|
||||||
swf.setFile(imageTag.getSwf().getFile()); //DefineSubImage calculates relative paths from it
|
|
||||||
try {
|
|
||||||
|
|
||||||
JPEGTablesTag jpegTablesTag = null;
|
|
||||||
if (imageTag instanceof DefineBitsTag) {
|
|
||||||
jpegTablesTag = imageTag.getSwf().getJtt();
|
|
||||||
}
|
|
||||||
Set<Integer> needed = new LinkedHashSet<>();
|
|
||||||
imageTag.getNeededCharacters(needed, swf);
|
|
||||||
|
|
||||||
List<CharacterTag> neededCopies = new ArrayList<>();
|
|
||||||
for (int n : needed) {
|
|
||||||
CharacterTag ct = imageTag.getSwf().getCharacter(n);
|
|
||||||
if (ct != null) {
|
|
||||||
ct = (CharacterTag) ct.cloneTag();
|
|
||||||
ct.setSwf(swf);
|
|
||||||
neededCopies.add(ct);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (imageTag instanceof DefineSubImage) {
|
|
||||||
DefineExternalImage2 dei2 = (DefineExternalImage2) imageTag.getSwf().getExternalImage2(((DefineSubImage) imageTag).imageId);
|
|
||||||
if (dei2 != null) {
|
|
||||||
dei2 = (DefineExternalImage2) dei2.cloneTag();
|
|
||||||
dei2.setSwf(swf);
|
|
||||||
neededCopies.add(dei2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ImageTag imageTagCopy = (ImageTag) imageTag.cloneTag();
|
|
||||||
imageTagCopy.setSwf(swf);
|
|
||||||
int imageCharId = imageTag.getCharacterId();
|
|
||||||
if ((imageTag instanceof DefineExternalImage2) && (((DefineExternalImage2) imageTag).idType != IdType.IDTYPE_NONE)) {
|
|
||||||
imageCharId = swf.getNextCharacterId();
|
|
||||||
imageTagCopy.characterID = imageCharId;
|
|
||||||
}
|
|
||||||
DefineShape2Tag shapeTag = new DefineShape2Tag(swf);
|
|
||||||
int shapeCharId = imageCharId + 1;
|
|
||||||
shapeTag.shapeId = shapeCharId;
|
|
||||||
shapeTag.shapeBounds = new RECT(swf.displayRect);
|
|
||||||
|
|
||||||
SHAPEWITHSTYLE shapeData = new SHAPEWITHSTYLE();
|
|
||||||
FILLSTYLEARRAY fillStyleArray = new FILLSTYLEARRAY();
|
|
||||||
FILLSTYLE[] fillStyles = new FILLSTYLE[1];
|
|
||||||
FILLSTYLE fillStyle = new FILLSTYLE();
|
|
||||||
fillStyle.bitmapId = imageCharId;
|
|
||||||
fillStyle.inShape3 = false;
|
|
||||||
fillStyle.fillStyleType = FILLSTYLE.CLIPPED_BITMAP;
|
|
||||||
fillStyle.bitmapMatrix = Matrix.getScaleInstance(SWF.unitDivisor).toMATRIX();
|
|
||||||
fillStyles[0] = fillStyle;
|
|
||||||
fillStyleArray.fillStyles = fillStyles;
|
|
||||||
shapeData.fillStyles = fillStyleArray;
|
|
||||||
shapeData.lineStyles = new LINESTYLEARRAY();
|
|
||||||
|
|
||||||
List<SHAPERECORD> shapeRecords = new ArrayList<>();
|
|
||||||
|
|
||||||
StyleChangeRecord scr = new StyleChangeRecord();
|
|
||||||
scr.stateFillStyle0 = true;
|
|
||||||
scr.fillStyle0 = 1;
|
|
||||||
shapeRecords.add(scr);
|
|
||||||
|
|
||||||
StyleChangeRecord scr2 = new StyleChangeRecord();
|
|
||||||
scr2.stateMoveTo = true;
|
|
||||||
scr2.moveDeltaX = 0;
|
|
||||||
scr2.moveDeltaY = 0;
|
|
||||||
scr2.calculateBits();
|
|
||||||
shapeRecords.add(scr2);
|
|
||||||
|
|
||||||
StraightEdgeRecord ser1 = new StraightEdgeRecord();
|
|
||||||
ser1.vertLineFlag = true;
|
|
||||||
ser1.deltaY = h;
|
|
||||||
ser1.calculateBits();
|
|
||||||
shapeRecords.add(ser1);
|
|
||||||
|
|
||||||
StraightEdgeRecord ser2 = new StraightEdgeRecord();
|
|
||||||
ser2.deltaX = w;
|
|
||||||
shapeRecords.add(ser2);
|
|
||||||
|
|
||||||
StraightEdgeRecord ser3 = new StraightEdgeRecord();
|
|
||||||
ser3.vertLineFlag = true;
|
|
||||||
ser3.deltaY = -h;
|
|
||||||
shapeRecords.add(ser3);
|
|
||||||
|
|
||||||
StraightEdgeRecord ser4 = new StraightEdgeRecord();
|
|
||||||
ser4.deltaX = -w;
|
|
||||||
shapeRecords.add(ser4);
|
|
||||||
|
|
||||||
shapeRecords.add(new EndShapeRecord());
|
|
||||||
|
|
||||||
shapeData.shapeRecords = shapeRecords;
|
|
||||||
|
|
||||||
shapeData.numFillBits = 1;
|
|
||||||
shapeData.numLineBits = 0;
|
|
||||||
|
|
||||||
shapeTag.shapes = shapeData;
|
|
||||||
|
|
||||||
PlaceObjectTag placeTag = new PlaceObjectTag(swf, shapeCharId, 1, new Matrix().toMATRIX(), null);
|
|
||||||
|
|
||||||
ShowFrameTag showFrameTag = new ShowFrameTag(swf);
|
|
||||||
|
|
||||||
EndTag endTag = new EndTag(swf);
|
|
||||||
|
|
||||||
if (jpegTablesTag != null) {
|
|
||||||
swf.addTag(jpegTablesTag);
|
|
||||||
}
|
|
||||||
for (CharacterTag neededCopy : neededCopies) {
|
|
||||||
swf.addTag(neededCopy);
|
|
||||||
}
|
|
||||||
swf.addTag(imageTagCopy);
|
|
||||||
swf.addTag(shapeTag);
|
|
||||||
swf.addTag(placeTag);
|
|
||||||
swf.addTag(showFrameTag);
|
|
||||||
swf.addTag(endTag);
|
|
||||||
|
|
||||||
} catch (InterruptedException | IOException ex) {
|
|
||||||
//ignore
|
|
||||||
}
|
|
||||||
return swf;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Timelined makeTimelined(final Tag tag) {
|
|
||||||
return makeTimelined(tag, -1);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Timelined makeTimelined(final Tag tag, final int fontFrameNum) {
|
|
||||||
|
|
||||||
return new Timelined() {
|
|
||||||
private Timeline tim;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Timeline getTimeline() {
|
|
||||||
if (tim == null) {
|
|
||||||
Timeline timeline = new Timeline(tag.getSwf(), this, ((CharacterTag) tag).getCharacterId(), getRect());
|
|
||||||
initTimeline(timeline);
|
|
||||||
tim = timeline;
|
|
||||||
}
|
|
||||||
|
|
||||||
return tim;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void resetTimeline() {
|
|
||||||
if (tim != null) {
|
|
||||||
tim.reset(tag.getSwf(), this, ((CharacterTag) tag).getCharacterId(), getRect());
|
|
||||||
initTimeline(tim);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void initTimeline(Timeline timeline) {
|
|
||||||
if (tag instanceof MorphShapeTag) {
|
|
||||||
timeline.frameRate = PreviewExporter.MORPH_SHAPE_ANIMATION_FRAME_RATE;
|
|
||||||
int framesCnt = (int) (timeline.frameRate * PreviewExporter.MORPH_SHAPE_ANIMATION_LENGTH);
|
|
||||||
for (int i = 0; i < framesCnt; i++) {
|
|
||||||
Frame f = new Frame(timeline, i);
|
|
||||||
DepthState ds = new DepthState(tag.getSwf(), f, f);
|
|
||||||
ds.characterId = ((CharacterTag) tag).getCharacterId();
|
|
||||||
ds.matrix = new MATRIX();
|
|
||||||
ds.ratio = i * 65535 / framesCnt;
|
|
||||||
f.layers.put(1, ds);
|
|
||||||
f.layersChanged = true;
|
|
||||||
timeline.addFrame(f);
|
|
||||||
}
|
|
||||||
Frame f = new Frame(timeline, framesCnt);
|
|
||||||
DepthState ds = new DepthState(tag.getSwf(), f, f);
|
|
||||||
ds.characterId = ((CharacterTag) tag).getCharacterId();
|
|
||||||
ds.matrix = new MATRIX();
|
|
||||||
ds.ratio = 65535;
|
|
||||||
f.layers.put(1, ds);
|
|
||||||
f.layersChanged = true;
|
|
||||||
timeline.addFrame(f);
|
|
||||||
} else if (tag instanceof FontTag) {
|
|
||||||
int pageCount = PreviewPanel.getFontPageCount((FontTag) tag);
|
|
||||||
int frame = fontFrameNum;
|
|
||||||
if (frame < 0 || frame >= pageCount) {
|
|
||||||
frame = 0;
|
|
||||||
}
|
|
||||||
//TODO: make this static texts instead of FontTag as drawable.
|
|
||||||
//We do not want to draw fonts directly added to stage as
|
|
||||||
//Fonts are really added to stage in some corner cases like for vertical text.
|
|
||||||
Frame f = new Frame(timeline, 0);
|
|
||||||
DepthState ds = new DepthState(tag.getSwf(), f, f);
|
|
||||||
ds.characterId = ((CharacterTag) tag).getCharacterId();
|
|
||||||
ds.matrix = new MATRIX();
|
|
||||||
f.layers.put(1, ds);
|
|
||||||
f.layersChanged = true;
|
|
||||||
timeline.addFrame(f);
|
|
||||||
timeline.fontFrameNum = frame;
|
|
||||||
} else {
|
|
||||||
Frame f = new Frame(timeline, 0);
|
|
||||||
DepthState ds = new DepthState(tag.getSwf(), f, f);
|
|
||||||
ds.characterId = ((CharacterTag) tag).getCharacterId();
|
|
||||||
ds.matrix = new MATRIX();
|
|
||||||
f.layers.put(1, ds);
|
|
||||||
timeline.addFrame(f);
|
|
||||||
}
|
|
||||||
timeline.displayRect = getRect();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public RECT getRect() {
|
|
||||||
return getRect(new HashSet<>());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public RECT getRect(Set<BoundedTag> added) {
|
|
||||||
BoundedTag bt = (BoundedTag) tag;
|
|
||||||
if (!added.contains(bt)) {
|
|
||||||
return bt.getRect(added);
|
|
||||||
}
|
|
||||||
return new RECT(Integer.MAX_VALUE, Integer.MIN_VALUE, Integer.MAX_VALUE, Integer.MIN_VALUE);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int hashCode() {
|
|
||||||
return tag.hashCode();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setModified(boolean value) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ReadOnlyTagList getTags() {
|
|
||||||
return ReadOnlyTagList.EMPTY;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void removeTag(int index) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void removeTag(Tag tag) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void addTag(Tag tag) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void addTag(int index, Tag tag) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void replaceTag(int index, Tag newTag) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void replaceTag(Tag oldTag, Tag newTag) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int indexOfTag(Tag tag) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public RECT getRectWithStrokes() {
|
|
||||||
return getRect();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setFrameCount(int frameCount) {
|
|
||||||
throw new UnsupportedOperationException("Not supported yet.");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getFrameCount() {
|
|
||||||
return getTimeline().getFrameCount();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public SWF getSwf() {
|
|
||||||
return tag.getSwf();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
private void disposeInner(Container container) {
|
private void disposeInner(Container container) {
|
||||||
for (Component c : container.getComponents()) {
|
for (Component c : container.getComponents()) {
|
||||||
if (c instanceof Container) {
|
if (c instanceof Container) {
|
||||||
|
|||||||
@@ -1564,7 +1564,7 @@ public class PreviewPanel extends JPersistentSplitPane implements TagEditorPanel
|
|||||||
|
|
||||||
private void showFontPage(FontTag fontTag) {
|
private void showFontPage(FontTag fontTag) {
|
||||||
if (!MainPanel.isAdobeFlashPlayerEnabled() /*|| ft instanceof GFxDefineCompactedFont*/) {
|
if (!MainPanel.isAdobeFlashPlayerEnabled() /*|| ft instanceof GFxDefineCompactedFont*/) {
|
||||||
showImagePanel(MainPanel.makeTimelined(fontTag), fontTag.getSwf(), fontPageNum, true, true, true, true, true, false, false, false);
|
showImagePanel(TimelinedMaker.makeTimelined(fontTag), fontTag.getSwf(), fontPageNum, true, true, true, true, true, false, false, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1583,7 +1583,7 @@ public class PreviewPanel extends JPersistentSplitPane implements TagEditorPanel
|
|||||||
|
|
||||||
public void showTextPanel(TextTag textTag) {
|
public void showTextPanel(TextTag textTag) {
|
||||||
if (!MainPanel.isAdobeFlashPlayerEnabled() /*|| ft instanceof GFxDefineCompactedFont*/) {
|
if (!MainPanel.isAdobeFlashPlayerEnabled() /*|| ft instanceof GFxDefineCompactedFont*/) {
|
||||||
showImagePanel(MainPanel.makeTimelined(textTag), textTag.getSwf(), 0, true, true, true, true, true, false, false, true);
|
showImagePanel(TimelinedMaker.makeTimelined(textTag), textTag.getSwf(), 0, true, true, true, true, true, false, false, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
showCardRight(CARDTEXTPANEL);
|
showCardRight(CARDTEXTPANEL);
|
||||||
@@ -1813,11 +1813,11 @@ public class PreviewPanel extends JPersistentSplitPane implements TagEditorPanel
|
|||||||
|
|
||||||
displayEditImagePanel.selectDepth(-1);
|
displayEditImagePanel.selectDepth(-1);
|
||||||
if (tag instanceof ShapeTag) {
|
if (tag instanceof ShapeTag) {
|
||||||
Timelined tim = MainPanel.makeTimelined(tag);
|
Timelined tim = TimelinedMaker.makeTimelined(tag);
|
||||||
displayEditImagePanel.setTimelined(tim, ((Tag) tag).getSwf(), 0, true, Configuration.autoPlayPreviews.get(), !Configuration.animateSubsprites.get(), false, !Configuration.playFrameSounds.get(), false, true);
|
displayEditImagePanel.setTimelined(tim, ((Tag) tag).getSwf(), 0, true, Configuration.autoPlayPreviews.get(), !Configuration.animateSubsprites.get(), false, !Configuration.playFrameSounds.get(), false, true);
|
||||||
}
|
}
|
||||||
if (tag instanceof MorphShapeTag) {
|
if (tag instanceof MorphShapeTag) {
|
||||||
Timelined tim = MainPanel.makeTimelined(tag);
|
Timelined tim = TimelinedMaker.makeTimelined(tag);
|
||||||
displayEditImagePanel.setTimelined(tim, ((Tag) tag).getSwf(), -1, true, Configuration.autoPlayPreviews.get(), !Configuration.animateSubsprites.get(), false, !Configuration.playFrameSounds.get(), false, true);
|
displayEditImagePanel.setTimelined(tim, ((Tag) tag).getSwf(), -1, true, Configuration.autoPlayPreviews.get(), !Configuration.animateSubsprites.get(), false, !Configuration.playFrameSounds.get(), false, true);
|
||||||
morphDisplayMode = MORPH_ANIMATE;
|
morphDisplayMode = MORPH_ANIMATE;
|
||||||
displayEditShowAnimationButton.setSelected(true);
|
displayEditShowAnimationButton.setSelected(true);
|
||||||
@@ -2502,19 +2502,19 @@ public class PreviewPanel extends JPersistentSplitPane implements TagEditorPanel
|
|||||||
|
|
||||||
private void showAnimationDisplayEditTagButtonActionPerformed(ActionEvent evt) {
|
private void showAnimationDisplayEditTagButtonActionPerformed(ActionEvent evt) {
|
||||||
morphDisplayMode = MORPH_ANIMATE;
|
morphDisplayMode = MORPH_ANIMATE;
|
||||||
Timelined tim = MainPanel.makeTimelined(displayEditTag);
|
Timelined tim = TimelinedMaker.makeTimelined(displayEditTag);
|
||||||
displayEditImagePanel.setTimelined(tim, displayEditTag.getSwf(), -1, true, Configuration.autoPlayPreviews.get(), !Configuration.animateSubsprites.get(), false, !Configuration.playFrameSounds.get(), false, true);
|
displayEditImagePanel.setTimelined(tim, displayEditTag.getSwf(), -1, true, Configuration.autoPlayPreviews.get(), !Configuration.animateSubsprites.get(), false, !Configuration.playFrameSounds.get(), false, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void showStartDisplayEditTagButtonActionPerformed(ActionEvent evt) {
|
private void showStartDisplayEditTagButtonActionPerformed(ActionEvent evt) {
|
||||||
morphDisplayMode = MORPH_START;
|
morphDisplayMode = MORPH_START;
|
||||||
Timelined tim = MainPanel.makeTimelined(displayEditTag);
|
Timelined tim = TimelinedMaker.makeTimelined(displayEditTag);
|
||||||
displayEditImagePanel.setTimelined(tim, displayEditTag.getSwf(), 0, true, Configuration.autoPlayPreviews.get(), !Configuration.animateSubsprites.get(), false, !Configuration.playFrameSounds.get(), false, true);
|
displayEditImagePanel.setTimelined(tim, displayEditTag.getSwf(), 0, true, Configuration.autoPlayPreviews.get(), !Configuration.animateSubsprites.get(), false, !Configuration.playFrameSounds.get(), false, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void showEndDisplayEditTagButtonActionPerformed(ActionEvent evt) {
|
private void showEndDisplayEditTagButtonActionPerformed(ActionEvent evt) {
|
||||||
morphDisplayMode = MORPH_END;
|
morphDisplayMode = MORPH_END;
|
||||||
Timelined tim = MainPanel.makeTimelined(displayEditTag);
|
Timelined tim = TimelinedMaker.makeTimelined(displayEditTag);
|
||||||
displayEditImagePanel.setTimelined(tim, displayEditTag.getSwf(), tim.getFrameCount() - 1, true, Configuration.autoPlayPreviews.get(), !Configuration.animateSubsprites.get(), false, !Configuration.playFrameSounds.get(), false, true);
|
displayEditImagePanel.setTimelined(tim, displayEditTag.getSwf(), tim.getFrameCount() - 1, true, Configuration.autoPlayPreviews.get(), !Configuration.animateSubsprites.get(), false, !Configuration.playFrameSounds.get(), false, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2964,7 +2964,7 @@ public class PreviewPanel extends JPersistentSplitPane implements TagEditorPanel
|
|||||||
int pageCount = getFontPageCount(fontTag);
|
int pageCount = getFontPageCount(fontTag);
|
||||||
fontPageNum = (fontPageNum + pageCount - 1) % pageCount;
|
fontPageNum = (fontPageNum + pageCount - 1) % pageCount;
|
||||||
if (!MainPanel.isAdobeFlashPlayerEnabled() /*|| ft instanceof GFxDefineCompactedFont*/) {
|
if (!MainPanel.isAdobeFlashPlayerEnabled() /*|| ft instanceof GFxDefineCompactedFont*/) {
|
||||||
imagePanel.setTimelined(MainPanel.makeTimelined(fontTag, fontPageNum), fontTag.getSwf(), 0, true, true, true, true, true, false, false);
|
imagePanel.setTimelined(TimelinedMaker.makeTimelined(fontTag, fontPageNum), fontTag.getSwf(), 0, true, true, true, true, true, false, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2973,7 +2973,7 @@ public class PreviewPanel extends JPersistentSplitPane implements TagEditorPanel
|
|||||||
int pageCount = getFontPageCount(fontTag);
|
int pageCount = getFontPageCount(fontTag);
|
||||||
fontPageNum = (fontPageNum + 1) % pageCount;
|
fontPageNum = (fontPageNum + 1) % pageCount;
|
||||||
if (!MainPanel.isAdobeFlashPlayerEnabled() /*|| ft instanceof GFxDefineCompactedFont*/) {
|
if (!MainPanel.isAdobeFlashPlayerEnabled() /*|| ft instanceof GFxDefineCompactedFont*/) {
|
||||||
imagePanel.setTimelined(MainPanel.makeTimelined(fontTag, fontPageNum), fontTag.getSwf(), 0, true, true, true, true, true, false, false);
|
imagePanel.setTimelined(TimelinedMaker.makeTimelined(fontTag, fontPageNum), fontTag.getSwf(), 0, true, true, true, true, true, false, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,363 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2024 JPEXS
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package com.jpexs.decompiler.flash.gui;
|
||||||
|
|
||||||
|
import com.jpexs.decompiler.flash.ReadOnlyTagList;
|
||||||
|
import com.jpexs.decompiler.flash.SWF;
|
||||||
|
import com.jpexs.decompiler.flash.exporters.PreviewExporter;
|
||||||
|
import com.jpexs.decompiler.flash.exporters.commonshape.Matrix;
|
||||||
|
import com.jpexs.decompiler.flash.tags.DefineBitsTag;
|
||||||
|
import com.jpexs.decompiler.flash.tags.DefineShape2Tag;
|
||||||
|
import com.jpexs.decompiler.flash.tags.EndTag;
|
||||||
|
import com.jpexs.decompiler.flash.tags.JPEGTablesTag;
|
||||||
|
import com.jpexs.decompiler.flash.tags.PlaceObjectTag;
|
||||||
|
import com.jpexs.decompiler.flash.tags.ShowFrameTag;
|
||||||
|
import com.jpexs.decompiler.flash.tags.Tag;
|
||||||
|
import com.jpexs.decompiler.flash.tags.base.BoundedTag;
|
||||||
|
import com.jpexs.decompiler.flash.tags.base.CharacterIdTag;
|
||||||
|
import com.jpexs.decompiler.flash.tags.base.CharacterTag;
|
||||||
|
import com.jpexs.decompiler.flash.tags.base.FontTag;
|
||||||
|
import com.jpexs.decompiler.flash.tags.base.ImageTag;
|
||||||
|
import com.jpexs.decompiler.flash.tags.base.MorphShapeTag;
|
||||||
|
import com.jpexs.decompiler.flash.tags.base.SoundTag;
|
||||||
|
import com.jpexs.decompiler.flash.tags.gfx.DefineExternalImage2;
|
||||||
|
import com.jpexs.decompiler.flash.tags.gfx.DefineSubImage;
|
||||||
|
import com.jpexs.decompiler.flash.tags.gfx.enums.IdType;
|
||||||
|
import com.jpexs.decompiler.flash.timeline.DepthState;
|
||||||
|
import com.jpexs.decompiler.flash.timeline.Frame;
|
||||||
|
import com.jpexs.decompiler.flash.timeline.Timeline;
|
||||||
|
import com.jpexs.decompiler.flash.timeline.Timelined;
|
||||||
|
import com.jpexs.decompiler.flash.types.FILLSTYLE;
|
||||||
|
import com.jpexs.decompiler.flash.types.FILLSTYLEARRAY;
|
||||||
|
import com.jpexs.decompiler.flash.types.LINESTYLEARRAY;
|
||||||
|
import com.jpexs.decompiler.flash.types.MATRIX;
|
||||||
|
import com.jpexs.decompiler.flash.types.RECT;
|
||||||
|
import com.jpexs.decompiler.flash.types.SHAPEWITHSTYLE;
|
||||||
|
import com.jpexs.decompiler.flash.types.shaperecords.EndShapeRecord;
|
||||||
|
import com.jpexs.decompiler.flash.types.shaperecords.SHAPERECORD;
|
||||||
|
import com.jpexs.decompiler.flash.types.shaperecords.StraightEdgeRecord;
|
||||||
|
import com.jpexs.decompiler.flash.types.shaperecords.StyleChangeRecord;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.LinkedHashSet;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author JPEXS
|
||||||
|
*/
|
||||||
|
public class TimelinedMaker {
|
||||||
|
|
||||||
|
public static SWF makeTimelinedImage(ImageTag imageTag) {
|
||||||
|
SWF swf = new SWF();
|
||||||
|
swf.gfx = imageTag.getSwf().gfx;
|
||||||
|
swf.version = imageTag.getSwf().version;
|
||||||
|
int w = (int) (imageTag.getImageDimension().getWidth() * SWF.unitDivisor);
|
||||||
|
int h = (int) (imageTag.getImageDimension().getHeight() * SWF.unitDivisor);
|
||||||
|
swf.displayRect = new RECT(0, w, 0, h);
|
||||||
|
swf.frameCount = 1;
|
||||||
|
swf.frameRate = 1;
|
||||||
|
swf.setFile(imageTag.getSwf().getFile()); //DefineSubImage calculates relative paths from it
|
||||||
|
try {
|
||||||
|
|
||||||
|
JPEGTablesTag jpegTablesTag = null;
|
||||||
|
if (imageTag instanceof DefineBitsTag) {
|
||||||
|
jpegTablesTag = imageTag.getSwf().getJtt();
|
||||||
|
}
|
||||||
|
Set<Integer> needed = new LinkedHashSet<>();
|
||||||
|
imageTag.getNeededCharacters(needed, swf);
|
||||||
|
|
||||||
|
List<CharacterTag> neededCopies = new ArrayList<>();
|
||||||
|
for (int n : needed) {
|
||||||
|
CharacterTag ct = imageTag.getSwf().getCharacter(n);
|
||||||
|
if (ct != null) {
|
||||||
|
ct = (CharacterTag) ct.cloneTag();
|
||||||
|
ct.setSwf(swf);
|
||||||
|
neededCopies.add(ct);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (imageTag instanceof DefineSubImage) {
|
||||||
|
DefineExternalImage2 dei2 = (DefineExternalImage2) imageTag.getSwf().getExternalImage2(((DefineSubImage) imageTag).imageId);
|
||||||
|
if (dei2 != null) {
|
||||||
|
dei2 = (DefineExternalImage2) dei2.cloneTag();
|
||||||
|
dei2.setSwf(swf);
|
||||||
|
neededCopies.add(dei2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ImageTag imageTagCopy = (ImageTag) imageTag.cloneTag();
|
||||||
|
imageTagCopy.setSwf(swf);
|
||||||
|
int imageCharId = imageTag.getCharacterId();
|
||||||
|
if ((imageTag instanceof DefineExternalImage2) && (((DefineExternalImage2) imageTag).idType != IdType.IDTYPE_NONE)) {
|
||||||
|
imageCharId = swf.getNextCharacterId();
|
||||||
|
imageTagCopy.characterID = imageCharId;
|
||||||
|
}
|
||||||
|
DefineShape2Tag shapeTag = new DefineShape2Tag(swf);
|
||||||
|
int shapeCharId = imageCharId + 1;
|
||||||
|
shapeTag.shapeId = shapeCharId;
|
||||||
|
shapeTag.shapeBounds = new RECT(swf.displayRect);
|
||||||
|
|
||||||
|
SHAPEWITHSTYLE shapeData = new SHAPEWITHSTYLE();
|
||||||
|
FILLSTYLEARRAY fillStyleArray = new FILLSTYLEARRAY();
|
||||||
|
FILLSTYLE[] fillStyles = new FILLSTYLE[1];
|
||||||
|
FILLSTYLE fillStyle = new FILLSTYLE();
|
||||||
|
fillStyle.bitmapId = imageCharId;
|
||||||
|
fillStyle.inShape3 = false;
|
||||||
|
fillStyle.fillStyleType = FILLSTYLE.CLIPPED_BITMAP;
|
||||||
|
fillStyle.bitmapMatrix = Matrix.getScaleInstance(SWF.unitDivisor).toMATRIX();
|
||||||
|
fillStyles[0] = fillStyle;
|
||||||
|
fillStyleArray.fillStyles = fillStyles;
|
||||||
|
shapeData.fillStyles = fillStyleArray;
|
||||||
|
shapeData.lineStyles = new LINESTYLEARRAY();
|
||||||
|
|
||||||
|
List<SHAPERECORD> shapeRecords = new ArrayList<>();
|
||||||
|
|
||||||
|
StyleChangeRecord scr = new StyleChangeRecord();
|
||||||
|
scr.stateFillStyle0 = true;
|
||||||
|
scr.fillStyle0 = 1;
|
||||||
|
shapeRecords.add(scr);
|
||||||
|
|
||||||
|
StyleChangeRecord scr2 = new StyleChangeRecord();
|
||||||
|
scr2.stateMoveTo = true;
|
||||||
|
scr2.moveDeltaX = 0;
|
||||||
|
scr2.moveDeltaY = 0;
|
||||||
|
scr2.calculateBits();
|
||||||
|
shapeRecords.add(scr2);
|
||||||
|
|
||||||
|
StraightEdgeRecord ser1 = new StraightEdgeRecord();
|
||||||
|
ser1.vertLineFlag = true;
|
||||||
|
ser1.deltaY = h;
|
||||||
|
ser1.calculateBits();
|
||||||
|
shapeRecords.add(ser1);
|
||||||
|
|
||||||
|
StraightEdgeRecord ser2 = new StraightEdgeRecord();
|
||||||
|
ser2.deltaX = w;
|
||||||
|
shapeRecords.add(ser2);
|
||||||
|
|
||||||
|
StraightEdgeRecord ser3 = new StraightEdgeRecord();
|
||||||
|
ser3.vertLineFlag = true;
|
||||||
|
ser3.deltaY = -h;
|
||||||
|
shapeRecords.add(ser3);
|
||||||
|
|
||||||
|
StraightEdgeRecord ser4 = new StraightEdgeRecord();
|
||||||
|
ser4.deltaX = -w;
|
||||||
|
shapeRecords.add(ser4);
|
||||||
|
|
||||||
|
shapeRecords.add(new EndShapeRecord());
|
||||||
|
|
||||||
|
shapeData.shapeRecords = shapeRecords;
|
||||||
|
|
||||||
|
shapeData.numFillBits = 1;
|
||||||
|
shapeData.numLineBits = 0;
|
||||||
|
|
||||||
|
shapeTag.shapes = shapeData;
|
||||||
|
|
||||||
|
PlaceObjectTag placeTag = new PlaceObjectTag(swf, shapeCharId, 1, new Matrix().toMATRIX(), null);
|
||||||
|
|
||||||
|
ShowFrameTag showFrameTag = new ShowFrameTag(swf);
|
||||||
|
|
||||||
|
EndTag endTag = new EndTag(swf);
|
||||||
|
|
||||||
|
if (jpegTablesTag != null) {
|
||||||
|
swf.addTag(jpegTablesTag);
|
||||||
|
}
|
||||||
|
for (CharacterTag neededCopy : neededCopies) {
|
||||||
|
swf.addTag(neededCopy);
|
||||||
|
}
|
||||||
|
swf.addTag(imageTagCopy);
|
||||||
|
swf.addTag(shapeTag);
|
||||||
|
swf.addTag(placeTag);
|
||||||
|
swf.addTag(showFrameTag);
|
||||||
|
swf.addTag(endTag);
|
||||||
|
|
||||||
|
} catch (InterruptedException | IOException ex) {
|
||||||
|
//ignore
|
||||||
|
}
|
||||||
|
return swf;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Timelined makeTimelined(final Tag tag) {
|
||||||
|
if (tag instanceof ImageTag) {
|
||||||
|
return makeTimelinedImage((ImageTag) tag);
|
||||||
|
}
|
||||||
|
return makeTimelined(tag, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Timelined makeTimelined(final Tag tag, final int fontFrameNum) {
|
||||||
|
int chId = ((CharacterIdTag) tag).getCharacterId();
|
||||||
|
if (chId == -1) {
|
||||||
|
chId = 0;
|
||||||
|
}
|
||||||
|
final int fChId = chId;
|
||||||
|
return new Timelined() {
|
||||||
|
private Timeline tim;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Timeline getTimeline() {
|
||||||
|
if (tim == null) {
|
||||||
|
Timeline timeline = new Timeline(tag.getSwf(), this, fChId, getRect());
|
||||||
|
initTimeline(timeline);
|
||||||
|
tim = timeline;
|
||||||
|
}
|
||||||
|
|
||||||
|
return tim;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void resetTimeline() {
|
||||||
|
if (tim != null) {
|
||||||
|
tim.reset(tag.getSwf(), this, ((CharacterTag) tag).getCharacterId(), getRect());
|
||||||
|
initTimeline(tim);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void initTimeline(Timeline timeline) {
|
||||||
|
if (tag instanceof MorphShapeTag) {
|
||||||
|
timeline.frameRate = PreviewExporter.MORPH_SHAPE_ANIMATION_FRAME_RATE;
|
||||||
|
int framesCnt = (int) (timeline.frameRate * PreviewExporter.MORPH_SHAPE_ANIMATION_LENGTH);
|
||||||
|
for (int i = 0; i < framesCnt; i++) {
|
||||||
|
Frame f = new Frame(timeline, i);
|
||||||
|
DepthState ds = new DepthState(tag.getSwf(), f, f);
|
||||||
|
ds.characterId = fChId;
|
||||||
|
ds.matrix = new MATRIX();
|
||||||
|
ds.ratio = i * 65535 / framesCnt;
|
||||||
|
f.layers.put(1, ds);
|
||||||
|
f.layersChanged = true;
|
||||||
|
timeline.addFrame(f);
|
||||||
|
}
|
||||||
|
Frame f = new Frame(timeline, framesCnt);
|
||||||
|
DepthState ds = new DepthState(tag.getSwf(), f, f);
|
||||||
|
ds.characterId = fChId;
|
||||||
|
ds.matrix = new MATRIX();
|
||||||
|
ds.ratio = 65535;
|
||||||
|
f.layers.put(1, ds);
|
||||||
|
f.layersChanged = true;
|
||||||
|
timeline.addFrame(f);
|
||||||
|
} else if (tag instanceof FontTag) {
|
||||||
|
int pageCount = PreviewPanel.getFontPageCount((FontTag) tag);
|
||||||
|
int frame = fontFrameNum;
|
||||||
|
if (frame < 0 || frame >= pageCount) {
|
||||||
|
frame = 0;
|
||||||
|
}
|
||||||
|
//TODO: make this static texts instead of FontTag as drawable.
|
||||||
|
//We do not want to draw fonts directly added to stage as
|
||||||
|
//Fonts are really added to stage in some corner cases like for vertical text.
|
||||||
|
Frame f = new Frame(timeline, 0);
|
||||||
|
DepthState ds = new DepthState(tag.getSwf(), f, f);
|
||||||
|
ds.characterId = fChId;
|
||||||
|
ds.matrix = new MATRIX();
|
||||||
|
f.layers.put(1, ds);
|
||||||
|
f.layersChanged = true;
|
||||||
|
timeline.addFrame(f);
|
||||||
|
timeline.fontFrameNum = frame;
|
||||||
|
} else if (tag instanceof SoundTag) {
|
||||||
|
|
||||||
|
} else {
|
||||||
|
Frame f = new Frame(timeline, 0);
|
||||||
|
DepthState ds = new DepthState(tag.getSwf(), f, f);
|
||||||
|
ds.characterId = fChId;
|
||||||
|
ds.matrix = new MATRIX();
|
||||||
|
f.layers.put(1, ds);
|
||||||
|
timeline.addFrame(f);
|
||||||
|
}
|
||||||
|
timeline.displayRect = getRect();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public RECT getRect() {
|
||||||
|
return getRect(new HashSet<>());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public RECT getRect(Set<BoundedTag> added) {
|
||||||
|
if (!(tag instanceof BoundedTag)) {
|
||||||
|
return new RECT(0,1,0,1);
|
||||||
|
}
|
||||||
|
BoundedTag bt = (BoundedTag) tag;
|
||||||
|
if (!added.contains(bt)) {
|
||||||
|
return bt.getRect(added);
|
||||||
|
}
|
||||||
|
return new RECT(Integer.MAX_VALUE, Integer.MIN_VALUE, Integer.MAX_VALUE, Integer.MIN_VALUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return tag.hashCode();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setModified(boolean value) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ReadOnlyTagList getTags() {
|
||||||
|
return ReadOnlyTagList.EMPTY;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void removeTag(int index) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void removeTag(Tag tag) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addTag(Tag tag) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addTag(int index, Tag tag) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void replaceTag(int index, Tag newTag) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void replaceTag(Tag oldTag, Tag newTag) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int indexOfTag(Tag tag) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public RECT getRectWithStrokes() {
|
||||||
|
return getRect();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setFrameCount(int frameCount) {
|
||||||
|
throw new UnsupportedOperationException("Not supported yet.");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getFrameCount() {
|
||||||
|
return getTimeline().getFrameCount();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SWF getSwf() {
|
||||||
|
return tag.getSwf();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -24,6 +24,7 @@ import com.jpexs.decompiler.flash.gui.FasterScrollPane;
|
|||||||
import com.jpexs.decompiler.flash.gui.Main;
|
import com.jpexs.decompiler.flash.gui.Main;
|
||||||
import com.jpexs.decompiler.flash.gui.MainPanel;
|
import com.jpexs.decompiler.flash.gui.MainPanel;
|
||||||
import com.jpexs.decompiler.flash.gui.PreviewPanel;
|
import com.jpexs.decompiler.flash.gui.PreviewPanel;
|
||||||
|
import com.jpexs.decompiler.flash.gui.TimelinedMaker;
|
||||||
import com.jpexs.decompiler.flash.gui.View;
|
import com.jpexs.decompiler.flash.gui.View;
|
||||||
import com.jpexs.decompiler.flash.tags.DefineButton2Tag;
|
import com.jpexs.decompiler.flash.tags.DefineButton2Tag;
|
||||||
import com.jpexs.decompiler.flash.tags.DefineSpriteTag;
|
import com.jpexs.decompiler.flash.tags.DefineSpriteTag;
|
||||||
@@ -784,7 +785,7 @@ public class AddScriptDialog extends AppDialog {
|
|||||||
private void buttonValueChanged(ListSelectionEvent e) {
|
private void buttonValueChanged(ListSelectionEvent e) {
|
||||||
buttonPreviewPanel.showEmpty();
|
buttonPreviewPanel.showEmpty();
|
||||||
if (buttonList.getSelectedIndex() >= 0) {
|
if (buttonList.getSelectedIndex() >= 0) {
|
||||||
buttonPreviewPanel.showImagePanel(MainPanel.makeTimelined(buttonList.getSelectedValue()), swf, -1, true, Configuration.autoPlayPreviews.get(), !Configuration.animateSubsprites.get(), false, !Configuration.playFrameSounds.get(), true, false, true);
|
buttonPreviewPanel.showImagePanel(TimelinedMaker.makeTimelined(buttonList.getSelectedValue()), swf, -1, true, Configuration.autoPlayPreviews.get(), !Configuration.animateSubsprites.get(), false, !Configuration.playFrameSounds.get(), true, false, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
checkEnabled();
|
checkEnabled();
|
||||||
|
|||||||
Reference in New Issue
Block a user