From 35e88e3b39625d4f6cf932138c0f798e872fcff8 Mon Sep 17 00:00:00 2001 From: lcdr Date: Sat, 22 May 2021 13:45:39 +0200 Subject: [PATCH] Add support for loading external images --- .../flash/tags/gfx/DefineExternalImage.java | 82 +++++++++++++++++-- 1 file changed, 75 insertions(+), 7 deletions(-) diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/gfx/DefineExternalImage.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/gfx/DefineExternalImage.java index b5147be07..c45815a6b 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/gfx/DefineExternalImage.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/gfx/DefineExternalImage.java @@ -12,33 +12,50 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.tags.gfx; import com.jpexs.decompiler.flash.SWFInputStream; import com.jpexs.decompiler.flash.SWFOutputStream; -import com.jpexs.decompiler.flash.tags.Tag; +import com.jpexs.decompiler.flash.helpers.ImageHelper; +import com.jpexs.decompiler.flash.tags.base.ImageTag; +import com.jpexs.decompiler.flash.tags.enums.ImageFormat; +import com.jpexs.decompiler.flash.types.annotations.HideInRawEdit; import com.jpexs.helpers.ByteArrayRange; +import com.jpexs.helpers.SerializableImage; +import net.npe.dds.DDSReader; +import java.awt.Dimension; +import java.awt.Image; +import java.awt.image.BufferedImage; +import java.io.File; import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.imageio.ImageIO; /** * * @author JPEXS */ -public class DefineExternalImage extends Tag { +public class DefineExternalImage extends ImageTag { public static final int ID = 1001; public static final String NAME = "DefineExternalImage"; - public int characterId; - public int bitmapFormat; public int targetWidth; public int targetHeight; + public String exportName; + public String fileName; public static final int BITMAP_FORMAT_DEFAULT = 0; @@ -47,6 +64,9 @@ public class DefineExternalImage extends Tag { public static final int BITMAP_FORMAT_DDS = 2; + @HideInRawEdit + private SerializableImage serImage; + /** * Gets data bytes * @@ -55,10 +75,11 @@ public class DefineExternalImage extends Tag { */ @Override public void getData(SWFOutputStream sos) throws IOException { - sos.writeUI16(characterId); + sos.writeUI16(characterID); sos.writeUI16(bitmapFormat); sos.writeUI16(targetWidth); sos.writeUI16(targetHeight); + sos.writeNetString(exportName); sos.writeNetString(fileName); } @@ -76,10 +97,57 @@ public class DefineExternalImage extends Tag { @Override public final void readData(SWFInputStream sis, ByteArrayRange data, int level, boolean parallel, boolean skipUnusualTags, boolean lazy) throws IOException { - characterId = sis.readUI16("characterId"); + characterID = sis.readUI16("characterID"); bitmapFormat = sis.readUI16("bitmapFormat"); targetWidth = sis.readUI16("targetWidth"); targetHeight = sis.readUI16("targetHeight"); + exportName = sis.readNetString("exportName"); fileName = sis.readNetString("fileName"); + + if (bitmapFormat == BITMAP_FORMAT_TGA) { + return; + } + + Path imagePath = Paths.get(sis.getSwf().getFile()).getParent().resolve(Paths.get(fileName)); + byte[] imageData = Files.readAllBytes(imagePath); + 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(targetWidth, targetHeight, Image.SCALE_DEFAULT); + bufImage = new BufferedImage(targetWidth, targetHeight, BufferedImage.TYPE_INT_ARGB); + bufImage.getGraphics().drawImage(scaled, 0, 0, null); + serImage = new SerializableImage(bufImage); + } + + @Override + public void setImage(byte[] data) throws IOException { + serImage = new SerializableImage(ImageHelper.read(data)); + clearCache(); + setModified(true); + } + + @Override + public ImageFormat getImageFormat() { + return ImageFormat.PNG; + } + + @Override + public ImageFormat getOriginalImageFormat() { + return ImageFormat.PNG; + } + + @Override + public InputStream getOriginalImageData() { + return null; + } + + @Override + protected SerializableImage getImage() { + return serImage; + } + + @Override + public Dimension getImageDimension() { + return new Dimension(serImage.getWidth(), serImage.getHeight()); } }