diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/gfx/DefineSubImage.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/gfx/DefineSubImage.java index 9551cac3b..838a6257a 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/gfx/DefineSubImage.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/gfx/DefineSubImage.java @@ -32,6 +32,7 @@ import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.Set; import net.npe.dds.DDSReader; /** @@ -53,7 +54,7 @@ public class DefineSubImage extends ImageTag { public int x2; public int y2; - + @HideInRawEdit private SerializableImage serImage; @@ -94,7 +95,7 @@ public class DefineSubImage extends ImageTag { x2 = sis.readUI16("x2"); y2 = sis.readUI16("y2"); } - + @Override public void setImage(byte[] data) throws IOException { serImage = new SerializableImage(ImageHelper.read(data)); @@ -120,8 +121,8 @@ public class DefineSubImage extends ImageTag { @Override protected SerializableImage getImage() { if (serImage == null) { - DefineExternalImage2 image = (DefineExternalImage2)swf.getImage(imageCharacterId | 0x8000); - + DefineExternalImage2 image = (DefineExternalImage2) swf.getImage(imageCharacterId | 0x8000); + Path imagePath = Paths.get(image.getSwf().getFile()).getParent().resolve(Paths.get(image.fileName)); byte[] imageData; try { @@ -129,7 +130,7 @@ public class DefineSubImage extends ImageTag { } catch (IOException e) { return null; } - int [] pixels = DDSReader.read(imageData, DDSReader.ARGB, 0); + int[] pixels = DDSReader.read(imageData, DDSReader.ARGB, 0); BufferedImage bufImage = new BufferedImage(DDSReader.getWidth(imageData), DDSReader.getHeight(imageData), BufferedImage.TYPE_INT_ARGB); bufImage.getRaster().setDataElements(0, 0, bufImage.getWidth(), bufImage.getHeight(), pixels); Image scaled = bufImage.getScaledInstance(image.targetWidth, image.targetHeight, Image.SCALE_DEFAULT); @@ -144,4 +145,9 @@ public class DefineSubImage extends ImageTag { public Dimension getImageDimension() { return new Dimension(x2 - x1, y2 - y1); } + + @Override + public void getNeededCharacters(Set needed) { + needed.add(imageCharacterId | 0x8000); + } } diff --git a/src/com/jpexs/decompiler/flash/gui/MainPanel.java b/src/com/jpexs/decompiler/flash/gui/MainPanel.java index bea5cd023..b4e3f2c5b 100644 --- a/src/com/jpexs/decompiler/flash/gui/MainPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/MainPanel.java @@ -3952,6 +3952,8 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se 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); @@ -3963,6 +3965,16 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se if (imageTag instanceof DefineBitsTag) { jpegTablesTag = imageTag.getSwf().getJtt(); } + Set needed = new LinkedHashSet<>(); + imageTag.getNeededCharacters(needed); + + List neededCopies = new ArrayList<>(); + for (int n : needed) { + CharacterTag ct = (CharacterTag) imageTag.getSwf().getCharacter(n).cloneTag(); + ct.setSwf(swf); + neededCopies.add(ct); + } + ImageTag imageTagCopy = (ImageTag) imageTag.cloneTag(); imageTagCopy.setSwf(swf); int imageCharId = imageTag.getCharacterId(); @@ -4035,6 +4047,9 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se if (jpegTablesTag != null) { swf.addTag(jpegTablesTag); } + for (CharacterTag neededCopy : neededCopies) { + swf.addTag(neededCopy); + } swf.addTag(imageTagCopy); swf.addTag(shapeTag); swf.addTag(placeTag);