From 698fbc6f1c40072f0629581f5b597d05d0d68ef0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sat, 3 Apr 2021 17:42:50 +0200 Subject: [PATCH] #1677 DefineFont2/3 font must have layout or numGlyphs>0 for codeTableOffset to be present --- CHANGELOG.md | 2 +- .../decompiler/flash/tags/DefineFont2Tag.java | 22 +++++++++++-------- .../decompiler/flash/tags/DefineFont3Tag.java | 22 +++++++++++-------- 3 files changed, 27 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e8ce3d36c..4df8d40b3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,7 +29,7 @@ All notable changes to this project will be documented in this file. - [#1672] Raw editor - digits grouping causing incorrect cursor movement - Rename invalid identifiers renames identifiers with a dollar sign - [#1676] Messages on movie tags when Flash Player ActiveX not available -- [#1677] DefineFont2/3 - missing codeTableOffset if numGlyphs is zero +- [#1677] DefineFont2/3 - missing codeTableOffset if numGlyphs is zero and font has layout ## [14.3.1] - 2021-03-25 ### Fixed diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineFont2Tag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineFont2Tag.java index 10e43d46a..ed1ce4cf8 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineFont2Tag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineFont2Tag.java @@ -153,10 +153,12 @@ public class DefineFont2Tag extends FontTag { } } - if (fontFlagsWideOffsets) { - sis.readUI32("codeTableOffset"); - } else { - sis.readUI16("codeTableOffset"); + if (numGlyphs > 0 || fontFlagsHasLayout) { + if (fontFlagsWideOffsets) { + sis.readUI32("codeTableOffset"); + } else { + sis.readUI16("codeTableOffset"); + } } glyphShapeTable = new ArrayList<>(); @@ -280,11 +282,13 @@ public class DefineFont2Tag extends FontTag { } } - long offset = (glyphShapeTable.size() + 1/*CodeTableOffset*/) * (fontFlagsWideOffsets ? 4 : 2) + baGlyphShapes.length; - if (fontFlagsWideOffsets) { - sos.writeUI32(offset); - } else { - sos.writeUI16((int) offset); + if (numGlyphs > 0 || fontFlagsHasLayout) { + long offset = (glyphShapeTable.size() + 1/*CodeTableOffset*/) * (fontFlagsWideOffsets ? 4 : 2) + baGlyphShapes.length; + if (fontFlagsWideOffsets) { + sos.writeUI32(offset); + } else { + sos.writeUI16((int) offset); + } } if (numGlyphs > 0) { sos.write(baGlyphShapes); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineFont3Tag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineFont3Tag.java index 59a1d85c9..d51b26d04 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineFont3Tag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineFont3Tag.java @@ -145,10 +145,12 @@ public class DefineFont3Tag extends FontTag { offsetTable[i] = sis.readUI16("offset"); } } - if (fontFlagsWideOffsets) { - sis.readUI32("codeTableOffset"); - } else { - sis.readUI16("codeTableOffset"); + if (numGlyphs > 0 || fontFlagsHasLayout) { + if (fontFlagsWideOffsets) { + sis.readUI32("codeTableOffset"); + } else { + sis.readUI16("codeTableOffset"); + } } glyphShapeTable = new ArrayList<>(); for (int i = 0; i < numGlyphs; i++) { @@ -269,11 +271,13 @@ public class DefineFont3Tag extends FontTag { sos.writeUI16((int) offset2); } } - long offset = (glyphShapeTable.size() + 1/*CodeTableOffset*/) * (fontFlagsWideOffsets ? 4 : 2) + baGlyphShapes.length; - if (fontFlagsWideOffsets) { - sos.writeUI32(offset); - } else { - sos.writeUI16((int) offset); + if (numGlyphs > 0 || fontFlagsHasLayout) { + long offset = (glyphShapeTable.size() + 1/*CodeTableOffset*/) * (fontFlagsWideOffsets ? 4 : 2) + baGlyphShapes.length; + if (fontFlagsWideOffsets) { + sos.writeUI32(offset); + } else { + sos.writeUI16((int) offset); + } } if (numGlyphs > 0) { sos.write(baGlyphShapes);