diff --git a/CHANGELOG.md b/CHANGELOG.md index a0dbbed90..5bd578637 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -65,8 +65,9 @@ All notable changes to this project will be documented in this file. - Outputstreams position calculation (ABCOutputStream, ...) - [#2260] Reading end of file on old GFX format (1.x) - [#2260] DefineExternalImage on old GFX format (1.x) -- fontFace html attribute in DefineEditText can be also an exportName +- Font face html attribute in DefineEditText can be also an exportName - BUTTONRECORD preview not showing in situations like GFX or importAssets +- FreeTransform not showing in situations like GFX or importAssets ### Changed - [#2185] MochiCrypt no longer offered for auto decrypt, user needs to choose variant from "Use unpacker" menu diff --git a/src/com/jpexs/decompiler/flash/gui/MainPanel.java b/src/com/jpexs/decompiler/flash/gui/MainPanel.java index 296e0998d..629db0aa3 100644 --- a/src/com/jpexs/decompiler/flash/gui/MainPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/MainPanel.java @@ -5601,37 +5601,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se } else if ((treeItem instanceof BUTTONRECORD) && (!((BUTTONRECORD) treeItem).getSwf().getCyclicCharacters().contains(((BUTTONRECORD) treeItem).characterId))) { BUTTONRECORD buttonRecord = (BUTTONRECORD) treeItem; previewPanel.setParametersPanelVisible(false); - SWF origSwf = ((SWF)treeItem.getOpenable()); - /*SWF swf = new SWF(buttonRecord.getSwf().getCharset()); - swf.frameCount = 1; - swf.frameRate = buttonRecord.getSwf().frameRate; - swf.displayRect = buttonRecord.getTag().getRect(); - swf.gfx = origSwf.gfx; - swf.setFile(origSwf.getFile()); // For GFX to properly load - if (swf.getBackgroundColor() != null) { - SetBackgroundColorTag setBackgroundColorTag = new SetBackgroundColorTag(swf, swf.getBackgroundColor().backgroundColor); - swf.addTag(setBackgroundColorTag); - setBackgroundColorTag.setTimelined(swf); - }*/ - CharacterTag character = buttonRecord.getSwf().getCharacter(buttonRecord.characterId); - /*Set needed = new LinkedHashSet<>(); - character.getNeededCharactersDeep(needed); - needed.remove(buttonRecord.characterId); - needed.add(buttonRecord.characterId); - - for (int n : needed) { - CharacterTag neededCharacter; - try { - neededCharacter = (CharacterTag) buttonRecord.getSwf().getCharacter(n).cloneTag(); - } catch (InterruptedException | IOException ex) { - Logger.getLogger(MainPanel.class.getName()).log(Level.SEVERE, null, ex); - return; - } - neededCharacter.setSwf(swf); - neededCharacter.setTimelined(swf); - swf.addTag(neededCharacter); - } -*/ + SWF origSwf = ((SWF)treeItem.getOpenable()); Timelined tim = new Timelined() { ReadOnlyTagList cachedTags = null; @@ -5725,15 +5695,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se public RECT getRectWithStrokes() { return getRect(); } - }; - - - - //swf.addTag(placeTag); - //placeTag.setTimelined(origSwf); - //ShowFrameTag showFrameTag = new ShowFrameTag(swf); - //swf.addTag(showFrameTag); - //showFrameTag.setTimelined(swf); + }; previewPanel.showImagePanel(tim, origSwf, 0, true, true, !Configuration.animateSubsprites.get(), false, !Configuration.playFrameSounds.get(), true, false, true); } else if (treeItem instanceof DefineFont4Tag) { previewPanel.showGenericTagPanel((Tag) treeItem); diff --git a/src/com/jpexs/decompiler/flash/gui/PreviewPanel.java b/src/com/jpexs/decompiler/flash/gui/PreviewPanel.java index b6550100c..ac29a058e 100644 --- a/src/com/jpexs/decompiler/flash/gui/PreviewPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/PreviewPanel.java @@ -16,6 +16,7 @@ */ package com.jpexs.decompiler.flash.gui; +import com.jpexs.decompiler.flash.ReadOnlyTagList; import com.jpexs.decompiler.flash.SWF; import com.jpexs.decompiler.flash.SWFHeader; import com.jpexs.decompiler.flash.action.parser.ActionParseException; @@ -43,6 +44,7 @@ import com.jpexs.decompiler.flash.tags.ShowFrameTag; import com.jpexs.decompiler.flash.tags.Tag; import com.jpexs.decompiler.flash.tags.UnknownTag; import com.jpexs.decompiler.flash.tags.base.BinaryDataInterface; +import com.jpexs.decompiler.flash.tags.base.BoundedTag; import com.jpexs.decompiler.flash.tags.base.ButtonTag; import com.jpexs.decompiler.flash.tags.base.CharacterTag; import com.jpexs.decompiler.flash.tags.base.FontTag; @@ -52,6 +54,7 @@ import com.jpexs.decompiler.flash.tags.base.ShapeTag; import com.jpexs.decompiler.flash.tags.base.TextTag; import com.jpexs.decompiler.flash.timeline.Frame; import com.jpexs.decompiler.flash.timeline.TagScript; +import com.jpexs.decompiler.flash.timeline.Timeline; import com.jpexs.decompiler.flash.timeline.Timelined; import com.jpexs.decompiler.flash.treeitems.TreeItem; import com.jpexs.decompiler.flash.types.BUTTONRECORD; @@ -2746,93 +2749,113 @@ public class PreviewPanel extends JPersistentSplitPane implements TagEditorPanel item = ((TagScript) item).getTag(); } - //previewPanel.showImagePanel(fn.timeline.timelined, swf, fn.frame, true, Configuration.autoPlayPreviews.get(), !Configuration.animateSubsprites.get(), false, !Configuration.playFrameSounds.get(), true, false); CharacterTag displayedCharacter = (CharacterTag) item; + + CharacterTag placedCharacter = displayedCharacter; + SWF origSwf = placedCharacter.getSwf(); + RECT rect = origSwf.getRect(); + if (displayedCharacter instanceof BoundedTag) { + rect = ((BoundedTag) displayedCharacter).getRect(); + } + final RECT frect = rect; + Timelined tim = new Timelined() { + ReadOnlyTagList cachedTags = null; - SWF fSwf = new SWF(displayedCharacter.getSwf().getCharset()); - fSwf.frameCount = 1; - fSwf.frameRate = displayedCharacter.getSwf().frameRate; - fSwf.displayRect = displayedCharacter.getSwf().getRect(); - CharacterTag character = displayedCharacter; - Set needed = new LinkedHashSet<>(); - CharacterTag placedCharacter = displayedCharacter; - if (displayedCharacter instanceof ButtonTag) { - ButtonTag buttonTag = (ButtonTag) displayedCharacter; - List records = buttonTag.getRecords(); - for (BUTTONRECORD rec : records) { - if (rec.buttonStateUp) { - displayedCharacter.getSwf().getCharacter(rec.characterId).getNeededCharactersDeep(needed); - needed.add(rec.characterId); + @Override + public SWF getSwf() { + return origSwf; + } + + @Override + public Timeline getTimeline() { + return new Timeline(origSwf, this, Integer.MAX_VALUE, frect); + } + + @Override + public void resetTimeline() { + + } + + @Override + public void setModified(boolean value) { + + } + + @Override + public ReadOnlyTagList getTags() { + if (cachedTags == null) { + List tags = new ArrayList<>(); + PlaceObject3Tag placeTag = new PlaceObject3Tag(origSwf); + placeTag.depth = 1; + placeTag.characterId = placedCharacter.getCharacterId(); + placeTag.placeFlagHasCharacter = true; + + placeTag.matrix = new MATRIX(); + placeTag.setTimelined(this); + tags.add(placeTag); + ShowFrameTag showFrameTag = new ShowFrameTag(origSwf); + showFrameTag.setTimelined(this); + tags.add(showFrameTag); + cachedTags = new ReadOnlyTagList(tags); } + return cachedTags; } - } else { - displayedCharacter.getNeededCharactersDeep(needed); - needed.remove(displayedCharacter.getCharacterId()); - needed.add(displayedCharacter.getCharacterId()); - } - for (int n : needed) { - CharacterTag neededCharacter; - try { - neededCharacter = (CharacterTag) displayedCharacter.getSwf().getCharacter(n).cloneTag(); - } catch (InterruptedException | IOException ex) { - Logger.getLogger(MainPanel.class.getName()).log(Level.SEVERE, null, ex); - return; + @Override + public void removeTag(int index) { } - neededCharacter.setSwf(fSwf); - neededCharacter.setTimelined(fSwf); - fSwf.addTag(neededCharacter); - } - if (displayedCharacter instanceof ButtonTag) { - DefineSpriteTag sprite = new DefineSpriteTag(fSwf); - sprite.frameCount = 1; - ButtonTag buttonTag = (ButtonTag) displayedCharacter; - List records = buttonTag.getRecords(); - for (BUTTONRECORD rec : records) { - if (rec.buttonStateUp) { - PlaceObject3Tag p = rec.toPlaceObject(); - p.setSwf(fSwf); - sprite.addTag(p); - p.setTimelined(sprite); - } + @Override + public void removeTag(Tag tag) { } - ShowFrameTag showFrameTag = new ShowFrameTag(fSwf); - sprite.addTag(showFrameTag); - showFrameTag.setTimelined(sprite); - fSwf.addTag(sprite); - sprite.setTimelined(fSwf); - placedCharacter = sprite; - } + @Override + public void addTag(Tag tag) { + } - DefineSpriteTag sprite2 = new DefineSpriteTag(fSwf); - sprite2.frameCount = 1; - PlaceObject3Tag placeTag = new PlaceObject3Tag(fSwf); - placeTag.depth = 1; - placeTag.characterId = placedCharacter.getCharacterId(); - placeTag.placeFlagHasCharacter = true; + @Override + public void addTag(int index, Tag tag) { + } - placeTag.matrix = new MATRIX(); - placeTag.setTimelined(sprite2); - sprite2.addTag(placeTag); - ShowFrameTag showFrameTag = new ShowFrameTag(fSwf); - sprite2.addTag(showFrameTag); - showFrameTag.setTimelined(sprite2); + @Override + public void replaceTag(int index, Tag newTag) { + } - PlaceObject3Tag placeTag2 = new PlaceObject3Tag(fSwf); - placeTag2.depth = 1; - placeTag2.characterId = sprite2.getCharacterId(); - placeTag2.placeFlagHasCharacter = true; + @Override + public void replaceTag(Tag oldTag, Tag newTag) { + } - placeTag2.matrix = new MATRIX(); - fSwf.addTag(placeTag2); - placeTag2.setTimelined(fSwf); - showFrameTag = new ShowFrameTag(fSwf); - fSwf.addTag(showFrameTag); - showFrameTag.setTimelined(fSwf); + @Override + public int indexOfTag(Tag tag) { + return getTags().indexOf(tag); + } - imagePanel.setTimelined(sprite2, fSwf, 0, true, true, true, true, true, false, true); + @Override + public void setFrameCount(int frameCount) { + } + + @Override + public int getFrameCount() { + return 1; + } + + @Override + public RECT getRect() { + return frect; + } + + @Override + public RECT getRect(Set added) { + return getRect(); + } + + @Override + public RECT getRectWithStrokes() { + return getRect(); + } + }; + + imagePanel.setTimelined(tim, origSwf, 0, true, true, true, true, true, false, true); imagePanel.selectDepth(-1); replaceSpriteButton.setVisible(false); @@ -2852,7 +2875,7 @@ public class PreviewPanel extends JPersistentSplitPane implements TagEditorPanel t.schedule(new TimerTask() { @Override public void run() { - imagePanel.freeTransformDepth(placeTag2.getDepth()); + imagePanel.freeTransformDepth(1); imageTransformPanel.load(); } }, 40); //add some delay before controls are hidden