mirror of
https://git.huckle.dev/Huckles-Minecraft-Archive/jpexs-decompiler.git
synced 2026-06-29 10:05:40 +00:00
Iggy fonts reading - first beta
This commit is contained in:
@@ -1,9 +1,7 @@
|
||||
package com.jpexs.decompiler.flash.iggy;
|
||||
|
||||
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;
|
||||
@@ -25,6 +23,7 @@ public class IggyDataReader implements StructureInterface {
|
||||
|
||||
private IggyFlashHeader64 header;
|
||||
private Map<Long, Long> sizesOfOffsets;
|
||||
private List<Long> allOffsets;
|
||||
|
||||
public IggyDataReader(IggyFlashHeader64 header, AbstractDataStream stream, List<Long> offsets) throws IOException {
|
||||
this.header = header;
|
||||
@@ -33,75 +32,40 @@ public class IggyDataReader implements StructureInterface {
|
||||
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?
|
||||
this.allOffsets = offsets;
|
||||
readFromDataStream(stream);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void readFromDataStream(AbstractDataStream stream) throws IOException {
|
||||
//here is offset[0]
|
||||
StringBuilder nameBuilder = new StringBuilder();
|
||||
int charCnt = 0;
|
||||
do {
|
||||
char c = (char) stream.readUI16();
|
||||
charCnt++;
|
||||
if (c == '\0') {
|
||||
break;
|
||||
}
|
||||
nameBuilder.append(c);
|
||||
} while (true);
|
||||
stream.seek(48 - charCnt * 2, SeekMode.CUR);
|
||||
name = nameBuilder.toString();
|
||||
|
||||
stream.readUI64(); //pad 1
|
||||
|
||||
long[] fontOffsets = new long[(int) header.font_count];
|
||||
for (int i = 0; i < header.font_count; i++) {
|
||||
fontOffsets[i] = stream.position() + stream.readUI64();
|
||||
}
|
||||
List<Long> textOffsets = new ArrayList<>();
|
||||
|
||||
while (true) {
|
||||
long val = stream.readUI64();
|
||||
if (val == 1) {
|
||||
break;
|
||||
}
|
||||
textOffsets.add(stream.position() + val);
|
||||
}
|
||||
|
||||
//long pad_len = 840 - stream.position();
|
||||
stream.seek(840, SeekMode.SET);
|
||||
|
||||
Long lastOffset = null;
|
||||
texts = new HashMap<>();
|
||||
text2Font = new HashMap<>();
|
||||
long textDataSizes[] = new long[(int) header.font_count];
|
||||
|
||||
long offsetAfterTexts = header.as3_section_offset;
|
||||
|
||||
for (int i = 0; i < textOffsets.size(); i++) {
|
||||
long textOffset = textOffsets.get(i);
|
||||
if (lastOffset == null) {
|
||||
lastOffset = textOffset;
|
||||
} else {
|
||||
textDataSizes[i - 1] = textOffset - lastOffset;
|
||||
}
|
||||
}
|
||||
if (lastOffset != null) {
|
||||
textDataSizes[(int) header.font_count - 1] = offsetAfterTexts - lastOffset;
|
||||
}
|
||||
|
||||
for (int textIndex = 0; textIndex < textOffsets.size(); textIndex++) {
|
||||
long textOffset = textOffsets.get(textIndex);
|
||||
stream.seek(textOffset, SeekMode.SET);
|
||||
byte[] textData = stream.readBytes((int) textDataSizes[textIndex]);
|
||||
IggyText text = new IggyText(new ByteArrayDataStream(textData, stream.is64()));
|
||||
text2Font.put(textIndex, text.fontIndex);
|
||||
texts.put(textIndex, text);
|
||||
}
|
||||
//here is offset[1]
|
||||
int pad8 = 8 - (int) (stream.position() % 8);
|
||||
stream.seek(pad8, SeekMode.CUR);
|
||||
//here is offset [2]
|
||||
fonts = new HashMap<>();
|
||||
for (int fontIndex = 0; fontIndex < header.font_count; fontIndex++) {
|
||||
stream.seek(fontOffsets[fontIndex], SeekMode.SET);
|
||||
IggyFont font = new IggyFont(stream);
|
||||
fonts.put(fontIndex, font);
|
||||
int fontIndex = 0;
|
||||
for (int i = 2; i < allOffsets.size(); i++) {
|
||||
long offset = allOffsets.get(i);
|
||||
stream.seek(offset, SeekMode.SET);
|
||||
int type = stream.readUI16();
|
||||
stream.seek(-2, SeekMode.CUR);
|
||||
if (type == IggyFont.ID) {
|
||||
IggyFont font = new IggyFont(stream);
|
||||
fonts.put(fontIndex++, font);
|
||||
}
|
||||
if (type == IggyText.ID) {
|
||||
//TODO: Texts - incomplete
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -2,11 +2,9 @@ package com.jpexs.decompiler.flash.iggy;
|
||||
|
||||
import com.jpexs.decompiler.flash.iggy.annotations.IggyArrayFieldType;
|
||||
import com.jpexs.decompiler.flash.iggy.annotations.IggyFieldType;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import org.omg.CORBA.StructMemberHelper;
|
||||
|
||||
/**
|
||||
*
|
||||
@@ -14,6 +12,8 @@ import org.omg.CORBA.StructMemberHelper;
|
||||
*/
|
||||
public class IggyFont implements StructureInterface {
|
||||
|
||||
public static final int ID = 0xFF16;
|
||||
|
||||
@IggyFieldType(DataType.uint16_t)
|
||||
int type; //stejny pro rozdilne fonty
|
||||
@IggyFieldType(DataType.uint16_t)
|
||||
|
||||
@@ -234,6 +234,9 @@ public class IggyToSwfConvertor {
|
||||
swf.addTag(fontTag);
|
||||
}
|
||||
|
||||
/*
|
||||
//TODO: Texts, they are incomplete
|
||||
|
||||
Map<Integer, Integer> textIndex2CharId = new HashMap<>();
|
||||
|
||||
Set<Integer> textIds = file.getTextIds(swfIndex);
|
||||
@@ -269,7 +272,7 @@ public class IggyToSwfConvertor {
|
||||
textTag.setModified(true);
|
||||
swf.addTag(textTag);
|
||||
}
|
||||
|
||||
*/
|
||||
swf.addTag(
|
||||
new EndTag(swf));
|
||||
swf.setModified(
|
||||
|
||||
Reference in New Issue
Block a user