From beeff4ffe7a5b3c68c00dc37120fe20624c02c78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=F8=EDk?= Date: Sun, 23 Feb 2014 14:33:08 +0100 Subject: [PATCH] Issue #401 Invalid GFX tags in non GFX files Matrix constructor fix --- trunk/src/com/jpexs/decompiler/flash/SWF.java | 2 +- .../decompiler/flash/SWFInputStream.java | 95 ++++++++++--------- .../decompiler/flash/exporters/Matrix.java | 3 + 3 files changed, 56 insertions(+), 44 deletions(-) diff --git a/trunk/src/com/jpexs/decompiler/flash/SWF.java b/trunk/src/com/jpexs/decompiler/flash/SWF.java index d601615ee..4da22b05b 100644 --- a/trunk/src/com/jpexs/decompiler/flash/SWF.java +++ b/trunk/src/com/jpexs/decompiler/flash/SWF.java @@ -414,7 +414,7 @@ public final class SWF implements TreeItem { if (checkOnly) { //return; } - tags = sis.readTagList(this, 0, parallelRead, true, !checkOnly); + tags = sis.readTagList(this, 0, parallelRead, true, !checkOnly, gfx); if (!checkOnly) { Map tagMap = new HashMap<>(); for (Tag tag : tags) { diff --git a/trunk/src/com/jpexs/decompiler/flash/SWFInputStream.java b/trunk/src/com/jpexs/decompiler/flash/SWFInputStream.java index aae22682b..aa2262dcf 100644 --- a/trunk/src/com/jpexs/decompiler/flash/SWFInputStream.java +++ b/trunk/src/com/jpexs/decompiler/flash/SWFInputStream.java @@ -808,19 +808,21 @@ public class SWFInputStream extends InputStream { private final boolean parallel; private final boolean skipUnusualTags; private final SWF swf; + private final boolean gfx; - public TagResolutionTask(SWF swf, Tag tag, int version, int level, boolean parallel, boolean skipUnusualTags) { + public TagResolutionTask(SWF swf, Tag tag, int version, int level, boolean parallel, boolean skipUnusualTags, boolean gfx) { this.tag = tag; this.version = version; this.level = level; this.parallel = parallel; this.skipUnusualTags = skipUnusualTags; this.swf = swf; + this.gfx = gfx; } @Override public Tag call() throws Exception { - return SWFInputStream.resolveTag(swf, tag, version, level, parallel, skipUnusualTags); + return SWFInputStream.resolveTag(swf, tag, version, level, parallel, skipUnusualTags, gfx); } } @@ -837,7 +839,7 @@ public class SWFInputStream extends InputStream { * @throws IOException * @throws java.lang.InterruptedException */ - public List readTagList(SWF swf, int level, boolean parallel, boolean skipUnusualTags, boolean parseTags) throws IOException, InterruptedException { + public List readTagList(SWF swf, int level, boolean parallel, boolean skipUnusualTags, boolean parseTags, boolean gfx) throws IOException, InterruptedException { ExecutorService executor = null; List> futureResults = new ArrayList<>(); if (parallel) { @@ -851,7 +853,7 @@ public class SWFInputStream extends InputStream { while (true) { long pos = getPos(); try { - tag = readTag(swf, level, pos, parseTags && !parallel, parallel, skipUnusualTags); + tag = readTag(swf, level, pos, parseTags && !parallel, parallel, skipUnusualTags, gfx); } catch (EOFException | EndOfStreamException ex) { tag = null; } @@ -880,7 +882,7 @@ public class SWFInputStream extends InputStream { } else { switch (tag.getId()) { case FileAttributesTag.ID: //FileAttributes - FileAttributesTag fileAttributes = (FileAttributesTag) resolveTag(swf, tag, version, level, parallel, skipUnusualTags); + FileAttributesTag fileAttributes = (FileAttributesTag) resolveTag(swf, tag, version, level, parallel, skipUnusualTags, gfx); if (fileAttributes.actionScript3) { isAS3 = true; } @@ -923,7 +925,7 @@ public class SWFInputStream extends InputStream { if (doParse) { if (parallel) { - Future future = executor.submit(new TagResolutionTask(swf, tag, version, level, parallel, skipUnusualTags)); + Future future = executor.submit(new TagResolutionTask(swf, tag, version, level, parallel, skipUnusualTags, gfx)); futureResults.add(future); } } @@ -945,7 +947,7 @@ public class SWFInputStream extends InputStream { return tags; } - public static Tag resolveTag(SWF swf, Tag tag, int version, int level, boolean parallel, boolean skipUnusualTags) throws InterruptedException { + public static Tag resolveTag(SWF swf, Tag tag, int version, int level, boolean parallel, boolean skipUnusualTags, boolean gfx) throws InterruptedException { Tag ret; byte[] data = tag.getData(version); @@ -1180,38 +1182,45 @@ public class SWFInputStream extends InputStream { case 94: ret = new PlaceObject4Tag(swf, data, version, pos); break; - case 1000: - ret = new ExporterInfoTag(swf, data, version, pos); - break; - case 1001: - ret = new DefineExternalImage(swf, data, version, pos); - break; - case 1002: - ret = new FontTextureInfo(swf, data, version, pos); - break; - case 1003: - ret = new DefineExternalGradient(swf, data, version, pos); - break; - case 1004: - ret = new DefineGradientMap(swf, data, version, pos); - break; - case 1005: - ret = new DefineCompactedFont(swf, data, version, pos); - break; - case 1006: - ret = new DefineExternalSound(swf, data, version, pos); - break; - case 1007: - ret = new DefineExternalStreamSound(swf, data, version, pos); - break; - case 1008: - ret = new DefineSubImage(swf, data, version, pos); - break; - case 1009: - ret = new DefineExternalImage2(swf, data, version, pos); - break; default: - ret = new UnknownTag(swf, tag.getId(), data, pos); + if (gfx) { //GFX tags only in GFX files. There may be incorrect GFX tags in non GFX files + switch (tag.getId()) { + case 1000: + ret = new ExporterInfoTag(swf, data, version, pos); + break; + case 1001: + ret = new DefineExternalImage(swf, data, version, pos); + break; + case 1002: + ret = new FontTextureInfo(swf, data, version, pos); + break; + case 1003: + ret = new DefineExternalGradient(swf, data, version, pos); + break; + case 1004: + ret = new DefineGradientMap(swf, data, version, pos); + break; + case 1005: + ret = new DefineCompactedFont(swf, data, version, pos); + break; + case 1006: + ret = new DefineExternalSound(swf, data, version, pos); + break; + case 1007: + ret = new DefineExternalStreamSound(swf, data, version, pos); + break; + case 1008: + ret = new DefineSubImage(swf, data, version, pos); + break; + case 1009: + ret = new DefineExternalImage2(swf, data, version, pos); + break; + default: + ret = new UnknownTag(swf, tag.getId(), data, pos); + } + } else { + ret = new UnknownTag(swf, tag.getId(), data, pos); + } } } catch (IOException ex) { Logger.getLogger(SWFInputStream.class.getName()).log(Level.SEVERE, "Error during tag reading", ex); @@ -1236,7 +1245,7 @@ public class SWFInputStream extends InputStream { * @throws IOException * @throws java.lang.InterruptedException */ - public Tag readTag(SWF swf, int level, long pos, boolean resolve, boolean parallel, boolean skipUnusualTags) throws IOException, InterruptedException { + public Tag readTag(SWF swf, int level, long pos, boolean resolve, boolean parallel, boolean skipUnusualTags, boolean gfx) throws IOException, InterruptedException { int tagIDTagLength = readUI16(); int tagID = (tagIDTagLength) >> 6; if (tagID == 0) { @@ -1289,7 +1298,7 @@ public class SWFInputStream extends InputStream { } if (resolve) { try { - return resolveTag(swf, ret, version, level, parallel, skipUnusualTags); + return resolveTag(swf, ret, version, level, parallel, skipUnusualTags, gfx); } catch (EndOfStreamException ex) { return ret; } @@ -1993,9 +2002,9 @@ public class SWFInputStream extends InputStream { ret.buttonStateOver = readUB(1) == 1; ret.buttonStateUp = readUB(1) == 1; - if (!ret.buttonHasBlendMode && !ret.buttonHasFilterList && - !ret.buttonStateHitTest && !ret.buttonStateDown && - !ret.buttonStateOver && !ret.buttonStateUp && ret.reserved == 0) { + if (!ret.buttonHasBlendMode && !ret.buttonHasFilterList + && !ret.buttonStateHitTest && !ret.buttonStateDown + && !ret.buttonStateOver && !ret.buttonStateUp && ret.reserved == 0) { return null; } diff --git a/trunk/src/com/jpexs/decompiler/flash/exporters/Matrix.java b/trunk/src/com/jpexs/decompiler/flash/exporters/Matrix.java index 2b5e34aeb..5945f0dc3 100644 --- a/trunk/src/com/jpexs/decompiler/flash/exporters/Matrix.java +++ b/trunk/src/com/jpexs/decompiler/flash/exporters/Matrix.java @@ -44,6 +44,9 @@ public class Matrix { } public Matrix(MATRIX matrix) { + if(matrix == null){ + matrix = new MATRIX(); + } translateX = matrix.translateX; translateY = matrix.translateY; if (matrix.hasScale) {