From 220fb1a196ac960f8265224ae8944c4e5738a844 Mon Sep 17 00:00:00 2001 From: Alexander Batalov Date: Sat, 28 May 2022 21:39:47 +0300 Subject: [PATCH] Decompile interface font byte swap functions See #17 --- src/font_manager.cc | 51 ++++++++++++++++++++++++++++++++++++++------- src/font_manager.h | 4 ++++ 2 files changed, 47 insertions(+), 8 deletions(-) diff --git a/src/font_manager.cc b/src/font_manager.cc index fc69afc..e3fd510 100644 --- a/src/font_manager.cc +++ b/src/font_manager.cc @@ -94,32 +94,32 @@ int interfaceFontLoad(int font_index) int sig; if (fileRead(&sig, 4, 1, stream) != 1) goto err; - sig = _byteswap_ulong(sig); + interfaceFontByteSwapInt32(&sig); if (sig != 0x41414646) goto err; if (fileRead(&(fontDescriptor->field_0), 2, 1, stream) != 1) goto err; - fontDescriptor->field_0 = _byteswap_ushort(fontDescriptor->field_0); + interfaceFontByteSwapInt16(&(fontDescriptor->field_0)); if (fileRead(&(fontDescriptor->letterSpacing), 2, 1, stream) != 1) goto err; - fontDescriptor->letterSpacing = _byteswap_ushort(fontDescriptor->letterSpacing); + interfaceFontByteSwapInt16(&(fontDescriptor->letterSpacing)); if (fileRead(&(fontDescriptor->wordSpacing), 2, 1, stream) != 1) goto err; - fontDescriptor->wordSpacing = _byteswap_ushort(fontDescriptor->wordSpacing); + interfaceFontByteSwapInt16(&(fontDescriptor->wordSpacing)); if (fileRead(&(fontDescriptor->field_6), 2, 1, stream) != 1) goto err; - fontDescriptor->field_6 = _byteswap_ushort(fontDescriptor->field_6); + interfaceFontByteSwapInt16(&(fontDescriptor->field_6)); for (int index = 0; index < 256; index++) { InterfaceFontGlyph* glyph = &(fontDescriptor->glyphs[index]); if (fileRead(&(glyph->width), 2, 1, stream) != 1) goto err; - glyph->width = _byteswap_ushort(glyph->width); + interfaceFontByteSwapInt16(&(glyph->width)); if (fileRead(&(glyph->field_2), 2, 1, stream) != 1) goto err; - glyph->field_2 = _byteswap_ushort(glyph->field_2); + interfaceFontByteSwapInt16(&(glyph->field_2)); if (fileRead(&(glyph->field_4), 4, 1, stream) != 1) goto err; - glyph->field_4 = _byteswap_ulong(glyph->field_4); + interfaceFontByteSwapInt32(&(glyph->field_4)); } fileSize -= sizeof(InterfaceFontDescriptor); @@ -335,3 +335,38 @@ void interfaceFontDrawImpl(unsigned char* buf, const char* string, int length, i _freeColorBlendTable(color & 0xFF); } + +// NOTE: Inlined. +// +// 0x442520 +void interfaceFontByteSwapUInt32(unsigned int* value) +{ + unsigned int swapped = *value; + unsigned short high = swapped >> 16; + // NOTE: Uninline. + interfaceFontByteSwapUInt16(&high); + unsigned short low = swapped & 0xFFFF; + // NOTE: Uninline. + interfaceFontByteSwapUInt16(&low); + *value = (low << 16) | high; +} + +// NOTE: 0x442520 with different signature. +void interfaceFontByteSwapInt32(int* value) +{ + interfaceFontByteSwapUInt32((unsigned int*)value); +} + +// 0x442568 +void interfaceFontByteSwapUInt16(unsigned short* value) +{ + unsigned short swapped = *value; + swapped = (swapped >> 8) | (swapped << 8); + *value = swapped; +} + +// NOTE: 0x442568 with different signature. +void interfaceFontByteSwapInt16(short* value) +{ + interfaceFontByteSwapUInt16((unsigned short*)value); +} diff --git a/src/font_manager.h b/src/font_manager.h index 42b1230..7720b4a 100644 --- a/src/font_manager.h +++ b/src/font_manager.h @@ -43,5 +43,9 @@ int interfaceFontGetLetterSpacingImpl(); int interfaceFontGetBufferSizeImpl(const char* string); int interfaceFontGetMonospacedCharacterWidthImpl(); void interfaceFontDrawImpl(unsigned char* buf, const char* string, int length, int pitch, int color); +void interfaceFontByteSwapUInt32(unsigned int* value); +void interfaceFontByteSwapInt32(int* value); +void interfaceFontByteSwapUInt16(unsigned short* value); +void interfaceFontByteSwapInt16(short* value); #endif /* FONT_MANAGER_H */