mirror of
https://git.huckle.dev/Huckles-Minecraft-Archive/jpexs-decompiler.git
synced 2026-09-26 12:51:21 +00:00
Parsing font main and font info
This commit is contained in:
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user