From 386610cb78d49b50aef6eb6507ca2c92bc117b86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sat, 5 Nov 2022 08:23:46 +0100 Subject: [PATCH] Fixed - Ignore missing font on DefineEditText - GFX: Drawing missing DefineExternalImage/2 as red instead of throwing exception - GFX: DefineExternalImage2 properly saving characterId --- CHANGELOG.md | 3 ++ .../flash/tags/DefineEditTextTag.java | 2 +- .../flash/tags/gfx/DefineExternalImage.java | 35 ++++++++++++------ .../flash/tags/gfx/DefineExternalImage2.java | 37 +++++++++++++------ 4 files changed, 53 insertions(+), 24 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ca92a87fb..cc490734a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,9 @@ All notable changes to this project will be documented in this file. ### Fixed - 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: DefineExternalImage2 properly saving characterId ## [16.0.4] - 2022-11-03 ### Fixed diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineEditTextTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineEditTextTag.java index e7a04a340..afd654b1d 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineEditTextTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineEditTextTag.java @@ -1154,7 +1154,7 @@ public class DefineEditTextTag extends TextTag { } else { for (SameStyleTextRecord tr : line) { width += tr.width; - int lineHeight = tr.style.font.hasLayout() ? (int) Math.round(tr.style.fontHeight * tr.style.font.getAscent() / tr.style.font.getDivider() / 1024.0) + tr.style.fontLeading + int lineHeight = (tr.style.font != null /*Font missing*/) && tr.style.font.hasLayout() ? (int) Math.round(tr.style.fontHeight * tr.style.font.getAscent() / tr.style.font.getDivider() / 1024.0) + tr.style.fontLeading : tr.style.fontHeight + tr.style.fontLeading; if (tr.style.font != null && !firstLine && tr.style.font.hasLayout()) { lineHeight += (int) Math.round(tr.style.fontHeight * tr.style.font.getDescent() / tr.style.font.getDivider() / 1024.0); 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 1c117c1c3..ec7f3e440 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 @@ -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; @@ -99,20 +101,31 @@ public class DefineExternalImage extends ImageTag { targetHeight = sis.readUI16("targetHeight"); exportName = sis.readNetString("exportName"); fileName = sis.readNetString("fileName"); - + if (bitmapFormat == BITMAP_FORMAT_TGA) { - return; + serImage = new SerializableImage(targetWidth, targetHeight, BufferedImage.TYPE_INT_ARGB_PRE); + Graphics g =serImage.getGraphics(); + g.setColor(Color.red); + g.fillRect(0,0, targetWidth, targetHeight); + 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); + 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); + } 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); + } } @Override 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 020259196..1ef93eb3e 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 @@ -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; @@ -75,7 +77,7 @@ public class DefineExternalImage2 extends ImageTag { */ @Override public void getData(SWFOutputStream sos) throws IOException { - sos.writeUI16(characterID); + sos.writeUI16(characterID - 0x8000); sos.writeUI16(unknownID); sos.writeUI16(bitmapFormat); sos.writeUI16(targetWidth); @@ -108,22 +110,33 @@ public class DefineExternalImage2 extends ImageTag { targetHeight = sis.readUI16("targetHeight"); exportName = sis.readNetString("exportName"); fileName = sis.readNetString("fileName"); - if (sis.available() > 0) { //there is usually one zero byte, bod knows why + if (sis.available() > 0) { //there is usually one zero byte, god knows why extraData = sis.readBytesEx(sis.available(), "extraData"); } if (bitmapFormat == BITMAP_FORMAT_TGA) { - return; + serImage = new SerializableImage(targetWidth, targetHeight, BufferedImage.TYPE_INT_ARGB_PRE); + Graphics g = serImage.getGraphics(); + g.setColor(Color.red); + g.fillRect(0, 0, targetWidth, targetHeight); + 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); + 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); + } 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); + } } @Override