Skip to content

Instantly share code, notes, and snippets.

@mbikovitsky
Created September 29, 2013 13:11
Show Gist options
  • Save mbikovitsky/6752403 to your computer and use it in GitHub Desktop.
Save mbikovitsky/6752403 to your computer and use it in GitHub Desktop.
Hex Workshop *.PFF structure library
#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