diff --git a/CHANGELOG.md b/CHANGELOG.md index 5037bbd8b..ee2ea8681 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,7 @@ All notable changes to this project will be documented in this file. - Flash viewer - subtract blend mode - [#1712], [#1857] JPEG images errors fixer - Ignore missing font on DefineEditText -- GFX: Drawing missing DefineExternalImage/2 as red instead of throwing exception +- GFX: Drawing missing DefineExternalImage/2, DefineSubImage as red instead of throwing exception - GFX: DefineExternalImage2 properly saving characterId - Hex view refreshing after selecting Unknown tag 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 ec7f3e440..80ea67c98 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 @@ -104,30 +104,38 @@ public class DefineExternalImage extends ImageTag { if (bitmapFormat == BITMAP_FORMAT_TGA) { serImage = new SerializableImage(targetWidth, targetHeight, BufferedImage.TYPE_INT_ARGB_PRE); - Graphics g =serImage.getGraphics(); + Graphics g = serImage.getGraphics(); g.setColor(Color.red); - g.fillRect(0,0, targetWidth, targetHeight); + g.fillRect(0, 0, targetWidth, targetHeight); return; } Path imagePath = sis.getSwf().getFile() == null ? null : Paths.get(sis.getSwf().getFile()).getParent().resolve(Paths.get(fileName)); if (imagePath != null && imagePath.toFile().exists()) { - 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); + try { + 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); + } catch (IOException ex) { + createFailedImage(); + } } else { - serImage = new SerializableImage(targetWidth, targetHeight, BufferedImage.TYPE_INT_ARGB_PRE); - Graphics g =serImage.getGraphics(); - g.setColor(Color.red); - g.fillRect(0,0, targetWidth, targetHeight); + createFailedImage(); } } + private void createFailedImage() { + serImage = new SerializableImage(targetWidth, targetHeight, BufferedImage.TYPE_INT_ARGB_PRE); + Graphics g = serImage.getGraphics(); + g.setColor(Color.red); + g.fillRect(0, 0, targetWidth, targetHeight); + } + @Override public void setImage(byte[] data) throws IOException { serImage = new SerializableImage(ImageHelper.read(data)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/gfx/DefineExternalImage2.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/gfx/DefineExternalImage2.java index 1ef93eb3e..012d3102e 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/gfx/DefineExternalImage2.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/gfx/DefineExternalImage2.java @@ -123,22 +123,30 @@ public class DefineExternalImage2 extends ImageTag { Path imagePath = sis.getSwf().getFile() == null ? null : Paths.get(sis.getSwf().getFile()).getParent().resolve(Paths.get(fileName)); if (imagePath != null && imagePath.toFile().exists()) { - 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); + try { + 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); + } catch (IOException ex) { + createFailedImage(); + } } else { - serImage = new SerializableImage(targetWidth, targetHeight, BufferedImage.TYPE_INT_ARGB_PRE); - Graphics g = serImage.getGraphics(); - g.setColor(Color.red); - g.fillRect(0, 0, targetWidth, targetHeight); + createFailedImage(); } } + private void createFailedImage() { + serImage = new SerializableImage(targetWidth, targetHeight, BufferedImage.TYPE_INT_ARGB_PRE); + Graphics g = serImage.getGraphics(); + g.setColor(Color.red); + g.fillRect(0, 0, targetWidth, targetHeight); + } + @Override public void setImage(byte[] data) throws IOException { serImage = new SerializableImage(ImageHelper.read(data)); 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 838a6257a..7645db804 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 @@ -24,7 +24,9 @@ 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 java.awt.Color; import java.awt.Dimension; +import java.awt.Graphics; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.IOException; @@ -123,24 +125,34 @@ public class DefineSubImage extends ImageTag { if (serImage == null) { DefineExternalImage2 image = (DefineExternalImage2) swf.getImage(imageCharacterId | 0x8000); - Path imagePath = Paths.get(image.getSwf().getFile()).getParent().resolve(Paths.get(image.fileName)); - byte[] imageData; - try { - imageData = Files.readAllBytes(imagePath); - } catch (IOException e) { - return null; + Path imagePath = image.getSwf().getFile() == null ? null : Paths.get(image.getSwf().getFile()).getParent().resolve(Paths.get(image.fileName)); + if (imagePath != null && imagePath.toFile().exists()) { + try { + 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(image.targetWidth, image.targetHeight, Image.SCALE_DEFAULT); + bufImage = new BufferedImage(x2 - x1, y2 - y1, BufferedImage.TYPE_INT_ARGB); + bufImage.getGraphics().drawImage(scaled, -x1, -y1, null); + serImage = new SerializableImage(bufImage); + } catch (IOException e) { + createFailedImage(); + } + } else { + createFailedImage(); } - 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); - bufImage = new BufferedImage(x2 - x1, y2 - y1, BufferedImage.TYPE_INT_ARGB); - bufImage.getGraphics().drawImage(scaled, -x1, -y1, null); - serImage = new SerializableImage(bufImage); } return serImage; } + private void createFailedImage() { + serImage = new SerializableImage(x2 - x1, y2 - y1, BufferedImage.TYPE_INT_ARGB_PRE); + Graphics g = serImage.getGraphics(); + g.setColor(Color.red); + g.fillRect(0, 0, x2 - x1, y2 - y1); + } + @Override public Dimension getImageDimension() { return new Dimension(x2 - x1, y2 - y1);