From c339113f450d0beaadff7e3aa2a4ff66a1223ebc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sun, 7 Mar 2021 09:53:41 +0100 Subject: [PATCH] Fixed: #1332 Flash viewer - Show directly added images when placeFlagHasImage is true on AS3 swfs --- CHANGELOG.md | 2 ++ .../com/jpexs/decompiler/flash/tags/PlaceObject2Tag.java | 5 +++++ .../com/jpexs/decompiler/flash/tags/PlaceObject3Tag.java | 9 ++++++++- .../com/jpexs/decompiler/flash/tags/PlaceObject4Tag.java | 8 +++++++- .../com/jpexs/decompiler/flash/tags/PlaceObjectTag.java | 5 +++++ .../decompiler/flash/tags/base/PlaceObjectTypeTag.java | 2 ++ .../com/jpexs/decompiler/flash/timeline/DepthState.java | 6 ++++-- .../com/jpexs/decompiler/flash/timeline/Timeline.java | 4 ++-- .../flash/console/CommandLineArgumentParser.java | 2 +- 9 files changed, 36 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 547c26274..651e211b6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,7 @@ All notable changes to this project will be documented in this file. - [#1647] Copying to clipboard - Transparency support - Incorrect placeobject display (tag selection) - Generic tag saving problem - timelined exception +- [#1332] Flash viewer - Show directly added images when placeFlagHasImage is true on AS3 swfs ## [14.1.0] - 2021-03-05 ### Added @@ -2092,6 +2093,7 @@ All notable changes to this project will be documented in this file. [#1254]: https://www.free-decompiler.com/flash/issues/1254 [#1636]: https://www.free-decompiler.com/flash/issues/1636 [#1647]: https://www.free-decompiler.com/flash/issues/1647 +[#1332]: https://www.free-decompiler.com/flash/issues/1332 [#1561]: https://www.free-decompiler.com/flash/issues/1561 [#1623]: https://www.free-decompiler.com/flash/issues/1623 [#1622]: https://www.free-decompiler.com/flash/issues/1622 diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/PlaceObject2Tag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/PlaceObject2Tag.java index b6f412730..81aea00b5 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/PlaceObject2Tag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/PlaceObject2Tag.java @@ -472,4 +472,9 @@ public class PlaceObject2Tag extends PlaceObjectTypeTag implements ASMSourceCont public void setPlaceFlagHasMatrix(boolean placeFlagHasMatrix) { this.placeFlagHasMatrix = placeFlagHasMatrix; } + + @Override + public boolean hasImage() { + return false; + } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/PlaceObject3Tag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/PlaceObject3Tag.java index 8f533a10e..1cabbe215 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/PlaceObject3Tag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/PlaceObject3Tag.java @@ -240,7 +240,7 @@ public class PlaceObject3Tag extends PlaceObjectTypeTag implements ASMSourceCont super(swf, ID, NAME, null); } - public PlaceObject3Tag(SWF swf, boolean placeFlagMove, int depth, String className, int characterId, MATRIX matrix, CXFORMWITHALPHA colorTransform, int ratio, String name, int clipDepth, List surfaceFilterList, int blendMode, Integer bitmapCache, int visible, RGBA backgroundColor, CLIPACTIONS clipActions) { + public PlaceObject3Tag(SWF swf, boolean placeFlagMove, int depth, String className, int characterId, MATRIX matrix, CXFORMWITHALPHA colorTransform, int ratio, String name, int clipDepth, List surfaceFilterList, int blendMode, Integer bitmapCache, int visible, RGBA backgroundColor, CLIPACTIONS clipActions, boolean placeFlagHasImage) { super(swf, ID, NAME, null); this.placeFlagHasClassName = className != null; this.placeFlagHasFilterList = surfaceFilterList != null; @@ -270,6 +270,7 @@ public class PlaceObject3Tag extends PlaceObjectTypeTag implements ASMSourceCont this.visible = visible; this.backgroundColor = backgroundColor; this.clipActions = clipActions; + this.placeFlagHasImage = placeFlagHasImage; } /** @@ -657,4 +658,10 @@ public class PlaceObject3Tag extends PlaceObjectTypeTag implements ASMSourceCont public void setPlaceFlagHasMatrix(boolean placeFlagHasMatrix) { this.placeFlagHasMatrix = placeFlagHasMatrix; } + + @Override + public boolean hasImage() { + return placeFlagHasImage; + } + } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/PlaceObject4Tag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/PlaceObject4Tag.java index 1704ce809..020d0cea9 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/PlaceObject4Tag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/PlaceObject4Tag.java @@ -245,7 +245,7 @@ public class PlaceObject4Tag extends PlaceObjectTypeTag implements ASMSourceCont super(swf, ID, NAME, null); } - public PlaceObject4Tag(SWF swf, boolean placeFlagMove, int depth, String className, int characterId, MATRIX matrix, CXFORMWITHALPHA colorTransform, int ratio, String name, int clipDepth, List surfaceFilterList, int blendMode, Integer bitmapCache, Integer visible, RGBA backgroundColor, CLIPACTIONS clipActions, Amf3Value amfData) { + public PlaceObject4Tag(SWF swf, boolean placeFlagMove, int depth, String className, int characterId, MATRIX matrix, CXFORMWITHALPHA colorTransform, int ratio, String name, int clipDepth, List surfaceFilterList, int blendMode, Integer bitmapCache, Integer visible, RGBA backgroundColor, CLIPACTIONS clipActions, Amf3Value amfData, boolean placeFlagHasImage) { super(swf, ID, NAME, null); this.placeFlagHasClassName = className != null; this.placeFlagHasFilterList = surfaceFilterList != null; @@ -276,6 +276,7 @@ public class PlaceObject4Tag extends PlaceObjectTypeTag implements ASMSourceCont this.backgroundColor = backgroundColor; this.clipActions = clipActions; this.amfData = amfData; + this.placeFlagHasImage = placeFlagHasImage; } /** @@ -678,4 +679,9 @@ public class PlaceObject4Tag extends PlaceObjectTypeTag implements ASMSourceCont public void setPlaceFlagHasMatrix(boolean placeFlagHasMatrix) { this.placeFlagHasMatrix = placeFlagHasMatrix; } + + @Override + public boolean hasImage() { + return placeFlagHasImage; + } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/PlaceObjectTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/PlaceObjectTag.java index 4be8d13fd..c5e67500c 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/PlaceObjectTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/PlaceObjectTag.java @@ -286,4 +286,9 @@ public class PlaceObjectTag extends PlaceObjectTypeTag { public void setPlaceFlagHasMatrix(boolean placeFlagHasMatrix) { } + + @Override + public boolean hasImage() { + return false; + } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/PlaceObjectTypeTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/PlaceObjectTypeTag.java index fe1747f33..809e42416 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/PlaceObjectTypeTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/PlaceObjectTypeTag.java @@ -65,6 +65,8 @@ public abstract class PlaceObjectTypeTag extends Tag implements CharacterIdTag { public abstract boolean cacheAsBitmap(); + public abstract boolean hasImage(); + public abstract Integer getBitmapCache(); public abstract boolean isVisible(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/timeline/DepthState.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/timeline/DepthState.java index 5d81282de..f8a14b7a4 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/timeline/DepthState.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/timeline/DepthState.java @@ -81,6 +81,8 @@ public class DepthState { public boolean motionTween = false; + public boolean hasImage = false; + private static AtomicLong lastInstanceId = new AtomicLong(0); public static long getNewInstanceId() { @@ -138,10 +140,10 @@ public class DepthState { return new PlaceObject2Tag(swf, false, depth, characterId, matrix, cxForm, ratio, instanceName, clipDepth, clipActions); } else if (minPlaceObjectNum == 3) { CXFORMWITHALPHA cxForm = colorTransForm == null ? null : new CXFORMWITHALPHA(colorTransForm); - return new PlaceObject3Tag(swf, false, depth, null/*todo: className*/, characterId, matrix, cxForm, ratio, instanceName, clipDepth, filters, blendMode, cacheAsBitmap ? 1 : 0, isVisible ? 1 : 0, backGroundColor, clipActions); + return new PlaceObject3Tag(swf, false, depth, null/*todo: className*/, characterId, matrix, cxForm, ratio, instanceName, clipDepth, filters, blendMode, cacheAsBitmap ? 1 : 0, isVisible ? 1 : 0, backGroundColor, clipActions, hasImage); } CXFORMWITHALPHA cxForm = colorTransForm == null ? null : new CXFORMWITHALPHA(colorTransForm); - return new PlaceObject4Tag(swf, false, depth, null/*todo: className*/, characterId, matrix, cxForm, ratio, instanceName, clipDepth, filters, blendMode, cacheAsBitmap ? 1 : 0, isVisible ? 1 : 0, backGroundColor, clipActions, null); + return new PlaceObject4Tag(swf, false, depth, null/*todo: className*/, characterId, matrix, cxForm, ratio, instanceName, clipDepth, filters, blendMode, cacheAsBitmap ? 1 : 0, isVisible ? 1 : 0, backGroundColor, clipActions, null, hasImage); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/timeline/Timeline.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/timeline/Timeline.java index e51ed6ae4..b89a5e346 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/timeline/Timeline.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/timeline/Timeline.java @@ -305,6 +305,7 @@ public class Timeline { int characterId = po.getCharacterId(); if (characterId != -1) { fl.characterId = characterId; + fl.hasImage = po.hasImage(); } CharacterTag character = swf.getCharacter(characterId); if (character instanceof DefineSpriteTag) { @@ -701,8 +702,7 @@ public class Timeline { img = new SerializableImage(newWidth, newHeight, SerializableImage.TYPE_INT_ARGB_PRE); img.fillTransparent(); - if (!(drawable instanceof ImageTag)) { - // image tags are not rendered, they should be embedded in shape tags + if (!(drawable instanceof ImageTag) || (swf.isAS3() && layer.hasImage)) { drawable.toImage(dframe, time, ratio, renderContext, img, isClip || clipDepth > -1, m, strokeTransform, absMat, clrTrans); } else { // todo: show one time warning diff --git a/src/com/jpexs/decompiler/flash/console/CommandLineArgumentParser.java b/src/com/jpexs/decompiler/flash/console/CommandLineArgumentParser.java index 40c3b1101..7a65fa80d 100644 --- a/src/com/jpexs/decompiler/flash/console/CommandLineArgumentParser.java +++ b/src/com/jpexs/decompiler/flash/console/CommandLineArgumentParser.java @@ -1509,7 +1509,7 @@ public class CommandLineArgumentParser { } else { pt4 = new PlaceObject4Tag( pt.getSwf(), pt.flagMove(), pt.getDepth(), pt.getClassName(), pt.getCharacterId(), pt.getMatrix(), pt.getColorTransform() == null ? null : new CXFORMWITHALPHA(pt.getColorTransform()), pt.getRatio(), - pt.getInstanceName(), pt.getClipDepth(), pt.getFilters(), pt.getBlendMode(), pt.getBitmapCache(), pt.getVisible(), pt.getBackgroundColor(), pt.getClipActions(), pt.getAmfData()); + pt.getInstanceName(), pt.getClipDepth(), pt.getFilters(), pt.getBlendMode(), pt.getBitmapCache(), pt.getVisible(), pt.getBackgroundColor(), pt.getClipActions(), pt.getAmfData(), pt.hasImage()); tim.replaceTag(i, pt4); }