From 9983c682ef096bb1f24bc16016ea88ab559ab75f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sun, 24 Aug 2025 18:55:19 +0200 Subject: [PATCH] Added: Basic support for PlaceImagePrivate tag Changed: CSMTextSettings tag renamed to CSMSettings --- CHANGELOG.md | 2 + .../decompiler/flash/SWFInputStream.java | 11 ++- .../flash/importers/SwfXmlImporter.java | 5 ++ ...xtSettingsTag.java => CSMSettingsTag.java} | 8 +- .../flash/tags/PlaceImagePrivateTag.java | 73 ++++++++++++++++++ .../decompiler/flash/tags/ShowFrameTag.java | 1 + .../com/jpexs/decompiler/flash/tags/Tag.java | 3 +- .../decompiler/flash/xfl/XFLConverter.java | 8 +- .../decompiler/flash/gui/TreeNodeType.java | 5 +- .../flash/gui/dumpview/DumpTree.java | 12 ++- ...smtextsettings16.png => csmsettings16.png} | Bin ...smtextsettings32.png => csmsettings32.png} | Bin .../gui/graphics/placeimageprivate16.png | Bin 0 -> 4915 bytes .../gui/graphics/placeimageprivate32.png | Bin 0 -> 5847 bytes .../flash/gui/tagtree/AbstractTagTree.java | 21 +++-- .../flash/gui/tagtree/TagIdClassMap.java | 6 +- .../decompiler/flash/gui/tagtree/TagTree.java | 3 +- .../flash/gui/tagtree/TagTreeContextMenu.java | 2 + 18 files changed, 131 insertions(+), 29 deletions(-) rename libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/{CSMTextSettingsTag.java => CSMSettingsTag.java} (93%) create mode 100644 libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/PlaceImagePrivateTag.java rename src/com/jpexs/decompiler/flash/gui/graphics/{csmtextsettings16.png => csmsettings16.png} (100%) rename src/com/jpexs/decompiler/flash/gui/graphics/{csmtextsettings32.png => csmsettings32.png} (100%) create mode 100644 src/com/jpexs/decompiler/flash/gui/graphics/placeimageprivate16.png create mode 100644 src/com/jpexs/decompiler/flash/gui/graphics/placeimageprivate32.png diff --git a/CHANGELOG.md b/CHANGELOG.md index b08832883..d2ca826be 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,7 @@ All notable changes to this project will be documented in this file. - AS1/2 Debugging - _global variable accessible - AS Debugging - Variables with flag DontEnumerate are hidden by default (can be changed in Advanced Settings) +- Basic support for PlaceImagePrivate tag ### Fixed - [#2474] Gotos incorrectly decompiled @@ -96,6 +97,7 @@ All notable changes to this project will be documented in this file. - SWF3 actions split into SWF1, SWF2 and SWF3 actions (in FFDec source code, docs, etc.) - Serial form of AS3 search results changed so the decompiler is unable to read saved AS3 search result from older versions and vice-versa +- CSMTextSettings tag renamed to CSMSettings ### Removed - Resample wav to 44kHz feature from GUI 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 3a9b0248c..b7079e44b 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWFInputStream.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWFInputStream.java @@ -127,7 +127,7 @@ import com.jpexs.decompiler.flash.configuration.Configuration; import com.jpexs.decompiler.flash.dumpview.DumpInfo; import com.jpexs.decompiler.flash.dumpview.DumpInfoSpecial; import com.jpexs.decompiler.flash.dumpview.DumpInfoSpecialType; -import com.jpexs.decompiler.flash.tags.CSMTextSettingsTag; +import com.jpexs.decompiler.flash.tags.CSMSettingsTag; import com.jpexs.decompiler.flash.tags.DebugIDTag; import com.jpexs.decompiler.flash.tags.DefineBinaryDataTag; import com.jpexs.decompiler.flash.tags.DefineBitsJPEG2Tag; @@ -181,6 +181,7 @@ import com.jpexs.decompiler.flash.tags.JPEGTablesTag; import com.jpexs.decompiler.flash.tags.MetadataTag; import com.jpexs.decompiler.flash.tags.NameCharacterTag; import com.jpexs.decompiler.flash.tags.PathsArePostScriptTag; +import com.jpexs.decompiler.flash.tags.PlaceImagePrivateTag; import com.jpexs.decompiler.flash.tags.PlaceObject2Tag; import com.jpexs.decompiler.flash.tags.PlaceObject3Tag; import com.jpexs.decompiler.flash.tags.PlaceObject4Tag; @@ -1632,7 +1633,7 @@ public class SWFInputStream implements AutoCloseable { case 37: ret = new DefineEditTextTag(sis, data); break; - //case 38: DefineMouseTarget + //case 38: DefineVideo / DefineMouseTarget case 39: ret = new DefineSpriteTag(sis, level, data, parallel, skipUnusualTags); break; @@ -1715,7 +1716,7 @@ public class SWFInputStream implements AutoCloseable { ret = new DefineFontAlignZonesTag(sis, data); break; case 74: - ret = new CSMTextSettingsTag(sis, data); + ret = new CSMSettingsTag(sis, data); break; case 75: ret = new DefineFont3Tag(sis, data); @@ -1740,7 +1741,9 @@ public class SWFInputStream implements AutoCloseable { case 84: ret = new DefineMorphShape2Tag(sis, data); break; - //case 85: PlaceImagePrivate + case 85: + ret = new PlaceImagePrivateTag(sis, data); + break; case 86: ret = new DefineSceneAndFrameLabelDataTag(sis, data); break; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/importers/SwfXmlImporter.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/importers/SwfXmlImporter.java index e2979ce05..d90688ee2 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/importers/SwfXmlImporter.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/importers/SwfXmlImporter.java @@ -37,6 +37,7 @@ import com.jpexs.decompiler.flash.abc.types.traits.TraitMethodGetterSetter; import com.jpexs.decompiler.flash.abc.types.traits.TraitSlotConst; import com.jpexs.decompiler.flash.abc.types.traits.Traits; import com.jpexs.decompiler.flash.amf.amf3.Amf3Value; +import com.jpexs.decompiler.flash.tags.CSMSettingsTag; import com.jpexs.decompiler.flash.tags.DefineSpriteTag; import com.jpexs.decompiler.flash.tags.Tag; import com.jpexs.decompiler.flash.tags.TagTypeInfo; @@ -486,6 +487,10 @@ public class SwfXmlImporter { if ("UnknownTag".equals(type)) { return new UnknownTag(swf, tagTypeId); } + + if ("CSMTextSettings".equals(type)) { + type = CSMSettingsTag.NAME; + } Class cls = swfTags.get(type); if (cls != null) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/CSMTextSettingsTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/CSMSettingsTag.java similarity index 93% rename from libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/CSMTextSettingsTag.java rename to libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/CSMSettingsTag.java index 7611d1c29..edca78269 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/CSMTextSettingsTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/CSMSettingsTag.java @@ -35,11 +35,11 @@ import java.util.Set; * @author JPEXS */ @SWFVersion(from = 8) -public class CSMTextSettingsTag extends Tag implements CharacterIdTag { +public class CSMSettingsTag extends Tag implements CharacterIdTag { public static final int ID = 74; - public static final String NAME = "CSMTextSettings"; + public static final String NAME = "CSMSettings"; @SWFType(BasicType.UI16) public int textID; @@ -69,7 +69,7 @@ public class CSMTextSettingsTag extends Tag implements CharacterIdTag { * * @param swf SWF */ - public CSMTextSettingsTag(SWF swf) { + public CSMSettingsTag(SWF swf) { super(swf, ID, NAME, null); } @@ -80,7 +80,7 @@ public class CSMTextSettingsTag extends Tag implements CharacterIdTag { * @param data Data * @throws IOException On I/O error */ - public CSMTextSettingsTag(SWFInputStream sis, ByteArrayRange data) throws IOException { + public CSMSettingsTag(SWFInputStream sis, ByteArrayRange data) throws IOException { super(sis.getSwf(), ID, NAME, data); readData(sis, data, 0, false, false, false); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/PlaceImagePrivateTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/PlaceImagePrivateTag.java new file mode 100644 index 000000000..0c0b9b2a1 --- /dev/null +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/PlaceImagePrivateTag.java @@ -0,0 +1,73 @@ +/* + * Copyright (C) 2010-2025 JPEXS, All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3.0 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. + */ +package com.jpexs.decompiler.flash.tags; + +import com.jpexs.decompiler.flash.SWF; +import com.jpexs.decompiler.flash.SWFInputStream; +import com.jpexs.decompiler.flash.SWFOutputStream; +import com.jpexs.decompiler.flash.types.BasicType; +import com.jpexs.decompiler.flash.types.RECT; +import com.jpexs.decompiler.flash.types.annotations.SWFType; +import com.jpexs.decompiler.flash.types.annotations.SWFVersion; +import com.jpexs.helpers.ByteArrayRange; +import java.io.IOException; + +/** + * + * @author JPEXS + */ +@SWFVersion(from = 9) +public class PlaceImagePrivateTag extends Tag { + public static final int ID = 85; + + public static final String NAME = "PlaceImagePrivate"; + + @SWFType(BasicType.UI16) + public int imageId = 0; + + @SWFType(BasicType.UI16) + public int depth = 0; + + public RECT bounds = new RECT(); + + public PlaceImagePrivateTag(SWF swf) { + super(swf, ID, NAME, null); + } + + public PlaceImagePrivateTag(SWFInputStream sis, ByteArrayRange data) throws IOException { + super(sis.getSwf(), ID, NAME, data); + readData(sis, data, 0, false, false, false); + } + + @Override + public void readData(SWFInputStream sis, ByteArrayRange data, int level, boolean parallel, boolean skipUnusualTags, boolean lazy) throws IOException { + imageId = sis.readUI16("imageId"); + if (sis.available() > 0) { + depth = sis.readUI16("depth"); + } + if (sis.available() > 0) { + bounds = sis.readRECT("bounds"); + } + } + + @Override + public void getData(SWFOutputStream sos) throws IOException { + sos.writeUI16(imageId); + sos.writeUI16(depth); + sos.writeRECT(bounds); + } +} diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/ShowFrameTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/ShowFrameTag.java index b33472220..92346e15f 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/ShowFrameTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/ShowFrameTag.java @@ -43,6 +43,7 @@ public class ShowFrameTag extends Tag { add(PlaceObject2Tag.ID); add(PlaceObject3Tag.ID); add(PlaceObject4Tag.ID); + add(PlaceImagePrivateTag.ID); add(RemoveObjectTag.ID); add(RemoveObject2Tag.ID); add(FrameLabelTag.ID); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/Tag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/Tag.java index 82972fc80..036602dde 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/Tag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/Tag.java @@ -325,7 +325,7 @@ public abstract class Tag implements NeedsCharacters, Exportable, Serializable { if (knownTagInfosById == null) { Map map = new HashMap<>(); Map map2 = new HashMap<>(); - addTagInfo(map, map2, CSMTextSettingsTag.ID, CSMTextSettingsTag.class, CSMTextSettingsTag.NAME); + addTagInfo(map, map2, CSMSettingsTag.ID, CSMSettingsTag.class, CSMSettingsTag.NAME); addTagInfo(map, map2, DebugIDTag.ID, DebugIDTag.class, DebugIDTag.NAME); addTagInfo(map, map2, DefineBinaryDataTag.ID, DefineBinaryDataTag.class, DefineBinaryDataTag.NAME); addTagInfo(map, map2, DefineBitsJPEG2Tag.ID, DefineBitsJPEG2Tag.class, DefineBitsJPEG2Tag.NAME); @@ -379,6 +379,7 @@ public abstract class Tag implements NeedsCharacters, Exportable, Serializable { addTagInfo(map, map2, PlaceObject3Tag.ID, PlaceObject3Tag.class, PlaceObject3Tag.NAME); addTagInfo(map, map2, PlaceObject4Tag.ID, PlaceObject4Tag.class, PlaceObject4Tag.NAME); addTagInfo(map, map2, PlaceObjectTag.ID, PlaceObjectTag.class, PlaceObjectTag.NAME); + addTagInfo(map, map2, PlaceImagePrivateTag.ID, PlaceImagePrivateTag.class, PlaceImagePrivateTag.NAME); addTagInfo(map, map2, ProductInfoTag.ID, ProductInfoTag.class, ProductInfoTag.NAME); addTagInfo(map, map2, ProtectTag.ID, ProtectTag.class, ProtectTag.NAME); addTagInfo(map, map2, RemoveObject2Tag.ID, RemoveObject2Tag.class, RemoveObject2Tag.NAME); 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 9efb6b0a6..ab4ca38d1 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 @@ -67,7 +67,7 @@ import com.jpexs.decompiler.flash.helpers.HighlightedTextWriter; import com.jpexs.decompiler.flash.helpers.NulWriter; import com.jpexs.decompiler.flash.helpers.StringBuilderTextWriter; import com.jpexs.decompiler.flash.tags.ABCContainerTag; -import com.jpexs.decompiler.flash.tags.CSMTextSettingsTag; +import com.jpexs.decompiler.flash.tags.CSMSettingsTag; import com.jpexs.decompiler.flash.tags.DefineButton2Tag; import com.jpexs.decompiler.flash.tags.DefineButtonCxformTag; import com.jpexs.decompiler.flash.tags.DefineButtonSoundTag; @@ -4966,7 +4966,7 @@ public class XFLConverter { private static void convertText(int frame, AccessibilityBag accessibility, String instanceName, TextTag tag, MATRIX m, List filters, XFLXmlWriter writer, Map characterImportLinkageURL, Reference lastImportedId, Map characterNameMap, Set characters) throws XMLStreamException { MATRIX matrix = new MATRIX(m); - CSMTextSettingsTag csmts = null; + CSMSettingsTag csmts = null; XFLXmlWriter filterStr = new XFLXmlWriter(); if (filters != null) { filterStr.writeStartElement("filters"); @@ -4978,8 +4978,8 @@ public class XFLConverter { SWF swf = tag.getSwf(); for (Tag t : swf.getTags()) { - if (t instanceof CSMTextSettingsTag) { - CSMTextSettingsTag c = (CSMTextSettingsTag) t; + if (t instanceof CSMSettingsTag) { + CSMSettingsTag c = (CSMSettingsTag) t; if (c.textID == tag.getCharacterId()) { csmts = c; break; diff --git a/src/com/jpexs/decompiler/flash/gui/TreeNodeType.java b/src/com/jpexs/decompiler/flash/gui/TreeNodeType.java index 070024415..99bd166f6 100644 --- a/src/com/jpexs/decompiler/flash/gui/TreeNodeType.java +++ b/src/com/jpexs/decompiler/flash/gui/TreeNodeType.java @@ -28,7 +28,7 @@ public enum TreeNodeType { FONT_INFO, FONT_NAME, TEXT, - CSM_TEXT_SETTINGS, + CSM_SETTINGS, IMAGE, SHAPE, MORPH_SHAPE, @@ -88,5 +88,6 @@ public enum TreeNodeType { SET_TABINDEX, SYMBOL_CLASS, SCENE_AND_FRAME_LABEL_DATA, - DEBUG_ID + DEBUG_ID, + PLACE_IMAGE_PRIVATE } diff --git a/src/com/jpexs/decompiler/flash/gui/dumpview/DumpTree.java b/src/com/jpexs/decompiler/flash/gui/dumpview/DumpTree.java index 0627f46df..31eba14a1 100644 --- a/src/com/jpexs/decompiler/flash/gui/dumpview/DumpTree.java +++ b/src/com/jpexs/decompiler/flash/gui/dumpview/DumpTree.java @@ -33,7 +33,7 @@ import com.jpexs.decompiler.flash.gui.MainPanel; import com.jpexs.decompiler.flash.gui.TreeNodeType; import com.jpexs.decompiler.flash.gui.View; import com.jpexs.decompiler.flash.gui.tagtree.TagTree; -import com.jpexs.decompiler.flash.tags.CSMTextSettingsTag; +import com.jpexs.decompiler.flash.tags.CSMSettingsTag; import com.jpexs.decompiler.flash.tags.DebugIDTag; import com.jpexs.decompiler.flash.tags.DefineBinaryDataTag; import com.jpexs.decompiler.flash.tags.DefineBitsJPEG2Tag; @@ -81,6 +81,7 @@ import com.jpexs.decompiler.flash.tags.ImportAssets2Tag; import com.jpexs.decompiler.flash.tags.ImportAssetsTag; import com.jpexs.decompiler.flash.tags.JPEGTablesTag; import com.jpexs.decompiler.flash.tags.MetadataTag; +import com.jpexs.decompiler.flash.tags.PlaceImagePrivateTag; import com.jpexs.decompiler.flash.tags.PlaceObject2Tag; import com.jpexs.decompiler.flash.tags.PlaceObject3Tag; import com.jpexs.decompiler.flash.tags.PlaceObject4Tag; @@ -255,6 +256,9 @@ public class DumpTree extends JTree { case PlaceObject4Tag.NAME: nodeType = TreeNodeType.PLACE_OBJECT; break; + case PlaceImagePrivateTag.NAME: + nodeType = TreeNodeType.PLACE_IMAGE_PRIVATE; + break; case RemoveObjectTag.NAME: case RemoveObject2Tag.NAME: nodeType = TreeNodeType.REMOVE_OBJECT; @@ -269,8 +273,8 @@ public class DumpTree extends JTree { case DefineFontNameTag.NAME: nodeType = TreeNodeType.FONT_NAME; break; - case CSMTextSettingsTag.NAME: - nodeType = TreeNodeType.CSM_TEXT_SETTINGS; + case CSMSettingsTag.NAME: + nodeType = TreeNodeType.CSM_SETTINGS; break; case DefineButtonCxformTag.NAME: nodeType = TreeNodeType.BUTTON_CXFORM; @@ -323,7 +327,7 @@ public class DumpTree extends JTree { break; case DebugIDTag.NAME: nodeType = TreeNodeType.DEBUG_ID; - break; + break; default: nodeType = TreeNodeType.OTHER_TAG; } diff --git a/src/com/jpexs/decompiler/flash/gui/graphics/csmtextsettings16.png b/src/com/jpexs/decompiler/flash/gui/graphics/csmsettings16.png similarity index 100% rename from src/com/jpexs/decompiler/flash/gui/graphics/csmtextsettings16.png rename to src/com/jpexs/decompiler/flash/gui/graphics/csmsettings16.png diff --git a/src/com/jpexs/decompiler/flash/gui/graphics/csmtextsettings32.png b/src/com/jpexs/decompiler/flash/gui/graphics/csmsettings32.png similarity index 100% rename from src/com/jpexs/decompiler/flash/gui/graphics/csmtextsettings32.png rename to src/com/jpexs/decompiler/flash/gui/graphics/csmsettings32.png diff --git a/src/com/jpexs/decompiler/flash/gui/graphics/placeimageprivate16.png b/src/com/jpexs/decompiler/flash/gui/graphics/placeimageprivate16.png new file mode 100644 index 0000000000000000000000000000000000000000..37d5a66b7aed652b525c80e2bc06e5056b69baf4 GIT binary patch literal 4915 zcmeHKc~BE+7H@9E8&T8|X@UogB?XEl&kR_5qbfr4^Bwo;%BzQS(SCD6q3e&{EKYRFUApU{?%Xhs zghSd?9F3kb=1Q*jN#Fc{1ul<$pC*Q;h??pHe!U(1uc=3dUK6{#P4F51{v}m=XG7Ds z4Piq!BCaDHT(Ypb(@DysYb*Sd@H>*RRaH-lP0ycroa-2Pf6S-{ezH=V=CMoS-0xo~ zd7l#{-B2|3et31xqWOi3{jZIf;eKR3yAgtHzN3SJq9cNWJ`@8=D9T(f4zH1n_;Ge( zRmj(aA4k`E1*INXwGz$$ddR7X^teM0=jfW<`E+T*jSpQD6>~6^^Xq{w4a-rH)GoW5wINY3h8!2DGeJXmoBg%c$!n;TA zwtZzjaB)zb!6TAW%$l! z-?6@bfqt9q_lOwL)@u7?7nSLmIPI-{o7isp+=kg28-4K(|Dy>noSjv6?hP}g*X>xw z#b9aJ6oiOm1dewJFkyf|MHz6|q*AK&m`TjA@?zlL zVrDa7E5x7>GvcMuaF9kv!F(21PG=+U2VWkOts$ILea?)Oz8<7tu@dZHEiL;Wtvojn85&k z_(OgwtyJ1guhw^|0Q6v+a4nm|Lf9%5yJv*n5RwK+x)S=s2z?xwQFaWa*QDwQDkP0k z8@zi`kVJR9HdUvzmO~P3N=c~zR1a3=e6nO%gfzN4!XiO3t``6prlePSVN>*(u)WdGc4<4q=ukL%z7*2B61uh38n}aAWXg- z?1@Y$Bbg|I3J4J@z~uDHP#M0V$V(Y$%k8qLe@2^B2ldxr{@~ zNh=jeV4)hF3J2RstMFustyL#m9Tvf{3DFT^2A73=v_va$gB%2a8KBjq#;E`3ilbFj ztO2*^$?+Em5doLOM>$-fz+dzcG>y{fK`&ZZIS7k~T0NGH!9Y1cTHMm9fWT@8)nGw7 z3O8tUaT<+M%&;T{TOzyNQZP^?Zoq?a0|iJCt^h+&jLVPXpcqGh@poCEvbu2KP=qy2xr%|061FlXNk%Fs} zDR6#tHS7mF{Rhp!74j&#h$mvAB8p)0c^n~ABoc_2GMcw z5Z7q~M;AB=+1*EBmtG*(Kl9VI4}azoF#Kha&(imcTwmn+ECoIb{H43T$n{wYd=~gi zcm3bwa{2f&MXA9*AR~BHl6Zc{1g}|+vdLk=&?JZju^b$>8~~PH+VB~A2f>o#=ezszueIiu6Im_KQWcd+PNjmsU-l#3=bxXNp1!d1Y~?BaYi0eV zHE&gmPlnekwoLIStJ^0|Q#P&C`CVGHAv9ZdqlMMd!N1j#S=!(b?<{H9+ov6QDQsK3 zEw10h?Kxws=Jvh!<6`J|^r!(g?9hF?(mTrQ%Xp6}%FHK!*!VzVf6{T!6^ZYvNjoQv zUgSji9xa#t+I8;%ycjG@v-auFNN;v-dlH(5=0~$iY%wrx`Na+mMGpWvpyyice z5}LPs@cCH3IWd+s}NJai<&;=ENT^x|ZE1s9<5uJf+`_F@x43jc(rG?vvTB z*=J8&h;eGDuOee^>iF~eoG-@wSG zr;GgDR?ggXIih7*+C1;3tSR}U3hPKWk1IZRADz8;f6tN3)o!9lBJiB^-4;i8Ngj!YHq%GKm?;pL}6P8ieF1>>lZ7WJxbF+HTPFQ@s zzVejQrZbM;zeow3Bn~Jwub2|O#>lUBX7n$+P*QoXtp6M8p-2ACTeqLo{M(Tmixis` zHm_fAR*bdv-aPL5p|75|uG`EWd?mQ~n0fvg4?<$k*m<1T-6Vd#x2@x{3qN4UO^3P; Z+iKQG)lDAM2lPJ_5fT;r!^AmDe+O@NIC%g7 literal 0 HcmV?d00001 diff --git a/src/com/jpexs/decompiler/flash/gui/graphics/placeimageprivate32.png b/src/com/jpexs/decompiler/flash/gui/graphics/placeimageprivate32.png new file mode 100644 index 0000000000000000000000000000000000000000..9006f184096ee25cc957d3c79316b298e11d2137 GIT binary patch literal 5847 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 classTagIdMap = new HashMap<>(); static { - addTag(CSMTextSettingsTag.ID, CSMTextSettingsTag.class); + addTag(CSMSettingsTag.ID, CSMSettingsTag.class); addTag(DebugIDTag.ID, DebugIDTag.class); addTag(DefineBinaryDataTag.ID, DefineBinaryDataTag.class); addTag(DefineBitsJPEG2Tag.ID, DefineBitsJPEG2Tag.class); @@ -162,6 +163,7 @@ public class TagIdClassMap { addTag(PlaceObject3Tag.ID, PlaceObject3Tag.class); addTag(PlaceObject4Tag.ID, PlaceObject4Tag.class); addTag(PlaceObjectTag.ID, PlaceObjectTag.class); + addTag(PlaceImagePrivateTag.ID, PlaceImagePrivateTag.class); addTag(ProductInfoTag.ID, ProductInfoTag.class); addTag(ProtectTag.ID, ProtectTag.class); addTag(RemoveObject2Tag.ID, RemoveObject2Tag.class); diff --git a/src/com/jpexs/decompiler/flash/gui/tagtree/TagTree.java b/src/com/jpexs/decompiler/flash/gui/tagtree/TagTree.java index dc2a265a0..6fe7c34b9 100644 --- a/src/com/jpexs/decompiler/flash/gui/tagtree/TagTree.java +++ b/src/com/jpexs/decompiler/flash/gui/tagtree/TagTree.java @@ -62,6 +62,7 @@ import com.jpexs.decompiler.flash.tags.ImportAssets2Tag; import com.jpexs.decompiler.flash.tags.ImportAssetsTag; import com.jpexs.decompiler.flash.tags.JPEGTablesTag; import com.jpexs.decompiler.flash.tags.MetadataTag; +import com.jpexs.decompiler.flash.tags.PlaceImagePrivateTag; import com.jpexs.decompiler.flash.tags.PlaceObject2Tag; import com.jpexs.decompiler.flash.tags.PlaceObject3Tag; import com.jpexs.decompiler.flash.tags.PlaceObject4Tag; @@ -292,7 +293,7 @@ public class TagTree extends AbstractTagTree { RemoveObjectTag.ID, RemoveObject2Tag.ID, ShowFrameTag.ID, FrameLabelTag.ID, StartSoundTag.ID, StartSound2Tag.ID, VideoFrameTag.ID, SoundStreamBlockTag.ID, SoundStreamHeadTag.ID, SoundStreamHead2Tag.ID, - SetTabIndexTag.ID); + SetTabIndexTag.ID, PlaceImagePrivateTag.ID); break; case TagTreeModel.FOLDER_OTHERS: ret = Arrays.asList( diff --git a/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeContextMenu.java b/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeContextMenu.java index eeb13dda9..0c679f2f6 100644 --- a/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeContextMenu.java +++ b/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeContextMenu.java @@ -81,6 +81,7 @@ import com.jpexs.decompiler.flash.tags.ExportAssetsTag; import com.jpexs.decompiler.flash.tags.FileAttributesTag; import com.jpexs.decompiler.flash.tags.FrameLabelTag; import com.jpexs.decompiler.flash.tags.MetadataTag; +import com.jpexs.decompiler.flash.tags.PlaceImagePrivateTag; import com.jpexs.decompiler.flash.tags.PlaceObject2Tag; import com.jpexs.decompiler.flash.tags.PlaceObject3Tag; import com.jpexs.decompiler.flash.tags.PlaceObject4Tag; @@ -5848,6 +5849,7 @@ public class TagTreeContextMenu extends JPopupMenu { */ private boolean isFrameTagToDelete(Tag tag) { return (tag instanceof PlaceObjectTypeTag) + || (tag instanceof PlaceImagePrivateTag) || (tag instanceof RemoveTag) || (tag instanceof FrameLabelTag) || (tag instanceof StartSoundTag)