diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java index 58ba8a284..47d847c1e 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java @@ -642,7 +642,7 @@ public final class SWF implements SWFContainerItem, Timelined { } private String getHeaderBytes(SWFCompression compression, boolean gfx) { - if (compression == SWFCompression.LZMA_ABC) { + if (compression == SWFCompression.LZMA_ABC || true) { return "ABC"; } diff --git a/src/com/jpexs/decompiler/flash/gui/HeaderInfoPanel.java b/src/com/jpexs/decompiler/flash/gui/HeaderInfoPanel.java index ac487f885..31604e00c 100644 --- a/src/com/jpexs/decompiler/flash/gui/HeaderInfoPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/HeaderInfoPanel.java @@ -17,19 +17,23 @@ package com.jpexs.decompiler.flash.gui; import com.jpexs.decompiler.flash.SWF; +import com.jpexs.decompiler.flash.SWFCompression; import com.jpexs.decompiler.flash.gui.helpers.TableLayoutHelper; import java.awt.BorderLayout; +import java.awt.Color; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import javax.swing.JButton; import javax.swing.JCheckBox; +import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JSpinner; import javax.swing.SpinnerNumberModel; import javax.swing.SwingConstants; import javax.swing.border.BevelBorder; +import javax.swing.event.ChangeEvent; import layout.TableLayout; /** @@ -56,6 +60,10 @@ public class HeaderInfoPanel extends JPanel implements TagEditorPanel { private final JLabel displayRectPixelsLabel = new JLabel(); + private final JPanel compressionEditorPanel = new JPanel(); + + private final JComboBox> compressionComboBox = new JComboBox<>(); + private final JPanel versionEditorPanel = new JPanel(); private final JSpinner versionEditor = new JSpinner(); @@ -86,6 +94,10 @@ public class HeaderInfoPanel extends JPanel implements TagEditorPanel { private final JSpinner yMaxEditor = new JSpinner(); + private final JPanel warningPanel = new JPanel(); + + private final JLabel warningLabel = new JLabel(); + private SWF swf; public HeaderInfoPanel() { @@ -96,17 +108,34 @@ public class HeaderInfoPanel extends JPanel implements TagEditorPanel { {TableLayout.PREFERRED, TableLayout.FILL}, {TableLayout.PREFERRED, TableLayout.PREFERRED, TableLayout.PREFERRED, TableLayout.PREFERRED, TableLayout.PREFERRED, TableLayout.PREFERRED, - TableLayout.PREFERRED, TableLayout.PREFERRED, TableLayout.PREFERRED} + TableLayout.PREFERRED, TableLayout.PREFERRED, TableLayout.PREFERRED, + TableLayout.PREFERRED} })); FlowLayout layout = new FlowLayout(SwingConstants.WEST); layout.setHgap(0); layout.setVgap(0); + compressionEditorPanel.setLayout(layout); + compressionComboBox.addItem(new ComboBoxItem<>(AppStrings.translate("header.uncompressed"), SWFCompression.NONE)); + compressionComboBox.addItem(new ComboBoxItem<>("Zlib", SWFCompression.ZLIB)); + compressionComboBox.addItem(new ComboBoxItem<>("LZMA", SWFCompression.LZMA)); + compressionComboBox.addActionListener((ActionEvent e) -> { + validateHeader(); + }); + compressionEditorPanel.add(compressionComboBox); + versionEditorPanel.setLayout(layout); versionEditor.setPreferredSize(new Dimension(80, versionEditor.getPreferredSize().height)); + versionEditor.addChangeListener((ChangeEvent e) -> { + validateHeader(); + }); versionEditorPanel.add(versionEditor); + gfxCheckBox.addActionListener((ActionEvent e) -> { + validateHeader(); + }); + frameRateEditorPanel.setLayout(layout); frameRateEditor.setPreferredSize(new Dimension(80, frameRateEditor.getPreferredSize().height)); frameRateEditorPanel.add(frameRateEditor); @@ -126,10 +155,16 @@ public class HeaderInfoPanel extends JPanel implements TagEditorPanel { displayRectEditorPanel.add(yMaxEditor); displayRectEditorPanel.add(new JLabel(" twips")); + warningLabel.setIcon(View.getIcon("warning16")); + warningPanel.setLayout(layout); + warningPanel.setBackground(new Color(255, 213, 29)); + warningPanel.add(warningLabel); + propertiesPanel.add(new JLabel(AppStrings.translate("header.signature")), "0,0"); propertiesPanel.add(signatureLabel, "1,0"); propertiesPanel.add(new JLabel(AppStrings.translate("header.compression")), "0,1"); propertiesPanel.add(compressionLabel, "1,1"); + propertiesPanel.add(compressionEditorPanel, "1,1"); propertiesPanel.add(new JLabel(AppStrings.translate("header.version")), "0,2"); propertiesPanel.add(versionLabel, "1,2"); propertiesPanel.add(versionEditorPanel, "1,2"); @@ -148,6 +183,7 @@ public class HeaderInfoPanel extends JPanel implements TagEditorPanel { propertiesPanel.add(displayRectEditorPanel, "1,7"); propertiesPanel.add(new JLabel(""), "0,8"); propertiesPanel.add(displayRectPixelsLabel, "1,8"); + propertiesPanel.add(warningPanel, "0,9,1,9"); add(propertiesPanel, BorderLayout.CENTER); @@ -171,12 +207,23 @@ public class HeaderInfoPanel extends JPanel implements TagEditorPanel { setEditMode(false); } + private int getVersionNumber() { + return (int) versionEditor.getModel().getValue(); + } + + private SWFCompression getCompression() { + @SuppressWarnings("unchecked") + ComboBoxItem item = (ComboBoxItem) compressionComboBox.getSelectedItem(); + return item.getValue(); + } + private void editButtonActionPerformed(ActionEvent evt) { setEditMode(true); } private void saveButtonActionPerformed(ActionEvent evt) { - swf.version = (int) versionEditor.getModel().getValue(); + swf.compression = getCompression(); + swf.version = getVersionNumber(); swf.gfx = gfxCheckBox.isSelected(); swf.frameRate = (int) frameRateEditor.getModel().getValue(); swf.displayRect.Xmin = (int) xMinEditor.getModel().getValue(); @@ -199,12 +246,15 @@ public class HeaderInfoPanel extends JPanel implements TagEditorPanel { switch (swf.compression) { case LZMA: compressionLabel.setText(AppStrings.translate("header.compression.lzma")); + compressionComboBox.setSelectedIndex(2); break; case ZLIB: compressionLabel.setText(AppStrings.translate("header.compression.zlib")); + compressionComboBox.setSelectedIndex(1); break; case NONE: compressionLabel.setText(AppStrings.translate("header.compression.none")); + compressionComboBox.setSelectedIndex(0); break; } @@ -253,22 +303,55 @@ public class HeaderInfoPanel extends JPanel implements TagEditorPanel { } private void setEditMode(boolean edit) { + compressionLabel.setVisible(!edit); + compressionEditorPanel.setVisible(edit); versionLabel.setVisible(!edit); - versionEditor.setVisible(edit); + versionEditorPanel.setVisible(edit); gfxLabel.setVisible(!edit); gfxCheckBox.setVisible(edit); frameRateLabel.setVisible(!edit); - frameRateEditor.setVisible(edit); + frameRateEditorPanel.setVisible(edit); displayRectTwipsLabel.setVisible(!edit); displayRectPixelsLabel.setVisible(!edit); displayRectEditorPanel.setVisible(edit); + warningPanel.setVisible(false); + editButton.setVisible(!edit); saveButton.setVisible(edit); cancelButton.setVisible(edit); } + private boolean validateHeader() { + int version = getVersionNumber(); + boolean gfx = gfxCheckBox.isSelected(); + SWFCompression compression = getCompression(); + String resultStr = ""; + boolean result = true; + if (gfx && !(compression == SWFCompression.NONE || compression == SWFCompression.ZLIB)) { + resultStr += AppStrings.translate("header.warning.unsupportedGfxCompression") + " "; + result = false; + } + + if (compression == SWFCompression.ZLIB && version < 6) { + resultStr += AppStrings.translate("header.warning.minimumZlibVersion") + " "; + result = false; + } + + if (compression == SWFCompression.LZMA && version < 13) { + resultStr += AppStrings.translate("header.warning.minimumLzmaVersion") + " "; + result = false; + } + + warningPanel.setVisible(!result); + if (!result) { + warningLabel.setText(resultStr); + } + + return result; + } + @Override public boolean tryAutoSave() { // todo: implement diff --git a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties index 4cc2c2faa..a01ce3e73 100644 --- a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties +++ b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties @@ -607,3 +607,7 @@ taginfo.header = Basic tag info tagInfo.dependentCharacters = Dependent Characters #after version 5.3.0 +header.uncompressed = Uncompressed +header.warning.unsupportedGfxCompression = GFX supports only uncompressed or Zlib compressed content. +header.warning.minimumZlibVersion = Zlib compression needs SWF version 6 or greater. +header.warning.minimumLzmaVersion = LZMA compression needs SWF version 13 or greater. diff --git a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_hu.properties b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_hu.properties index 58f7d5e59..843a4e5d3 100644 --- a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_hu.properties +++ b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_hu.properties @@ -604,3 +604,9 @@ button.viewhexpcode = Hexa mutat\u00e1sa utas\u00edt\u00e1sokkal taginfo.header = Alap tag info tagInfo.dependentCharacters = F\u00fcgg\u0151 karakterek + +#after version 5.3.0 +header.uncompressed = T\u00f6m\u00f6r\u00edtetlen +header.warning.unsupportedGfxCompression = GFX csak t\u00f6m\u00f6r\u00edtetlen \u00e9s Zlib t\u00f6m\u00f6r\u00edtett tartalmakat t\u00e1mogat. +header.warning.minimumZlibVersion = Zlib t\u00f6m\u00f6r\u00edt\u00e9shez 6-os vagy nagyobb SWF verzi\u00f3ra van sz\u00fcks\u00e9g. +header.warning.minimumLzmaVersion = LZMA t\u00f6m\u00f6r\u00edt\u00e9shez 13-as vagy nagyobb SWF verzi\u00f3ra van sz\u00fcks\u00e9g.