/* * brlyt.c * * * Created by Alex Marshall on 09/01/27. * Updated by Stephen Simpson on 09/03/11. * Copyright 2009 __MyCompanyName__. All rights reserved. * */ #include #include #include #include "types.h" #include "brlyt.h" #ifdef DEBUGBRLYT #define dbgprintf printf #else #define dbgprintf // #endif //DEBUGBRLYT char pic1_magic[] = "pic1"; char pan1_magic[] = "pan1"; char bnd1_magic[] = "bnd1"; char wnd1_magic[] = "wnd1"; char lyt1_magic[] = "lyt1"; char grp1_magic[] = "grp1"; char txl1_magic[] = "txl1"; char mat1_magic[] = "mat1"; char fnl1_magic[] = "fnl1"; char txt1_magic[] = "txt1"; char gre1_magic[] = "gre1"; char grs1_magic[] = "grs1"; char pae1_magic[] = "pae1"; char pas1_magic[] = "pas1"; static size_t BRLYT_fileoffset = 0; //linked_list_materials materials; static int FourCCsMatch(fourcc cc1, fourcc cc2) { dbgprintf("FourCCs\n"); int ret[4]; dbgprintf("Let's go %08x %08x\n", cc1, cc2); ret[0] = (cc1[0] == cc2[0]); dbgprintf("Got zero |%02x| |%02x| %d\n", cc1[0], cc2[0], ret[0]); ret[1] = (cc1[1] == cc2[1]); dbgprintf("Got one |%02x| |%02x| %d\n", cc1[1], cc2[1], ret[1]); ret[2] = (cc1[2] == cc2[2]); dbgprintf("Got two |%02x| |%02x| %d\n", cc1[2], cc2[2], ret[2]); ret[3] = (cc1[3] == cc2[3]); dbgprintf("Got three |%02x| |%02x| %d\n", cc1[3], cc2[3], ret[3]); int retval; if(ret[0] && ret[1] && ret[2] && ret[3]) retval = 1; else retval = 0; dbgprintf("Got retval %d\n", retval); return retval; } static void BRLYT_ReadDataFromMemoryX(void* destination, void* input, size_t size) { u8* out = (u8*)destination; u8* in = ((u8*)input) + BRLYT_fileoffset; memcpy(out, in, size); } static void BRLYT_ReadDataFromMemory(void* destination, void* input, size_t size) { BRLYT_ReadDataFromMemoryX(destination, input, size); BRLYT_fileoffset += size; } float float_swap_bytes(float float1) { unsigned char *float1c; float1c = (unsigned char*)&float1; unsigned char charTemp = 0x00; charTemp = float1c[0]; float1c[0] = float1c[3]; float1c[3] = charTemp; charTemp = 0x00; charTemp = float1c[1]; float1c[1] = float1c[2]; float1c[2] = charTemp; float *newFloat; newFloat = (float*)float1c; return *newFloat; } unsigned short short_swap_bytes(unsigned short short1) { unsigned char *short1c; short1c = (unsigned char*)&short1; unsigned char charTemp = 0x00; charTemp = short1c[0]; short1c[0] = short1c[1]; short1c[1] = charTemp; unsigned short *newShort; newShort = (unsigned short*)short1c; return *newShort; } int bit_extract(unsigned int num, unsigned int start, unsigned int end) { if (end == 100) end = start; //simple bitmask, figure out when awake //unsigned int mask = (2**(31 - start + 1) - 1) - (2**(31 - end) - 1) unsigned int mask; int first = 0; int firstMask = 0; if (start<32) firstMask = 1; for (first;first<31-start+1;first++) { firstMask *= 2; } firstMask -= 1; first = 0; int secondMask = 0; if (end<31) secondMask = 1; for (first;first< 31-end;first++) { secondMask *=2; } mask = firstMask = secondMask; int ret = (num & mask) >> (31 - end); return ret; } /* void get_opt(char* chunk, int startpos, bool enabled, int size, char* item_type) { // if (!enabled) { // return None, startpos if (item_type != "None") { //parse_data is your memcopy from chunk to struct_item_type ret = parse_data(chunk[startpos:startpos+size], item_type) }else if (size == 4) { ret = struct.unpack('>I', chunk[startpos:startpos+4])[0] }else if (size % 4 == 0) { ret = struct.unpack('>' + 'I'*(size/4), chunk[startpos:startpos+size]) }else raise Exception('unhandled') return ret, startpos + size } void get_array(char *chunk, int startpos, int array_size, int item_size, char *item_type): { ar = [] int pos = startpos; int n = 0; for (n;n disappears. //# 2nd --> no visible effect. //# 3rd --> disappears. //# 4th --> no visible effect. //# 4 * flags[6] mat['ua4'], mpos = get_opt(chunk, mpos, bit_extract(flags, 6), 4, ' 4b') //# 4 * flags[4] mat['ua5'], mpos = get_opt(chunk, mpos, bit_extract(flags, 4), 4, ' 4b') //# 4 * flags[19] mat['ua6'], mpos = get_opt(chunk, mpos, bit_extract(flags, 19), 4, '4b') //# 0x14 * flags[17-18] mat['ua7'], mpos = get_array(chunk, mpos, bit_extract(flags, 17, 18 ), 0x14, 'ua7') //# 4 * flags[14-16] mat['ua8'], mpos = get_array(chunk, mpos, bit_extract(flags, 14, 16 ), 4, '4b') //# 0x10 * flags[9-13] mat['ua9'], mpos = get_array(chunk, mpos, bit_extract(flags, 9, 13) , 0x10, '10b') //# 4 * flags[8], these are bytes btw mat['uaa'], mpos = get_opt(chunk, mpos, bit_extract(flags, 8), 4, ' 4b') //# 4 * flags[7] mat['uab'], mpos = get_opt(chunk, mpos, bit_extract(flags, 7), 4, ' 4b') if n < vars['num'] - 1 { next_offset, = struct.unpack('>I', chunk[pos+4:pos+8]) if next_offset - 8 != mpos: mat['~_insane'] = next_offset - 8 - mpos //# Extra shit we di dn't parse :( } mat['unk_bit_5'] = bit_extract(flags, 5) mat['unk_bits_0_3'] = bit_extract(flags, 0, 3) //# Overwritten by stu ff vars['materials'].append(mat) pos += 4 */ } } void PrintBRLYTEntry_gre1(brlyt_entry entry, u8* brlyt_file) { //brlyt_numoffs_chunk data; //BRLYT_fileoffset = entry.data_location; //BRLYT_ReadDataFromMemory(&data, brlyt_file, sizeof(brlyt_numoffs_chunk)); //PRINT CRAP printf(" Type: %c%c%c%c\n", entry.magic[0], entry.magic[1], entry.magic[2], entry.magic[3]); //printf(" num: %08x\n", be16(data.num)); //group end info } void PrintBRLYTEntry_grs1(brlyt_entry entry, u8* brlyt_file) { //brlyt_numoffs_chunk data; //BRLYT_fileoffset = entry.data_location; //BRLYT_ReadDataFromMemory(&data, brlyt_file, sizeof(brlyt_numoffs_chunk)); //PRINT CRAP printf(" Type: %c%c%c%c\n", entry.magic[0], entry.magic[1], entry.magic[2], entry.magic[3]); //printf(" num: %08x\n", be16(data.num)); //group start info } void PrintBRLYTEntry_pae1(brlyt_entry entry, u8* brlyt_file) { //brlyt_numoffs_chunk data; //BRLYT_fileoffset = entry.data_location; //BRLYT_ReadDataFromMemory(&data, brlyt_file, sizeof(brlyt_numoffs_chunk)); //PRINT CRAP printf(" Type: %c%c%c%c\n", entry.magic[0], entry.magic[1], entry.magic[2], entry.magic[3]); //printf(" num: %08x\n", be16(data.num)); //panel end info } void PrintBRLYTEntry_pas1(brlyt_entry entry, u8* brlyt_file) { //brlyt_numoffs_chunk data; //BRLYT_fileoffset = entry.data_location; //BRLYT_ReadDataFromMemory(&data, brlyt_file, sizeof(brlyt_numoffs_chunk)); //PRINT CRAP printf(" Type: %c%c%c%c\n", entry.magic[0], entry.magic[1], entry.magic[2], entry.magic[3]); //printf(" num: %08x\n", be16(data.num)); //panel start info } void PrintBRLYTEntries(brlyt_entry *entries, int entrycnt, u8* brlyt_file) { dbgprintf("Printing BRLYT Entries"); int i; for(i = 0; i < entrycnt; i++) { printf("\n Index %d (@%08x):\n", i, entries[i].data_location - 8); if((FourCCsMatch(entries[i].magic, pan1_magic) == 1)) { dbgprintf("pan1\n"); PrintBRLYTEntry_pan1(entries[i], brlyt_file); }else if((FourCCsMatch(entries[i].magic, txt1_magic) == 1)) { dbgprintf("txt1\n"); PrintBRLYTEntry_txt1(entries[i], brlyt_file); }else if((FourCCsMatch(entries[i].magic, pic1_magic) == 1)) { dbgprintf("pic1\n"); PrintBRLYTEntry_pic1(entries[i], brlyt_file); }else if((FourCCsMatch(entries[i].magic, wnd1_magic) == 1)) { dbgprintf("wnd1\n"); PrintBRLYTEntry_wnd1(entries[i], brlyt_file); }else if((FourCCsMatch(entries[i].magic, bnd1_magic) == 1)) { dbgprintf("bnd1\n"); PrintBRLYTEntry_bnd1(entries[i], brlyt_file); }else if((FourCCsMatch(entries[i].magic, lyt1_magic) == 1)) { dbgprintf("lyt1\n"); PrintBRLYTEntry_lyt1(entries[i], brlyt_file); }else if((FourCCsMatch(entries[i].magic, grp1_magic) == 1)) { dbgprintf("grp1\n"); PrintBRLYTEntry_grp1(entries[i], brlyt_file); }else if((FourCCsMatch(entries[i].magic, txl1_magic) == 1)) { dbgprintf("txl1\n"); PrintBRLYTEntry_txl1(entries[i], brlyt_file); }else if((FourCCsMatch(entries[i].magic, fnl1_magic) == 1)) { dbgprintf("img\n"); PrintBRLYTEntry_fnl1(entries[i], brlyt_file); }else if((FourCCsMatch(entries[i].magic, mat1_magic) == 1)) { dbgprintf("mat1\n"); PrintBRLYTEntry_mat1(entries[i], brlyt_file); }else if((FourCCsMatch(entries[i].magic, gre1_magic) == 1)) { dbgprintf("gre1\n"); PrintBRLYTEntry_gre1(entries[i], brlyt_file); }else if((FourCCsMatch(entries[i].magic, grs1_magic) == 1)) { dbgprintf("grs1\n"); PrintBRLYTEntry_grs1(entries[i], brlyt_file); }else if((FourCCsMatch(entries[i].magic, pae1_magic) == 1)) { dbgprintf("pae1\n"); PrintBRLYTEntry_pae1(entries[i], brlyt_file); }else if((FourCCsMatch(entries[i].magic, pas1_magic) == 1)) { dbgprintf("pas1\n"); PrintBRLYTEntry_pas1(entries[i], brlyt_file); }else printf(" Unknown tag (%c%c%c%c)!\n",entries[i].magic[0],entries[i].magic[1],entries[i].magic[2],entries[i].magic[3]); } } void parse_brlyt(char *filename) { FILE* fp = fopen(filename, "rb"); if(fp == NULL) { printf("Error! Couldn't open %s!\n", filename); exit(1); } fseek(fp, 0, SEEK_END); size_t file_size = ftell(fp); dbgprintf("Filesize is %d\n", file_size); u8* brlyt_file = (u8*)malloc(file_size); dbgprintf("brlyt_file allocated\n"); fseek(fp, 0, SEEK_SET); fread(brlyt_file, file_size, 1, fp); dbgprintf("brlyt_file read to.\n"); BRLYT_fileoffset = 0; brlyt_header header; BRLYT_ReadDataFromMemory(&header, brlyt_file, sizeof(brlyt_header)); BRLYT_CheckHeaderSanity(header, file_size); brlyt_entry *entries; BRLYT_fileoffset = be16(header.lyt_offset); brlyt_entry_header tempentry; int i; dbgprintf("curr %08x max %08x\n", BRLYT_fileoffset, file_size); for(i = 0; BRLYT_fileoffset < file_size; i++) { BRLYT_ReadDataFromMemoryX(&tempentry, brlyt_file, sizeof(brlyt_entry_header)); BRLYT_fileoffset += be32(tempentry.length); dbgprintf("curr %08x max %08x\n", BRLYT_fileoffset, file_size); } int entrycount = i; entries = (brlyt_entry*)calloc(entrycount, sizeof(brlyt_entry)); dbgprintf("%08x\n", entries); if(entries == NULL) { printf("Couldn't allocate for entries!\n"); exit(1); } BRLYT_fileoffset = be16(header.lyt_offset); for(i = 0; i < entrycount; i++) { dbgprintf("&(entries[i]) = %08x\n", &(entries[i])); BRLYT_ReadDataFromMemoryX(&tempentry, brlyt_file, sizeof(brlyt_entry_header)); memcpy(entries[i].magic, tempentry.magic, 4); entries[i].length = tempentry.length; entries[i].data_location = BRLYT_fileoffset + sizeof(brlyt_entry_header); BRLYT_fileoffset += be32(tempentry.length); } // int entrycnt = BRLYT_ReadEntries(brlyt_file, file_size, header, entries); dbgprintf("%08x\n", entries); printf("Parsed BRLYT! Information:\n"); printf("Main header:\n"); printf(" Magic: %c%c%c%c\n", header.magic[0], header.magic[1], header.magic[2], header.magic[3]); printf(" Unk1: %08x\n", be32(header.unk1)); printf(" Filesize: %lu\n", be32(header.filesize)); printf(" %s real file size!\n", be32(header.filesize) == file_size ? "Matches" : "Does not match"); printf(" Offset to lyt1: %04x\n", be16(header.lyt_offset)); printf(" Unk2: %04x\n", be16(header.unk2)); printf("\nBRLYT Entries:"); PrintBRLYTEntries(entries, entrycount, brlyt_file); } void make_brlyt(char* infile, char* outfile) { }