Parsing font main and font info

This commit is contained in:
Jindra Petřík
2016-11-24 07:40:47 +01:00
parent 3225c62564
commit d335373e7e
3 changed files with 73 additions and 17 deletions
@@ -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<Long, Long> sizesOfOffsets;
public IggyDataReader(IggyFlashHeader64 header, AbstractDataStream stream) throws IOException {
public IggyDataReader(IggyFlashHeader64 header, AbstractDataStream stream, List<Long> 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<ByteArrayDataStream> 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<ByteArrayDataStream> 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();
}
@@ -52,6 +52,7 @@ public class IggyFile extends AbstractDataStream implements AutoCloseable {
//TODO: use these two for something
List<List<Integer>> indexTables = new ArrayList<>();
List<List<Long>> offsetTables = new ArrayList<>();
List<AbstractDataStream> 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
@@ -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");