Fix building g2.dat on x64

This commit is contained in:
Ted John 2016-08-27 14:05:25 +01:00
parent 94a31fe630
commit 68fc6371ae
1 changed files with 49 additions and 12 deletions

View File

@ -99,21 +99,43 @@ static bool sprite_file_open(const utf8 *path)
}
if (spriteFileHeader.num_entries > 0) {
int entryTableSize = spriteFileHeader.num_entries * sizeof(rct_g1_element);
int openEntryTableSize = spriteFileHeader.num_entries * sizeof(rct_g1_element_32bit);
rct_g1_element_32bit * openElements = (rct_g1_element_32bit *)malloc(openEntryTableSize);
if (openElements == NULL) {
SDL_RWclose(file);
return false;
}
spriteFileEntries = malloc(entryTableSize);
if (SDL_RWread(file, spriteFileEntries, entryTableSize, 1) != 1) {
if (SDL_RWread(file, openElements, openEntryTableSize, 1) != 1) {
free(openElements);
SDL_RWclose(file);
return false;
}
spriteFileData = malloc(spriteFileHeader.total_size);
if (SDL_RWread(file, spriteFileData, spriteFileHeader.total_size, 1) != 1) {
free(spriteFileData);
free(openElements);
SDL_RWclose(file);
return false;
}
sprite_entries_make_absolute();
int entryTableSize = spriteFileHeader.num_entries * sizeof(rct_g1_element);
spriteFileEntries = malloc(entryTableSize);
for (uint32 i = 0; i < spriteFileHeader.num_entries; i++) {
rct_g1_element_32bit * inElement = &openElements[i];
rct_g1_element * outElement = &spriteFileEntries[i];
outElement->offset = (uint8*)((uintptr_t)inElement->offset + (uintptr_t)spriteFileData);
outElement->width = inElement->width;
outElement->height = inElement->height;
outElement->x_offset = inElement->x_offset;
outElement->y_offset = inElement->y_offset;
outElement->flags = inElement->flags;
outElement->zoomed_offset = inElement->zoomed_offset;
}
free(openElements);
}
SDL_RWclose(file);
@ -132,18 +154,33 @@ static bool sprite_file_save(const char *path)
}
if (spriteFileHeader.num_entries > 0) {
sprite_entries_make_relative();
int entryTableSize = spriteFileHeader.num_entries * sizeof(rct_g1_element);
if (SDL_RWwrite(file, spriteFileEntries, entryTableSize, 1) != 1) {
sprite_entries_make_absolute();
int saveEntryTableSize = spriteFileHeader.num_entries * sizeof(rct_g1_element_32bit);
rct_g1_element_32bit * saveElements = (rct_g1_element_32bit *)malloc(saveEntryTableSize);
if (saveElements == NULL) {
SDL_RWclose(file);
return false;
} else {
sprite_entries_make_absolute();
}
for (uint32 i = 0; i < spriteFileHeader.num_entries; i++) {
rct_g1_element * inElement = &spriteFileEntries[i];
rct_g1_element_32bit * outElement = &saveElements[i];
outElement->offset = (uint32)((uintptr_t)inElement->offset - (uintptr_t)spriteFileData);
outElement->width = inElement->width;
outElement->height = inElement->height;
outElement->x_offset = inElement->x_offset;
outElement->y_offset = inElement->y_offset;
outElement->flags = inElement->flags;
outElement->zoomed_offset = inElement->zoomed_offset;
}
if (SDL_RWwrite(file, saveElements, saveEntryTableSize, 1) != 1) {
free(saveElements);
SDL_RWclose(file);
return false;
}
free(saveElements);
if (SDL_RWwrite(file, spriteFileData, spriteFileHeader.total_size, 1) != 1) {
SDL_RWclose(file);
return false;