Hex Workshop *.PFF structure library
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include "standard-types.hsl" | |
#pragma maxarray(65536) | |
#pragma hide() | |
typedef struct DDS_PIXELFORMAT { | |
DWORD dwSize; | |
DWORD dwFlags; | |
DWORD dwFourCC; | |
DWORD dwRGBBitCount; | |
DWORD dwRBitMask; | |
DWORD dwGBitMask; | |
DWORD dwBBitMask; | |
DWORD dwABitMask; | |
} DDS_PIXELFORMAT; | |
typedef struct DDS_HEADER { | |
DWORD dwMagic; | |
DWORD dwSize; | |
DWORD dwFlags; | |
DWORD dwHeight; | |
DWORD dwWidth; | |
DWORD dwPitchOrLinearSize; | |
DWORD dwDepth; | |
DWORD dwMipMapCount; | |
DWORD dwReserved1[11]; | |
DDS_PIXELFORMAT ddspf; | |
DWORD dwCaps; | |
DWORD dwCaps2; | |
DWORD dwCaps3; | |
DWORD dwCaps4; | |
DWORD dwReserved2; | |
} DDS_HEADER; | |
typedef struct FRAME_HEADER { | |
char szFrame[6]; | |
DWORD dwSize; | |
} FRAME_HEADER; | |
typedef struct VIDEO_HEADER { | |
char szVideo[6]; | |
DWORD dwSize; | |
} VIDEO_HEADER; | |
typedef struct FIRST_VIDEO_SECTION { | |
VIDEO_HEADER header; | |
DWORD dwUnknown; | |
DDS_HEADER ddsh; | |
BYTE data[header.dwSize - __getSizeOf(dwUnknown) - __getSizeOf(ddsh)]; | |
} FIRST_VIDEO_SECTION; | |
typedef struct VIDEO_SECTION { | |
VIDEO_HEADER header; | |
BYTE data[header.dwSize]; | |
} VIDEO_SECTION; | |
typedef struct AUDIO_SECTION { | |
char szSound[6]; | |
DWORD dwSize; | |
BYTE padding; | |
BYTE data[dwSize - __getSizeOf(padding)]; | |
__verify(__getUDWordAt(__getAddrOf(szSound)) == 1314213715); | |
} AUDIO_SECTION; | |
#pragma show() | |
struct PFF_HEADER { | |
char szFormat[7]; | |
char szVideo[10]; | |
char szAudio[13]; | |
char szLang[3]; | |
char szEndHeader[10]; | |
__verify(__getUQWordAt(__getAddrOf(szFormat)) == 6197006062198343248); | |
}; | |
struct FIRST_FRAME { | |
FRAME_HEADER header; | |
BYTE padding[8]; | |
FIRST_VIDEO_SECTION video; | |
AUDIO_SECTION audio; | |
char szEndFrame[9]; | |
}; | |
struct FRAME { | |
FRAME_HEADER header; | |
BYTE unknown[8]; | |
VIDEO_SECTION video; | |
AUDIO_SECTION audio; | |
char szEndFrame[9]; | |
}; | |
struct VIDEO_ONLY { | |
FRAME_HEADER header; | |
BYTE unknown[8]; | |
VIDEO_SECTION video; | |
char szEndFrame[9]; | |
}; | |
struct EMPTY { | |
FRAME_HEADER header; | |
BYTE unknown[8]; | |
char szEndFrame[9]; | |
}; | |
struct PFF_FOOTER { | |
char szEndFile[8]; | |
}; | |
function ParsePFF | |
{ | |
// Move to beginning | |
__setCaretPos(0); | |
// Add PFF header | |
UQWord pos = __addStructureAt(0, "PFF_HEADER", ""); | |
// Add first frame | |
pos += __addStructureAt(pos, "FIRST_FRAME", ""); | |
// Add remaining frames | |
while (__getUQWordAt(pos) != 19505650988240453) | |
{ | |
if (__getUDWordAt(pos + 18) == 1162103126) | |
{ | |
UDWord videoLen = __getUDWordAt(pos + 24); | |
UQWord videoEnd = pos + 28 + videoLen; | |
if (__getUDWordAt(videoEnd) == 1314213715) | |
{ | |
pos += __addStructureAt(pos, "FRAME", ""); | |
} else { | |
pos += __addStructureAt(pos, "VIDEO_ONLY", ""); | |
}; | |
} else { | |
pos += __addStructureAt(pos, "EMPTY", ""); | |
}; | |
}; | |
// Add footer | |
__addStructureAt(pos, "PFF_FOOTER", ""); | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment