Add support for loading external images

This commit is contained in:
lcdr
2021-11-19 13:03:23 +01:00
committed by Jindra Petřík
parent 61ac7520d1
commit 35e88e3b39
@@ -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());
}
}