From d335373e7ecf7a61174ae3440a4fe3d12d61c61a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Thu, 24 Nov 2016 07:40:47 +0100 Subject: [PATCH] Parsing font main and font info --- .../decompiler/flash/iggy/IggyDataReader.java | 61 +++++++++++++++++-- .../jpexs/decompiler/flash/iggy/IggyFile.java | 23 ++++--- .../flash/iggy/IggyFlashHeader64.java | 6 +- 3 files changed, 73 insertions(+), 17 deletions(-) diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/iggy/IggyDataReader.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/iggy/IggyDataReader.java index 7951e3393..89e4eb327 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/iggy/IggyDataReader.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/iggy/IggyDataReader.java @@ -4,7 +4,9 @@ import com.jpexs.decompiler.flash.iggy.annotations.IggyArrayFieldType; import com.jpexs.decompiler.flash.iggy.annotations.IggyFieldType; import java.io.IOException; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * @@ -12,19 +14,27 @@ import java.util.List; */ public class IggyDataReader implements StructureInterface { + final static int NO_OFFSET = 1; + @IggyFieldType(value = DataType.widechar_t, count = 48) String name; @IggyFieldType(value = DataType.uint64_t) long unk_pad; @IggyArrayFieldType(value = DataType.uint64_t, countField = "font_count") - long[] font_main_offsets; + long font_main_offsets[]; @IggyArrayFieldType(value = DataType.uint64_t, countField = "font_count") long font_info_offsets[]; private IggyFlashHeader64 header; + private Map sizesOfOffsets; - public IggyDataReader(IggyFlashHeader64 header, AbstractDataStream stream) throws IOException { + public IggyDataReader(IggyFlashHeader64 header, AbstractDataStream stream, List offsets) throws IOException { this.header = header; + sizesOfOffsets = new HashMap<>(); + for (int i = 0; i < offsets.size() - 1; i++) { + sizesOfOffsets.put(offsets.get(i), offsets.get(i + 1) - offsets.get(i)); + } + sizesOfOffsets.put(offsets.get(offsets.size() - 1), 0L); //Last offset has 0L length? readFromDataStream(stream); } @@ -46,14 +56,52 @@ public class IggyDataReader implements StructureInterface { stream.seek(48 - charCnt * 2, SeekMode.CUR); name = nameBuilder.toString(); unk_pad = stream.readUI64(); //padding one + font_main_offsets = new long[(int) header.font_count]; for (int i = 0; i < header.font_count; i++) { - font_main_offsets[i] = stream.readUI64(); + long pos = stream.position(); + long offset = stream.readUI64(); + font_main_offsets[i] = offset == NO_OFFSET ? NO_OFFSET : pos + offset; } + font_info_offsets = new long[(int) header.font_count]; for (int i = 0; i < header.font_count; i++) { - font_info_offsets[i] = stream.readUI64(); + long pos = stream.position(); + long offset = stream.readUI64(); + font_info_offsets[i] = offset == NO_OFFSET ? NO_OFFSET : pos + offset; } - System.out.println("pos=" + stream.position()); + long pad_len = 840 - stream.position(); + stream.seek(pad_len, SeekMode.CUR); + List fontMainStreams = new ArrayList<>(); + + for (int i = 0; i < header.font_count; i++) { + long fontMainOffset = font_main_offsets[i]; + if (fontMainOffset == NO_OFFSET) { + fontMainStreams.add(null); + } else { + long fontMainSize = sizesOfOffsets.get(font_main_offsets[i]); + + stream.seek(fontMainOffset, SeekMode.SET); + byte[] fontMainData = stream.readBytes((int) fontMainSize); + + fontMainStreams.add(new ByteArrayDataStream(fontMainData, stream.is64())); + } + } + + List fontInfoStreams = new ArrayList<>(); + + for (int i = 0; i < header.font_count; i++) { + long fontInfoOffset = font_info_offsets[i]; + if (fontInfoOffset == NO_OFFSET) { + fontInfoStreams.add(null); + } else { + long fontInfoSize = sizesOfOffsets.get(font_info_offsets[i]); + + stream.seek(fontInfoOffset, SeekMode.SET); + byte[] fontInfoData = stream.readBytes((int) fontInfoSize); + + fontInfoStreams.add(new ByteArrayDataStream(fontInfoData, stream.is64())); + } + } } public String getName() { @@ -70,6 +118,9 @@ public class IggyDataReader implements StructureInterface { StringBuilder sb = new StringBuilder(); sb.append("[\r\n"); sb.append("name ").append(name).append("\r\n"); + for (int i = 0; i < header.font_count; i++) { + sb.append("font[").append(i).append("] main_offset:").append(font_main_offsets[i]).append(" info_offset:").append(font_info_offsets[i]).append("\r\n"); + } sb.append("]"); return sb.toString(); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/iggy/IggyFile.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/iggy/IggyFile.java index 1153ce074..a26d9430e 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/iggy/IggyFile.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/iggy/IggyFile.java @@ -52,6 +52,7 @@ public class IggyFile extends AbstractDataStream implements AutoCloseable { //TODO: use these two for something List> indexTables = new ArrayList<>(); List> offsetTables = new ArrayList<>(); + List flashDataStreams = new ArrayList<>(); for (int i = 0; i < subFileEntries.size(); i++) { IggySubFileEntry entry = subFileEntries.get(i); @@ -64,19 +65,23 @@ public class IggyFile extends AbstractDataStream implements AutoCloseable { offsetTables.add(offsets); } else if (entry.type == IggySubFileEntry.TYPE_FLASH) { IggyFlashHeaderInterface hdr; - //if (is64()) { - //FIXME: Make 32 bit version work - hdr = new IggyFlashHeader64(dataStream); - /*} else { + if (is64()) { + hdr = new IggyFlashHeader64(dataStream); + } else { hdr = new IggyFlashHeader32(dataStream); - }*/ - System.out.println("hdr=" + hdr); - IggyDataReader dataReader = new IggyDataReader((IggyFlashHeader64) hdr, dataStream); - System.out.println("dataReader=" + dataReader); + } headers.add(hdr); - flashDataReaders.add(dataReader); + flashDataStreams.add(dataStream); } } + + for (int swfIndex = 0; swfIndex < headers.size(); swfIndex++) { + IggyFlashHeaderInterface hdr = headers.get(swfIndex); + System.out.println("hdr=" + hdr); + IggyDataReader dataReader = new IggyDataReader((IggyFlashHeader64) hdr /*FIXME for 32*/, flashDataStreams.get(swfIndex), offsetTables.get(swfIndex)); + System.out.println("dataReader=" + dataReader); + flashDataReaders.add(dataReader); + } } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/iggy/IggyFlashHeader64.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/iggy/IggyFlashHeader64.java index 65860fec6..208282fbd 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/iggy/IggyFlashHeader64.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/iggy/IggyFlashHeader64.java @@ -49,7 +49,7 @@ public class IggyFlashHeader64 implements IggyFlashHeaderInterface { @IggyFieldType(DataType.uint64_t) long fonts_offset; @IggyFieldType(DataType.uint64_t) - long font_infos_offset; + long unk_68; @IggyFieldType(DataType.uint64_t) long names_offset; // 0x70 relative offset to the names/import section of the file - end of fonts @IggyFieldType(DataType.uint64_t) @@ -104,7 +104,7 @@ public class IggyFlashHeader64 implements IggyFlashHeaderInterface { frame_rate = stream.readFloat(); unk_5C = stream.readUI32(); fonts_offset = stream.readUI64(); - font_infos_offset = stream.readUI64(); + unk_68 = stream.readUI64(); names_offset = stream.readUI64(); unk_offset5 = stream.readUI64(); unk_80 = stream.readUI64(); @@ -165,7 +165,7 @@ public class IggyFlashHeader64 implements IggyFlashHeaderInterface { sb.append("frame_rate ").append(frame_rate).append("\r\n"); sb.append("unk_5C ").append(unk_5C).append("\r\n"); sb.append("fonts_offset ").append(fonts_offset).append("\r\n"); - sb.append("font_infos_offset ").append(font_infos_offset).append("\r\n"); + sb.append("unk_68 ").append(unk_68).append("\r\n"); sb.append("names_offset ").append(names_offset).append("\r\n"); sb.append("unk_offset5 ").append(unk_offset5).append("\r\n"); sb.append("unk_80 ").append(unk_80).append("\r\n");