From a3fb90b51c716efaa8fd6ca06963c277b1798210 Mon Sep 17 00:00:00 2001 From: red031000 Date: Wed, 13 Nov 2024 17:21:50 +0200 Subject: [PATCH] update nitrogfx to the latest version --- .clang-format-ignore | 1 + tools/nitrogfx/.gitignore | 1 + tools/nitrogfx/Makefile | 2 +- tools/nitrogfx/cJSON.c | 2264 ++++++++++++++++++++------------- tools/nitrogfx/cJSON.h | 15 +- tools/nitrogfx/font.c | 577 ++++++--- tools/nitrogfx/font.h | 4 + tools/nitrogfx/gfx.c | 1366 ++++++++++++-------- tools/nitrogfx/gfx.h | 4 +- tools/nitrogfx/json.c | 125 ++ tools/nitrogfx/json.h | 2 + tools/nitrogfx/lz.c | 275 ++-- tools/nitrogfx/lz.h | 4 +- tools/nitrogfx/main.c | 979 ++++++++------ tools/nitrogfx/nitrogfx-debug | Bin 1373376 -> 0 bytes tools/nitrogfx/options.h | 26 + tools/nitrogfx/util.c | 128 +- 17 files changed, 3516 insertions(+), 2257 deletions(-) delete mode 100755 tools/nitrogfx/nitrogfx-debug diff --git a/.clang-format-ignore b/.clang-format-ignore index 4607a0c8f5..a49edb5648 100644 --- a/.clang-format-ignore +++ b/.clang-format-ignore @@ -2,3 +2,4 @@ **/*.inc **/*.json lib/ +tools/nitrogfx/ diff --git a/tools/nitrogfx/.gitignore b/tools/nitrogfx/.gitignore index e00951e94e..80659a2f71 100644 --- a/tools/nitrogfx/.gitignore +++ b/tools/nitrogfx/.gitignore @@ -1,2 +1,3 @@ nitrogfx nitrogfx-debug +.vscode/ diff --git a/tools/nitrogfx/Makefile b/tools/nitrogfx/Makefile index 8b3c7c8d84..948416ea14 100644 --- a/tools/nitrogfx/Makefile +++ b/tools/nitrogfx/Makefile @@ -19,7 +19,7 @@ all: nitrogfx @: nitrogfx-debug: $(SRCS) convert_png.h gfx.h global.h jasc_pal.h lz.h rl.h util.h font.h json.h cJSON.h - $(CC) $(CFLAGS) -g -DDEBUG $(SRCS) -o $@ $(LDFLAGS) $(LIBS) -fsanitize=address,undefined + $(CC) $(CFLAGS) -g -DDEBUG $(SRCS) -o $@ $(LDFLAGS) $(LIBS) nitrogfx: $(SRCS) convert_png.h gfx.h global.h jasc_pal.h lz.h rl.h util.h font.h json.h cJSON.h $(CC) $(CFLAGS) -O2 $(SRCS) -o $@ $(LDFLAGS) $(LIBS) diff --git a/tools/nitrogfx/cJSON.c b/tools/nitrogfx/cJSON.c index d1a76821bb..d7c72363db 100644 --- a/tools/nitrogfx/cJSON.c +++ b/tools/nitrogfx/cJSON.c @@ -32,25 +32,25 @@ #pragma GCC visibility push(default) #endif #if defined(_MSC_VER) -#pragma warning(push) +#pragma warning (push) /* disable warning about single line comments in system headers */ -#pragma warning(disable : 4001) +#pragma warning (disable : 4001) #endif -#include -#include -#include -#include +#include #include +#include #include -#include +#include +#include +#include #ifdef ENABLE_LOCALES #include #endif #if defined(_MSC_VER) -#pragma warning(pop) +#pragma warning (pop) #endif #ifdef __GNUC__ #pragma GCC visibility pop @@ -81,7 +81,7 @@ #ifdef _WIN32 #define NAN sqrt(-1.0) #else -#define NAN 0.0 / 0.0 +#define NAN 0.0/0.0 #endif #endif @@ -91,54 +91,61 @@ typedef struct { } error; static error global_error = { NULL, 0 }; -CJSON_PUBLIC(const char *) -cJSON_GetErrorPtr(void) { - return (const char *)(global_error.json + global_error.position); +CJSON_PUBLIC(const char *) cJSON_GetErrorPtr(void) +{ + return (const char*) (global_error.json + global_error.position); } -CJSON_PUBLIC(char *) -cJSON_GetStringValue(const cJSON *const item) { - if (!cJSON_IsString(item)) { +CJSON_PUBLIC(char *) cJSON_GetStringValue(const cJSON * const item) +{ + if (!cJSON_IsString(item)) + { return NULL; } return item->valuestring; } -CJSON_PUBLIC(double) -cJSON_GetNumberValue(const cJSON *const item) { - if (!cJSON_IsNumber(item)) { - return (double)NAN; +CJSON_PUBLIC(double) cJSON_GetNumberValue(const cJSON * const item) +{ + if (!cJSON_IsNumber(item)) + { + return (double) NAN; } return item->valuedouble; } /* This is a safeguard to prevent copy-pasters from using incompatible C and header files */ -#if (CJSON_VERSION_MAJOR != 1) || (CJSON_VERSION_MINOR != 7) || (CJSON_VERSION_PATCH != 15) -#error cJSON.h and cJSON.c have different versions. Make sure that both have the same. +#if (CJSON_VERSION_MAJOR != 1) || (CJSON_VERSION_MINOR != 7) || (CJSON_VERSION_PATCH != 18) + #error cJSON.h and cJSON.c have different versions. Make sure that both have the same. #endif -CJSON_PUBLIC(const char *) -cJSON_Version(void) { +CJSON_PUBLIC(const char*) cJSON_Version(void) +{ static char version[15]; - snprintf(version, 15, "%i.%i.%i", CJSON_VERSION_MAJOR, CJSON_VERSION_MINOR, CJSON_VERSION_PATCH); + sprintf(version, "%i.%i.%i", CJSON_VERSION_MAJOR, CJSON_VERSION_MINOR, CJSON_VERSION_PATCH); return version; } /* Case insensitive string comparison, doesn't consider two NULL pointers equal though */ -static int case_insensitive_strcmp(const unsigned char *string1, const unsigned char *string2) { - if ((string1 == NULL) || (string2 == NULL)) { +static int case_insensitive_strcmp(const unsigned char *string1, const unsigned char *string2) +{ + if ((string1 == NULL) || (string2 == NULL)) + { return 1; } - if (string1 == string2) { + if (string1 == string2) + { return 0; } - for (; tolower(*string1) == tolower(*string2); (void)string1++, string2++) { - if (*string1 == '\0') { + for(; tolower(*string1) == tolower(*string2); (void)string1++, string2++) + { + if (*string1 == '\0') + { return 0; } } @@ -146,26 +153,30 @@ static int case_insensitive_strcmp(const unsigned char *string1, const unsigned return tolower(*string1) - tolower(*string2); } -typedef struct internal_hooks { +typedef struct internal_hooks +{ void *(CJSON_CDECL *allocate)(size_t size); - void(CJSON_CDECL *deallocate)(void *pointer); + void (CJSON_CDECL *deallocate)(void *pointer); void *(CJSON_CDECL *reallocate)(void *pointer, size_t size); } internal_hooks; #if defined(_MSC_VER) /* work around MSVC error C2322: '...' address of dllimport '...' is not static */ -static void *CJSON_CDECL internal_malloc(size_t size) { +static void * CJSON_CDECL internal_malloc(size_t size) +{ return malloc(size); } -static void CJSON_CDECL internal_free(void *pointer) { +static void CJSON_CDECL internal_free(void *pointer) +{ free(pointer); } -static void *CJSON_CDECL internal_realloc(void *pointer, size_t size) { +static void * CJSON_CDECL internal_realloc(void *pointer, size_t size) +{ return realloc(pointer, size); } #else -#define internal_malloc malloc -#define internal_free free +#define internal_malloc malloc +#define internal_free free #define internal_realloc realloc #endif @@ -174,17 +185,20 @@ static void *CJSON_CDECL internal_realloc(void *pointer, size_t size) { static internal_hooks global_hooks = { internal_malloc, internal_free, internal_realloc }; -static unsigned char *cJSON_strdup(const unsigned char *string, const internal_hooks *const hooks) { - size_t length = 0; +static unsigned char* cJSON_strdup(const unsigned char* string, const internal_hooks * const hooks) +{ + size_t length = 0; unsigned char *copy = NULL; - if (string == NULL) { + if (string == NULL) + { return NULL; } - length = strlen((const char *)string) + sizeof(""); - copy = (unsigned char *)hooks->allocate(length); - if (copy == NULL) { + length = strlen((const char*)string) + sizeof(""); + copy = (unsigned char*)hooks->allocate(length); + if (copy == NULL) + { return NULL; } memcpy(copy, string, length); @@ -192,37 +206,43 @@ static unsigned char *cJSON_strdup(const unsigned char *string, const internal_h return copy; } -CJSON_PUBLIC(void) -cJSON_InitHooks(cJSON_Hooks *hooks) { - if (hooks == NULL) { +CJSON_PUBLIC(void) cJSON_InitHooks(cJSON_Hooks* hooks) +{ + if (hooks == NULL) + { /* Reset hooks */ - global_hooks.allocate = malloc; + global_hooks.allocate = malloc; global_hooks.deallocate = free; global_hooks.reallocate = realloc; return; } global_hooks.allocate = malloc; - if (hooks->malloc_fn != NULL) { + if (hooks->malloc_fn != NULL) + { global_hooks.allocate = hooks->malloc_fn; } global_hooks.deallocate = free; - if (hooks->free_fn != NULL) { + if (hooks->free_fn != NULL) + { global_hooks.deallocate = hooks->free_fn; } /* use realloc only if both free and malloc are used */ global_hooks.reallocate = NULL; - if ((global_hooks.allocate == malloc) && (global_hooks.deallocate == free)) { + if ((global_hooks.allocate == malloc) && (global_hooks.deallocate == free)) + { global_hooks.reallocate = realloc; } } /* Internal constructor. */ -static cJSON *cJSON_New_Item(const internal_hooks *const hooks) { - cJSON *node = (cJSON *)hooks->allocate(sizeof(cJSON)); - if (node) { +static cJSON *cJSON_New_Item(const internal_hooks * const hooks) +{ + cJSON* node = (cJSON*)hooks->allocate(sizeof(cJSON)); + if (node) + { memset(node, '\0', sizeof(cJSON)); } @@ -230,19 +250,25 @@ static cJSON *cJSON_New_Item(const internal_hooks *const hooks) { } /* Delete a cJSON structure. */ -CJSON_PUBLIC(void) -cJSON_Delete(cJSON *item) { +CJSON_PUBLIC(void) cJSON_Delete(cJSON *item) +{ cJSON *next = NULL; - while (item != NULL) { + while (item != NULL) + { next = item->next; - if (!(item->type & cJSON_IsReference) && (item->child != NULL)) { + if (!(item->type & cJSON_IsReference) && (item->child != NULL)) + { cJSON_Delete(item->child); } - if (!(item->type & cJSON_IsReference) && (item->valuestring != NULL)) { + if (!(item->type & cJSON_IsReference) && (item->valuestring != NULL)) + { global_hooks.deallocate(item->valuestring); + item->valuestring = NULL; } - if (!(item->type & cJSON_StringIsConst) && (item->string != NULL)) { + if (!(item->type & cJSON_StringIsConst) && (item->string != NULL)) + { global_hooks.deallocate(item->string); + item->string = NULL; } global_hooks.deallocate(item); item = next; @@ -250,10 +276,11 @@ cJSON_Delete(cJSON *item) { } /* get the decimal point character of the current locale */ -static unsigned char get_decimal_point(void) { +static unsigned char get_decimal_point(void) +{ #ifdef ENABLE_LOCALES struct lconv *lconv = localeconv(); - return (unsigned char)lconv->decimal_point[0]; + return (unsigned char) lconv->decimal_point[0]; #else return '.'; #endif @@ -271,69 +298,79 @@ typedef struct /* check if the given size is left to read in a given parse buffer (starting with 1) */ #define can_read(buffer, size) ((buffer != NULL) && (((buffer)->offset + size) <= (buffer)->length)) /* check if the buffer can be accessed at the given index (starting with 0) */ -#define can_access_at_index(buffer, index) ((buffer != NULL) && (((buffer)->offset + index) < (buffer)->length)) +#define can_access_at_index(buffer, index) ((buffer != NULL) && (((buffer)->offset + index) < (buffer)->length)) #define cannot_access_at_index(buffer, index) (!can_access_at_index(buffer, index)) /* get a pointer to the buffer at the position */ #define buffer_at_offset(buffer) ((buffer)->content + (buffer)->offset) /* Parse the input text to generate a number, and populate the result into item. */ -static cJSON_bool parse_number(cJSON *const item, parse_buffer *const input_buffer) { - double number = 0; +static cJSON_bool parse_number(cJSON * const item, parse_buffer * const input_buffer) +{ + double number = 0; unsigned char *after_end = NULL; unsigned char number_c_string[64]; unsigned char decimal_point = get_decimal_point(); - size_t i = 0; + size_t i = 0; - if ((input_buffer == NULL) || (input_buffer->content == NULL)) { + if ((input_buffer == NULL) || (input_buffer->content == NULL)) + { return false; } /* copy the number into a temporary buffer and replace '.' with the decimal point * of the current locale (for strtod) * This also takes care of '\0' not necessarily being available for marking the end of the input */ - for (i = 0; (i < (sizeof(number_c_string) - 1)) && can_access_at_index(input_buffer, i); i++) { - switch (buffer_at_offset(input_buffer)[i]) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case '+': - case '-': - case 'e': - case 'E': - number_c_string[i] = buffer_at_offset(input_buffer)[i]; - break; + for (i = 0; (i < (sizeof(number_c_string) - 1)) && can_access_at_index(input_buffer, i); i++) + { + switch (buffer_at_offset(input_buffer)[i]) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case '+': + case '-': + case 'e': + case 'E': + number_c_string[i] = buffer_at_offset(input_buffer)[i]; + break; - case '.': - number_c_string[i] = decimal_point; - break; + case '.': + number_c_string[i] = decimal_point; + break; - default: - goto loop_end; + default: + goto loop_end; } } loop_end: number_c_string[i] = '\0'; - number = strtod((const char *)number_c_string, (char **)&after_end); - if (number_c_string == after_end) { + number = strtod((const char*)number_c_string, (char**)&after_end); + if (number_c_string == after_end) + { return false; /* parse_error */ } item->valuedouble = number; /* use saturation in case of overflow */ - if (number >= INT_MAX) { + if (number >= INT_MAX) + { item->valueint = INT_MAX; - } else if (number <= (double)INT_MIN) { + } + else if (number <= (double)INT_MIN) + { item->valueint = INT_MIN; - } else { + } + else + { item->valueint = (int)number; } @@ -344,35 +381,61 @@ static cJSON_bool parse_number(cJSON *const item, parse_buffer *const input_buff } /* don't ask me, but the original cJSON_SetNumberValue returns an integer or double */ -CJSON_PUBLIC(double) -cJSON_SetNumberHelper(cJSON *object, double number) { - if (number >= INT_MAX) { +CJSON_PUBLIC(double) cJSON_SetNumberHelper(cJSON *object, double number) +{ + if (number >= INT_MAX) + { object->valueint = INT_MAX; - } else if (number <= (double)INT_MIN) { + } + else if (number <= (double)INT_MIN) + { object->valueint = INT_MIN; - } else { + } + else + { object->valueint = (int)number; } return object->valuedouble = number; } -CJSON_PUBLIC(char *) -cJSON_SetValuestring(cJSON *object, const char *valuestring) { +/* Note: when passing a NULL valuestring, cJSON_SetValuestring treats this as an error and return NULL */ +CJSON_PUBLIC(char*) cJSON_SetValuestring(cJSON *object, const char *valuestring) +{ char *copy = NULL; + size_t v1_len; + size_t v2_len; /* if object's type is not cJSON_String or is cJSON_IsReference, it should not set valuestring */ - if (!(object->type & cJSON_String) || (object->type & cJSON_IsReference)) { + if ((object == NULL) || !(object->type & cJSON_String) || (object->type & cJSON_IsReference)) + { + return NULL; + } + /* return NULL if the object is corrupted or valuestring is NULL */ + if (object->valuestring == NULL || valuestring == NULL) + { return NULL; } - if (strlen(valuestring) <= strlen(object->valuestring)) { + + v1_len = strlen(valuestring); + v2_len = strlen(object->valuestring); + + if (v1_len <= v2_len) + { + /* strcpy does not handle overlapping string: [X1, X2] [Y1, Y2] => X2 < Y1 or Y2 < X1 */ + if (!( valuestring + v1_len < object->valuestring || object->valuestring + v2_len < valuestring )) + { + return NULL; + } strcpy(object->valuestring, valuestring); return object->valuestring; } - copy = (char *)cJSON_strdup((const unsigned char *)valuestring, &global_hooks); - if (copy == NULL) { + copy = (char*) cJSON_strdup((const unsigned char*)valuestring, &global_hooks); + if (copy == NULL) + { return NULL; } - if (object->valuestring != NULL) { + if (object->valuestring != NULL) + { cJSON_free(object->valuestring); } object->valuestring = copy; @@ -392,26 +455,31 @@ typedef struct } printbuffer; /* realloc printbuffer if necessary to have at least "needed" bytes more */ -static unsigned char *ensure(printbuffer *const p, size_t needed) { +static unsigned char* ensure(printbuffer * const p, size_t needed) +{ unsigned char *newbuffer = NULL; - size_t newsize = 0; + size_t newsize = 0; - if ((p == NULL) || (p->buffer == NULL)) { + if ((p == NULL) || (p->buffer == NULL)) + { return NULL; } - if ((p->length > 0) && (p->offset >= p->length)) { + if ((p->length > 0) && (p->offset >= p->length)) + { /* make sure that offset is valid */ return NULL; } - if (needed > INT_MAX) { + if (needed > INT_MAX) + { /* sizes bigger than INT_MAX are currently not supported */ return NULL; } needed += p->offset + 1; - if (needed <= p->length) { + if (needed <= p->length) + { return p->buffer + p->offset; } @@ -420,31 +488,42 @@ static unsigned char *ensure(printbuffer *const p, size_t needed) { } /* calculate new buffer size */ - if (needed > (INT_MAX / 2)) { + if (needed > (INT_MAX / 2)) + { /* overflow of int, use INT_MAX if possible */ - if (needed <= INT_MAX) { + if (needed <= INT_MAX) + { newsize = INT_MAX; - } else { + } + else + { return NULL; } - } else { + } + else + { newsize = needed * 2; } - if (p->hooks.reallocate != NULL) { + if (p->hooks.reallocate != NULL) + { /* reallocate with realloc if available */ - newbuffer = (unsigned char *)p->hooks.reallocate(p->buffer, newsize); - if (newbuffer == NULL) { + newbuffer = (unsigned char*)p->hooks.reallocate(p->buffer, newsize); + if (newbuffer == NULL) + { p->hooks.deallocate(p->buffer); p->length = 0; p->buffer = NULL; return NULL; } - } else { + } + else + { /* otherwise reallocate manually */ - newbuffer = (unsigned char *)p->hooks.allocate(newsize); - if (!newbuffer) { + newbuffer = (unsigned char*)p->hooks.allocate(newsize); + if (!newbuffer) + { p->hooks.deallocate(p->buffer); p->length = 0; p->buffer = NULL; @@ -462,65 +541,82 @@ static unsigned char *ensure(printbuffer *const p, size_t needed) { } /* calculate the new length of the string in a printbuffer and update the offset */ -static void update_offset(printbuffer *const buffer) { +static void update_offset(printbuffer * const buffer) +{ const unsigned char *buffer_pointer = NULL; - if ((buffer == NULL) || (buffer->buffer == NULL)) { + if ((buffer == NULL) || (buffer->buffer == NULL)) + { return; } buffer_pointer = buffer->buffer + buffer->offset; - buffer->offset += strlen((const char *)buffer_pointer); + buffer->offset += strlen((const char*)buffer_pointer); } /* securely comparison of floating-point variables */ -static cJSON_bool compare_double(double a, double b) { +static cJSON_bool compare_double(double a, double b) +{ double maxVal = fabs(a) > fabs(b) ? fabs(a) : fabs(b); - return fabs(a - b) <= maxVal * DBL_EPSILON; + return (fabs(a - b) <= maxVal * DBL_EPSILON); } /* Render the number nicely from the given item into a string. */ -static cJSON_bool print_number(const cJSON *const item, printbuffer *const output_buffer) { - unsigned char *output_pointer = NULL; - double d = item->valuedouble; - int length = 0; - size_t i = 0; - unsigned char number_buffer[26] = { 0 }; /* temporary buffer to print the number into */ - unsigned char decimal_point = get_decimal_point(); - double test = 0.0; - - if (output_buffer == NULL) { +static cJSON_bool print_number(const cJSON * const item, printbuffer * const output_buffer) +{ + unsigned char *output_pointer = NULL; + double d = item->valuedouble; + int length = 0; + size_t i = 0; + unsigned char number_buffer[26] = {0}; /* temporary buffer to print the number into */ + unsigned char decimal_point = get_decimal_point(); + double test = 0.0; + + if (output_buffer == NULL) + { return false; } /* This checks for NaN and Infinity */ - if (isnan(d) || isinf(d)) { - length = snprintf((char *)number_buffer, 26, "null"); - } else { + if (isnan(d) || isinf(d)) + { + length = sprintf((char*)number_buffer, "null"); + } + else if(d == (double)item->valueint) + { + length = sprintf((char*)number_buffer, "%d", item->valueint); + } + else + { /* Try 15 decimal places of precision to avoid nonsignificant nonzero digits */ - length = snprintf((char *)number_buffer, 26, "%1.15g", d); + length = sprintf((char*)number_buffer, "%1.15g", d); /* Check whether the original double can be recovered */ - if ((sscanf((char *)number_buffer, "%lg", &test) != 1) || !compare_double((double)test, d)) { + if ((sscanf((char*)number_buffer, "%lg", &test) != 1) || !compare_double((double)test, d)) + { /* If not, print with 17 decimal places of precision */ - length = snprintf((char *)number_buffer, 26, "%1.17g", d); + length = sprintf((char*)number_buffer, "%1.17g", d); } } - /* snprintf failed or buffer overrun occurred */ - if ((length < 0) || (length > (int)(sizeof(number_buffer) - 1))) { + /* sprintf failed or buffer overrun occurred */ + if ((length < 0) || (length > (int)(sizeof(number_buffer) - 1))) + { return false; } /* reserve appropriate space in the output */ output_pointer = ensure(output_buffer, (size_t)length + sizeof("")); - if (output_pointer == NULL) { + if (output_pointer == NULL) + { return false; } /* copy the printed number to the output and replace locale * dependent decimal point with '.' */ - for (i = 0; i < ((size_t)length); i++) { - if (number_buffer[i] == decimal_point) { + for (i = 0; i < ((size_t)length); i++) + { + if (number_buffer[i] == decimal_point) + { output_pointer[i] = '.'; continue; } @@ -535,24 +631,33 @@ static cJSON_bool print_number(const cJSON *const item, printbuffer *const outpu } /* parse 4 digit hexadecimal number */ -static unsigned parse_hex4(const unsigned char *const input) { +static unsigned parse_hex4(const unsigned char * const input) +{ unsigned int h = 0; - size_t i = 0; + size_t i = 0; - for (i = 0; i < 4; i++) { + for (i = 0; i < 4; i++) + { /* parse digit */ - if ((input[i] >= '0') && (input[i] <= '9')) { - h += (unsigned int)input[i] - '0'; - } else if ((input[i] >= 'A') && (input[i] <= 'F')) { - h += (unsigned int)10 + input[i] - 'A'; - } else if ((input[i] >= 'a') && (input[i] <= 'f')) { - h += (unsigned int)10 + input[i] - 'a'; - } else /* invalid */ + if ((input[i] >= '0') && (input[i] <= '9')) + { + h += (unsigned int) input[i] - '0'; + } + else if ((input[i] >= 'A') && (input[i] <= 'F')) + { + h += (unsigned int) 10 + input[i] - 'A'; + } + else if ((input[i] >= 'a') && (input[i] <= 'f')) + { + h += (unsigned int) 10 + input[i] - 'a'; + } + else /* invalid */ { return 0; } - if (i < 3) { + if (i < 3) + { /* shift left to make place for the next nibble */ h = h << 4; } @@ -563,16 +668,18 @@ static unsigned parse_hex4(const unsigned char *const input) { /* converts a UTF-16 literal to UTF-8 * A literal can be one or two sequences of the form \uXXXX */ -static unsigned char utf16_literal_to_utf8(const unsigned char *const input_pointer, const unsigned char *const input_end, unsigned char **output_pointer) { - long unsigned int codepoint = 0; - unsigned int first_code = 0; +static unsigned char utf16_literal_to_utf8(const unsigned char * const input_pointer, const unsigned char * const input_end, unsigned char **output_pointer) +{ + long unsigned int codepoint = 0; + unsigned int first_code = 0; const unsigned char *first_sequence = input_pointer; - unsigned char utf8_length = 0; - unsigned char utf8_position = 0; - unsigned char sequence_length = 0; - unsigned char first_byte_mark = 0; + unsigned char utf8_length = 0; + unsigned char utf8_position = 0; + unsigned char sequence_length = 0; + unsigned char first_byte_mark = 0; - if ((input_end - first_sequence) < 6) { + if ((input_end - first_sequence) < 6) + { /* input ends unexpectedly */ goto fail; } @@ -581,22 +688,26 @@ static unsigned char utf16_literal_to_utf8(const unsigned char *const input_poin first_code = parse_hex4(first_sequence + 2); /* check that the code is valid */ - if ((first_code >= 0xDC00) && (first_code <= 0xDFFF)) { + if (((first_code >= 0xDC00) && (first_code <= 0xDFFF))) + { goto fail; } /* UTF16 surrogate pair */ - if ((first_code >= 0xD800) && (first_code <= 0xDBFF)) { + if ((first_code >= 0xD800) && (first_code <= 0xDBFF)) + { const unsigned char *second_sequence = first_sequence + 6; - unsigned int second_code = 0; - sequence_length = 12; /* \uXXXX\uXXXX */ + unsigned int second_code = 0; + sequence_length = 12; /* \uXXXX\uXXXX */ - if ((input_end - second_sequence) < 6) { + if ((input_end - second_sequence) < 6) + { /* input ends unexpectedly */ goto fail; } - if ((second_sequence[0] != '\\') || (second_sequence[1] != 'u')) { + if ((second_sequence[0] != '\\') || (second_sequence[1] != 'u')) + { /* missing second half of the surrogate pair */ goto fail; } @@ -604,51 +715,68 @@ static unsigned char utf16_literal_to_utf8(const unsigned char *const input_poin /* get the second utf16 sequence */ second_code = parse_hex4(second_sequence + 2); /* check that the code is valid */ - if ((second_code < 0xDC00) || (second_code > 0xDFFF)) { + if ((second_code < 0xDC00) || (second_code > 0xDFFF)) + { /* invalid second half of the surrogate pair */ goto fail; } + /* calculate the unicode codepoint from the surrogate pair */ codepoint = 0x10000 + (((first_code & 0x3FF) << 10) | (second_code & 0x3FF)); - } else { + } + else + { sequence_length = 6; /* \uXXXX */ - codepoint = first_code; + codepoint = first_code; } /* encode as UTF-8 * takes at maximum 4 bytes to encode: * 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */ - if (codepoint < 0x80) { + if (codepoint < 0x80) + { /* normal ascii, encoding 0xxxxxxx */ utf8_length = 1; - } else if (codepoint < 0x800) { + } + else if (codepoint < 0x800) + { /* two bytes, encoding 110xxxxx 10xxxxxx */ - utf8_length = 2; + utf8_length = 2; first_byte_mark = 0xC0; /* 11000000 */ - } else if (codepoint < 0x10000) { + } + else if (codepoint < 0x10000) + { /* three bytes, encoding 1110xxxx 10xxxxxx 10xxxxxx */ - utf8_length = 3; + utf8_length = 3; first_byte_mark = 0xE0; /* 11100000 */ - } else if (codepoint <= 0x10FFFF) { + } + else if (codepoint <= 0x10FFFF) + { /* four bytes, encoding 1110xxxx 10xxxxxx 10xxxxxx 10xxxxxx */ - utf8_length = 4; + utf8_length = 4; first_byte_mark = 0xF0; /* 11110000 */ - } else { + } + else + { /* invalid unicode codepoint */ goto fail; } /* encode as utf8 */ - for (utf8_position = (unsigned char)(utf8_length - 1); utf8_position > 0; utf8_position--) { + for (utf8_position = (unsigned char)(utf8_length - 1); utf8_position > 0; utf8_position--) + { /* 10xxxxxx */ (*output_pointer)[utf8_position] = (unsigned char)((codepoint | 0x80) & 0xBF); codepoint >>= 6; } /* encode first byte */ - if (utf8_length > 1) { + if (utf8_length > 1) + { (*output_pointer)[0] = (unsigned char)((codepoint | first_byte_mark) & 0xFF); - } else { + } + else + { (*output_pointer)[0] = (unsigned char)(codepoint & 0x7F); } @@ -661,25 +789,30 @@ static unsigned char utf16_literal_to_utf8(const unsigned char *const input_poin } /* Parse the input text into an unescaped cinput, and populate item. */ -static cJSON_bool parse_string(cJSON *const item, parse_buffer *const input_buffer) { +static cJSON_bool parse_string(cJSON * const item, parse_buffer * const input_buffer) +{ const unsigned char *input_pointer = buffer_at_offset(input_buffer) + 1; - const unsigned char *input_end = buffer_at_offset(input_buffer) + 1; - unsigned char *output_pointer = NULL; - unsigned char *output = NULL; + const unsigned char *input_end = buffer_at_offset(input_buffer) + 1; + unsigned char *output_pointer = NULL; + unsigned char *output = NULL; /* not a string */ - if (buffer_at_offset(input_buffer)[0] != '\"') { + if (buffer_at_offset(input_buffer)[0] != '\"') + { goto fail; } { /* calculate approximate size of the output (overestimate) */ size_t allocation_length = 0; - size_t skipped_bytes = 0; - while (((size_t)(input_end - input_buffer->content) < input_buffer->length) && (*input_end != '\"')) { + size_t skipped_bytes = 0; + while (((size_t)(input_end - input_buffer->content) < input_buffer->length) && (*input_end != '\"')) + { /* is escape sequence */ - if (input_end[0] == '\\') { - if ((size_t)(input_end + 1 - input_buffer->content) >= input_buffer->length) { + if (input_end[0] == '\\') + { + if ((size_t)(input_end + 1 - input_buffer->content) >= input_buffer->length) + { /* prevent buffer overflow when last input character is a backslash */ goto fail; } @@ -688,64 +821,72 @@ static cJSON_bool parse_string(cJSON *const item, parse_buffer *const input_buff } input_end++; } - if (((size_t)(input_end - input_buffer->content) >= input_buffer->length) || (*input_end != '\"')) { + if (((size_t)(input_end - input_buffer->content) >= input_buffer->length) || (*input_end != '\"')) + { goto fail; /* string ended unexpectedly */ } /* This is at most how much we need for the output */ - allocation_length = (size_t)(input_end - buffer_at_offset(input_buffer)) - skipped_bytes; - output = (unsigned char *)input_buffer->hooks.allocate(allocation_length + sizeof("")); - if (output == NULL) { + allocation_length = (size_t) (input_end - buffer_at_offset(input_buffer)) - skipped_bytes; + output = (unsigned char*)input_buffer->hooks.allocate(allocation_length + sizeof("")); + if (output == NULL) + { goto fail; /* allocation failure */ } } output_pointer = output; /* loop through the string literal */ - while (input_pointer < input_end) { - if (*input_pointer != '\\') { + while (input_pointer < input_end) + { + if (*input_pointer != '\\') + { *output_pointer++ = *input_pointer++; } /* escape sequence */ - else { + else + { unsigned char sequence_length = 2; - if ((input_end - input_pointer) < 1) { + if ((input_end - input_pointer) < 1) + { goto fail; } - switch (input_pointer[1]) { - case 'b': - *output_pointer++ = '\b'; - break; - case 'f': - *output_pointer++ = '\f'; - break; - case 'n': - *output_pointer++ = '\n'; - break; - case 'r': - *output_pointer++ = '\r'; - break; - case 't': - *output_pointer++ = '\t'; - break; - case '\"': - case '\\': - case '/': - *output_pointer++ = input_pointer[1]; - break; - - /* UTF-16 literal */ - case 'u': - sequence_length = utf16_literal_to_utf8(input_pointer, input_end, &output_pointer); - if (sequence_length == 0) { - /* failed to convert UTF16-literal to UTF-8 */ + switch (input_pointer[1]) + { + case 'b': + *output_pointer++ = '\b'; + break; + case 'f': + *output_pointer++ = '\f'; + break; + case 'n': + *output_pointer++ = '\n'; + break; + case 'r': + *output_pointer++ = '\r'; + break; + case 't': + *output_pointer++ = '\t'; + break; + case '\"': + case '\\': + case '/': + *output_pointer++ = input_pointer[1]; + break; + + /* UTF-16 literal */ + case 'u': + sequence_length = utf16_literal_to_utf8(input_pointer, input_end, &output_pointer); + if (sequence_length == 0) + { + /* failed to convert UTF16-literal to UTF-8 */ + goto fail; + } + break; + + default: goto fail; - } - break; - - default: - goto fail; } input_pointer += sequence_length; } @@ -754,20 +895,23 @@ static cJSON_bool parse_string(cJSON *const item, parse_buffer *const input_buff /* zero terminate the output */ *output_pointer = '\0'; - item->type = cJSON_String; - item->valuestring = (char *)output; + item->type = cJSON_String; + item->valuestring = (char*)output; - input_buffer->offset = (size_t)(input_end - input_buffer->content); + input_buffer->offset = (size_t) (input_end - input_buffer->content); input_buffer->offset++; return true; fail: - if (output != NULL) { + if (output != NULL) + { input_buffer->hooks.deallocate(output); + output = NULL; } - if (input_pointer != NULL) { + if (input_pointer != NULL) + { input_buffer->offset = (size_t)(input_pointer - input_buffer->content); } @@ -775,59 +919,68 @@ static cJSON_bool parse_string(cJSON *const item, parse_buffer *const input_buff } /* Render the cstring provided to an escaped version that can be printed. */ -static cJSON_bool print_string_ptr(const unsigned char *const input, printbuffer *const output_buffer) { +static cJSON_bool print_string_ptr(const unsigned char * const input, printbuffer * const output_buffer) +{ const unsigned char *input_pointer = NULL; - unsigned char *output = NULL; - unsigned char *output_pointer = NULL; - size_t output_length = 0; + unsigned char *output = NULL; + unsigned char *output_pointer = NULL; + size_t output_length = 0; /* numbers of additional characters needed for escaping */ size_t escape_characters = 0; - if (output_buffer == NULL) { + if (output_buffer == NULL) + { return false; } /* empty string */ - if (input == NULL) { + if (input == NULL) + { output = ensure(output_buffer, sizeof("\"\"")); - if (output == NULL) { + if (output == NULL) + { return false; } - strcpy((char *)output, "\"\""); + strcpy((char*)output, "\"\""); return true; } /* set "flag" to 1 if something needs to be escaped */ - for (input_pointer = input; *input_pointer; input_pointer++) { - switch (*input_pointer) { - case '\"': - case '\\': - case '\b': - case '\f': - case '\n': - case '\r': - case '\t': - /* one character escape sequence */ - escape_characters++; - break; - default: - if (*input_pointer < 32) { - /* UTF-16 escape sequence uXXXX */ - escape_characters += 5; - } - break; + for (input_pointer = input; *input_pointer; input_pointer++) + { + switch (*input_pointer) + { + case '\"': + case '\\': + case '\b': + case '\f': + case '\n': + case '\r': + case '\t': + /* one character escape sequence */ + escape_characters++; + break; + default: + if (*input_pointer < 32) + { + /* UTF-16 escape sequence uXXXX */ + escape_characters += 5; + } + break; } } output_length = (size_t)(input_pointer - input) + escape_characters; output = ensure(output_buffer, output_length + sizeof("\"\"")); - if (output == NULL) { + if (output == NULL) + { return false; } /* no characters have to be escaped */ - if (escape_characters == 0) { + if (escape_characters == 0) + { output[0] = '\"'; memcpy(output + 1, input, output_length); output[output_length + 1] = '\"'; @@ -836,43 +989,48 @@ static cJSON_bool print_string_ptr(const unsigned char *const input, printbuffer return true; } - output[0] = '\"'; + output[0] = '\"'; output_pointer = output + 1; /* copy the string */ - for (input_pointer = input; *input_pointer != '\0'; (void)input_pointer++, output_pointer++) { - if ((*input_pointer > 31) && (*input_pointer != '\"') && (*input_pointer != '\\')) { + for (input_pointer = input; *input_pointer != '\0'; (void)input_pointer++, output_pointer++) + { + if ((*input_pointer > 31) && (*input_pointer != '\"') && (*input_pointer != '\\')) + { /* normal character, copy */ *output_pointer = *input_pointer; - } else { + } + else + { /* character needs to be escaped */ *output_pointer++ = '\\'; - switch (*input_pointer) { - case '\\': - *output_pointer = '\\'; - break; - case '\"': - *output_pointer = '\"'; - break; - case '\b': - *output_pointer = 'b'; - break; - case '\f': - *output_pointer = 'f'; - break; - case '\n': - *output_pointer = 'n'; - break; - case '\r': - *output_pointer = 'r'; - break; - case '\t': - *output_pointer = 't'; - break; - default: - /* escape and print as unicode codepoint */ - snprintf((char *)output_pointer, output_buffer->length - (output_pointer - output), "u%04x", *input_pointer); - output_pointer += 4; - break; + switch (*input_pointer) + { + case '\\': + *output_pointer = '\\'; + break; + case '\"': + *output_pointer = '\"'; + break; + case '\b': + *output_pointer = 'b'; + break; + case '\f': + *output_pointer = 'f'; + break; + case '\n': + *output_pointer = 'n'; + break; + case '\r': + *output_pointer = 'r'; + break; + case '\t': + *output_pointer = 't'; + break; + default: + /* escape and print as unicode codepoint */ + sprintf((char*)output_pointer, "u%04x", *input_pointer); + output_pointer += 4; + break; } } } @@ -883,33 +1041,39 @@ static cJSON_bool print_string_ptr(const unsigned char *const input, printbuffer } /* Invoke print_string_ptr (which is useful) on an item. */ -static cJSON_bool print_string(const cJSON *const item, printbuffer *const p) { - return print_string_ptr((unsigned char *)item->valuestring, p); +static cJSON_bool print_string(const cJSON * const item, printbuffer * const p) +{ + return print_string_ptr((unsigned char*)item->valuestring, p); } /* Predeclare these prototypes. */ -static cJSON_bool parse_value(cJSON *const item, parse_buffer *const input_buffer); -static cJSON_bool print_value(const cJSON *const item, printbuffer *const output_buffer); -static cJSON_bool parse_array(cJSON *const item, parse_buffer *const input_buffer); -static cJSON_bool print_array(const cJSON *const item, printbuffer *const output_buffer); -static cJSON_bool parse_object(cJSON *const item, parse_buffer *const input_buffer); -static cJSON_bool print_object(const cJSON *const item, printbuffer *const output_buffer); +static cJSON_bool parse_value(cJSON * const item, parse_buffer * const input_buffer); +static cJSON_bool print_value(const cJSON * const item, printbuffer * const output_buffer); +static cJSON_bool parse_array(cJSON * const item, parse_buffer * const input_buffer); +static cJSON_bool print_array(const cJSON * const item, printbuffer * const output_buffer); +static cJSON_bool parse_object(cJSON * const item, parse_buffer * const input_buffer); +static cJSON_bool print_object(const cJSON * const item, printbuffer * const output_buffer); /* Utility to jump whitespace and cr/lf */ -static parse_buffer *buffer_skip_whitespace(parse_buffer *const buffer) { - if ((buffer == NULL) || (buffer->content == NULL)) { +static parse_buffer *buffer_skip_whitespace(parse_buffer * const buffer) +{ + if ((buffer == NULL) || (buffer->content == NULL)) + { return NULL; } - if (cannot_access_at_index(buffer, 0)) { + if (cannot_access_at_index(buffer, 0)) + { return buffer; } - while (can_access_at_index(buffer, 0) && (buffer_at_offset(buffer)[0] <= 32)) { - buffer->offset++; + while (can_access_at_index(buffer, 0) && (buffer_at_offset(buffer)[0] <= 32)) + { + buffer->offset++; } - if (buffer->offset == buffer->length) { + if (buffer->offset == buffer->length) + { buffer->offset--; } @@ -917,23 +1081,27 @@ static parse_buffer *buffer_skip_whitespace(parse_buffer *const buffer) { } /* skip the UTF-8 BOM (byte order mark) if it is at the beginning of a buffer */ -static parse_buffer *skip_utf8_bom(parse_buffer *const buffer) { - if ((buffer == NULL) || (buffer->content == NULL) || (buffer->offset != 0)) { +static parse_buffer *skip_utf8_bom(parse_buffer * const buffer) +{ + if ((buffer == NULL) || (buffer->content == NULL) || (buffer->offset != 0)) + { return NULL; } - if (can_access_at_index(buffer, 4) && (strncmp((const char *)buffer_at_offset(buffer), "\xEF\xBB\xBF", 3) == 0)) { + if (can_access_at_index(buffer, 4) && (strncmp((const char*)buffer_at_offset(buffer), "\xEF\xBB\xBF", 3) == 0)) + { buffer->offset += 3; } return buffer; } -CJSON_PUBLIC(cJSON *) -cJSON_ParseWithOpts(const char *value, const char **return_parse_end, cJSON_bool require_null_terminated) { +CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return_parse_end, cJSON_bool require_null_terminated) +{ size_t buffer_length; - if (NULL == value) { + if (NULL == value) + { return NULL; } @@ -944,25 +1112,24 @@ cJSON_ParseWithOpts(const char *value, const char **return_parse_end, cJSON_bool } /* Parse an object - create a new root, and populate. */ -CJSON_PUBLIC(cJSON *) -cJSON_ParseWithLengthOpts(const char *value, size_t buffer_length, const char **return_parse_end, cJSON_bool require_null_terminated) { - parse_buffer buffer = { - 0, 0, 0, 0, { 0, 0, 0 } - }; +CJSON_PUBLIC(cJSON *) cJSON_ParseWithLengthOpts(const char *value, size_t buffer_length, const char **return_parse_end, cJSON_bool require_null_terminated) +{ + parse_buffer buffer = { 0, 0, 0, 0, { 0, 0, 0 } }; cJSON *item = NULL; /* reset error position */ - global_error.json = NULL; + global_error.json = NULL; global_error.position = 0; - if (value == NULL || 0 == buffer_length) { + if (value == NULL || 0 == buffer_length) + { goto fail; } - buffer.content = (const unsigned char *)value; - buffer.length = buffer_length; - buffer.offset = 0; - buffer.hooks = global_hooks; + buffer.content = (const unsigned char*)value; + buffer.length = buffer_length; + buffer.offset = 0; + buffer.hooks = global_hooks; item = cJSON_New_Item(&global_hooks); if (item == NULL) /* memory fail */ @@ -970,42 +1137,52 @@ cJSON_ParseWithLengthOpts(const char *value, size_t buffer_length, const char ** goto fail; } - if (!parse_value(item, buffer_skip_whitespace(skip_utf8_bom(&buffer)))) { + if (!parse_value(item, buffer_skip_whitespace(skip_utf8_bom(&buffer)))) + { /* parse failure. ep is set. */ goto fail; } /* if we require null-terminated JSON without appended garbage, skip and then check for a null terminator */ - if (require_null_terminated) { + if (require_null_terminated) + { buffer_skip_whitespace(&buffer); - if ((buffer.offset >= buffer.length) || buffer_at_offset(&buffer)[0] != '\0') { + if ((buffer.offset >= buffer.length) || buffer_at_offset(&buffer)[0] != '\0') + { goto fail; } } - if (return_parse_end) { - *return_parse_end = (const char *)buffer_at_offset(&buffer); + if (return_parse_end) + { + *return_parse_end = (const char*)buffer_at_offset(&buffer); } return item; fail: - if (item != NULL) { + if (item != NULL) + { cJSON_Delete(item); } - if (value != NULL) { + if (value != NULL) + { error local_error; - local_error.json = (const unsigned char *)value; + local_error.json = (const unsigned char*)value; local_error.position = 0; - if (buffer.offset < buffer.length) { + if (buffer.offset < buffer.length) + { local_error.position = buffer.offset; - } else if (buffer.length > 0) { + } + else if (buffer.length > 0) + { local_error.position = buffer.length - 1; } - if (return_parse_end != NULL) { - *return_parse_end = (const char *)local_error.json + local_error.position; + if (return_parse_end != NULL) + { + *return_parse_end = (const char*)local_error.json + local_error.position; } global_error = local_error; @@ -1015,19 +1192,20 @@ cJSON_ParseWithLengthOpts(const char *value, size_t buffer_length, const char ** } /* Default options for cJSON_Parse */ -CJSON_PUBLIC(cJSON *) -cJSON_Parse(const char *value) { +CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value) +{ return cJSON_ParseWithOpts(value, 0, 0); } -CJSON_PUBLIC(cJSON *) -cJSON_ParseWithLength(const char *value, size_t buffer_length) { +CJSON_PUBLIC(cJSON *) cJSON_ParseWithLength(const char *value, size_t buffer_length) +{ return cJSON_ParseWithLengthOpts(value, buffer_length, 0, 0); } #define cjson_min(a, b) (((a) < (b)) ? (a) : (b)) -static unsigned char *print(const cJSON *const item, cJSON_bool format, const internal_hooks *const hooks) { +static unsigned char *print(const cJSON * const item, cJSON_bool format, const internal_hooks * const hooks) +{ static const size_t default_buffer_size = 256; printbuffer buffer[1]; unsigned char *printed = NULL; @@ -1035,31 +1213,36 @@ static unsigned char *print(const cJSON *const item, cJSON_bool format, const in memset(buffer, 0, sizeof(buffer)); /* create buffer */ - buffer->buffer = (unsigned char *)hooks->allocate(default_buffer_size); + buffer->buffer = (unsigned char*) hooks->allocate(default_buffer_size); buffer->length = default_buffer_size; buffer->format = format; - buffer->hooks = *hooks; - if (buffer->buffer == NULL) { + buffer->hooks = *hooks; + if (buffer->buffer == NULL) + { goto fail; } /* print the value */ - if (!print_value(item, buffer)) { + if (!print_value(item, buffer)) + { goto fail; } update_offset(buffer); /* check if reallocate is available */ - if (hooks->reallocate != NULL) { - printed = (unsigned char *)hooks->reallocate(buffer->buffer, buffer->offset + 1); + if (hooks->reallocate != NULL) + { + printed = (unsigned char*) hooks->reallocate(buffer->buffer, buffer->offset + 1); if (printed == NULL) { goto fail; } buffer->buffer = NULL; - } else /* otherwise copy the JSON over to a new buffer */ + } + else /* otherwise copy the JSON over to a new buffer */ { - printed = (unsigned char *)hooks->allocate(buffer->offset + 1); - if (printed == NULL) { + printed = (unsigned char*) hooks->allocate(buffer->offset + 1); + if (printed == NULL) + { goto fail; } memcpy(printed, buffer->buffer, cjson_min(buffer->length, buffer->offset + 1)); @@ -1067,122 +1250,137 @@ static unsigned char *print(const cJSON *const item, cJSON_bool format, const in /* free the buffer */ hooks->deallocate(buffer->buffer); + buffer->buffer = NULL; } return printed; fail: - if (buffer->buffer != NULL) { + if (buffer->buffer != NULL) + { hooks->deallocate(buffer->buffer); + buffer->buffer = NULL; } - if (printed != NULL) { + if (printed != NULL) + { hooks->deallocate(printed); + printed = NULL; } return NULL; } /* Render a cJSON item/entity/structure to text. */ -CJSON_PUBLIC(char *) -cJSON_Print(const cJSON *item) { - return (char *)print(item, true, &global_hooks); +CJSON_PUBLIC(char *) cJSON_Print(const cJSON *item) +{ + return (char*)print(item, true, &global_hooks); } -CJSON_PUBLIC(char *) -cJSON_PrintUnformatted(const cJSON *item) { - return (char *)print(item, false, &global_hooks); +CJSON_PUBLIC(char *) cJSON_PrintUnformatted(const cJSON *item) +{ + return (char*)print(item, false, &global_hooks); } -CJSON_PUBLIC(char *) -cJSON_PrintBuffered(const cJSON *item, int prebuffer, cJSON_bool fmt) { - printbuffer p = { - 0, 0, 0, 0, 0, 0, { 0, 0, 0 } - }; +CJSON_PUBLIC(char *) cJSON_PrintBuffered(const cJSON *item, int prebuffer, cJSON_bool fmt) +{ + printbuffer p = { 0, 0, 0, 0, 0, 0, { 0, 0, 0 } }; - if (prebuffer < 0) { + if (prebuffer < 0) + { return NULL; } - p.buffer = (unsigned char *)global_hooks.allocate((size_t)prebuffer); - if (!p.buffer) { + p.buffer = (unsigned char*)global_hooks.allocate((size_t)prebuffer); + if (!p.buffer) + { return NULL; } - p.length = (size_t)prebuffer; - p.offset = 0; + p.length = (size_t)prebuffer; + p.offset = 0; p.noalloc = false; - p.format = fmt; - p.hooks = global_hooks; + p.format = fmt; + p.hooks = global_hooks; - if (!print_value(item, &p)) { + if (!print_value(item, &p)) + { global_hooks.deallocate(p.buffer); + p.buffer = NULL; return NULL; } - return (char *)p.buffer; + return (char*)p.buffer; } -CJSON_PUBLIC(cJSON_bool) -cJSON_PrintPreallocated(cJSON *item, char *buffer, const int length, const cJSON_bool format) { - printbuffer p = { - 0, 0, 0, 0, 0, 0, { 0, 0, 0 } - }; +CJSON_PUBLIC(cJSON_bool) cJSON_PrintPreallocated(cJSON *item, char *buffer, const int length, const cJSON_bool format) +{ + printbuffer p = { 0, 0, 0, 0, 0, 0, { 0, 0, 0 } }; - if ((length < 0) || (buffer == NULL)) { + if ((length < 0) || (buffer == NULL)) + { return false; } - p.buffer = (unsigned char *)buffer; - p.length = (size_t)length; - p.offset = 0; + p.buffer = (unsigned char*)buffer; + p.length = (size_t)length; + p.offset = 0; p.noalloc = true; - p.format = format; - p.hooks = global_hooks; + p.format = format; + p.hooks = global_hooks; return print_value(item, &p); } /* Parser core - when encountering text, process appropriately. */ -static cJSON_bool parse_value(cJSON *const item, parse_buffer *const input_buffer) { - if ((input_buffer == NULL) || (input_buffer->content == NULL)) { +static cJSON_bool parse_value(cJSON * const item, parse_buffer * const input_buffer) +{ + if ((input_buffer == NULL) || (input_buffer->content == NULL)) + { return false; /* no input */ } /* parse the different types of values */ /* null */ - if (can_read(input_buffer, 4) && (strncmp((const char *)buffer_at_offset(input_buffer), "null", 4) == 0)) { + if (can_read(input_buffer, 4) && (strncmp((const char*)buffer_at_offset(input_buffer), "null", 4) == 0)) + { item->type = cJSON_NULL; input_buffer->offset += 4; return true; } /* false */ - if (can_read(input_buffer, 5) && (strncmp((const char *)buffer_at_offset(input_buffer), "false", 5) == 0)) { + if (can_read(input_buffer, 5) && (strncmp((const char*)buffer_at_offset(input_buffer), "false", 5) == 0)) + { item->type = cJSON_False; input_buffer->offset += 5; return true; } /* true */ - if (can_read(input_buffer, 4) && (strncmp((const char *)buffer_at_offset(input_buffer), "true", 4) == 0)) { - item->type = cJSON_True; + if (can_read(input_buffer, 4) && (strncmp((const char*)buffer_at_offset(input_buffer), "true", 4) == 0)) + { + item->type = cJSON_True; item->valueint = 1; input_buffer->offset += 4; return true; } /* string */ - if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '\"')) { + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '\"')) + { return parse_string(item, input_buffer); } /* number */ - if (can_access_at_index(input_buffer, 0) && ((buffer_at_offset(input_buffer)[0] == '-') || ((buffer_at_offset(input_buffer)[0] >= '0') && (buffer_at_offset(input_buffer)[0] <= '9')))) { + if (can_access_at_index(input_buffer, 0) && ((buffer_at_offset(input_buffer)[0] == '-') || ((buffer_at_offset(input_buffer)[0] >= '0') && (buffer_at_offset(input_buffer)[0] <= '9')))) + { return parse_number(item, input_buffer); } /* array */ - if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '[')) { + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '[')) + { return parse_array(item, input_buffer); } /* object */ - if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '{')) { + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '{')) + { return parse_object(item, input_buffer); } @@ -1190,94 +1388,108 @@ static cJSON_bool parse_value(cJSON *const item, parse_buffer *const input_buffe } /* Render a value to text. */ -static cJSON_bool print_value(const cJSON *const item, printbuffer *const output_buffer) { +static cJSON_bool print_value(const cJSON * const item, printbuffer * const output_buffer) +{ unsigned char *output = NULL; - if ((item == NULL) || (output_buffer == NULL)) { + if ((item == NULL) || (output_buffer == NULL)) + { return false; } - switch ((item->type) & 0xFF) { - case cJSON_NULL: - output = ensure(output_buffer, 5); - if (output == NULL) { - return false; - } - strcpy((char *)output, "null"); - return true; + switch ((item->type) & 0xFF) + { + case cJSON_NULL: + output = ensure(output_buffer, 5); + if (output == NULL) + { + return false; + } + strcpy((char*)output, "null"); + return true; - case cJSON_False: - output = ensure(output_buffer, 6); - if (output == NULL) { - return false; - } - strcpy((char *)output, "false"); - return true; + case cJSON_False: + output = ensure(output_buffer, 6); + if (output == NULL) + { + return false; + } + strcpy((char*)output, "false"); + return true; - case cJSON_True: - output = ensure(output_buffer, 5); - if (output == NULL) { - return false; - } - strcpy((char *)output, "true"); - return true; + case cJSON_True: + output = ensure(output_buffer, 5); + if (output == NULL) + { + return false; + } + strcpy((char*)output, "true"); + return true; - case cJSON_Number: - return print_number(item, output_buffer); + case cJSON_Number: + return print_number(item, output_buffer); - case cJSON_Raw: { - size_t raw_length = 0; - if (item->valuestring == NULL) { - return false; - } + case cJSON_Raw: + { + size_t raw_length = 0; + if (item->valuestring == NULL) + { + return false; + } - raw_length = strlen(item->valuestring) + sizeof(""); - output = ensure(output_buffer, raw_length); - if (output == NULL) { - return false; + raw_length = strlen(item->valuestring) + sizeof(""); + output = ensure(output_buffer, raw_length); + if (output == NULL) + { + return false; + } + memcpy(output, item->valuestring, raw_length); + return true; } - memcpy(output, item->valuestring, raw_length); - return true; - } - case cJSON_String: - return print_string(item, output_buffer); + case cJSON_String: + return print_string(item, output_buffer); - case cJSON_Array: - return print_array(item, output_buffer); + case cJSON_Array: + return print_array(item, output_buffer); - case cJSON_Object: - return print_object(item, output_buffer); + case cJSON_Object: + return print_object(item, output_buffer); - default: - return false; + default: + return false; } } /* Build an array from input text. */ -static cJSON_bool parse_array(cJSON *const item, parse_buffer *const input_buffer) { - cJSON *head = NULL; /* head of the linked list */ +static cJSON_bool parse_array(cJSON * const item, parse_buffer * const input_buffer) +{ + cJSON *head = NULL; /* head of the linked list */ cJSON *current_item = NULL; - if (input_buffer->depth >= CJSON_NESTING_LIMIT) { + if (input_buffer->depth >= CJSON_NESTING_LIMIT) + { return false; /* to deeply nested */ } input_buffer->depth++; - if (buffer_at_offset(input_buffer)[0] != '[') { + if (buffer_at_offset(input_buffer)[0] != '[') + { /* not an array */ goto fail; } input_buffer->offset++; buffer_skip_whitespace(input_buffer); - if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == ']')) { + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == ']')) + { /* empty array */ goto success; } /* check if we skipped to the end of the buffer */ - if (cannot_access_at_index(input_buffer, 0)) { + if (cannot_access_at_index(input_buffer, 0)) + { input_buffer->offset--; goto fail; } @@ -1285,34 +1497,42 @@ static cJSON_bool parse_array(cJSON *const item, parse_buffer *const input_buffe /* step back to character in front of the first element */ input_buffer->offset--; /* loop through the comma separated array elements */ - do { + do + { /* allocate next item */ cJSON *new_item = cJSON_New_Item(&(input_buffer->hooks)); - if (new_item == NULL) { + if (new_item == NULL) + { goto fail; /* allocation failure */ } /* attach next item to list */ - if (head == NULL) { + if (head == NULL) + { /* start the linked list */ current_item = head = new_item; - } else { + } + else + { /* add to the end and advance */ current_item->next = new_item; - new_item->prev = current_item; - current_item = new_item; + new_item->prev = current_item; + current_item = new_item; } /* parse next value */ input_buffer->offset++; buffer_skip_whitespace(input_buffer); - if (!parse_value(current_item, input_buffer)) { + if (!parse_value(current_item, input_buffer)) + { goto fail; /* failed to parse value */ } buffer_skip_whitespace(input_buffer); - } while (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == ',')); + } + while (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == ',')); - if (cannot_access_at_index(input_buffer, 0) || buffer_at_offset(input_buffer)[0] != ']') { + if (cannot_access_at_index(input_buffer, 0) || buffer_at_offset(input_buffer)[0] != ']') + { goto fail; /* expected end of array */ } @@ -1323,7 +1543,7 @@ static cJSON_bool parse_array(cJSON *const item, parse_buffer *const input_buffe head->prev = current_item; } - item->type = cJSON_Array; + item->type = cJSON_Array; item->child = head; input_buffer->offset++; @@ -1331,7 +1551,8 @@ static cJSON_bool parse_array(cJSON *const item, parse_buffer *const input_buffe return true; fail: - if (head != NULL) { + if (head != NULL) + { cJSON_Delete(head); } @@ -1339,19 +1560,22 @@ static cJSON_bool parse_array(cJSON *const item, parse_buffer *const input_buffe } /* Render an array to text */ -static cJSON_bool print_array(const cJSON *const item, printbuffer *const output_buffer) { +static cJSON_bool print_array(const cJSON * const item, printbuffer * const output_buffer) +{ unsigned char *output_pointer = NULL; - size_t length = 0; - cJSON *current_element = item->child; + size_t length = 0; + cJSON *current_element = item->child; - if (output_buffer == NULL) { + if (output_buffer == NULL) + { return false; } /* Compose the output array. */ /* opening square bracket */ output_pointer = ensure(output_buffer, 1); - if (output_pointer == NULL) { + if (output_pointer == NULL) + { return false; } @@ -1359,19 +1583,24 @@ static cJSON_bool print_array(const cJSON *const item, printbuffer *const output output_buffer->offset++; output_buffer->depth++; - while (current_element != NULL) { - if (!print_value(current_element, output_buffer)) { + while (current_element != NULL) + { + if (!print_value(current_element, output_buffer)) + { return false; } update_offset(output_buffer); - if (current_element->next) { - length = (size_t)(output_buffer->format ? 2 : 1); + if (current_element->next) + { + length = (size_t) (output_buffer->format ? 2 : 1); output_pointer = ensure(output_buffer, length + 1); - if (output_pointer == NULL) { + if (output_pointer == NULL) + { return false; } *output_pointer++ = ','; - if (output_buffer->format) { + if(output_buffer->format) + { *output_pointer++ = ' '; } *output_pointer = '\0'; @@ -1381,38 +1610,44 @@ static cJSON_bool print_array(const cJSON *const item, printbuffer *const output } output_pointer = ensure(output_buffer, 2); - if (output_pointer == NULL) { + if (output_pointer == NULL) + { return false; } *output_pointer++ = ']'; - *output_pointer = '\0'; + *output_pointer = '\0'; output_buffer->depth--; return true; } /* Build an object from the text. */ -static cJSON_bool parse_object(cJSON *const item, parse_buffer *const input_buffer) { - cJSON *head = NULL; /* linked list head */ +static cJSON_bool parse_object(cJSON * const item, parse_buffer * const input_buffer) +{ + cJSON *head = NULL; /* linked list head */ cJSON *current_item = NULL; - if (input_buffer->depth >= CJSON_NESTING_LIMIT) { + if (input_buffer->depth >= CJSON_NESTING_LIMIT) + { return false; /* to deeply nested */ } input_buffer->depth++; - if (cannot_access_at_index(input_buffer, 0) || (buffer_at_offset(input_buffer)[0] != '{')) { + if (cannot_access_at_index(input_buffer, 0) || (buffer_at_offset(input_buffer)[0] != '{')) + { goto fail; /* not an object */ } input_buffer->offset++; buffer_skip_whitespace(input_buffer); - if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '}')) { + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '}')) + { goto success; /* empty object */ } /* check if we skipped to the end of the buffer */ - if (cannot_access_at_index(input_buffer, 0)) { + if (cannot_access_at_index(input_buffer, 0)) + { input_buffer->offset--; goto fail; } @@ -1420,50 +1655,65 @@ static cJSON_bool parse_object(cJSON *const item, parse_buffer *const input_buff /* step back to character in front of the first element */ input_buffer->offset--; /* loop through the comma separated array elements */ - do { + do + { /* allocate next item */ cJSON *new_item = cJSON_New_Item(&(input_buffer->hooks)); - if (new_item == NULL) { + if (new_item == NULL) + { goto fail; /* allocation failure */ } /* attach next item to list */ - if (head == NULL) { + if (head == NULL) + { /* start the linked list */ current_item = head = new_item; - } else { + } + else + { /* add to the end and advance */ current_item->next = new_item; - new_item->prev = current_item; - current_item = new_item; + new_item->prev = current_item; + current_item = new_item; + } + + if (cannot_access_at_index(input_buffer, 1)) + { + goto fail; /* nothing comes after the comma */ } /* parse the name of the child */ input_buffer->offset++; buffer_skip_whitespace(input_buffer); - if (!parse_string(current_item, input_buffer)) { + if (!parse_string(current_item, input_buffer)) + { goto fail; /* failed to parse name */ } buffer_skip_whitespace(input_buffer); /* swap valuestring and string, because we parsed the name */ - current_item->string = current_item->valuestring; + current_item->string = current_item->valuestring; current_item->valuestring = NULL; - if (cannot_access_at_index(input_buffer, 0) || (buffer_at_offset(input_buffer)[0] != ':')) { + if (cannot_access_at_index(input_buffer, 0) || (buffer_at_offset(input_buffer)[0] != ':')) + { goto fail; /* invalid object */ } /* parse the value */ input_buffer->offset++; buffer_skip_whitespace(input_buffer); - if (!parse_value(current_item, input_buffer)) { + if (!parse_value(current_item, input_buffer)) + { goto fail; /* failed to parse value */ } buffer_skip_whitespace(input_buffer); - } while (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == ',')); + } + while (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == ',')); - if (cannot_access_at_index(input_buffer, 0) || (buffer_at_offset(input_buffer)[0] != '}')) { + if (cannot_access_at_index(input_buffer, 0) || (buffer_at_offset(input_buffer)[0] != '}')) + { goto fail; /* expected end of object */ } @@ -1474,14 +1724,15 @@ static cJSON_bool parse_object(cJSON *const item, parse_buffer *const input_buff head->prev = current_item; } - item->type = cJSON_Object; + item->type = cJSON_Object; item->child = head; input_buffer->offset++; return true; fail: - if (head != NULL) { + if (head != NULL) + { cJSON_Delete(head); } @@ -1489,76 +1740,91 @@ static cJSON_bool parse_object(cJSON *const item, parse_buffer *const input_buff } /* Render an object to text. */ -static cJSON_bool print_object(const cJSON *const item, printbuffer *const output_buffer) { +static cJSON_bool print_object(const cJSON * const item, printbuffer * const output_buffer) +{ unsigned char *output_pointer = NULL; - size_t length = 0; - cJSON *current_item = item->child; + size_t length = 0; + cJSON *current_item = item->child; - if (output_buffer == NULL) { + if (output_buffer == NULL) + { return false; } /* Compose the output: */ - length = (size_t)(output_buffer->format ? 2 : 1); /* fmt: {\n */ + length = (size_t) (output_buffer->format ? 2 : 1); /* fmt: {\n */ output_pointer = ensure(output_buffer, length + 1); - if (output_pointer == NULL) { + if (output_pointer == NULL) + { return false; } *output_pointer++ = '{'; output_buffer->depth++; - if (output_buffer->format) { + if (output_buffer->format) + { *output_pointer++ = '\n'; } output_buffer->offset += length; - while (current_item) { - if (output_buffer->format) { + while (current_item) + { + if (output_buffer->format) + { size_t i; output_pointer = ensure(output_buffer, output_buffer->depth); - if (output_pointer == NULL) { + if (output_pointer == NULL) + { return false; } - for (i = 0; i < output_buffer->depth; i++) { + for (i = 0; i < output_buffer->depth; i++) + { *output_pointer++ = '\t'; } output_buffer->offset += output_buffer->depth; } /* print key */ - if (!print_string_ptr((unsigned char *)current_item->string, output_buffer)) { + if (!print_string_ptr((unsigned char*)current_item->string, output_buffer)) + { return false; } update_offset(output_buffer); - length = (size_t)(output_buffer->format ? 2 : 1); + length = (size_t) (output_buffer->format ? 2 : 1); output_pointer = ensure(output_buffer, length); - if (output_pointer == NULL) { + if (output_pointer == NULL) + { return false; } *output_pointer++ = ':'; - if (output_buffer->format) { + if (output_buffer->format) + { *output_pointer++ = '\t'; } output_buffer->offset += length; /* print value */ - if (!print_value(current_item, output_buffer)) { + if (!print_value(current_item, output_buffer)) + { return false; } update_offset(output_buffer); /* print comma if not last */ - length = ((size_t)(output_buffer->format ? 1 : 0) + (size_t)(current_item->next ? 1 : 0)); + length = ((size_t)(output_buffer->format ? 1 : 0) + (size_t)(current_item->next ? 1 : 0)); output_pointer = ensure(output_buffer, length + 1); - if (output_pointer == NULL) { + if (output_pointer == NULL) + { return false; } - if (current_item->next) { + if (current_item->next) + { *output_pointer++ = ','; } - if (output_buffer->format) { + if (output_buffer->format) + { *output_pointer++ = '\n'; } *output_pointer = '\0'; @@ -1568,35 +1834,40 @@ static cJSON_bool print_object(const cJSON *const item, printbuffer *const outpu } output_pointer = ensure(output_buffer, output_buffer->format ? (output_buffer->depth + 1) : 2); - if (output_pointer == NULL) { + if (output_pointer == NULL) + { return false; } - if (output_buffer->format) { + if (output_buffer->format) + { size_t i; - for (i = 0; i < (output_buffer->depth - 1); i++) { + for (i = 0; i < (output_buffer->depth - 1); i++) + { *output_pointer++ = '\t'; } } *output_pointer++ = '}'; - *output_pointer = '\0'; + *output_pointer = '\0'; output_buffer->depth--; return true; } /* Get Array size/item / object item. */ -CJSON_PUBLIC(int) -cJSON_GetArraySize(const cJSON *array) { +CJSON_PUBLIC(int) cJSON_GetArraySize(const cJSON *array) +{ cJSON *child = NULL; - size_t size = 0; + size_t size = 0; - if (array == NULL) { + if (array == NULL) + { return 0; } child = array->child; - while (child != NULL) { + while(child != NULL) + { size++; child = child->next; } @@ -1606,15 +1877,18 @@ cJSON_GetArraySize(const cJSON *array) { return (int)size; } -static cJSON *get_array_item(const cJSON *array, size_t index) { +static cJSON* get_array_item(const cJSON *array, size_t index) +{ cJSON *current_child = NULL; - if (array == NULL) { + if (array == NULL) + { return NULL; } current_child = array->child; - while ((current_child != NULL) && (index > 0)) { + while ((current_child != NULL) && (index > 0)) + { index--; current_child = current_child->next; } @@ -1622,29 +1896,37 @@ static cJSON *get_array_item(const cJSON *array, size_t index) { return current_child; } -CJSON_PUBLIC(cJSON *) -cJSON_GetArrayItem(const cJSON *array, int index) { - if (index < 0) { +CJSON_PUBLIC(cJSON *) cJSON_GetArrayItem(const cJSON *array, int index) +{ + if (index < 0) + { return NULL; } return get_array_item(array, (size_t)index); } -static cJSON *get_object_item(const cJSON *const object, const char *const name, const cJSON_bool case_sensitive) { +static cJSON *get_object_item(const cJSON * const object, const char * const name, const cJSON_bool case_sensitive) +{ cJSON *current_element = NULL; - if ((object == NULL) || (name == NULL)) { + if ((object == NULL) || (name == NULL)) + { return NULL; } current_element = object->child; - if (case_sensitive) { - while ((current_element != NULL) && (current_element->string != NULL) && (strcmp(name, current_element->string) != 0)) { + if (case_sensitive) + { + while ((current_element != NULL) && (current_element->string != NULL) && (strcmp(name, current_element->string) != 0)) + { current_element = current_element->next; } - } else { - while ((current_element != NULL) && (case_insensitive_strcmp((const unsigned char *)name, (const unsigned char *)(current_element->string)) != 0)) { + } + else + { + while ((current_element != NULL) && (case_insensitive_strcmp((const unsigned char*)name, (const unsigned char*)(current_element->string)) != 0)) + { current_element = current_element->next; } } @@ -1656,36 +1938,40 @@ static cJSON *get_object_item(const cJSON *const object, const char *const name, return current_element; } -CJSON_PUBLIC(cJSON *) -cJSON_GetObjectItem(const cJSON *const object, const char *const string) { +CJSON_PUBLIC(cJSON *) cJSON_GetObjectItem(const cJSON * const object, const char * const string) +{ return get_object_item(object, string, false); } -CJSON_PUBLIC(cJSON *) -cJSON_GetObjectItemCaseSensitive(const cJSON *const object, const char *const string) { +CJSON_PUBLIC(cJSON *) cJSON_GetObjectItemCaseSensitive(const cJSON * const object, const char * const string) +{ return get_object_item(object, string, true); } -CJSON_PUBLIC(cJSON_bool) -cJSON_HasObjectItem(const cJSON *object, const char *string) { +CJSON_PUBLIC(cJSON_bool) cJSON_HasObjectItem(const cJSON *object, const char *string) +{ return cJSON_GetObjectItem(object, string) ? 1 : 0; } /* Utility for array list handling. */ -static void suffix_object(cJSON *prev, cJSON *item) { +static void suffix_object(cJSON *prev, cJSON *item) +{ prev->next = item; item->prev = prev; } /* Utility for handling references. */ -static cJSON *create_reference(const cJSON *item, const internal_hooks *const hooks) { +static cJSON *create_reference(const cJSON *item, const internal_hooks * const hooks) +{ cJSON *reference = NULL; - if (item == NULL) { + if (item == NULL) + { return NULL; } reference = cJSON_New_Item(hooks); - if (reference == NULL) { + if (reference == NULL) + { return NULL; } @@ -1696,10 +1982,12 @@ static cJSON *create_reference(const cJSON *item, const internal_hooks *const ho return reference; } -static cJSON_bool add_item_to_array(cJSON *array, cJSON *item) { +static cJSON_bool add_item_to_array(cJSON *array, cJSON *item) +{ cJSON *child = NULL; - if ((item == NULL) || (array == NULL) || (array == item)) { + if ((item == NULL) || (array == NULL) || (array == item)) + { return false; } @@ -1707,14 +1995,18 @@ static cJSON_bool add_item_to_array(cJSON *array, cJSON *item) { /* * To find the last item in array quickly, we use prev in array */ - if (child == NULL) { + if (child == NULL) + { /* list is empty, start new one */ array->child = item; - item->prev = item; - item->next = NULL; - } else { + item->prev = item; + item->next = NULL; + } + else + { /* append to the end */ - if (child->prev) { + if (child->prev) + { suffix_object(child->prev, item); array->child->prev = item; } @@ -1724,88 +2016,100 @@ static cJSON_bool add_item_to_array(cJSON *array, cJSON *item) { } /* Add item to array/object. */ -CJSON_PUBLIC(cJSON_bool) -cJSON_AddItemToArray(cJSON *array, cJSON *item) { +CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToArray(cJSON *array, cJSON *item) +{ return add_item_to_array(array, item); } -#if defined(__clang__) || (defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))) -#pragma GCC diagnostic push +#if defined(__clang__) || (defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))) + #pragma GCC diagnostic push #endif #ifdef __GNUC__ #pragma GCC diagnostic ignored "-Wcast-qual" #endif /* helper function to cast away const */ -static void *cast_away_const(const void *string) { - return (void *)string; +static void* cast_away_const(const void* string) +{ + return (void*)string; } -#if defined(__clang__) || (defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))) -#pragma GCC diagnostic pop +#if defined(__clang__) || (defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))) + #pragma GCC diagnostic pop #endif -static cJSON_bool add_item_to_object(cJSON *const object, const char *const string, cJSON *const item, const internal_hooks *const hooks, const cJSON_bool constant_key) { + +static cJSON_bool add_item_to_object(cJSON * const object, const char * const string, cJSON * const item, const internal_hooks * const hooks, const cJSON_bool constant_key) +{ char *new_key = NULL; - int new_type = cJSON_Invalid; + int new_type = cJSON_Invalid; - if ((object == NULL) || (string == NULL) || (item == NULL) || (object == item)) { + if ((object == NULL) || (string == NULL) || (item == NULL) || (object == item)) + { return false; } - if (constant_key) { - new_key = (char *)cast_away_const(string); + if (constant_key) + { + new_key = (char*)cast_away_const(string); new_type = item->type | cJSON_StringIsConst; - } else { - new_key = (char *)cJSON_strdup((const unsigned char *)string, hooks); - if (new_key == NULL) { + } + else + { + new_key = (char*)cJSON_strdup((const unsigned char*)string, hooks); + if (new_key == NULL) + { return false; } new_type = item->type & ~cJSON_StringIsConst; } - if (!(item->type & cJSON_StringIsConst) && (item->string != NULL)) { + if (!(item->type & cJSON_StringIsConst) && (item->string != NULL)) + { hooks->deallocate(item->string); } item->string = new_key; - item->type = new_type; + item->type = new_type; return add_item_to_array(object, item); } -CJSON_PUBLIC(cJSON_bool) -cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item) { +CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item) +{ return add_item_to_object(object, string, item, &global_hooks, false); } /* Add an item to an object with constant string as key */ -CJSON_PUBLIC(cJSON_bool) -cJSON_AddItemToObjectCS(cJSON *object, const char *string, cJSON *item) { +CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToObjectCS(cJSON *object, const char *string, cJSON *item) +{ return add_item_to_object(object, string, item, &global_hooks, true); } -CJSON_PUBLIC(cJSON_bool) -cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item) { - if (array == NULL) { +CJSON_PUBLIC(cJSON_bool) cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item) +{ + if (array == NULL) + { return false; } return add_item_to_array(array, create_reference(item, &global_hooks)); } -CJSON_PUBLIC(cJSON_bool) -cJSON_AddItemReferenceToObject(cJSON *object, const char *string, cJSON *item) { - if ((object == NULL) || (string == NULL)) { +CJSON_PUBLIC(cJSON_bool) cJSON_AddItemReferenceToObject(cJSON *object, const char *string, cJSON *item) +{ + if ((object == NULL) || (string == NULL)) + { return false; } return add_item_to_object(object, string, create_reference(item, &global_hooks), &global_hooks, false); } -CJSON_PUBLIC(cJSON *) -cJSON_AddNullToObject(cJSON *const object, const char *const name) { +CJSON_PUBLIC(cJSON*) cJSON_AddNullToObject(cJSON * const object, const char * const name) +{ cJSON *null = cJSON_CreateNull(); - if (add_item_to_object(object, name, null, &global_hooks, false)) { + if (add_item_to_object(object, name, null, &global_hooks, false)) + { return null; } @@ -1813,10 +2117,11 @@ cJSON_AddNullToObject(cJSON *const object, const char *const name) { return NULL; } -CJSON_PUBLIC(cJSON *) -cJSON_AddTrueToObject(cJSON *const object, const char *const name) { +CJSON_PUBLIC(cJSON*) cJSON_AddTrueToObject(cJSON * const object, const char * const name) +{ cJSON *true_item = cJSON_CreateTrue(); - if (add_item_to_object(object, name, true_item, &global_hooks, false)) { + if (add_item_to_object(object, name, true_item, &global_hooks, false)) + { return true_item; } @@ -1824,10 +2129,11 @@ cJSON_AddTrueToObject(cJSON *const object, const char *const name) { return NULL; } -CJSON_PUBLIC(cJSON *) -cJSON_AddFalseToObject(cJSON *const object, const char *const name) { +CJSON_PUBLIC(cJSON*) cJSON_AddFalseToObject(cJSON * const object, const char * const name) +{ cJSON *false_item = cJSON_CreateFalse(); - if (add_item_to_object(object, name, false_item, &global_hooks, false)) { + if (add_item_to_object(object, name, false_item, &global_hooks, false)) + { return false_item; } @@ -1835,10 +2141,11 @@ cJSON_AddFalseToObject(cJSON *const object, const char *const name) { return NULL; } -CJSON_PUBLIC(cJSON *) -cJSON_AddBoolToObject(cJSON *const object, const char *const name, const cJSON_bool boolean) { +CJSON_PUBLIC(cJSON*) cJSON_AddBoolToObject(cJSON * const object, const char * const name, const cJSON_bool boolean) +{ cJSON *bool_item = cJSON_CreateBool(boolean); - if (add_item_to_object(object, name, bool_item, &global_hooks, false)) { + if (add_item_to_object(object, name, bool_item, &global_hooks, false)) + { return bool_item; } @@ -1846,10 +2153,11 @@ cJSON_AddBoolToObject(cJSON *const object, const char *const name, const cJSON_b return NULL; } -CJSON_PUBLIC(cJSON *) -cJSON_AddNumberToObject(cJSON *const object, const char *const name, const double number) { +CJSON_PUBLIC(cJSON*) cJSON_AddNumberToObject(cJSON * const object, const char * const name, const double number) +{ cJSON *number_item = cJSON_CreateNumber(number); - if (add_item_to_object(object, name, number_item, &global_hooks, false)) { + if (add_item_to_object(object, name, number_item, &global_hooks, false)) + { return number_item; } @@ -1857,10 +2165,11 @@ cJSON_AddNumberToObject(cJSON *const object, const char *const name, const doubl return NULL; } -CJSON_PUBLIC(cJSON *) -cJSON_AddStringToObject(cJSON *const object, const char *const name, const char *const string) { +CJSON_PUBLIC(cJSON*) cJSON_AddStringToObject(cJSON * const object, const char * const name, const char * const string) +{ cJSON *string_item = cJSON_CreateString(string); - if (add_item_to_object(object, name, string_item, &global_hooks, false)) { + if (add_item_to_object(object, name, string_item, &global_hooks, false)) + { return string_item; } @@ -1868,10 +2177,11 @@ cJSON_AddStringToObject(cJSON *const object, const char *const name, const char return NULL; } -CJSON_PUBLIC(cJSON *) -cJSON_AddRawToObject(cJSON *const object, const char *const name, const char *const raw) { +CJSON_PUBLIC(cJSON*) cJSON_AddRawToObject(cJSON * const object, const char * const name, const char * const raw) +{ cJSON *raw_item = cJSON_CreateRaw(raw); - if (add_item_to_object(object, name, raw_item, &global_hooks, false)) { + if (add_item_to_object(object, name, raw_item, &global_hooks, false)) + { return raw_item; } @@ -1879,10 +2189,11 @@ cJSON_AddRawToObject(cJSON *const object, const char *const name, const char *co return NULL; } -CJSON_PUBLIC(cJSON *) -cJSON_AddObjectToObject(cJSON *const object, const char *const name) { +CJSON_PUBLIC(cJSON*) cJSON_AddObjectToObject(cJSON * const object, const char * const name) +{ cJSON *object_item = cJSON_CreateObject(); - if (add_item_to_object(object, name, object_item, &global_hooks, false)) { + if (add_item_to_object(object, name, object_item, &global_hooks, false)) + { return object_item; } @@ -1890,10 +2201,11 @@ cJSON_AddObjectToObject(cJSON *const object, const char *const name) { return NULL; } -CJSON_PUBLIC(cJSON *) -cJSON_AddArrayToObject(cJSON *const object, const char *const name) { +CJSON_PUBLIC(cJSON*) cJSON_AddArrayToObject(cJSON * const object, const char * const name) +{ cJSON *array = cJSON_CreateArray(); - if (add_item_to_object(object, name, array, &global_hooks, false)) { + if (add_item_to_object(object, name, array, &global_hooks, false)) + { return array; } @@ -1901,25 +2213,31 @@ cJSON_AddArrayToObject(cJSON *const object, const char *const name) { return NULL; } -CJSON_PUBLIC(cJSON *) -cJSON_DetachItemViaPointer(cJSON *parent, cJSON *const item) { - if ((parent == NULL) || (item == NULL)) { +CJSON_PUBLIC(cJSON *) cJSON_DetachItemViaPointer(cJSON *parent, cJSON * const item) +{ + if ((parent == NULL) || (item == NULL) || (item != parent->child && item->prev == NULL)) + { return NULL; } - if (item != parent->child) { + if (item != parent->child) + { /* not the first element */ item->prev->next = item->next; } - if (item->next != NULL) { + if (item->next != NULL) + { /* not the last element */ item->next->prev = item->prev; } - if (item == parent->child) { + if (item == parent->child) + { /* first element */ parent->child = item->next; - } else if (item->next == NULL) { + } + else if (item->next == NULL) + { /* last element */ parent->child->prev = item->prev; } @@ -1931,98 +2249,118 @@ cJSON_DetachItemViaPointer(cJSON *parent, cJSON *const item) { return item; } -CJSON_PUBLIC(cJSON *) -cJSON_DetachItemFromArray(cJSON *array, int which) { - if (which < 0) { +CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromArray(cJSON *array, int which) +{ + if (which < 0) + { return NULL; } return cJSON_DetachItemViaPointer(array, get_array_item(array, (size_t)which)); } -CJSON_PUBLIC(void) -cJSON_DeleteItemFromArray(cJSON *array, int which) { +CJSON_PUBLIC(void) cJSON_DeleteItemFromArray(cJSON *array, int which) +{ cJSON_Delete(cJSON_DetachItemFromArray(array, which)); } -CJSON_PUBLIC(cJSON *) -cJSON_DetachItemFromObject(cJSON *object, const char *string) { +CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObject(cJSON *object, const char *string) +{ cJSON *to_detach = cJSON_GetObjectItem(object, string); return cJSON_DetachItemViaPointer(object, to_detach); } -CJSON_PUBLIC(cJSON *) -cJSON_DetachItemFromObjectCaseSensitive(cJSON *object, const char *string) { +CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObjectCaseSensitive(cJSON *object, const char *string) +{ cJSON *to_detach = cJSON_GetObjectItemCaseSensitive(object, string); return cJSON_DetachItemViaPointer(object, to_detach); } -CJSON_PUBLIC(void) -cJSON_DeleteItemFromObject(cJSON *object, const char *string) { +CJSON_PUBLIC(void) cJSON_DeleteItemFromObject(cJSON *object, const char *string) +{ cJSON_Delete(cJSON_DetachItemFromObject(object, string)); } -CJSON_PUBLIC(void) -cJSON_DeleteItemFromObjectCaseSensitive(cJSON *object, const char *string) { +CJSON_PUBLIC(void) cJSON_DeleteItemFromObjectCaseSensitive(cJSON *object, const char *string) +{ cJSON_Delete(cJSON_DetachItemFromObjectCaseSensitive(object, string)); } /* Replace array/object items with new ones. */ -CJSON_PUBLIC(cJSON_bool) -cJSON_InsertItemInArray(cJSON *array, int which, cJSON *newitem) { +CJSON_PUBLIC(cJSON_bool) cJSON_InsertItemInArray(cJSON *array, int which, cJSON *newitem) +{ cJSON *after_inserted = NULL; - if (which < 0) { + if (which < 0 || newitem == NULL) + { return false; } after_inserted = get_array_item(array, (size_t)which); - if (after_inserted == NULL) { + if (after_inserted == NULL) + { return add_item_to_array(array, newitem); } - newitem->next = after_inserted; - newitem->prev = after_inserted->prev; + if (after_inserted != array->child && after_inserted->prev == NULL) { + /* return false if after_inserted is a corrupted array item */ + return false; + } + + newitem->next = after_inserted; + newitem->prev = after_inserted->prev; after_inserted->prev = newitem; - if (after_inserted == array->child) { + if (after_inserted == array->child) + { array->child = newitem; - } else { + } + else + { newitem->prev->next = newitem; } return true; } -CJSON_PUBLIC(cJSON_bool) -cJSON_ReplaceItemViaPointer(cJSON *const parent, cJSON *const item, cJSON *replacement) { - if ((parent == NULL) || (replacement == NULL) || (item == NULL)) { +CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemViaPointer(cJSON * const parent, cJSON * const item, cJSON * replacement) +{ + if ((parent == NULL) || (parent->child == NULL) || (replacement == NULL) || (item == NULL)) + { return false; } - if (replacement == item) { + if (replacement == item) + { return true; } replacement->next = item->next; replacement->prev = item->prev; - if (replacement->next != NULL) { + if (replacement->next != NULL) + { replacement->next->prev = replacement; } - if (parent->child == item) { - if (parent->child->prev == parent->child) { + if (parent->child == item) + { + if (parent->child->prev == parent->child) + { replacement->prev = replacement; } parent->child = replacement; - } else { /* - * To find the last item in array quickly, we use prev in array. - * We can't modify the last item's next pointer where this item was the parent's child - */ - if (replacement->prev != NULL) { + } + else + { /* + * To find the last item in array quickly, we use prev in array. + * We can't modify the last item's next pointer where this item was the parent's child + */ + if (replacement->prev != NULL) + { replacement->prev->next = replacement; } - if (replacement->next == NULL) { + if (replacement->next == NULL) + { parent->child->prev = replacement; } } @@ -2034,94 +2372,113 @@ cJSON_ReplaceItemViaPointer(cJSON *const parent, cJSON *const item, cJSON *repla return true; } -CJSON_PUBLIC(cJSON_bool) -cJSON_ReplaceItemInArray(cJSON *array, int which, cJSON *newitem) { - if (which < 0) { +CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInArray(cJSON *array, int which, cJSON *newitem) +{ + if (which < 0) + { return false; } return cJSON_ReplaceItemViaPointer(array, get_array_item(array, (size_t)which), newitem); } -static cJSON_bool replace_item_in_object(cJSON *object, const char *string, cJSON *replacement, cJSON_bool case_sensitive) { - if ((replacement == NULL) || (string == NULL)) { +static cJSON_bool replace_item_in_object(cJSON *object, const char *string, cJSON *replacement, cJSON_bool case_sensitive) +{ + if ((replacement == NULL) || (string == NULL)) + { return false; } /* replace the name in the replacement */ - if (!(replacement->type & cJSON_StringIsConst) && (replacement->string != NULL)) { + if (!(replacement->type & cJSON_StringIsConst) && (replacement->string != NULL)) + { cJSON_free(replacement->string); } - replacement->string = (char *)cJSON_strdup((const unsigned char *)string, &global_hooks); + replacement->string = (char*)cJSON_strdup((const unsigned char*)string, &global_hooks); + if (replacement->string == NULL) + { + return false; + } + replacement->type &= ~cJSON_StringIsConst; return cJSON_ReplaceItemViaPointer(object, get_object_item(object, string, case_sensitive), replacement); } -CJSON_PUBLIC(cJSON_bool) -cJSON_ReplaceItemInObject(cJSON *object, const char *string, cJSON *newitem) { +CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInObject(cJSON *object, const char *string, cJSON *newitem) +{ return replace_item_in_object(object, string, newitem, false); } -CJSON_PUBLIC(cJSON_bool) -cJSON_ReplaceItemInObjectCaseSensitive(cJSON *object, const char *string, cJSON *newitem) { +CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInObjectCaseSensitive(cJSON *object, const char *string, cJSON *newitem) +{ return replace_item_in_object(object, string, newitem, true); } /* Create basic types: */ -CJSON_PUBLIC(cJSON *) -cJSON_CreateNull(void) { +CJSON_PUBLIC(cJSON *) cJSON_CreateNull(void) +{ cJSON *item = cJSON_New_Item(&global_hooks); - if (item) { + if(item) + { item->type = cJSON_NULL; } return item; } -CJSON_PUBLIC(cJSON *) -cJSON_CreateTrue(void) { +CJSON_PUBLIC(cJSON *) cJSON_CreateTrue(void) +{ cJSON *item = cJSON_New_Item(&global_hooks); - if (item) { + if(item) + { item->type = cJSON_True; } return item; } -CJSON_PUBLIC(cJSON *) -cJSON_CreateFalse(void) { +CJSON_PUBLIC(cJSON *) cJSON_CreateFalse(void) +{ cJSON *item = cJSON_New_Item(&global_hooks); - if (item) { + if(item) + { item->type = cJSON_False; } return item; } -CJSON_PUBLIC(cJSON *) -cJSON_CreateBool(cJSON_bool boolean) { +CJSON_PUBLIC(cJSON *) cJSON_CreateBool(cJSON_bool boolean) +{ cJSON *item = cJSON_New_Item(&global_hooks); - if (item) { + if(item) + { item->type = boolean ? cJSON_True : cJSON_False; } return item; } -CJSON_PUBLIC(cJSON *) -cJSON_CreateNumber(double num) { +CJSON_PUBLIC(cJSON *) cJSON_CreateNumber(double num) +{ cJSON *item = cJSON_New_Item(&global_hooks); - if (item) { - item->type = cJSON_Number; + if(item) + { + item->type = cJSON_Number; item->valuedouble = num; /* use saturation in case of overflow */ - if (num >= INT_MAX) { + if (num >= INT_MAX) + { item->valueint = INT_MAX; - } else if (num <= (double)INT_MIN) { + } + else if (num <= (double)INT_MIN) + { item->valueint = INT_MIN; - } else { + } + else + { item->valueint = (int)num; } } @@ -2129,13 +2486,15 @@ cJSON_CreateNumber(double num) { return item; } -CJSON_PUBLIC(cJSON *) -cJSON_CreateString(const char *string) { +CJSON_PUBLIC(cJSON *) cJSON_CreateString(const char *string) +{ cJSON *item = cJSON_New_Item(&global_hooks); - if (item) { - item->type = cJSON_String; - item->valuestring = (char *)cJSON_strdup((const unsigned char *)string, &global_hooks); - if (!item->valuestring) { + if(item) + { + item->type = cJSON_String; + item->valuestring = (char*)cJSON_strdup((const unsigned char*)string, &global_hooks); + if(!item->valuestring) + { cJSON_Delete(item); return NULL; } @@ -2144,46 +2503,48 @@ cJSON_CreateString(const char *string) { return item; } -CJSON_PUBLIC(cJSON *) -cJSON_CreateStringReference(const char *string) { +CJSON_PUBLIC(cJSON *) cJSON_CreateStringReference(const char *string) +{ cJSON *item = cJSON_New_Item(&global_hooks); - if (item != NULL) { - item->type = cJSON_String | cJSON_IsReference; - item->valuestring = (char *)cast_away_const(string); + if (item != NULL) + { + item->type = cJSON_String | cJSON_IsReference; + item->valuestring = (char*)cast_away_const(string); } return item; } -CJSON_PUBLIC(cJSON *) -cJSON_CreateObjectReference(const cJSON *child) { +CJSON_PUBLIC(cJSON *) cJSON_CreateObjectReference(const cJSON *child) +{ cJSON *item = cJSON_New_Item(&global_hooks); if (item != NULL) { - item->type = cJSON_Object | cJSON_IsReference; - item->child = (cJSON *)cast_away_const(child); + item->type = cJSON_Object | cJSON_IsReference; + item->child = (cJSON*)cast_away_const(child); } return item; } -CJSON_PUBLIC(cJSON *) -cJSON_CreateArrayReference(const cJSON *child) { +CJSON_PUBLIC(cJSON *) cJSON_CreateArrayReference(const cJSON *child) { cJSON *item = cJSON_New_Item(&global_hooks); if (item != NULL) { - item->type = cJSON_Array | cJSON_IsReference; - item->child = (cJSON *)cast_away_const(child); + item->type = cJSON_Array | cJSON_IsReference; + item->child = (cJSON*)cast_away_const(child); } return item; } -CJSON_PUBLIC(cJSON *) -cJSON_CreateRaw(const char *raw) { +CJSON_PUBLIC(cJSON *) cJSON_CreateRaw(const char *raw) +{ cJSON *item = cJSON_New_Item(&global_hooks); - if (item) { - item->type = cJSON_Raw; - item->valuestring = (char *)cJSON_strdup((const unsigned char *)raw, &global_hooks); - if (!item->valuestring) { + if(item) + { + item->type = cJSON_Raw; + item->valuestring = (char*)cJSON_strdup((const unsigned char*)raw, &global_hooks); + if(!item->valuestring) + { cJSON_Delete(item); return NULL; } @@ -2192,20 +2553,22 @@ cJSON_CreateRaw(const char *raw) { return item; } -CJSON_PUBLIC(cJSON *) -cJSON_CreateArray(void) { +CJSON_PUBLIC(cJSON *) cJSON_CreateArray(void) +{ cJSON *item = cJSON_New_Item(&global_hooks); - if (item) { - item->type = cJSON_Array; + if(item) + { + item->type=cJSON_Array; } return item; } -CJSON_PUBLIC(cJSON *) -cJSON_CreateObject(void) { +CJSON_PUBLIC(cJSON *) cJSON_CreateObject(void) +{ cJSON *item = cJSON_New_Item(&global_hooks); - if (item) { + if (item) + { item->type = cJSON_Object; } @@ -2213,28 +2576,34 @@ cJSON_CreateObject(void) { } /* Create Arrays: */ -CJSON_PUBLIC(cJSON *) -cJSON_CreateIntArray(const int *numbers, int count) { +CJSON_PUBLIC(cJSON *) cJSON_CreateIntArray(const int *numbers, int count) +{ size_t i = 0; cJSON *n = NULL; cJSON *p = NULL; cJSON *a = NULL; - if ((count < 0) || (numbers == NULL)) { + if ((count < 0) || (numbers == NULL)) + { return NULL; } a = cJSON_CreateArray(); - for (i = 0; a && (i < (size_t)count); i++) { + for(i = 0; a && (i < (size_t)count); i++) + { n = cJSON_CreateNumber(numbers[i]); - if (!n) { + if (!n) + { cJSON_Delete(a); return NULL; } - if (!i) { + if(!i) + { a->child = n; - } else { + } + else + { suffix_object(p, n); } p = n; @@ -2247,28 +2616,34 @@ cJSON_CreateIntArray(const int *numbers, int count) { return a; } -CJSON_PUBLIC(cJSON *) -cJSON_CreateFloatArray(const float *numbers, int count) { +CJSON_PUBLIC(cJSON *) cJSON_CreateFloatArray(const float *numbers, int count) +{ size_t i = 0; cJSON *n = NULL; cJSON *p = NULL; cJSON *a = NULL; - if ((count < 0) || (numbers == NULL)) { + if ((count < 0) || (numbers == NULL)) + { return NULL; } a = cJSON_CreateArray(); - for (i = 0; a && (i < (size_t)count); i++) { + for(i = 0; a && (i < (size_t)count); i++) + { n = cJSON_CreateNumber((double)numbers[i]); - if (!n) { + if(!n) + { cJSON_Delete(a); return NULL; } - if (!i) { + if(!i) + { a->child = n; - } else { + } + else + { suffix_object(p, n); } p = n; @@ -2281,28 +2656,34 @@ cJSON_CreateFloatArray(const float *numbers, int count) { return a; } -CJSON_PUBLIC(cJSON *) -cJSON_CreateDoubleArray(const double *numbers, int count) { +CJSON_PUBLIC(cJSON *) cJSON_CreateDoubleArray(const double *numbers, int count) +{ size_t i = 0; cJSON *n = NULL; cJSON *p = NULL; cJSON *a = NULL; - if ((count < 0) || (numbers == NULL)) { + if ((count < 0) || (numbers == NULL)) + { return NULL; } a = cJSON_CreateArray(); - for (i = 0; a && (i < (size_t)count); i++) { + for(i = 0; a && (i < (size_t)count); i++) + { n = cJSON_CreateNumber(numbers[i]); - if (!n) { + if(!n) + { cJSON_Delete(a); return NULL; } - if (!i) { + if(!i) + { a->child = n; - } else { + } + else + { suffix_object(p, n); } p = n; @@ -2315,29 +2696,35 @@ cJSON_CreateDoubleArray(const double *numbers, int count) { return a; } -CJSON_PUBLIC(cJSON *) -cJSON_CreateStringArray(const char *const *strings, int count) { +CJSON_PUBLIC(cJSON *) cJSON_CreateStringArray(const char *const *strings, int count) +{ size_t i = 0; cJSON *n = NULL; cJSON *p = NULL; cJSON *a = NULL; - if ((count < 0) || (strings == NULL)) { + if ((count < 0) || (strings == NULL)) + { return NULL; } a = cJSON_CreateArray(); - for (i = 0; a && (i < (size_t)count); i++) { + for (i = 0; a && (i < (size_t)count); i++) + { n = cJSON_CreateString(strings[i]); - if (!n) { + if(!n) + { cJSON_Delete(a); return NULL; } - if (!i) { + if(!i) + { a->child = n; - } else { - suffix_object(p, n); + } + else + { + suffix_object(p,n); } p = n; } @@ -2350,79 +2737,105 @@ cJSON_CreateStringArray(const char *const *strings, int count) { } /* Duplication */ -CJSON_PUBLIC(cJSON *) -cJSON_Duplicate(const cJSON *item, cJSON_bool recurse) { - cJSON *newitem = NULL; - cJSON *child = NULL; - cJSON *next = NULL; +cJSON * cJSON_Duplicate_rec(const cJSON *item, size_t depth, cJSON_bool recurse); + +CJSON_PUBLIC(cJSON *) cJSON_Duplicate(const cJSON *item, cJSON_bool recurse) +{ + return cJSON_Duplicate_rec(item, 0, recurse ); +} + +cJSON * cJSON_Duplicate_rec(const cJSON *item, size_t depth, cJSON_bool recurse) +{ + cJSON *newitem = NULL; + cJSON *child = NULL; + cJSON *next = NULL; cJSON *newchild = NULL; /* Bail on bad ptr */ - if (!item) { + if (!item) + { goto fail; } /* Create new item */ newitem = cJSON_New_Item(&global_hooks); - if (!newitem) { + if (!newitem) + { goto fail; } /* Copy over all vars */ - newitem->type = item->type & (~cJSON_IsReference); - newitem->valueint = item->valueint; + newitem->type = item->type & (~cJSON_IsReference); + newitem->valueint = item->valueint; newitem->valuedouble = item->valuedouble; - if (item->valuestring) { - newitem->valuestring = (char *)cJSON_strdup((unsigned char *)item->valuestring, &global_hooks); - if (!newitem->valuestring) { + if (item->valuestring) + { + newitem->valuestring = (char*)cJSON_strdup((unsigned char*)item->valuestring, &global_hooks); + if (!newitem->valuestring) + { goto fail; } } - if (item->string) { - newitem->string = (item->type & cJSON_StringIsConst) ? item->string : (char *)cJSON_strdup((unsigned char *)item->string, &global_hooks); - if (!newitem->string) { + if (item->string) + { + newitem->string = (item->type&cJSON_StringIsConst) ? item->string : (char*)cJSON_strdup((unsigned char*)item->string, &global_hooks); + if (!newitem->string) + { goto fail; } } /* If non-recursive, then we're done! */ - if (!recurse) { + if (!recurse) + { return newitem; } /* Walk the ->next chain for the child. */ child = item->child; - while (child != NULL) { - newchild = cJSON_Duplicate(child, true); /* Duplicate (with recurse) each item in the ->next chain */ - if (!newchild) { + while (child != NULL) + { + if(depth >= CJSON_CIRCULAR_LIMIT) { + goto fail; + } + newchild = cJSON_Duplicate_rec(child, depth + 1, true); /* Duplicate (with recurse) each item in the ->next chain */ + if (!newchild) + { goto fail; } - if (next != NULL) { + if (next != NULL) + { /* If newitem->child already set, then crosswire ->prev and ->next and move on */ - next->next = newchild; + next->next = newchild; newchild->prev = next; - next = newchild; - } else { + next = newchild; + } + else + { /* Set newitem->child and move to it */ newitem->child = newchild; - next = newchild; + next = newchild; } child = child->next; } - if (newitem && newitem->child) { + if (newitem && newitem->child) + { newitem->child->prev = newchild; } return newitem; fail: - if (newitem != NULL) { + if (newitem != NULL) + { cJSON_Delete(newitem); } return NULL; } -static void skip_oneline_comment(char **input) { +static void skip_oneline_comment(char **input) +{ *input += static_strlen("//"); - for (; (*input)[0] != '\0'; ++(*input)) { + for (; (*input)[0] != '\0'; ++(*input)) + { if ((*input)[0] == '\n') { *input += static_strlen("\n"); return; @@ -2430,11 +2843,14 @@ static void skip_oneline_comment(char **input) { } } -static void skip_multiline_comment(char **input) { +static void skip_multiline_comment(char **input) +{ *input += static_strlen("/*"); - for (; (*input)[0] != '\0'; ++(*input)) { - if (((*input)[0] == '*') && ((*input)[1] == '/')) { + for (; (*input)[0] != '\0'; ++(*input)) + { + if (((*input)[0] == '*') && ((*input)[1] == '/')) + { *input += static_strlen("*/"); return; } @@ -2446,6 +2862,7 @@ static void minify_string(char **input, char **output) { *input += static_strlen("\""); *output += static_strlen("\""); + for (; (*input)[0] != '\0'; (void)++(*input), ++(*output)) { (*output)[0] = (*input)[0]; @@ -2462,41 +2879,47 @@ static void minify_string(char **input, char **output) { } } -CJSON_PUBLIC(void) -cJSON_Minify(char *json) { +CJSON_PUBLIC(void) cJSON_Minify(char *json) +{ char *into = json; - if (json == NULL) { + if (json == NULL) + { return; } - while (json[0] != '\0') { - switch (json[0]) { - case ' ': - case '\t': - case '\r': - case '\n': - json++; - break; - - case '/': - if (json[1] == '/') { - skip_oneline_comment(&json); - } else if (json[1] == '*') { - skip_multiline_comment(&json); - } else { + while (json[0] != '\0') + { + switch (json[0]) + { + case ' ': + case '\t': + case '\r': + case '\n': json++; - } - break; + break; - case '\"': - minify_string(&json, (char **)&into); - break; + case '/': + if (json[1] == '/') + { + skip_oneline_comment(&json); + } + else if (json[1] == '*') + { + skip_multiline_comment(&json); + } else { + json++; + } + break; - default: - into[0] = json[0]; - json++; - into++; + case '\"': + minify_string(&json, (char**)&into); + break; + + default: + into[0] = json[0]; + json++; + into++; } } @@ -2504,209 +2927,238 @@ cJSON_Minify(char *json) { *into = '\0'; } -CJSON_PUBLIC(cJSON_bool) -cJSON_IsInvalid(const cJSON *const item) { - if (item == NULL) { +CJSON_PUBLIC(cJSON_bool) cJSON_IsInvalid(const cJSON * const item) +{ + if (item == NULL) + { return false; } return (item->type & 0xFF) == cJSON_Invalid; } -CJSON_PUBLIC(cJSON_bool) -cJSON_IsFalse(const cJSON *const item) { - if (item == NULL) { +CJSON_PUBLIC(cJSON_bool) cJSON_IsFalse(const cJSON * const item) +{ + if (item == NULL) + { return false; } return (item->type & 0xFF) == cJSON_False; } -CJSON_PUBLIC(cJSON_bool) -cJSON_IsTrue(const cJSON *const item) { - if (item == NULL) { +CJSON_PUBLIC(cJSON_bool) cJSON_IsTrue(const cJSON * const item) +{ + if (item == NULL) + { return false; } return (item->type & 0xff) == cJSON_True; } -CJSON_PUBLIC(cJSON_bool) -cJSON_IsBool(const cJSON *const item) { - if (item == NULL) { + +CJSON_PUBLIC(cJSON_bool) cJSON_IsBool(const cJSON * const item) +{ + if (item == NULL) + { return false; } return (item->type & (cJSON_True | cJSON_False)) != 0; } -CJSON_PUBLIC(cJSON_bool) -cJSON_IsNull(const cJSON *const item) { - if (item == NULL) { +CJSON_PUBLIC(cJSON_bool) cJSON_IsNull(const cJSON * const item) +{ + if (item == NULL) + { return false; } return (item->type & 0xFF) == cJSON_NULL; } -CJSON_PUBLIC(cJSON_bool) -cJSON_IsNumber(const cJSON *const item) { - if (item == NULL) { +CJSON_PUBLIC(cJSON_bool) cJSON_IsNumber(const cJSON * const item) +{ + if (item == NULL) + { return false; } return (item->type & 0xFF) == cJSON_Number; } -CJSON_PUBLIC(cJSON_bool) -cJSON_IsString(const cJSON *const item) { - if (item == NULL) { +CJSON_PUBLIC(cJSON_bool) cJSON_IsString(const cJSON * const item) +{ + if (item == NULL) + { return false; } return (item->type & 0xFF) == cJSON_String; } -CJSON_PUBLIC(cJSON_bool) -cJSON_IsArray(const cJSON *const item) { - if (item == NULL) { +CJSON_PUBLIC(cJSON_bool) cJSON_IsArray(const cJSON * const item) +{ + if (item == NULL) + { return false; } return (item->type & 0xFF) == cJSON_Array; } -CJSON_PUBLIC(cJSON_bool) -cJSON_IsObject(const cJSON *const item) { - if (item == NULL) { +CJSON_PUBLIC(cJSON_bool) cJSON_IsObject(const cJSON * const item) +{ + if (item == NULL) + { return false; } return (item->type & 0xFF) == cJSON_Object; } -CJSON_PUBLIC(cJSON_bool) -cJSON_IsRaw(const cJSON *const item) { - if (item == NULL) { +CJSON_PUBLIC(cJSON_bool) cJSON_IsRaw(const cJSON * const item) +{ + if (item == NULL) + { return false; } return (item->type & 0xFF) == cJSON_Raw; } -CJSON_PUBLIC(cJSON_bool) -cJSON_Compare(const cJSON *const a, const cJSON *const b, const cJSON_bool case_sensitive) { - if ((a == NULL) || (b == NULL) || ((a->type & 0xFF) != (b->type & 0xFF))) { +CJSON_PUBLIC(cJSON_bool) cJSON_Compare(const cJSON * const a, const cJSON * const b, const cJSON_bool case_sensitive) +{ + if ((a == NULL) || (b == NULL) || ((a->type & 0xFF) != (b->type & 0xFF))) + { return false; } /* check if type is valid */ - switch (a->type & 0xFF) { - case cJSON_False: - case cJSON_True: - case cJSON_NULL: - case cJSON_Number: - case cJSON_String: - case cJSON_Raw: - case cJSON_Array: - case cJSON_Object: - break; - - default: - return false; + switch (a->type & 0xFF) + { + case cJSON_False: + case cJSON_True: + case cJSON_NULL: + case cJSON_Number: + case cJSON_String: + case cJSON_Raw: + case cJSON_Array: + case cJSON_Object: + break; + + default: + return false; } /* identical objects are equal */ - if (a == b) { + if (a == b) + { return true; } - switch (a->type & 0xFF) { - /* in these cases and equal type is enough */ - case cJSON_False: - case cJSON_True: - case cJSON_NULL: - return true; - - case cJSON_Number: - if (compare_double(a->valuedouble, b->valuedouble)) { + switch (a->type & 0xFF) + { + /* in these cases and equal type is enough */ + case cJSON_False: + case cJSON_True: + case cJSON_NULL: return true; - } - return false; - case cJSON_String: - case cJSON_Raw: - if ((a->valuestring == NULL) || (b->valuestring == NULL)) { + case cJSON_Number: + if (compare_double(a->valuedouble, b->valuedouble)) + { + return true; + } return false; - } - if (strcmp(a->valuestring, b->valuestring) == 0) { - return true; - } - - return false; - - case cJSON_Array: { - cJSON *a_element = a->child; - cJSON *b_element = b->child; - for (; (a_element != NULL) && (b_element != NULL);) { - if (!cJSON_Compare(a_element, b_element, case_sensitive)) { + case cJSON_String: + case cJSON_Raw: + if ((a->valuestring == NULL) || (b->valuestring == NULL)) + { return false; } + if (strcmp(a->valuestring, b->valuestring) == 0) + { + return true; + } - a_element = a_element->next; - b_element = b_element->next; - } - - /* one of the arrays is longer than the other */ - if (a_element != b_element) { return false; - } - return true; - } + case cJSON_Array: + { + cJSON *a_element = a->child; + cJSON *b_element = b->child; + + for (; (a_element != NULL) && (b_element != NULL);) + { + if (!cJSON_Compare(a_element, b_element, case_sensitive)) + { + return false; + } - case cJSON_Object: { - cJSON *a_element = NULL; - cJSON *b_element = NULL; - cJSON_ArrayForEach(a_element, a) { - /* TODO This has O(n^2) runtime, which is horrible! */ - b_element = get_object_item(b, a_element->string, case_sensitive); - if (b_element == NULL) { - return false; + a_element = a_element->next; + b_element = b_element->next; } - if (!cJSON_Compare(a_element, b_element, case_sensitive)) { + /* one of the arrays is longer than the other */ + if (a_element != b_element) { return false; } + + return true; } - /* doing this twice, once on a and b to prevent true comparison if a subset of b - * TODO: Do this the proper way, this is just a fix for now */ - cJSON_ArrayForEach(b_element, b) { - a_element = get_object_item(a, b_element->string, case_sensitive); - if (a_element == NULL) { - return false; + case cJSON_Object: + { + cJSON *a_element = NULL; + cJSON *b_element = NULL; + cJSON_ArrayForEach(a_element, a) + { + /* TODO This has O(n^2) runtime, which is horrible! */ + b_element = get_object_item(b, a_element->string, case_sensitive); + if (b_element == NULL) + { + return false; + } + + if (!cJSON_Compare(a_element, b_element, case_sensitive)) + { + return false; + } } - if (!cJSON_Compare(b_element, a_element, case_sensitive)) { - return false; + /* doing this twice, once on a and b to prevent true comparison if a subset of b + * TODO: Do this the proper way, this is just a fix for now */ + cJSON_ArrayForEach(b_element, b) + { + a_element = get_object_item(a, b_element->string, case_sensitive); + if (a_element == NULL) + { + return false; + } + + if (!cJSON_Compare(b_element, a_element, case_sensitive)) + { + return false; + } } - } - return true; - } + return true; + } - default: - return false; + default: + return false; } } -CJSON_PUBLIC(void *) -cJSON_malloc(size_t size) { +CJSON_PUBLIC(void *) cJSON_malloc(size_t size) +{ return global_hooks.allocate(size); } -CJSON_PUBLIC(void) -cJSON_free(void *object) { +CJSON_PUBLIC(void) cJSON_free(void *object) +{ global_hooks.deallocate(object); + object = NULL; } diff --git a/tools/nitrogfx/cJSON.h b/tools/nitrogfx/cJSON.h index 92907a2cd3..37520bbcf8 100644 --- a/tools/nitrogfx/cJSON.h +++ b/tools/nitrogfx/cJSON.h @@ -81,7 +81,7 @@ then using the CJSON_API_VISIBILITY flag to "export" the same symbols the way CJ /* project version */ #define CJSON_VERSION_MAJOR 1 #define CJSON_VERSION_MINOR 7 -#define CJSON_VERSION_PATCH 15 +#define CJSON_VERSION_PATCH 18 #include @@ -137,6 +137,12 @@ typedef int cJSON_bool; #define CJSON_NESTING_LIMIT 1000 #endif +/* Limits the length of circular references can be before cJSON rejects to parse them. + * This is to prevent stack overflows. */ +#ifndef CJSON_CIRCULAR_LIMIT +#define CJSON_CIRCULAR_LIMIT 10000 +#endif + /* returns the version of cJSON as a string */ CJSON_PUBLIC(const char*) cJSON_Version(void); @@ -279,6 +285,13 @@ CJSON_PUBLIC(double) cJSON_SetNumberHelper(cJSON *object, double number); /* Change the valuestring of a cJSON_String object, only takes effect when type of object is cJSON_String */ CJSON_PUBLIC(char*) cJSON_SetValuestring(cJSON *object, const char *valuestring); +/* If the object is not a boolean type this does nothing and returns cJSON_Invalid else it returns the new type*/ +#define cJSON_SetBoolValue(object, boolValue) ( \ + (object != NULL && ((object)->type & (cJSON_False|cJSON_True))) ? \ + (object)->type=((object)->type &(~(cJSON_False|cJSON_True)))|((boolValue)?cJSON_True:cJSON_False) : \ + cJSON_Invalid\ +) + /* Macro for iterating over an array or object */ #define cJSON_ArrayForEach(element, array) for(element = (array != NULL) ? (array)->child : NULL; element != NULL; element = element->next) diff --git a/tools/nitrogfx/font.c b/tools/nitrogfx/font.c index 0dd6fbc3ee..f929e30cea 100644 --- a/tools/nitrogfx/font.c +++ b/tools/nitrogfx/font.c @@ -4,323 +4,486 @@ #include #include #include +#include #include "global.h" #include "font.h" #include "gfx.h" +#include "options.h" #include "util.h" unsigned char gFontPalette[][3] = { - {0x90, 0xC8, 0xFF}, // bg (saturated blue that contrasts well with the shadow color) - {0x38, 0x38, 0x38}, // fg (dark grey) - {0xD8, 0xD8, 0xD8}, // shadow (light grey) - {0xFF, 0xFF, 0xFF} // box (white) + {0x90, 0xC8, 0xFF}, // bg (saturated blue that contrasts well with the shadow color) + {0x38, 0x38, 0x38}, // fg (dark grey) + {0xD8, 0xD8, 0xD8}, // shadow (light grey) + {0xFF, 0xFF, 0xFF} // box (white) +}; + +// special palette for DS subscreen font +unsigned char gFontPalette_Subscreen[][3] = { + {0x90, 0xC8, 0xFF}, // bg (saturated blue that contrasts well with the shadow color) + {0xFF, 0xFF, 0xFF}, // fg (white) + {0xD8, 0xD8, 0xD8}, // shadow (light grey) + {0x38, 0x38, 0x38}, // outline (dark grey) }; static void ConvertFromLatinFont(unsigned char *src, unsigned char *dest, unsigned int numRows) { - unsigned int srcPixelsOffset = 0; + unsigned int srcPixelsOffset = 0; - for (unsigned int row = 0; row < numRows; row++) { - for (unsigned int column = 0; column < 16; column++) { - for (unsigned int glyphTile = 0; glyphTile < 4; glyphTile++) { - unsigned int pixelsX = (column * 16) + ((glyphTile & 1) * 8); + for (unsigned int row = 0; row < numRows; row++) { + for (unsigned int column = 0; column < 16; column++) { + for (unsigned int glyphTile = 0; glyphTile < 4; glyphTile++) { + unsigned int pixelsX = (column * 16) + ((glyphTile & 1) * 8); - for (unsigned int i = 0; i < 8; i++) { - unsigned int pixelsY = (row * 16) + ((glyphTile >> 1) * 8) + i; - unsigned int destPixelsOffset = (pixelsY * 64) + (pixelsX / 4); + for (unsigned int i = 0; i < 8; i++) { + unsigned int pixelsY = (row * 16) + ((glyphTile >> 1) * 8) + i; + unsigned int destPixelsOffset = (pixelsY * 64) + (pixelsX / 4); - dest[destPixelsOffset] = src[srcPixelsOffset + 1]; - dest[destPixelsOffset + 1] = src[srcPixelsOffset]; + dest[destPixelsOffset] = src[srcPixelsOffset + 1]; + dest[destPixelsOffset + 1] = src[srcPixelsOffset]; - srcPixelsOffset += 2; - } - } - } - } + srcPixelsOffset += 2; + } + } + } + } } static void ConvertToLatinFont(unsigned char *src, unsigned char *dest, unsigned int numRows) { - unsigned int destPixelsOffset = 0; + unsigned int destPixelsOffset = 0; - for (unsigned int row = 0; row < numRows; row++) { - for (unsigned int column = 0; column < 16; column++) { - for (unsigned int glyphTile = 0; glyphTile < 4; glyphTile++) { - unsigned int pixelsX = (column * 16) + ((glyphTile & 1) * 8); + for (unsigned int row = 0; row < numRows; row++) { + for (unsigned int column = 0; column < 16; column++) { + for (unsigned int glyphTile = 0; glyphTile < 4; glyphTile++) { + unsigned int pixelsX = (column * 16) + ((glyphTile & 1) * 8); - for (unsigned int i = 0; i < 8; i++) { - unsigned int pixelsY = (row * 16) + ((glyphTile >> 1) * 8) + i; - unsigned int srcPixelsOffset = (pixelsY * 64) + (pixelsX / 4); + for (unsigned int i = 0; i < 8; i++) { + unsigned int pixelsY = (row * 16) + ((glyphTile >> 1) * 8) + i; + unsigned int srcPixelsOffset = (pixelsY * 64) + (pixelsX / 4); - dest[destPixelsOffset] = src[srcPixelsOffset + 1]; - dest[destPixelsOffset + 1] = src[srcPixelsOffset]; + dest[destPixelsOffset] = src[srcPixelsOffset + 1]; + dest[destPixelsOffset + 1] = src[srcPixelsOffset]; - destPixelsOffset += 2; - } - } - } - } + destPixelsOffset += 2; + } + } + } + } } static void ConvertFromHalfwidthJapaneseFont(unsigned char *src, unsigned char *dest, unsigned int numRows) { - for (unsigned int row = 0; row < numRows; row++) { - for (unsigned int column = 0; column < 16; column++) { - unsigned int glyphIndex = (row * 16) + column; - - for (unsigned int glyphTile = 0; glyphTile < 2; glyphTile++) { - unsigned int pixelsX = column * 8; - unsigned int srcPixelsOffset = 512 * (glyphIndex >> 4) + 16 * (glyphIndex & 0xF) + 256 * glyphTile; - - for (unsigned int i = 0; i < 8; i++) { - unsigned int pixelsY = (row * 16) + (glyphTile * 8) + i; - unsigned int destPixelsOffset = (pixelsY * 32) + (pixelsX / 4); - - dest[destPixelsOffset] = src[srcPixelsOffset + 1]; - dest[destPixelsOffset + 1] = src[srcPixelsOffset]; - - srcPixelsOffset += 2; - } - } - } - } + for (unsigned int row = 0; row < numRows; row++) { + for (unsigned int column = 0; column < 16; column++) { + unsigned int glyphIndex = (row * 16) + column; + + for (unsigned int glyphTile = 0; glyphTile < 2; glyphTile++) { + unsigned int pixelsX = column * 8; + unsigned int srcPixelsOffset = 512 * (glyphIndex >> 4) + 16 * (glyphIndex & 0xF) + 256 * glyphTile; + + for (unsigned int i = 0; i < 8; i++) { + unsigned int pixelsY = (row * 16) + (glyphTile * 8) + i; + unsigned int destPixelsOffset = (pixelsY * 32) + (pixelsX / 4); + + dest[destPixelsOffset] = src[srcPixelsOffset + 1]; + dest[destPixelsOffset + 1] = src[srcPixelsOffset]; + + srcPixelsOffset += 2; + } + } + } + } } static void ConvertToHalfwidthJapaneseFont(unsigned char *src, unsigned char *dest, unsigned int numRows) { - for (unsigned int row = 0; row < numRows; row++) { - for (unsigned int column = 0; column < 16; column++) { - unsigned int glyphIndex = (row * 16) + column; - - for (unsigned int glyphTile = 0; glyphTile < 2; glyphTile++) { - unsigned int pixelsX = column * 8; - unsigned int destPixelsOffset = 512 * (glyphIndex >> 4) + 16 * (glyphIndex & 0xF) + 256 * glyphTile; - - for (unsigned int i = 0; i < 8; i++) { - unsigned int pixelsY = (row * 16) + (glyphTile * 8) + i; - unsigned int srcPixelsOffset = (pixelsY * 32) + (pixelsX / 4); - - dest[destPixelsOffset] = src[srcPixelsOffset + 1]; - dest[destPixelsOffset + 1] = src[srcPixelsOffset]; - - destPixelsOffset += 2; - } - } - } - } + for (unsigned int row = 0; row < numRows; row++) { + for (unsigned int column = 0; column < 16; column++) { + unsigned int glyphIndex = (row * 16) + column; + + for (unsigned int glyphTile = 0; glyphTile < 2; glyphTile++) { + unsigned int pixelsX = column * 8; + unsigned int destPixelsOffset = 512 * (glyphIndex >> 4) + 16 * (glyphIndex & 0xF) + 256 * glyphTile; + + for (unsigned int i = 0; i < 8; i++) { + unsigned int pixelsY = (row * 16) + (glyphTile * 8) + i; + unsigned int srcPixelsOffset = (pixelsY * 32) + (pixelsX / 4); + + dest[destPixelsOffset] = src[srcPixelsOffset + 1]; + dest[destPixelsOffset + 1] = src[srcPixelsOffset]; + + destPixelsOffset += 2; + } + } + } + } } static void ConvertFromFullwidthJapaneseFont(unsigned char *src, unsigned char *dest, unsigned int numRows) { - for (unsigned int row = 0; row < numRows; row++) { - for (unsigned int column = 0; column < 16; column++) { - unsigned int glyphIndex = (row * 16) + column; - - for (unsigned int glyphTile = 0; glyphTile < 4; glyphTile++) { - unsigned int pixelsX = (column * 16) + ((glyphTile & 1) * 8); - unsigned int srcPixelsOffset = 512 * (glyphIndex >> 3) + 32 * (glyphIndex & 7) + 256 * (glyphTile >> 1) + 16 * (glyphTile & 1); - - for (unsigned int i = 0; i < 8; i++) { - unsigned int pixelsY = (row * 16) + ((glyphTile >> 1) * 8) + i; - unsigned int destPixelsOffset = (pixelsY * 64) + (pixelsX / 4); - - dest[destPixelsOffset] = src[srcPixelsOffset + 1]; - dest[destPixelsOffset + 1] = src[srcPixelsOffset]; - - srcPixelsOffset += 2; - } - } - } - } + for (unsigned int row = 0; row < numRows; row++) { + for (unsigned int column = 0; column < 16; column++) { + unsigned int glyphIndex = (row * 16) + column; + + for (unsigned int glyphTile = 0; glyphTile < 4; glyphTile++) { + unsigned int pixelsX = (column * 16) + ((glyphTile & 1) * 8); + unsigned int srcPixelsOffset = 512 * (glyphIndex >> 3) + 32 * (glyphIndex & 7) + 256 * (glyphTile >> 1) + 16 * (glyphTile & 1); + + for (unsigned int i = 0; i < 8; i++) { + unsigned int pixelsY = (row * 16) + ((glyphTile >> 1) * 8) + i; + unsigned int destPixelsOffset = (pixelsY * 64) + (pixelsX / 4); + + dest[destPixelsOffset] = src[srcPixelsOffset + 1]; + dest[destPixelsOffset + 1] = src[srcPixelsOffset]; + + srcPixelsOffset += 2; + } + } + } + } } static void ConvertToFullwidthJapaneseFont(unsigned char *src, unsigned char *dest, unsigned int numRows) { - for (unsigned int row = 0; row < numRows; row++) { - for (unsigned int column = 0; column < 16; column++) { - unsigned int glyphIndex = (row * 16) + column; - - for (unsigned int glyphTile = 0; glyphTile < 4; glyphTile++) { - unsigned int pixelsX = (column * 16) + ((glyphTile & 1) * 8); - unsigned int destPixelsOffset = 512 * (glyphIndex >> 3) + 32 * (glyphIndex & 7) + 256 * (glyphTile >> 1) + 16 * (glyphTile & 1); - - for (unsigned int i = 0; i < 8; i++) { - unsigned int pixelsY = (row * 16) + ((glyphTile >> 1) * 8) + i; - unsigned int srcPixelsOffset = (pixelsY * 64) + (pixelsX / 4); - - dest[destPixelsOffset] = src[srcPixelsOffset + 1]; - dest[destPixelsOffset + 1] = src[srcPixelsOffset]; - - destPixelsOffset += 2; - } - } - } - } + for (unsigned int row = 0; row < numRows; row++) { + for (unsigned int column = 0; column < 16; column++) { + unsigned int glyphIndex = (row * 16) + column; + + for (unsigned int glyphTile = 0; glyphTile < 4; glyphTile++) { + unsigned int pixelsX = (column * 16) + ((glyphTile & 1) * 8); + unsigned int destPixelsOffset = 512 * (glyphIndex >> 3) + 32 * (glyphIndex & 7) + 256 * (glyphTile >> 1) + 16 * (glyphTile & 1); + + for (unsigned int i = 0; i < 8; i++) { + unsigned int pixelsY = (row * 16) + ((glyphTile >> 1) * 8) + i; + unsigned int srcPixelsOffset = (pixelsY * 64) + (pixelsX / 4); + + dest[destPixelsOffset] = src[srcPixelsOffset + 1]; + dest[destPixelsOffset + 1] = src[srcPixelsOffset]; + + destPixelsOffset += 2; + } + } + } + } +} + +static void ConvertFromNitroFont(unsigned char *src, unsigned char *dest, unsigned int numRows, struct NtrFontMetadata *metadata) +{ + unsigned int srcPixelsOffset = 0; + unsigned int curGlyph = 0; + + for (unsigned int row = 0; row < numRows; row++) { + for (unsigned int column = 0; column < 16 && curGlyph < metadata->numGlyphs; column++, curGlyph++) { + for (unsigned int glyphTile = 0; glyphTile < 4; glyphTile++) { + unsigned int pixelsX = (column * 16) + ((glyphTile & 1) * 8); + + for (unsigned int i = 0; i < 8; i++) { + unsigned int pixelsY = (row * 16) + ((glyphTile >> 1) * 8) + i; + unsigned int destPixelsOffset = (pixelsY * 64) + (pixelsX / 4); + + dest[destPixelsOffset] = src[srcPixelsOffset + 1]; + dest[destPixelsOffset + 1] = src[srcPixelsOffset]; + + srcPixelsOffset += 2; + } + } + } + } +} + +static void ConvertToNitroFont(unsigned char *src, unsigned char *dest, unsigned int numRows, struct NtrFontMetadata *metadata) +{ + unsigned int destPixelsOffset = 0; + unsigned int curGlyph = 0; + + for (unsigned int row = 0; row < numRows; row++) { + for (unsigned int column = 0; column < 16 && curGlyph < metadata->numGlyphs; column++, curGlyph++) { + for (unsigned int glyphTile = 0; glyphTile < 4; glyphTile++) { + unsigned int pixelsX = (column * 16) + ((glyphTile & 1) * 8); + + for (unsigned int i = 0; i < 8; i++) { + unsigned int pixelsY = (row * 16) + ((glyphTile >> 1) * 8) + i; + unsigned int srcPixelsOffset = (pixelsY * 64) + (pixelsX / 4); + + dest[destPixelsOffset] = src[srcPixelsOffset + 1]; + dest[destPixelsOffset + 1] = src[srcPixelsOffset]; + + destPixelsOffset += 2; + } + } + } + } } static void SetFontPalette(struct Image *image) { - image->hasPalette = true; + image->hasPalette = true; - image->palette.numColors = 4; + image->palette.numColors = 4; - for (int i = 0; i < image->palette.numColors; i++) { - image->palette.colors[i].red = gFontPalette[i][0]; - image->palette.colors[i].green = gFontPalette[i][1]; - image->palette.colors[i].blue = gFontPalette[i][2]; - } + for (int i = 0; i < image->palette.numColors; i++) { + image->palette.colors[i].red = gFontPalette[i][0]; + image->palette.colors[i].green = gFontPalette[i][1]; + image->palette.colors[i].blue = gFontPalette[i][2]; + } - image->hasTransparency = false; + image->hasTransparency = false; +} + +static void SetSubscreenFontPalette(struct Image *image) +{ + image->hasPalette = true; + + image->palette.numColors = 4; + + for (int i = 0; i < image->palette.numColors; i++) { + image->palette.colors[i].red = gFontPalette_Subscreen[i][0]; + image->palette.colors[i].green = gFontPalette_Subscreen[i][1]; + image->palette.colors[i].blue = gFontPalette_Subscreen[i][2]; + } + + image->hasTransparency = false; } void ReadLatinFont(char *path, struct Image *image) { - int fileSize; - unsigned char *buffer = ReadWholeFile(path, &fileSize); + int fileSize; + unsigned char *buffer = ReadWholeFile(path, &fileSize); - int numGlyphs = fileSize / 64; + int numGlyphs = fileSize / 64; - if (numGlyphs % 16 != 0) - FATAL_ERROR("The number of glyphs (%d) is not a multiple of 16.\n", numGlyphs); + if (numGlyphs % 16 != 0) + FATAL_ERROR("The number of glyphs (%d) is not a multiple of 16.\n", numGlyphs); - int numRows = numGlyphs / 16; + int numRows = numGlyphs / 16; - image->width = 256; - image->height = numRows * 16; - image->bitDepth = 2; - image->pixels = malloc(fileSize); + image->width = 256; + image->height = numRows * 16; + image->bitDepth = 2; + image->pixels = malloc(fileSize); - if (image->pixels == NULL) - FATAL_ERROR("Failed to allocate memory for font.\n"); + if (image->pixels == NULL) + FATAL_ERROR("Failed to allocate memory for font.\n"); - ConvertFromLatinFont(buffer, image->pixels, numRows); + ConvertFromLatinFont(buffer, image->pixels, numRows); - free(buffer); + free(buffer); - SetFontPalette(image); + SetFontPalette(image); } void WriteLatinFont(char *path, struct Image *image) { - if (image->width != 256) - FATAL_ERROR("The width of the font image (%d) is not 256.\n", image->width); + if (image->width != 256) + FATAL_ERROR("The width of the font image (%d) is not 256.\n", image->width); - if (image->height % 16 != 0) - FATAL_ERROR("The height of the font image (%d) is not a multiple of 16.\n", image->height); + if (image->height % 16 != 0) + FATAL_ERROR("The height of the font image (%d) is not a multiple of 16.\n", image->height); - int numRows = image->height / 16; - int bufferSize = numRows * 16 * 64; - unsigned char *buffer = malloc(bufferSize); + int numRows = image->height / 16; + int bufferSize = numRows * 16 * 64; + unsigned char *buffer = malloc(bufferSize); - if (buffer == NULL) - FATAL_ERROR("Failed to allocate memory for font.\n"); + if (buffer == NULL) + FATAL_ERROR("Failed to allocate memory for font.\n"); - ConvertToLatinFont(image->pixels, buffer, numRows); + ConvertToLatinFont(image->pixels, buffer, numRows); - WriteWholeFile(path, buffer, bufferSize); + WriteWholeFile(path, buffer, bufferSize); - free(buffer); + free(buffer); } void ReadHalfwidthJapaneseFont(char *path, struct Image *image) { - int fileSize; - unsigned char *buffer = ReadWholeFile(path, &fileSize); + int fileSize; + unsigned char *buffer = ReadWholeFile(path, &fileSize); - int glyphSize = 32; + int glyphSize = 32; - if (fileSize % glyphSize != 0) - FATAL_ERROR("The file size (%d) is not a multiple of %d.\n", fileSize, glyphSize); + if (fileSize % glyphSize != 0) + FATAL_ERROR("The file size (%d) is not a multiple of %d.\n", fileSize, glyphSize); - int numGlyphs = fileSize / glyphSize; - - if (numGlyphs % 16 != 0) - FATAL_ERROR("The number of glyphs (%d) is not a multiple of 16.\n", numGlyphs); + int numGlyphs = fileSize / glyphSize; + + if (numGlyphs % 16 != 0) + FATAL_ERROR("The number of glyphs (%d) is not a multiple of 16.\n", numGlyphs); - int numRows = numGlyphs / 16; + int numRows = numGlyphs / 16; - image->width = 128; - image->height = numRows * 16; - image->bitDepth = 2; - image->pixels = malloc(fileSize); + image->width = 128; + image->height = numRows * 16; + image->bitDepth = 2; + image->pixels = malloc(fileSize); - if (image->pixels == NULL) - FATAL_ERROR("Failed to allocate memory for font.\n"); + if (image->pixels == NULL) + FATAL_ERROR("Failed to allocate memory for font.\n"); - ConvertFromHalfwidthJapaneseFont(buffer, image->pixels, numRows); + ConvertFromHalfwidthJapaneseFont(buffer, image->pixels, numRows); - free(buffer); + free(buffer); - SetFontPalette(image); + SetFontPalette(image); } void WriteHalfwidthJapaneseFont(char *path, struct Image *image) { - if (image->width != 128) - FATAL_ERROR("The width of the font image (%d) is not 128.\n", image->width); + if (image->width != 128) + FATAL_ERROR("The width of the font image (%d) is not 128.\n", image->width); - if (image->height % 16 != 0) - FATAL_ERROR("The height of the font image (%d) is not a multiple of 16.\n", image->height); + if (image->height % 16 != 0) + FATAL_ERROR("The height of the font image (%d) is not a multiple of 16.\n", image->height); - int numRows = image->height / 16; - int bufferSize = numRows * 16 * 32; - unsigned char *buffer = malloc(bufferSize); + int numRows = image->height / 16; + int bufferSize = numRows * 16 * 32; + unsigned char *buffer = malloc(bufferSize); - if (buffer == NULL) - FATAL_ERROR("Failed to allocate memory for font.\n"); + if (buffer == NULL) + FATAL_ERROR("Failed to allocate memory for font.\n"); - ConvertToHalfwidthJapaneseFont(image->pixels, buffer, numRows); + ConvertToHalfwidthJapaneseFont(image->pixels, buffer, numRows); - WriteWholeFile(path, buffer, bufferSize); + WriteWholeFile(path, buffer, bufferSize); - free(buffer); + free(buffer); } void ReadFullwidthJapaneseFont(char *path, struct Image *image) { - int fileSize; - unsigned char *buffer = ReadWholeFile(path, &fileSize); + int fileSize; + unsigned char *buffer = ReadWholeFile(path, &fileSize); - int numGlyphs = fileSize / 64; + int numGlyphs = fileSize / 64; - if (numGlyphs % 16 != 0) - FATAL_ERROR("The number of glyphs (%d) is not a multiple of 16.\n", numGlyphs); + if (numGlyphs % 16 != 0) + FATAL_ERROR("The number of glyphs (%d) is not a multiple of 16.\n", numGlyphs); - int numRows = numGlyphs / 16; + int numRows = numGlyphs / 16; - image->width = 256; - image->height = numRows * 16; - image->bitDepth = 2; - image->pixels = malloc(fileSize); + image->width = 256; + image->height = numRows * 16; + image->bitDepth = 2; + image->pixels = malloc(fileSize); - if (image->pixels == NULL) - FATAL_ERROR("Failed to allocate memory for font.\n"); + if (image->pixels == NULL) + FATAL_ERROR("Failed to allocate memory for font.\n"); - ConvertFromFullwidthJapaneseFont(buffer, image->pixels, numRows); + ConvertFromFullwidthJapaneseFont(buffer, image->pixels, numRows); - free(buffer); + free(buffer); - SetFontPalette(image); + SetFontPalette(image); } void WriteFullwidthJapaneseFont(char *path, struct Image *image) { - if (image->width != 256) - FATAL_ERROR("The width of the font image (%d) is not 256.\n", image->width); + if (image->width != 256) + FATAL_ERROR("The width of the font image (%d) is not 256.\n", image->width); + + if (image->height % 16 != 0) + FATAL_ERROR("The height of the font image (%d) is not a multiple of 16.\n", image->height); + + int numRows = image->height / 16; + int bufferSize = numRows * 16 * 64; + unsigned char *buffer = malloc(bufferSize); + + if (buffer == NULL) + FATAL_ERROR("Failed to allocate memory for font.\n"); + + ConvertToFullwidthJapaneseFont(image->pixels, buffer, numRows); + + WriteWholeFile(path, buffer, bufferSize); + + free(buffer); +} + +static inline uint32_t ReadLittleEndianWord(unsigned char *buffer, size_t start) +{ + return (buffer[start + 3] << 24) + | (buffer[start + 2] << 16) + | (buffer[start + 1] << 8) + | (buffer[start]); +} + +void ReadNtrFont(char *path, struct Image *image, struct NtrFontMetadata *metadata, bool useSubscreenPalette) +{ + int filesize; + unsigned char *buffer = ReadWholeFile(path, &filesize); - if (image->height % 16 != 0) - FATAL_ERROR("The height of the font image (%d) is not a multiple of 16.\n", image->height); + metadata->size = ReadLittleEndianWord(buffer, 0x00); + metadata->widthTableOffset = ReadLittleEndianWord(buffer, 0x04); + metadata->numGlyphs = ReadLittleEndianWord(buffer, 0x08); + metadata->maxWidth = buffer[0x0C]; + metadata->maxHeight = buffer[0x0D]; + metadata->glyphWidth = buffer[0x0E]; + metadata->glyphHeight = buffer[0x0F]; - int numRows = image->height / 16; - int bufferSize = numRows * 16 * 64; - unsigned char *buffer = malloc(bufferSize); + int numRows = (metadata->numGlyphs + 15) / 16; // Round up to next multiple of 16. - if (buffer == NULL) - FATAL_ERROR("Failed to allocate memory for font.\n"); + metadata->glyphWidthTable = malloc(metadata->numGlyphs); + memcpy(metadata->glyphWidthTable, buffer + metadata->widthTableOffset, metadata->numGlyphs); - ConvertToFullwidthJapaneseFont(image->pixels, buffer, numRows); + image->width = 256; + image->height = numRows * 16; + image->bitDepth = 2; + image->pixels = malloc(filesize); - WriteWholeFile(path, buffer, bufferSize); + if (image->pixels == NULL) + FATAL_ERROR("Failed to allocate memory for font.\n"); - free(buffer); + ConvertFromNitroFont(buffer + metadata->size, image->pixels, numRows, metadata); + + free(buffer); + + if (useSubscreenPalette) + SetSubscreenFontPalette(image); + else + SetFontPalette(image); +} + +void WriteNtrFont(char *path, struct Image *image, struct NtrFontMetadata *metadata) +{ + if (image->width != 256) + FATAL_ERROR("The width of the font image (%d) is not 256.\n", image->width); + + if (image->height % 16 != 0) + FATAL_ERROR("The height of the font image (%d) is not a multiple of 16.\n", image->height); + + int numRows = image->height / 16; + int bufferSize = metadata->widthTableOffset + metadata->numGlyphs; + unsigned char *buffer = malloc(bufferSize); + + if (buffer == NULL) + FATAL_ERROR("Failed to allocate memory for font.\n"); + + buffer[0x00] = (metadata->size & 0x000000FF); + buffer[0x01] = (metadata->size & 0x0000FF00) >> 8; + buffer[0x02] = (metadata->size & 0x00FF0000) >> 16; + buffer[0x03] = (metadata->size & 0xFF000000) >> 24; + buffer[0x04] = (metadata->widthTableOffset & 0x000000FF); + buffer[0x05] = (metadata->widthTableOffset & 0x0000FF00) >> 8; + buffer[0x06] = (metadata->widthTableOffset & 0x00FF0000) >> 16; + buffer[0x07] = (metadata->widthTableOffset & 0xFF000000) >> 24; + buffer[0x08] = (metadata->numGlyphs & 0x000000FF); + buffer[0x09] = (metadata->numGlyphs & 0x0000FF00) >> 8; + buffer[0x0A] = (metadata->numGlyphs & 0x00FF0000) >> 16; + buffer[0x0B] = (metadata->numGlyphs & 0xFF000000) >> 24; + buffer[0x0C] = metadata->maxWidth; + buffer[0x0D] = metadata->maxHeight; + buffer[0x0E] = metadata->glyphWidth; + buffer[0x0F] = metadata->glyphHeight; + + ConvertToNitroFont(image->pixels, buffer + metadata->size, numRows, metadata); + memcpy(buffer + metadata->widthTableOffset, metadata->glyphWidthTable, metadata->numGlyphs); + + WriteWholeFile(path, buffer, bufferSize); + + free(buffer); +} + +void FreeNtrFontMetadata(struct NtrFontMetadata *metadata) +{ + free(metadata->glyphWidthTable); + free(metadata); } diff --git a/tools/nitrogfx/font.h b/tools/nitrogfx/font.h index 45086d02ac..70dca08088 100644 --- a/tools/nitrogfx/font.h +++ b/tools/nitrogfx/font.h @@ -5,6 +5,7 @@ #include #include "gfx.h" +#include "options.h" void ReadLatinFont(char *path, struct Image *image); void WriteLatinFont(char *path, struct Image *image); @@ -12,5 +13,8 @@ void ReadHalfwidthJapaneseFont(char *path, struct Image *image); void WriteHalfwidthJapaneseFont(char *path, struct Image *image); void ReadFullwidthJapaneseFont(char *path, struct Image *image); void WriteFullwidthJapaneseFont(char *path, struct Image *image); +void ReadNtrFont(char *path, struct Image *image, struct NtrFontMetadata *metadata, bool useSubscreenPalette); +void WriteNtrFont(char *path, struct Image *image, struct NtrFontMetadata *metadata); +void FreeNtrFontMetadata(struct NtrFontMetadata *metadata); #endif // FONT_H diff --git a/tools/nitrogfx/gfx.c b/tools/nitrogfx/gfx.c index 2b8c7b4b17..ffbece9ad5 100644 --- a/tools/nitrogfx/gfx.c +++ b/tools/nitrogfx/gfx.c @@ -1,25 +1,26 @@ // Copyright (c) 2015 YamaArashi, 2021-2024 red031000 -#include "gfx.h" - -#include -#include +#include #include #include -#include - +#include +#include #include "global.h" - +#include "gfx.h" #include "util.h" -static unsigned int FindNitroDataBlock(const unsigned char *data, const char *ident, unsigned int fileSize, unsigned int *blockSize_out) { +static unsigned int FindNitroDataBlock(const unsigned char *data, const char *ident, unsigned int fileSize, unsigned int *blockSize_out) +{ unsigned int offset = 0x10; - while (offset < fileSize) { + while (offset < fileSize) + { unsigned int blockSize = data[offset + 4] | (data[offset + 5] << 8) | (data[offset + 6] << 16) | (data[offset + 7] << 24); - if (offset + blockSize > fileSize) { + if (offset + blockSize > fileSize) + { FATAL_ERROR("corrupted NTR file"); } - if (memcmp(data + offset, ident, 4) == 0) { + if (memcmp(data + offset, ident, 4) == 0) + { *blockSize_out = blockSize; return offset; } @@ -28,8 +29,8 @@ static unsigned int FindNitroDataBlock(const unsigned char *data, const char *id return -1u; } -#define GET_GBA_PAL_RED(x) (((x) >> 0) & 0x1F) -#define GET_GBA_PAL_GREEN(x) (((x) >> 5) & 0x1F) +#define GET_GBA_PAL_RED(x) (((x) >> 0) & 0x1F) +#define GET_GBA_PAL_GREEN(x) (((x) >> 5) & 0x1F) #define GET_GBA_PAL_BLUE(x) (((x) >> 10) & 0x1F) #define SET_GBA_PAL(r, g, b) (((b) << 10) | ((g) << 5) | (r)) @@ -38,7 +39,8 @@ static unsigned int FindNitroDataBlock(const unsigned char *data, const char *id #define DOWNCONVERT_BIT_DEPTH(x) ((x) / 8) -static void AdvanceTilePosition(int *tilesSoFar, int *rowsSoFar, int *chunkStartX, int *chunkStartY, int chunksWide, int colsPerChunk, int rowsPerChunk) { +static void AdvanceTilePosition(int *tilesSoFar, int *rowsSoFar, int *chunkStartX, int *chunkStartY, int chunksWide, int colsPerChunk, int rowsPerChunk) +{ (*tilesSoFar)++; if (*tilesSoFar == colsPerChunk) { *tilesSoFar = 0; @@ -54,18 +56,19 @@ static void AdvanceTilePosition(int *tilesSoFar, int *rowsSoFar, int *chunkStart } } -static void ConvertFromTiles1Bpp(unsigned char *src, unsigned char *dest, int numTiles, int chunksWide, int colsPerChunk, int rowsPerChunk, bool invertColors) { - int tilesSoFar = 0; - int rowsSoFar = 0; +static void ConvertFromTiles1Bpp(unsigned char *src, unsigned char *dest, int numTiles, int chunksWide, int colsPerChunk, int rowsPerChunk, bool invertColors) +{ + int tilesSoFar = 0; + int rowsSoFar = 0; int chunkStartX = 0; int chunkStartY = 0; - int pitch = chunksWide * colsPerChunk; + int pitch = chunksWide * colsPerChunk; for (int i = 0; i < numTiles; i++) { for (int j = 0; j < 8; j++) { - int idxComponentY = (chunkStartY * rowsPerChunk + rowsSoFar) * 8 + j; - int idxComponentX = chunkStartX * colsPerChunk + tilesSoFar; - unsigned char srcPixelOctet = *src++; + int idxComponentY = (chunkStartY * rowsPerChunk + rowsSoFar) * 8 + j; + int idxComponentX = chunkStartX * colsPerChunk + tilesSoFar; + unsigned char srcPixelOctet = *src++; unsigned char *destPixelOctet = &dest[idxComponentY * pitch + idxComponentX]; for (int k = 0; k < 8; k++) { @@ -79,25 +82,26 @@ static void ConvertFromTiles1Bpp(unsigned char *src, unsigned char *dest, int nu } } -static void ConvertFromTiles4Bpp(unsigned char *src, unsigned char *dest, int numTiles, int chunksWide, int colsPerChunk, int rowsPerChunk, bool invertColors) { - int tilesSoFar = 0; - int rowsSoFar = 0; +static void ConvertFromTiles4Bpp(unsigned char *src, unsigned char *dest, int numTiles, int chunksWide, int colsPerChunk, int rowsPerChunk, bool invertColors) +{ + int tilesSoFar = 0; + int rowsSoFar = 0; int chunkStartX = 0; int chunkStartY = 0; - int pitch = (chunksWide * colsPerChunk) * 4; + int pitch = (chunksWide * colsPerChunk) * 4; for (int i = 0; i < numTiles; i++) { for (int j = 0; j < 8; j++) { int idxComponentY = (chunkStartY * rowsPerChunk + rowsSoFar) * 8 + j; for (int k = 0; k < 4; k++) { - int idxComponentX = (chunkStartX * colsPerChunk + tilesSoFar) * 4 + k; + int idxComponentX = (chunkStartX * colsPerChunk + tilesSoFar) * 4 + k; unsigned char srcPixelPair = *src++; - unsigned char leftPixel = srcPixelPair & 0xF; - unsigned char rightPixel = srcPixelPair >> 4; + unsigned char leftPixel = srcPixelPair & 0xF; + unsigned char rightPixel = srcPixelPair >> 4; if (invertColors) { - leftPixel = 15 - leftPixel; + leftPixel = 15 - leftPixel; rightPixel = 15 - rightPixel; } @@ -109,36 +113,40 @@ static void ConvertFromTiles4Bpp(unsigned char *src, unsigned char *dest, int nu } } -static uint32_t ConvertFromScanned4Bpp(unsigned char *src, unsigned char *dest, int fileSize, bool invertColours, bool scanFrontToBack) { +static uint32_t ConvertFromScanned4Bpp(unsigned char *src, unsigned char *dest, int fileSize, bool invertColours, bool scanFrontToBack) +{ uint32_t encValue = 0; if (scanFrontToBack) { encValue = (src[1] << 8) | src[0]; - for (int i = 0; i < fileSize; i += 2) { + for (int i = 0; i < fileSize; i += 2) + { uint16_t val = src[i] | (src[i + 1] << 8); val ^= (encValue & 0xFFFF); - src[i] = val; + src[i] = val; src[i + 1] = val >> 8; - encValue = encValue * 1103515245; - encValue = encValue + 24691; + encValue = encValue * 1103515245; + encValue = encValue + 24691; } } else { encValue = (src[fileSize - 1] << 8) | src[fileSize - 2]; - for (int i = fileSize; i > 0; i -= 2) { + for (int i = fileSize; i > 0; i -= 2) + { uint16_t val = (src[i - 1] << 8) | src[i - 2]; val ^= (encValue & 0xFFFF); src[i - 1] = (val >> 8); src[i - 2] = val; - encValue = encValue * 1103515245; - encValue = encValue + 24691; + encValue = encValue * 1103515245; + encValue = encValue + 24691; } } - for (int i = 0; i < fileSize; i++) { + for (int i = 0; i < fileSize; i++) + { unsigned char srcPixelPair = src[i]; - unsigned char leftPixel = srcPixelPair & 0xF; - unsigned char rightPixel = srcPixelPair >> 4; + unsigned char leftPixel = srcPixelPair & 0xF; + unsigned char rightPixel = srcPixelPair >> 4; if (invertColours) { - leftPixel = 15 - leftPixel; + leftPixel = 15 - leftPixel; rightPixel = 15 - rightPixel; } @@ -147,24 +155,24 @@ static uint32_t ConvertFromScanned4Bpp(unsigned char *src, unsigned char *dest, return encValue; } -static void ConvertFromTiles8Bpp(unsigned char *src, unsigned char *dest, int numTiles, int chunksWide, int colsPerChunk, int rowsPerChunk, bool invertColors) { - int tilesSoFar = 0; - int rowsSoFar = 0; +static void ConvertFromTiles8Bpp(unsigned char *src, unsigned char *dest, int numTiles, int chunksWide, int colsPerChunk, int rowsPerChunk, bool invertColors) +{ + int tilesSoFar = 0; + int rowsSoFar = 0; int chunkStartX = 0; int chunkStartY = 0; - int pitch = (chunksWide * colsPerChunk) * 8; + int pitch = (chunksWide * colsPerChunk) * 8; for (int i = 0; i < numTiles; i++) { for (int j = 0; j < 8; j++) { int idxComponentY = (chunkStartY * rowsPerChunk + rowsSoFar) * 8 + j; for (int k = 0; k < 8; k++) { - int idxComponentX = (chunkStartX * colsPerChunk + tilesSoFar) * 8 + k; + int idxComponentX = (chunkStartX * colsPerChunk + tilesSoFar) * 8 + k; unsigned char srcPixel = *src++; - if (invertColors) { + if (invertColors) srcPixel = 255 - srcPixel; - } dest[idxComponentY * pitch + idxComponentX] = srcPixel; } @@ -174,30 +182,34 @@ static void ConvertFromTiles8Bpp(unsigned char *src, unsigned char *dest, int nu } } -static uint32_t ConvertFromScanned8Bpp(unsigned char *src, unsigned char *dest, int fileSize, bool invertColours, bool scanFrontToBack) { +static uint32_t ConvertFromScanned8Bpp(unsigned char *src, unsigned char *dest, int fileSize, bool invertColours, bool scanFrontToBack) +{ uint32_t encValue = 0; if (scanFrontToBack) { encValue = (src[1] << 8) | src[0]; - for (int i = 0; i < fileSize; i += 2) { + for (int i = 0; i < fileSize; i += 2) + { uint16_t val = src[i] | (src[i + 1] << 8); val ^= (encValue & 0xFFFF); - src[i] = val; + src[i] = val; src[i + 1] = val >> 8; - encValue = encValue * 1103515245; - encValue = encValue + 24691; + encValue = encValue * 1103515245; + encValue = encValue + 24691; } } else { encValue = (src[fileSize - 1] << 8) | src[fileSize - 2]; - for (int i = fileSize; i > 0; i -= 2) { + for (int i = fileSize; i > 0; i -= 2) + { uint16_t val = (src[i - 1] << 8) | src[i - 2]; val ^= (encValue & 0xFFFF); src[i - 1] = (val >> 8); src[i - 2] = val; - encValue = encValue * 1103515245; - encValue = encValue + 24691; + encValue = encValue * 1103515245; + encValue = encValue + 24691; } } - for (int i = 0; i < fileSize; i++) { + for (int i = 0; i < fileSize; i++) + { unsigned char srcPixel = src[i]; if (invertColours) { @@ -209,18 +221,19 @@ static uint32_t ConvertFromScanned8Bpp(unsigned char *src, unsigned char *dest, return encValue; } -static void ConvertToTiles1Bpp(unsigned char *src, unsigned char *dest, int numTiles, int chunksWide, int colsPerChunk, int rowsPerChunk, bool invertColors) { - int tilesSoFar = 0; - int rowsSoFar = 0; +static void ConvertToTiles1Bpp(unsigned char *src, unsigned char *dest, int numTiles, int chunksWide, int colsPerChunk, int rowsPerChunk, bool invertColors) +{ + int tilesSoFar = 0; + int rowsSoFar = 0; int chunkStartX = 0; int chunkStartY = 0; - int pitch = chunksWide * colsPerChunk; + int pitch = chunksWide * colsPerChunk; for (int i = 0; i < numTiles; i++) { for (int j = 0; j < 8; j++) { - int idxComponentY = (chunkStartY * rowsPerChunk + rowsSoFar) * 8 + j; - int idxComponentX = chunkStartX * colsPerChunk + tilesSoFar; - unsigned char srcPixelOctet = src[idxComponentY * pitch + idxComponentX]; + int idxComponentY = (chunkStartY * rowsPerChunk + rowsSoFar) * 8 + j; + int idxComponentX = chunkStartX * colsPerChunk + tilesSoFar; + unsigned char srcPixelOctet = src[idxComponentY * pitch + idxComponentX]; unsigned char *destPixelOctet = dest++; for (int k = 0; k < 8; k++) { @@ -234,25 +247,26 @@ static void ConvertToTiles1Bpp(unsigned char *src, unsigned char *dest, int numT } } -static void ConvertToTiles4Bpp(unsigned char *src, unsigned char *dest, int numTiles, int chunksWide, int colsPerChunk, int rowsPerChunk, bool invertColors) { - int tilesSoFar = 0; - int rowsSoFar = 0; +static void ConvertToTiles4Bpp(unsigned char *src, unsigned char *dest, int numTiles, int chunksWide, int colsPerChunk, int rowsPerChunk, bool invertColors) +{ + int tilesSoFar = 0; + int rowsSoFar = 0; int chunkStartX = 0; int chunkStartY = 0; - int pitch = (chunksWide * colsPerChunk) * 4; + int pitch = (chunksWide * colsPerChunk) * 4; for (int i = 0; i < numTiles; i++) { for (int j = 0; j < 8; j++) { int idxComponentY = (chunkStartY * rowsPerChunk + rowsSoFar) * 8 + j; for (int k = 0; k < 4; k++) { - int idxComponentX = (chunkStartX * colsPerChunk + tilesSoFar) * 4 + k; + int idxComponentX = (chunkStartX * colsPerChunk + tilesSoFar) * 4 + k; unsigned char srcPixelPair = src[idxComponentY * pitch + idxComponentX]; - unsigned char leftPixel = srcPixelPair >> 4; - unsigned char rightPixel = srcPixelPair & 0xF; + unsigned char leftPixel = srcPixelPair >> 4; + unsigned char rightPixel = srcPixelPair & 0xF; if (invertColors) { - leftPixel = 15 - leftPixel; + leftPixel = 15 - leftPixel; rightPixel = 15 - rightPixel; } @@ -264,55 +278,60 @@ static void ConvertToTiles4Bpp(unsigned char *src, unsigned char *dest, int numT } } -static void ConvertToScanned4Bpp(unsigned char *src, unsigned char *dest, int fileSize, bool invertColours, uint32_t encValue, uint32_t scanMode) { - for (int i = 0; i < fileSize; i++) { +static void ConvertToScanned4Bpp(unsigned char *src, unsigned char *dest, int fileSize, bool invertColours, uint32_t encValue, uint32_t scanMode) +{ + for (int i = 0; i < fileSize; i++) + { unsigned char srcPixelPair = src[i]; - unsigned char leftPixel = srcPixelPair & 0xF; - unsigned char rightPixel = srcPixelPair >> 4; + unsigned char leftPixel = srcPixelPair & 0xF; + unsigned char rightPixel = srcPixelPair >> 4; if (invertColours) { - leftPixel = 15 - leftPixel; + leftPixel = 15 - leftPixel; rightPixel = 15 - rightPixel; } dest[i] = (leftPixel << 4) | rightPixel; } if (scanMode == 2) { // front to back - for (int i = fileSize - 1; i > 0; i -= 2) { + for (int i = fileSize - 1; i > 0; i -= 2) + { uint16_t val = dest[i - 1] | (dest[i] << 8); - encValue = (encValue - 24691) * 4005161829; + encValue = (encValue - 24691) * 4005161829; val ^= (encValue & 0xFFFF); - dest[i] = (val >> 8); + dest[i] = (val >> 8); dest[i - 1] = val; } - } else if (scanMode == 1) { - for (int i = 1; i < fileSize; i += 2) { + } + else if (scanMode == 1) { + for (int i = 1; i < fileSize; i += 2) + { uint16_t val = (dest[i] << 8) | dest[i - 1]; - encValue = (encValue - 24691) * 4005161829; + encValue = (encValue - 24691) * 4005161829; val ^= (encValue & 0xFFFF); - dest[i] = (val >> 8); + dest[i] = (val >> 8); dest[i - 1] = val; } } } -static void ConvertToTiles8Bpp(unsigned char *src, unsigned char *dest, int numTiles, int chunksWide, int colsPerChunk, int rowsPerChunk, bool invertColors) { - int tilesSoFar = 0; - int rowsSoFar = 0; +static void ConvertToTiles8Bpp(unsigned char *src, unsigned char *dest, int numTiles, int chunksWide, int colsPerChunk, int rowsPerChunk, bool invertColors) +{ + int tilesSoFar = 0; + int rowsSoFar = 0; int chunkStartX = 0; int chunkStartY = 0; - int pitch = (chunksWide * colsPerChunk) * 8; + int pitch = (chunksWide * colsPerChunk) * 8; for (int i = 0; i < numTiles; i++) { for (int j = 0; j < 8; j++) { int idxComponentY = (chunkStartY * rowsPerChunk + rowsSoFar) * 8 + j; for (int k = 0; k < 8; k++) { - int idxComponentX = (chunkStartX * colsPerChunk + tilesSoFar) * 8 + k; + int idxComponentX = (chunkStartX * colsPerChunk + tilesSoFar) * 8 + k; unsigned char srcPixel = src[idxComponentY * pitch + idxComponentX]; - if (invertColors) { + if (invertColors) srcPixel = 255 - srcPixel; - } *dest++ = srcPixel; } @@ -322,7 +341,8 @@ static void ConvertToTiles8Bpp(unsigned char *src, unsigned char *dest, int numT } } -void ReadImage(char *path, int tilesWide, int bitDepth, int colsPerChunk, int rowsPerChunk, struct Image *image, bool invertColors) { +void ReadImage(char *path, int tilesWide, int bitDepth, int colsPerChunk, int rowsPerChunk, struct Image *image, bool invertColors) +{ int tileSize = bitDepth * 8; // number of bytes per tile int fileSize; @@ -332,22 +352,19 @@ void ReadImage(char *path, int tilesWide, int bitDepth, int colsPerChunk, int ro int tilesTall = (numTiles + tilesWide - 1) / tilesWide; - if (tilesWide % colsPerChunk != 0) { + if (tilesWide % colsPerChunk != 0) FATAL_ERROR("The width in tiles (%d) isn't a multiple of the specified tiles per row (%d)", tilesWide, colsPerChunk); - } - if (tilesTall % rowsPerChunk != 0) { + if (tilesTall % rowsPerChunk != 0) FATAL_ERROR("The height in tiles (%d) isn't a multiple of the specified rows per chunk (%d)", tilesTall, rowsPerChunk); - } - image->width = tilesWide * 8; - image->height = tilesTall * 8; + image->width = tilesWide * 8; + image->height = tilesTall * 8; image->bitDepth = bitDepth; - image->pixels = calloc(tilesWide * tilesTall, tileSize); + image->pixels = calloc(tilesWide * tilesTall, tileSize); - if (image->pixels == NULL) { + if (image->pixels == NULL) FATAL_ERROR("Failed to allocate memory for pixels.\n"); - } int chunksWide = tilesWide / colsPerChunk; // how many chunks side-by-side are needed for the full width of the image @@ -366,23 +383,27 @@ void ReadImage(char *path, int tilesWide, int bitDepth, int colsPerChunk, int ro free(buffer); } -uint32_t ReadNtrImage(char *path, int tilesWide, int bitDepth, int colsPerChunk, int rowsPerChunk, struct Image *image, bool invertColors, bool scanFrontToBack) { +uint32_t ReadNtrImage(char *path, int tilesWide, int bitDepth, int colsPerChunk, int rowsPerChunk, struct Image *image, bool invertColors, bool scanFrontToBack) +{ int fileSize; unsigned char *buffer = ReadWholeFile(path, &fileSize); - if (memcmp(buffer, "RGCN", 4) != 0) { + if (memcmp(buffer, "RGCN", 4) != 0) + { FATAL_ERROR("Not a valid NCGR character file.\n"); } unsigned char *charHeader = buffer + 0x10; - if (memcmp(charHeader, "RAHC", 4) != 0) { + if (memcmp(charHeader, "RAHC", 4) != 0) + { FATAL_ERROR("No valid CHAR file after NCLR header.\n"); } bitDepth = bitDepth ? bitDepth : (charHeader[0xC] == 3 ? 4 : 8); - if (bitDepth == 4) { + if (bitDepth == 4) + { image->palette.numColors = 16; } @@ -392,57 +413,61 @@ uint32_t ReadNtrImage(char *path, int tilesWide, int bitDepth, int colsPerChunk, int tileSize = bitDepth * 8; // number of bytes per tile - int tilesWide_in = ReadS16(charHeader, 0xA); - if (tilesWide_in < 0 && tilesWide == 0) { - tilesWide = 1; - } else if (tilesWide == 0) { - tilesWide = tilesWide_in; + if (tilesWide == 0) { + tilesWide = ReadS16(charHeader, 0xA); + if (tilesWide < 0) { + tilesWide = 1; + } } int numTiles = ReadS32(charHeader, 0x18) / (64 / (8 / bitDepth)); int tilesTall = ReadS16(charHeader, 0x8); - if (tilesTall < 0 || tilesWide != tilesWide_in) { + if (tilesTall < 0) tilesTall = (numTiles + tilesWide - 1) / tilesWide; - } - if (tilesWide % colsPerChunk != 0) { + if (tilesWide % colsPerChunk != 0) FATAL_ERROR("The width in tiles (%d) isn't a multiple of the specified tiles per row (%d)", tilesWide, colsPerChunk); - } - if (tilesTall % rowsPerChunk != 0) { + if (tilesTall % rowsPerChunk != 0) FATAL_ERROR("The height in tiles (%d) isn't a multiple of the specified rows per chunk (%d)", tilesTall, rowsPerChunk); - } - image->width = tilesWide * 8; - image->height = tilesTall * 8; + + image->width = tilesWide * 8; + image->height = tilesTall * 8; image->bitDepth = bitDepth; - image->pixels = calloc(tilesWide * tilesTall, tileSize); + image->pixels = calloc(tilesWide * tilesTall, tileSize); - if (image->pixels == NULL) { + if (image->pixels == NULL) FATAL_ERROR("Failed to allocate memory for pixels.\n"); - } int chunksWide = tilesWide / colsPerChunk; // how many chunks side-by-side are needed for the full width of the image uint32_t key = 0; - if (scanned) { - switch (bitDepth) { - case 4: - key = ConvertFromScanned4Bpp(imageData, image->pixels, fileSize - 0x30, invertColors, scanFrontToBack); - break; - case 8: - key = ConvertFromScanned8Bpp(imageData, image->pixels, fileSize - 0x30, invertColors, scanFrontToBack); - break; + if (scanned) + { + switch (bitDepth) + { + case 4: + key = ConvertFromScanned4Bpp(imageData, image->pixels, fileSize - 0x30, invertColors, scanFrontToBack); + break; + case 8: + key = ConvertFromScanned8Bpp(imageData, image->pixels, fileSize - 0x30, invertColors, scanFrontToBack); + break; } - } else { - switch (bitDepth) { - case 4: - ConvertFromTiles4Bpp(imageData, image->pixels, numTiles, chunksWide, colsPerChunk, rowsPerChunk, invertColors); - break; - case 8: - ConvertFromTiles8Bpp(imageData, image->pixels, numTiles, chunksWide, colsPerChunk, rowsPerChunk, invertColors); - break; + } + else + { + switch (bitDepth) + { + case 4: + ConvertFromTiles4Bpp(imageData, image->pixels, numTiles, chunksWide, colsPerChunk, rowsPerChunk, + invertColors); + break; + case 8: + ConvertFromTiles8Bpp(imageData, image->pixels, numTiles, chunksWide, colsPerChunk, rowsPerChunk, + invertColors); + break; } } @@ -450,42 +475,37 @@ uint32_t ReadNtrImage(char *path, int tilesWide, int bitDepth, int colsPerChunk, return key; } -void WriteImage(char *path, int numTiles, int bitDepth, int colsPerChunk, int rowsPerChunk, struct Image *image, bool invertColors) { +void WriteImage(char *path, int numTiles, int bitDepth, int colsPerChunk, int rowsPerChunk, struct Image *image, bool invertColors) +{ int tileSize = bitDepth * 8; // number of bytes per tile - if (image->width % 8 != 0) { + if (image->width % 8 != 0) FATAL_ERROR("The width in pixels (%d) isn't a multiple of 8.\n", image->width); - } - if (image->height % 8 != 0) { + if (image->height % 8 != 0) FATAL_ERROR("The height in pixels (%d) isn't a multiple of 8.\n", image->height); - } - int tilesWide = image->width / 8; // how many tiles wide the image is + int tilesWide = image->width / 8; // how many tiles wide the image is int tilesTall = image->height / 8; // how many tiles tall the image is - if (tilesWide % colsPerChunk != 0) { + if (tilesWide % colsPerChunk != 0) FATAL_ERROR("The width in tiles (%d) isn't a multiple of the specified tiles per row (%d)", tilesWide, colsPerChunk); - } - if (tilesTall % rowsPerChunk != 0) { + if (tilesTall % rowsPerChunk != 0) FATAL_ERROR("The height in tiles (%d) isn't a multiple of the specified rows per chunk (%d)", tilesTall, rowsPerChunk); - } int maxNumTiles = tilesWide * tilesTall; - if (numTiles == 0) { + if (numTiles == 0) numTiles = maxNumTiles; - } else if (numTiles > maxNumTiles) { + else if (numTiles > maxNumTiles) FATAL_ERROR("The specified number of tiles (%d) is greater than the maximum possible value (%d).\n", numTiles, maxNumTiles); - } - int bufferSize = numTiles * tileSize; + int bufferSize = numTiles * tileSize; unsigned char *buffer = malloc(bufferSize); - if (buffer == NULL) { + if (buffer == NULL) FATAL_ERROR("Failed to allocate memory for pixels.\n"); - } int chunksWide = tilesWide / colsPerChunk; // how many chunks side-by-side are needed for the full width of the image @@ -506,95 +526,103 @@ void WriteImage(char *path, int numTiles, int bitDepth, int colsPerChunk, int ro free(buffer); } -void WriteNtrImage(char *path, int numTiles, int bitDepth, int colsPerChunk, int rowsPerChunk, struct Image *image, bool invertColors, bool clobberSize, bool byteOrder, bool version101, bool sopc, bool vram, uint32_t scanMode, uint32_t mappingType, uint32_t key, bool wrongSize) { +void WriteNtrImage(char *path, int numTiles, int bitDepth, int colsPerChunk, int rowsPerChunk, struct Image *image, + bool invertColors, bool clobberSize, bool byteOrder, bool version101, bool sopc, bool vram, uint32_t scanMode, + uint32_t mappingType, uint32_t key, bool wrongSize) +{ FILE *fp = fopen(path, "wb"); - if (fp == NULL) { + if (fp == NULL) FATAL_ERROR("Failed to open \"%s\" for writing.\n", path); - } int tileSize = bitDepth * 8; // number of bytes per tile - if (image->width % 8 != 0) { + if (image->width % 8 != 0) FATAL_ERROR("The width in pixels (%d) isn't a multiple of 8.\n", image->width); - } - if (image->height % 8 != 0) { + if (image->height % 8 != 0) FATAL_ERROR("The height in pixels (%d) isn't a multiple of 8.\n", image->height); - } - int tilesWide = image->width / 8; // how many tiles wide the image is + int tilesWide = image->width / 8; // how many tiles wide the image is int tilesTall = image->height / 8; // how many tiles tall the image is - if (tilesWide % colsPerChunk != 0) { + if (tilesWide % colsPerChunk != 0) FATAL_ERROR("The width in tiles (%d) isn't a multiple of the specified tiles per row (%d)", tilesWide, colsPerChunk); - } - if (tilesTall % rowsPerChunk != 0) { + if (tilesTall % rowsPerChunk != 0) FATAL_ERROR("The height in tiles (%d) isn't a multiple of the specified rows per chunk (%d)", tilesTall, rowsPerChunk); - } int maxNumTiles = tilesWide * tilesTall; - if (numTiles == 0) { + if (numTiles == 0) numTiles = maxNumTiles; - } else if (numTiles > maxNumTiles) { + else if (numTiles > maxNumTiles) FATAL_ERROR("The specified number of tiles (%d) is greater than the maximum possible value (%d).\n", numTiles, maxNumTiles); - } - int bufferSize = numTiles * tileSize; + int bufferSize = numTiles * tileSize; unsigned char *pixelBuffer = malloc(bufferSize); - if (pixelBuffer == NULL) { + if (pixelBuffer == NULL) FATAL_ERROR("Failed to allocate memory for pixels.\n"); - } int chunksWide = tilesWide / colsPerChunk; // how many chunks side-by-side are needed for the full width of the image - if (scanMode) { - switch (bitDepth) { - case 4: - ConvertToScanned4Bpp(image->pixels, pixelBuffer, bufferSize, invertColors, key, scanMode); - break; - case 8: - FATAL_ERROR("8Bpp not supported yet.\n"); - break; + if (scanMode) + { + switch (bitDepth) + { + case 4: + ConvertToScanned4Bpp(image->pixels, pixelBuffer, bufferSize, invertColors, key, scanMode); + break; + case 8: + FATAL_ERROR("8Bpp not supported yet.\n"); + break; } - } else { - switch (bitDepth) { - case 4: - ConvertToTiles4Bpp(image->pixels, pixelBuffer, numTiles, chunksWide, colsPerChunk, rowsPerChunk, invertColors); - break; - case 8: - ConvertToTiles8Bpp(image->pixels, pixelBuffer, numTiles, chunksWide, colsPerChunk, rowsPerChunk, invertColors); - break; + } + else + { + switch (bitDepth) + { + case 4: + ConvertToTiles4Bpp(image->pixels, pixelBuffer, numTiles, chunksWide, colsPerChunk, rowsPerChunk, + invertColors); + break; + case 8: + ConvertToTiles8Bpp(image->pixels, pixelBuffer, numTiles, chunksWide, colsPerChunk, rowsPerChunk, + invertColors); + break; } } WriteGenericNtrHeader(fp, "RGCN", bufferSize + (sopc ? 0x30 : 0x20) + (wrongSize ? -8 : 0), byteOrder, version101, sopc ? 2 : 1); - unsigned char charHeader[0x20] = { 0x52, 0x41, 0x48, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00 }; + unsigned char charHeader[0x20] = { 0x52, 0x41, 0x48, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00 }; charHeader[4] = (bufferSize + 0x20 + (wrongSize ? -8 : 0)) & 0xFF; charHeader[5] = ((bufferSize + 0x20 + (wrongSize ? -8 : 0)) >> 8) & 0xFF; charHeader[6] = ((bufferSize + 0x20 + (wrongSize ? -8 : 0)) >> 16) & 0xFF; charHeader[7] = ((bufferSize + 0x20 + (wrongSize ? -8 : 0)) >> 24) & 0xFF; - if (!clobberSize) { + if (!clobberSize) + { charHeader[8] = tilesTall & 0xFF; charHeader[9] = (tilesTall >> 8) & 0xFF; charHeader[10] = tilesWide & 0xFF; charHeader[11] = (tilesWide >> 8) & 0xFF; - } else { - charHeader[8] = 0xFF; - charHeader[9] = 0xFF; + } + else + { + charHeader[8] = 0xFF; + charHeader[9] = 0xFF; charHeader[10] = 0xFF; charHeader[11] = 0xFF; - charHeader[16] = 0x10; // size clobbering implies mapping type is some variant of 1d - *should* have a mapping type that's not 0 + charHeader[16] = 0x10; //size clobbering implies mapping type is some variant of 1d - *should* have a mapping type that's not 0 - if (mappingType == 0) { + if (mappingType == 0) + { mappingType = 32; // if not specified assume that it is 32k } } @@ -604,32 +632,34 @@ void WriteNtrImage(char *path, int numTiles, int bitDepth, int colsPerChunk, int if (mappingType != 0) { uint32_t val = 0; switch (mappingType) { - case 32: - val = 0; - break; - case 64: - val = 0x10; - break; - case 128: - val = 0x20; - break; - case 256: - val = 0x30; - break; - default: - FATAL_ERROR("Invalid mapping type %d\n", mappingType); - break; + case 32: + val = 0; + break; + case 64: + val = 0x10; + break; + case 128: + val = 0x20; + break; + case 256: + val = 0x30; + break; + default: + FATAL_ERROR("Invalid mapping type %d\n", mappingType); + break; } charHeader[18] = val; } - if (scanMode) { - charHeader[20] = 1; // implies BMP + if (scanMode) + { + charHeader[20] = 1; //implies BMP } - if (vram) { - charHeader[21] = 1; // implies VRAM transfer + if (vram) + { + charHeader[21] = 1; //implies VRAM transfer } charHeader[24] = bufferSize & 0xFF; @@ -641,7 +671,8 @@ void WriteNtrImage(char *path, int numTiles, int bitDepth, int colsPerChunk, int fwrite(pixelBuffer, 1, bufferSize, fp); - if (sopc) { + if (sopc) + { unsigned char sopcBuffer[0x10] = { 0x53, 0x4F, 0x50, 0x43, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; sopcBuffer[12] = tilesWide & 0xFF; @@ -657,91 +688,98 @@ void WriteNtrImage(char *path, int numTiles, int bitDepth, int colsPerChunk, int fclose(fp); } -void FreeImage(struct Image *image) { +void FreeImage(struct Image *image) +{ free(image->pixels); image->pixels = NULL; } -void ReadGbaPalette(char *path, struct Palette *palette) { +void ReadGbaPalette(char *path, struct Palette *palette) +{ int fileSize; unsigned char *data = ReadWholeFile(path, &fileSize); - if (fileSize % 2 != 0) { - FATAL_ERROR("The file size (%d) is not a multiple of 2.\n", fileSize); - } + if (fileSize % 2 != 0) + FATAL_ERROR("The file size (%d) is not a multiple of 2.\n", fileSize); palette->numColors = fileSize / 2; for (int i = 0; i < palette->numColors; i++) { - uint16_t paletteEntry = (data[i * 2 + 1] << 8) | data[i * 2]; - palette->colors[i].red = UPCONVERT_BIT_DEPTH(GET_GBA_PAL_RED(paletteEntry)); + uint16_t paletteEntry = (data[i * 2 + 1] << 8) | data[i * 2]; + palette->colors[i].red = UPCONVERT_BIT_DEPTH(GET_GBA_PAL_RED(paletteEntry)); palette->colors[i].green = UPCONVERT_BIT_DEPTH(GET_GBA_PAL_GREEN(paletteEntry)); - palette->colors[i].blue = UPCONVERT_BIT_DEPTH(GET_GBA_PAL_BLUE(paletteEntry)); + palette->colors[i].blue = UPCONVERT_BIT_DEPTH(GET_GBA_PAL_BLUE(paletteEntry)); } free(data); } -void ReadNtrPalette(char *path, struct Palette *palette, int bitdepth, int palIndex) { +void ReadNtrPalette(char *path, struct Palette *palette, int bitdepth, int palIndex, bool inverted) +{ int fileSize; unsigned char *data = ReadWholeFile(path, &fileSize); - if (memcmp(data, "RLCN", 4) != 0 && memcmp(data, "RPCN", 4) != 0) // NCLR / NCPR + if (memcmp(data, "RLCN", 4) != 0 && memcmp(data, "RPCN", 4) != 0) //NCLR / NCPR { FATAL_ERROR("Not a valid NCLR or NCPR palette file.\n"); } unsigned char *paletteHeader = data + 0x10; - if (memcmp(paletteHeader, "TTLP", 4) != 0) { + if (memcmp(paletteHeader, "TTLP", 4) != 0) + { FATAL_ERROR("No valid PLTT file after NCLR header.\n"); } - if ((fileSize - 0x28) % 2 != 0) { + if ((fileSize - 0x28) % 2 != 0) FATAL_ERROR("The file size (%d) is not a multiple of 2.\n", fileSize); - } palette->bitDepth = paletteHeader[0x8] == 3 ? 4 : 8; bitdepth = bitdepth ? bitdepth : palette->bitDepth; size_t paletteSize = (paletteHeader[0x10]) | (paletteHeader[0x11] << 8) | (paletteHeader[0x12] << 16) | (paletteHeader[0x13] << 24); + if (inverted) paletteSize = 0x200 - paletteSize; if (palIndex == 0) { palette->numColors = paletteSize / 2; } else { - palette->numColors = bitdepth == 4 ? 16 : 256; // remove header and divide by 2 + palette->numColors = bitdepth == 4 ? 16 : 256; //remove header and divide by 2 --palIndex; } unsigned char *paletteData = paletteHeader + 0x18; - for (int i = 0; i < 256; i++) { - if (i < palette->numColors) { - uint16_t paletteEntry = (paletteData[(32 * palIndex) + i * 2 + 1] << 8) | paletteData[(32 * palIndex) + i * 2]; - palette->colors[i].red = UPCONVERT_BIT_DEPTH(GET_GBA_PAL_RED(paletteEntry)); + for (int i = 0; i < 256; i++) + { + if (i < palette->numColors) + { + uint16_t paletteEntry = (paletteData[(32 * palIndex) + i * 2 + 1] << 8) | paletteData[(32 * palIndex) + i * 2]; + palette->colors[i].red = UPCONVERT_BIT_DEPTH(GET_GBA_PAL_RED(paletteEntry)); palette->colors[i].green = UPCONVERT_BIT_DEPTH(GET_GBA_PAL_GREEN(paletteEntry)); - palette->colors[i].blue = UPCONVERT_BIT_DEPTH(GET_GBA_PAL_BLUE(paletteEntry)); - } else { - palette->colors[i].red = 0; + palette->colors[i].blue = UPCONVERT_BIT_DEPTH(GET_GBA_PAL_BLUE(paletteEntry)); + } + else + { + palette->colors[i].red = 0; palette->colors[i].green = 0; - palette->colors[i].blue = 0; + palette->colors[i].blue = 0; } } free(data); } -void WriteGbaPalette(char *path, struct Palette *palette) { +void WriteGbaPalette(char *path, struct Palette *palette) +{ FILE *fp = fopen(path, "wb"); - if (fp == NULL) { + if (fp == NULL) FATAL_ERROR("Failed to open \"%s\" for writing.\n", path); - } for (int i = 0; i < palette->numColors; i++) { - unsigned char red = DOWNCONVERT_BIT_DEPTH(palette->colors[i].red); + unsigned char red = DOWNCONVERT_BIT_DEPTH(palette->colors[i].red); unsigned char green = DOWNCONVERT_BIT_DEPTH(palette->colors[i].green); - unsigned char blue = DOWNCONVERT_BIT_DEPTH(palette->colors[i].blue); + unsigned char blue = DOWNCONVERT_BIT_DEPTH(palette->colors[i].blue); uint16_t paletteEntry = SET_GBA_PAL(red, green, blue); @@ -752,22 +790,23 @@ void WriteGbaPalette(char *path, struct Palette *palette) { fclose(fp); } -void WriteNtrPalette(char *path, struct Palette *palette, bool ncpr, bool ir, int bitdepth, bool pad, int compNum, bool pcmp) { +void WriteNtrPalette(char *path, struct Palette *palette, bool ncpr, bool ir, int bitdepth, bool pad, int compNum, bool pcmp, bool inverted) +{ FILE *fp = fopen(path, "wb"); - if (fp == NULL) { + if (fp == NULL) FATAL_ERROR("Failed to open \"%s\" for writing.\n", path); - } int colourNum = pad ? 256 : palette->numColors; - uint32_t size = colourNum * 2; // todo check if there's a better way to detect :/ + uint32_t size = colourNum * 2; //todo check if there's a better way to detect :/ uint32_t extSize = size + (ncpr ? 0x10 : 0x18); - int numSections = 1; - int pcmpColorNum = 0; + int numSections = 1; + int pcmpColorNum = 0; uint32_t pcmpSize = 0; - if (pcmp) { + if (pcmp) + { pcmpColorNum = colourNum / (bitdepth == 4 ? 16 : 256); if (pcmpColorNum == 0) { FATAL_ERROR("colourNum=%d palette->bitDepth=%d\n", colourNum, bitdepth); @@ -776,59 +815,67 @@ void WriteNtrPalette(char *path, struct Palette *palette, bool ncpr, bool ir, in ++numSections; } - // NCLR header + //NCLR header WriteGenericNtrHeader(fp, (ncpr ? "RPCN" : "RLCN"), extSize + pcmpSize, !ncpr, false, numSections); - unsigned char palHeader[0x18] = { - 0x54, 0x54, 0x4C, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00 - }; + unsigned char palHeader[0x18] = + { + 0x54, 0x54, 0x4C, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00 + }; - // section size + //section size palHeader[4] = extSize & 0xFF; palHeader[5] = (extSize >> 8) & 0xFF; palHeader[6] = (extSize >> 16) & 0xFF; palHeader[7] = (extSize >> 24) & 0xFF; - if (!palette->bitDepth) { + if (!palette->bitDepth) palette->bitDepth = 4; - } bitdepth = bitdepth ? bitdepth : palette->bitDepth; - // bit depth - palHeader[8] = bitdepth == 4 ? 0x03 : 0x04; + //bit depth + palHeader[8] = bitdepth == 4 ? 0x03: 0x04; - if (compNum) { - palHeader[10] = compNum; // assuming this is an indicator of compression, literally no docs for it though + if (compNum) + { + palHeader[10] = compNum; //assuming this is an indicator of compression, literally no docs for it though } - // size - palHeader[16] = size & 0xFF; - palHeader[17] = (size >> 8) & 0xFF; - palHeader[18] = (size >> 16) & 0xFF; - palHeader[19] = (size >> 24) & 0xFF; + //size + int colorSize = inverted ? 0x200 - size : size; + palHeader[16] = colorSize & 0xFF; + palHeader[17] = (colorSize >> 8) & 0xFF; + palHeader[18] = (colorSize >> 16) & 0xFF; + palHeader[19] = (colorSize >> 24) & 0xFF; fwrite(palHeader, 1, 0x18, fp); - unsigned char *colours = malloc(colourNum * 2); - // palette data - for (int i = 0; i < colourNum; i++) { - if (i < palette->numColors) { - unsigned char red = DOWNCONVERT_BIT_DEPTH(palette->colors[i].red); + unsigned char * colours = malloc(colourNum * 2); + //palette data + for (int i = 0; i < colourNum; i++) + { + if (i < palette->numColors) + { + unsigned char red = DOWNCONVERT_BIT_DEPTH(palette->colors[i].red); unsigned char green = DOWNCONVERT_BIT_DEPTH(palette->colors[i].green); - unsigned char blue = DOWNCONVERT_BIT_DEPTH(palette->colors[i].blue); + unsigned char blue = DOWNCONVERT_BIT_DEPTH(palette->colors[i].blue); uint16_t paletteEntry = SET_GBA_PAL(red, green, blue); - colours[i * 2] = paletteEntry & 0xFF; + colours[i * 2] = paletteEntry & 0xFF; colours[i * 2 + 1] = paletteEntry >> 8; - } else { - colours[i * 2] = 0x00; + } + else + { + colours[i * 2] = 0x00; colours[i * 2 + 1] = 0x00; } } - if (ir) { + if (ir) + { colours[colourNum * 2 - 2] = 'I'; colours[colourNum * 2 - 1] = 'R'; } @@ -836,22 +883,24 @@ void WriteNtrPalette(char *path, struct Palette *palette, bool ncpr, bool ir, in fwrite(colours, 1, colourNum * 2, fp); free(colours); - if (pcmp) { - uint8_t pcmp_header[16] = { 0x50, 0x4D, 0x43, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEF, 0xBE, 0x08, 0x00, 0x00, 0x00 }; - pcmp_header[4] = pcmpSize & 0xFF; - pcmp_header[5] = (pcmpSize >> 8) & 0xFF; - pcmp_header[6] = (pcmpSize >> 16) & 0xFF; - pcmp_header[7] = (pcmpSize >> 24) & 0xFF; - pcmp_header[8] = pcmpColorNum & 0xFF; - pcmp_header[9] = (pcmpColorNum >> 8) & 0xFF; + if (pcmp) + { + uint8_t pcmp_header[16] = {0x50, 0x4D, 0x43, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEF, 0xBE, 0x08, 0x00, 0x00, 0x00}; + pcmp_header[4] = pcmpSize & 0xFF; + pcmp_header[5] = (pcmpSize >> 8) & 0xFF; + pcmp_header[6] = (pcmpSize >> 16) & 0xFF; + pcmp_header[7] = (pcmpSize >> 24) & 0xFF; + pcmp_header[8] = pcmpColorNum & 0xFF; + pcmp_header[9] = (pcmpColorNum >> 8) & 0xFF; fwrite(pcmp_header, 1, 16, fp); uint8_t *pcmp_data = malloc(2 * pcmpColorNum); - if (pcmp_data == NULL) { + if (pcmp_data == NULL) + { FATAL_ERROR("failed to alloc pcmp_data\n"); } for (int i = 0; i < pcmpColorNum; ++i) { - pcmp_data[i * 2] = i & 0xFF; + pcmp_data[i * 2] = i & 0xFF; pcmp_data[i * 2 + 1] = (i >> 8) & 0xFF; } fwrite(pcmp_data, 1, pcmpColorNum * 2, fp); @@ -861,9 +910,13 @@ void WriteNtrPalette(char *path, struct Palette *palette, bool ncpr, bool ir, in fclose(fp); } -void ReadNtrCell_CEBK(unsigned char *restrict data, unsigned int blockOffset, unsigned int blockSize, struct JsonToCellOptions *options) { +void ReadNtrCell_CEBK(unsigned char * restrict data, unsigned int blockOffset, unsigned int blockSize, struct JsonToCellOptions *options) +{ options->cellCount = data[blockOffset + 0x8] | (data[blockOffset + 0x9] << 8); - options->extended = data[blockOffset + 0xA] == 1; + options->extended = data[blockOffset + 0xA] == 1; + + int vramTransferOffset = (data[blockOffset + 0x14] | data[blockOffset + 0x15] << 8); + options->vramTransferEnabled = vramTransferOffset > 0; /*if (!options->extended) { //in theory not extended should be implemented, however not 100% sure @@ -873,23 +926,25 @@ void ReadNtrCell_CEBK(unsigned char *restrict data, unsigned int blockOffset, un options->mappingType = data[blockOffset + 0x10]; options->cells = malloc(sizeof(struct Cell *) * options->cellCount); - int celSize = options->extended ? 0x10 : 0x8; + int celSize = options->extended ? 0x10 : 0x8; - for (int i = 0; i < options->cellCount; i++) { + for (int i = 0; i < options->cellCount; i++) + { int offset = blockOffset + 0x20 + (i * celSize); - if (offset + celSize > blockSize) { - FATAL_ERROR("corrupted CEBK block"); + if (offset + celSize > blockOffset + blockSize) { + FATAL_ERROR("corrupted CEBK block\n"); } - options->cells[i] = malloc(sizeof(struct Cell)); - options->cells[i]->oamCount = data[offset] | (data[offset + 1] << 8); - short cellAttrs = data[offset + 2] | (data[offset + 3] << 8); - options->cells[i]->attributes.hFlip = (cellAttrs >> 8) & 1; - options->cells[i]->attributes.vFlip = (cellAttrs >> 9) & 1; - options->cells[i]->attributes.hvFlip = (cellAttrs >> 10) & 1; - options->cells[i]->attributes.boundingRect = (cellAttrs >> 11) & 1; + options->cells[i] = malloc(sizeof(struct Cell)); + options->cells[i]->oamCount = data[offset] | (data[offset + 1] << 8); + short cellAttrs = data[offset + 2] | (data[offset + 3] << 8); + options->cells[i]->attributes.hFlip = (cellAttrs >> 8) & 1; + options->cells[i]->attributes.vFlip = (cellAttrs >> 9) & 1; + options->cells[i]->attributes.hvFlip = (cellAttrs >> 10) & 1; + options->cells[i]->attributes.boundingRect = (cellAttrs >> 11) & 1; options->cells[i]->attributes.boundingSphereRadius = cellAttrs & 0x3F; - if (options->extended) { + if (options->extended) + { options->cells[i]->maxX = data[offset + 8] | (data[offset + 9] << 8); options->cells[i]->maxY = data[offset + 10] | (data[offset + 11] << 8); options->cells[i]->minX = data[offset + 12] | (data[offset + 13] << 8); @@ -898,77 +953,104 @@ void ReadNtrCell_CEBK(unsigned char *restrict data, unsigned int blockOffset, un } int offset = blockOffset + 0x20 + (options->cellCount * celSize); - for (int i = 0; i < options->cellCount; i++) { + for (int i = 0; i < options->cellCount; i++) + { options->cells[i]->oam = malloc(sizeof(struct OAM) * options->cells[i]->oamCount); - for (int j = 0; j < options->cells[i]->oamCount; j++) { - // Attr0 + for (int j = 0; j < options->cells[i]->oamCount; j++) + { + //Attr0 - // bits 0-7 Y coordinate + //bits 0-7 Y coordinate options->cells[i]->oam[j].attr0.YCoordinate = data[offset]; - // bit 8 rotation + //bit 8 rotation options->cells[i]->oam[j].attr0.Rotation = data[offset + 1] & 1; - // bit 9 Obj Size (if rotation) or Obj Disable (if not rotation) + //bit 9 Obj Size (if rotation) or Obj Disable (if not rotation) options->cells[i]->oam[j].attr0.SizeDisable = (data[offset + 1] >> 1) & 1; - // bits 10-11 Obj Mode + //bits 10-11 Obj Mode options->cells[i]->oam[j].attr0.Mode = (data[offset + 1] >> 2) & 3; - // bit 12 Obj Mosaic + //bit 12 Obj Mosaic options->cells[i]->oam[j].attr0.Mosaic = (data[offset + 1] >> 4) & 1; - // bit 13 Colours + //bit 13 Colours options->cells[i]->oam[j].attr0.Colours = ((data[offset + 1] >> 5) & 1) == 0 ? 16 : 256; - // bits 14-15 Obj Shape + //bits 14-15 Obj Shape options->cells[i]->oam[j].attr0.Shape = (data[offset + 1] >> 6) & 3; - // Attr1 + //Attr1 - // bits 0-8 X coordinate + //bits 0-8 X coordinate options->cells[i]->oam[j].attr1.XCoordinate = data[offset + 2] | ((data[offset + 3] & 1) << 8); - // bits 9-13 Rotation and scaling (if rotation) bit 12 Horizontal flip, bit 13 Vertical flip (if not rotation) + //bits 9-13 Rotation and scaling (if rotation) bit 12 Horizontal flip, bit 13 Vertical flip (if not rotation) options->cells[i]->oam[j].attr1.RotationScaling = (data[offset + 3] >> 1) & 0x1F; - // bits 14-15 Obj Size + //bits 14-15 Obj Size options->cells[i]->oam[j].attr1.Size = (data[offset + 3] >> 6) & 3; - // Attr2 + //Attr2 - // bits 0-9 Character Name? + //bits 0-9 Character Name? options->cells[i]->oam[j].attr2.CharName = data[offset + 4] | ((data[offset + 5] & 3) << 8); - // bits 10-11 Priority + //bits 10-11 Priority options->cells[i]->oam[j].attr2.Priority = (data[offset + 5] >> 2) & 3; - // bits 12-15 Palette Number + //bits 12-15 Palette Number options->cells[i]->oam[j].attr2.Palette = (data[offset + 5] >> 4) & 0xF; offset += 6; } } + + if (options->vramTransferEnabled) + { + offset = blockOffset + 0x08 + vramTransferOffset; + + // first 2 dwords are max size and offset, offset *should* always be 0x08 since the transfer data list immediately follows this + options->vramTransferMaxSize = data[offset] | (data[offset + 1] << 8) | (data[offset + 2] << 16) | (data[offset + 3] << 24); + offset += 0x08; + + // read 1 VRAM transfer data block for each cell (this is an assumption based on the NCERs I looked at) + options->transferData = malloc(sizeof(struct CellVramTransferData *) * options->cellCount); + for (int idx = 0; idx < options->cellCount; idx++) + { + options->transferData[idx] = malloc(sizeof(struct CellVramTransferData)); + options->transferData[idx]->sourceDataOffset = data[offset] | (data[offset + 1] << 8) | (data[offset + 2] << 16) | (data[offset + 3] << 24); + options->transferData[idx]->size = data[offset + 4] | (data[offset + 5] << 8) | (data[offset + 6] << 16) | (data[offset + 7] << 24); + offset += 8; + } + } } -void ReadNtrCell_LABL(unsigned char *restrict data, unsigned int blockOffset, unsigned int blockSize, struct JsonToCellOptions *options) { - int count = 0; +void ReadNtrCell_LABL(unsigned char * restrict data, unsigned int blockOffset, unsigned int blockSize, struct JsonToCellOptions *options) +{ + int count = 0; unsigned int textStart = blockOffset + 8; - while (textStart < blockOffset + blockSize) { + while (textStart < blockOffset + blockSize) + { unsigned int labelOffset = data[textStart] | (data[textStart + 1] << 8) | (data[textStart + 2] << 16) | (data[textStart + 3] << 24); - if (labelOffset > blockSize) { + if (labelOffset > blockSize) + { break; - } else { + } + else { ++count; textStart += 4; } } options->labelCount = count; - options->labels = malloc(sizeof(char *) * count); - for (int i = 0; i < count; ++i) { + options->labels = malloc(sizeof(char *) * count); + for (int i = 0; i < count; ++i) + { int offset = textStart + (data[blockOffset + 4 * i + 8] | (data[blockOffset + 4 * i + 9] << 8) | (data[blockOffset + 4 * i + 10] << 16) | (data[blockOffset + 4 * i + 11] << 24)); - if (offset > blockOffset + blockSize) { - FATAL_ERROR("corrupted LABL block"); + if (offset > blockOffset + blockSize) + { + FATAL_ERROR("corrupted LABL block\n"); } unsigned long slen = strnlen((char *)data + offset, blockSize - offset); options->labels[i] = malloc(slen + 1); @@ -976,72 +1058,109 @@ void ReadNtrCell_LABL(unsigned char *restrict data, unsigned int blockOffset, un } } -void ReadNtrCell(char *path, struct JsonToCellOptions *options) { +void ReadNtrCell(char *path, struct JsonToCellOptions *options) +{ int fileSize; unsigned char *data = ReadWholeFile(path, &fileSize); unsigned int offset = 0x10; - if (memcmp(data, "RECN", 4) != 0) // NCER + if (memcmp(data, "RECN", 4) != 0) //NCER { FATAL_ERROR("Not a valid NCER cell file.\n"); } - options->labelEnabled = data[0xE] != 1; + options->labelEnabled = false; unsigned int blockSize; offset = FindNitroDataBlock(data, "KBEC", fileSize, &blockSize); - if (offset != -1u) { + if (offset != -1u) + { ReadNtrCell_CEBK(data, offset, blockSize, options); - } else { + } + else { FATAL_ERROR("missing CEBK block"); } offset = FindNitroDataBlock(data, "LBAL", fileSize, &blockSize); - if (offset != -1u) { + if (offset != -1u) + { + options->labelEnabled = true; ReadNtrCell_LABL(data, offset, blockSize, options); } free(data); } -void WriteNtrCell(char *path, struct JsonToCellOptions *options) { +void WriteNtrCell(char *path, struct JsonToCellOptions *options) +{ FILE *fp = fopen(path, "wb"); - if (fp == NULL) { + if (fp == NULL) FATAL_ERROR("Failed to open \"%s\" for writing.\n", path); + + int iterNum = (options->extended ? 0x10 : 0x8); + + // KBEC base size: 0x08 per bank, or 0x10 per extended bank + unsigned int kbecSize = options->cellCount * (options->extended ? 0x10 : 0x08); + // if VRAM transfer is enabled, add 0x08 for the header and 0x08 for each cell + if (options->vramTransferEnabled) + { + kbecSize += 0x08 + (0x08 * options->cellCount); + } + // add 0x06 for number of OAMs - can be more than 1 + for (int idx = 0; idx < options->cellCount * iterNum; idx += iterNum) + { + kbecSize += options->cells[idx / iterNum]->oamCount * 0x06; } - unsigned int totalSize = (options->labelEnabled > 0 ? 0x34 : 0x20) + options->cellCount * (options->extended ? 0x16 : 0xe); + // KBEC size is padded to be 4-byte aligned + kbecSize += kbecSize % 4; - if (options->labelEnabled) { - for (int j = 0; j < options->labelCount; j++) { - totalSize += (unsigned)strlen(options->labels[j]) + 5; // strlen + terminator + pointer + unsigned int totalSize = (options->labelEnabled > 0 ? 0x34 : 0x20) + kbecSize; + + if (options->labelEnabled) + { + for (int j = 0; j < options->labelCount; j++) + { + totalSize += (unsigned)strlen(options->labels[j]) + 5; //strlen + terminator + pointer } } WriteGenericNtrHeader(fp, "RECN", totalSize, true, false, options->labelEnabled ? 3 : 1); - unsigned char KBECHeader[0x20] = { - 0x4B, 0x42, 0x45, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }; + unsigned char KBECHeader[0x20] = + { + 0x4B, 0x42, 0x45, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + }; - KBECHeader[8] = options->cellCount; // cell count + KBECHeader[8] = options->cellCount; //cell count - if (options->extended) { - KBECHeader[10] = 1; // extended + if (options->extended) + { + KBECHeader[10] = 1; //extended } - unsigned int size = options->cellCount * (options->extended ? 0x16 : 0xe); + KBECHeader[4] = (kbecSize + 0x20) & 0xFF; //size + KBECHeader[5] = (kbecSize + 0x20) >> 8; //unlikely to be more than 16 bits, but there are 32 allocated, change if necessary - KBECHeader[4] = (size + 0x20) & 0xFF; // size - KBECHeader[5] = (size + 0x20) >> 8; // unlikely to be more than 16 bits, but there are 32 allocated, change if necessary + KBECHeader[16] = (options->mappingType & 0xFF); //not possible to be more than 8 bits, though 32 are allocated - KBECHeader[16] = (options->mappingType & 0xFF); // not possible to be more than 8 bits, though 32 are allocated + // offset to VRAM transfer data within KBEC section (offset from KBEC start + 0x08) + if (options->vramTransferEnabled) + { + unsigned int vramTransferLength = 0x08 + (0x08 * options->cellCount); + unsigned int vramTransferOffset = (kbecSize + 0x20) - vramTransferLength - 0x08; + KBECHeader[20] = vramTransferOffset & 0xFF; + KBECHeader[21] = (vramTransferOffset >> 8) & 0xFF; + KBECHeader[22] = (vramTransferOffset >> 16) & 0xFF; + KBECHeader[23] = (vramTransferOffset >> 24) & 0xFF; + } fwrite(KBECHeader, 1, 0x20, fp); - unsigned char *KBECContents = malloc(size); + unsigned char *KBECContents = malloc(kbecSize); - memset(KBECContents, 0, size); + memset(KBECContents, 0, kbecSize); /*if (!options->extended) { @@ -1050,93 +1169,129 @@ void WriteNtrCell(char *path, struct JsonToCellOptions *options) { }*/ int i; - int iterNum = (options->extended ? 0x10 : 0x8); int totalOam = 0; - for (i = 0; i < options->cellCount * iterNum; i += iterNum) { - KBECContents[i] = options->cells[i / iterNum]->oamCount; // number of OAM entries + for (i = 0; i < options->cellCount * iterNum; i += iterNum) + { + KBECContents[i] = options->cells[i / iterNum]->oamCount; //number of OAM entries short cellAttrs = (options->cells[i / iterNum]->attributes.hFlip << 8) | (options->cells[i / iterNum]->attributes.vFlip << 9) - | (options->cells[i / iterNum]->attributes.hvFlip << 10) | (options->cells[i / iterNum]->attributes.boundingRect << 11) - | (options->cells[i / iterNum]->attributes.boundingSphereRadius & 0x3F); - KBECContents[i + 2] = cellAttrs & 0xff; // cell attributes + | (options->cells[i / iterNum]->attributes.hvFlip << 10) | (options->cells[i / iterNum]->attributes.boundingRect << 11) + | (options->cells[i / iterNum]->attributes.boundingSphereRadius & 0x3F); + KBECContents[i + 2] = cellAttrs & 0xff; //cell attributes KBECContents[i + 3] = cellAttrs >> 8; - KBECContents[i + 4] = (totalOam * 6) & 0xff; // pointer to OAM data - KBECContents[i + 5] = (totalOam * 6) >> 8; // unlikely to be more than 16 bits, but there are 32 allocated, change if necessary - if (options->extended) { - KBECContents[i + 8] = options->cells[i / iterNum]->maxX & 0xff; // maxX - KBECContents[i + 9] = options->cells[i / iterNum]->maxX >> 8; - KBECContents[i + 10] = options->cells[i / iterNum]->maxY & 0xff; // maxY + KBECContents[i + 4] = (totalOam * 6) & 0xff; //pointer to OAM data + KBECContents[i + 5] = (totalOam * 6) >> 8; //unlikely to be more than 16 bits, but there are 32 allocated, change if necessary + if (options->extended) + { + KBECContents[i + 8] = options->cells[i / iterNum]->maxX & 0xff; //maxX + KBECContents[i + 9] = options->cells[i / iterNum]->maxX >> 8; + KBECContents[i + 10] = options->cells[i / iterNum]->maxY & 0xff; //maxY KBECContents[i + 11] = options->cells[i / iterNum]->maxY >> 8; - KBECContents[i + 12] = options->cells[i / iterNum]->minX & 0xff; // minX + KBECContents[i + 12] = options->cells[i / iterNum]->minX & 0xff; //minX KBECContents[i + 13] = options->cells[i / iterNum]->minX >> 8; - KBECContents[i + 14] = options->cells[i / iterNum]->minY & 0xff; // minY + KBECContents[i + 14] = options->cells[i / iterNum]->minY & 0xff; //minY KBECContents[i + 15] = options->cells[i / iterNum]->minY >> 8; } totalOam += options->cells[i / iterNum]->oamCount; } - // OAM data + //OAM data int offset = i; - for (int j = 0; j < options->cellCount; j++) { - for (int k = 0; k < options->cells[j]->oamCount; k++) { - // Attr0 + for (int j = 0; j < options->cellCount; j++) + { + for (int k = 0; k < options->cells[j]->oamCount; k++) + { + //Attr0 - // bits 0-7 Y coordinate + //bits 0-7 Y coordinate KBECContents[offset] = options->cells[j]->oam[k].attr0.YCoordinate & 0xff; - // bit 8 rotation + //bit 8 rotation KBECContents[offset + 1] = options->cells[j]->oam[k].attr0.Rotation; - // bit 9 Obj Size (if rotation) or Obj Disable (if not rotation) + //bit 9 Obj Size (if rotation) or Obj Disable (if not rotation) KBECContents[offset + 1] |= options->cells[j]->oam[k].attr0.SizeDisable << 1; - // bits 10-11 Obj Mode + //bits 10-11 Obj Mode KBECContents[offset + 1] |= options->cells[j]->oam[k].attr0.Mode << 2; - // bit 12 Obj Mosaic + //bit 12 Obj Mosaic KBECContents[offset + 1] |= options->cells[j]->oam[k].attr0.Mosaic << 4; - // bit 13 Colours + //bit 13 Colours KBECContents[offset + 1] |= (options->cells[j]->oam[k].attr0.Colours == 16 ? 0 : 1) << 5; - // bits 14-15 Obj Shape + //bits 14-15 Obj Shape KBECContents[offset + 1] |= options->cells[j]->oam[k].attr0.Shape << 6; - // Attr1 + //Attr1 - // bits 0-8 X coordinate + //bits 0-8 X coordinate KBECContents[offset + 2] = options->cells[j]->oam[k].attr1.XCoordinate & 0xff; KBECContents[offset + 3] = options->cells[j]->oam[k].attr1.XCoordinate >> 8; - // bits 9-13 Rotation and scaling (if rotation) bit 12 Horizontal flip, bit 13 Vertical flip (if not rotation) + //bits 9-13 Rotation and scaling (if rotation) bit 12 Horizontal flip, bit 13 Vertical flip (if not rotation) KBECContents[offset + 3] |= options->cells[j]->oam[k].attr1.RotationScaling << 1; - // bits 14-15 Obj Size + //bits 14-15 Obj Size KBECContents[offset + 3] |= options->cells[j]->oam[k].attr1.Size << 6; - // Attr2 + //Attr2 - // bits 0-9 Character Name? + //bits 0-9 Character Name? KBECContents[offset + 4] = options->cells[j]->oam[k].attr2.CharName & 0xff; KBECContents[offset + 5] = options->cells[j]->oam[k].attr2.CharName >> 8; - // bits 10-11 Priority + //bits 10-11 Priority KBECContents[offset + 5] |= options->cells[j]->oam[k].attr2.Priority << 2; - // bits 12-15 Palette Number + //bits 12-15 Palette Number KBECContents[offset + 5] |= options->cells[j]->oam[k].attr2.Palette << 4; offset += 6; } } - fwrite(KBECContents, 1, size, fp); + // VRAM transfer data + if (options->vramTransferEnabled) + { + // max transfer size + fixed offset 0x08 + KBECContents[offset] = options->vramTransferMaxSize & 0xFF; + KBECContents[offset + 1] = (options->vramTransferMaxSize >> 8) & 0xFF; + KBECContents[offset + 2] = (options->vramTransferMaxSize >> 16) & 0xFF; + KBECContents[offset + 3] = (options->vramTransferMaxSize >> 24) & 0xFF; + + KBECContents[offset + 4] = 0x08; + + offset += 8; + + // write a VRAM transfer block for each cell + for (int idx = 0; idx < options->cellCount; idx++) + { + // offset + KBECContents[offset] = options->transferData[idx]->sourceDataOffset & 0xFF; + KBECContents[offset + 1] = (options->transferData[idx]->sourceDataOffset >> 8) & 0xFF; + KBECContents[offset + 2] = (options->transferData[idx]->sourceDataOffset >> 16) & 0xFF; + KBECContents[offset + 3] = (options->transferData[idx]->sourceDataOffset >> 24) & 0xFF; + + // size + KBECContents[offset + 4] = options->transferData[idx]->size & 0xFF; + KBECContents[offset + 5] = (options->transferData[idx]->size >> 8) & 0xFF; + KBECContents[offset + 6] = (options->transferData[idx]->size >> 16) & 0xFF; + KBECContents[offset + 7] = (options->transferData[idx]->size >> 24) & 0xFF; + offset += 8; + } + } + + fwrite(KBECContents, 1, kbecSize, fp); free(KBECContents); - if (options->labelEnabled) { + if (options->labelEnabled) + { unsigned int lablSize = 8; - for (int j = 0; j < options->labelCount; j++) { + for (int j = 0; j < options->labelCount; j++) + { lablSize += (unsigned)strlen(options->labels[j]) + 5; } @@ -1144,14 +1299,15 @@ void WriteNtrCell(char *path, struct JsonToCellOptions *options) { memset(labl, 0, lablSize); - strcpy((char *)labl, "LBAL"); + strcpy((char *) labl, "LBAL"); labl[4] = lablSize & 0xff; labl[5] = lablSize >> 8; unsigned int position = 0; i = 0; - for (int j = 0; j < options->labelCount; j++) { + for (int j = 0; j < options->labelCount; j++) + { labl[i + 8] = position & 0xff; labl[i + 9] = position >> 8; @@ -1159,8 +1315,9 @@ void WriteNtrCell(char *path, struct JsonToCellOptions *options) { i += 4; } - for (int j = 0; j < options->labelCount; j++) { - strcpy((char *)(labl + (i + 8)), options->labels[j]); + for (int j = 0; j < options->labelCount; j++) + { + strcpy((char *) (labl + (i + 8)), options->labels[j]); i += (int)strlen(options->labels[j]) + 1; } @@ -1168,7 +1325,7 @@ void WriteNtrCell(char *path, struct JsonToCellOptions *options) { free(labl); - unsigned char txeu[0xc] = { 0x54, 0x58, 0x45, 0x55, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + unsigned char txeu[0xc] = {0x54, 0x58, 0x45, 0x55, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; fwrite(txeu, 1, 0xc, fp); } @@ -1176,18 +1333,19 @@ void WriteNtrCell(char *path, struct JsonToCellOptions *options) { fclose(fp); } -void WriteNtrScreen(char *path, struct JsonToScreenOptions *options) { +void WriteNtrScreen(char *path, struct JsonToScreenOptions *options) +{ FILE *fp = fopen(path, "wb"); - if (fp == NULL) { + if (fp == NULL) FATAL_ERROR("Failed to open \"%s\" for writing.\n", path); - } int totalSize = options->width * options->height * 2 + 0x14; WriteGenericNtrHeader(fp, "RCSN", totalSize, true, false, 1); - unsigned char NSCRHeader[0x14] = { 0x4E, 0x52, 0x43, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + unsigned char NSCRHeader[0x14] = { 0x4E, 0x52, 0x43, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00 }; NSCRHeader[0x4] = totalSize & 0xff; NSCRHeader[0x5] = (totalSize >> 8) & 0xff; @@ -1214,28 +1372,30 @@ void WriteNtrScreen(char *path, struct JsonToScreenOptions *options) { fclose(fp); } -void ReadNtrAnimation(char *path, struct JsonToAnimationOptions *options) { +void ReadNtrAnimation(char *path, struct JsonToAnimationOptions *options) +{ int fileSize; unsigned char *data = ReadWholeFile(path, &fileSize); - if (memcmp(data, "RNAN", 4) != 0 && memcmp(data, "RAMN", 4) != 0) // NANR/NMAR + if (memcmp(data, "RNAN", 4) != 0 && memcmp(data, "RAMN", 4) != 0) //NANR/NMAR { FATAL_ERROR("Not a valid NANR/NMAR animation file.\n"); } options->labelEnabled = data[0xE] != 1; - if (memcmp(data + 0x10, "KNBA", 4) != 0) // ABNK + if (memcmp(data + 0x10, "KNBA", 4) != 0 ) //ABNK { FATAL_ERROR("Not a valid ABNK animation file.\n"); } options->sequenceCount = data[0x18] | (data[0x19] << 8); - options->frameCount = data[0x1A] | (data[0x1B] << 8); + options->frameCount = data[0x1A] | (data[0x1B] << 8); options->sequenceData = malloc(sizeof(struct SequenceData *) * options->sequenceCount); - for (int i = 0; i < options->sequenceCount; i++) { + for (int i = 0; i < options->sequenceCount; i++) + { options->sequenceData[i] = malloc(sizeof(struct SequenceData)); } @@ -1243,16 +1403,18 @@ void ReadNtrAnimation(char *path, struct JsonToAnimationOptions *options) { unsigned int *frameOffsets = malloc(sizeof(unsigned int) * options->sequenceCount); - for (int i = 0; i < options->sequenceCount; i++, offset += 0x10) { - options->sequenceData[i]->frameCount = data[offset] | (data[offset + 1] << 8); - options->sequenceData[i]->loopStartFrame = data[offset + 2] | (data[offset + 3] << 8); + for (int i = 0; i < options->sequenceCount; i++, offset += 0x10) + { + options->sequenceData[i]->frameCount = data[offset] | (data[offset + 1] << 8); + options->sequenceData[i]->loopStartFrame = data[offset + 2] | (data[offset + 3] << 8); options->sequenceData[i]->animationElement = data[offset + 4] | (data[offset + 5] << 8); - options->sequenceData[i]->animationType = data[offset + 6] | (data[offset + 7] << 8); - options->sequenceData[i]->playbackMode = data[offset + 8] | (data[offset + 9] << 8) | (data[offset + 10] << 16) | (data[offset + 11] << 24); - frameOffsets[i] = data[offset + 12] | (data[offset + 13] << 8) | (data[offset + 14] << 16) | (data[offset + 15] << 24); + options->sequenceData[i]->animationType = data[offset + 6] | (data[offset + 7] << 8); + options->sequenceData[i]->playbackMode = data[offset + 8] | (data[offset + 9] << 8) | (data[offset + 10] << 16) | (data[offset + 11] << 24); + frameOffsets[i] = data[offset + 12] | (data[offset + 13] << 8) | (data[offset + 14] << 16) | (data[offset + 15] << 24); options->sequenceData[i]->frameData = malloc(sizeof(struct FrameData *) * options->sequenceData[i]->frameCount); - for (int j = 0; j < options->sequenceData[i]->frameCount; j++) { + for (int j = 0; j < options->sequenceData[i]->frameCount; j++) + { options->sequenceData[i]->frameData[j] = malloc(sizeof(struct FrameData)); } } @@ -1260,27 +1422,36 @@ void ReadNtrAnimation(char *path, struct JsonToAnimationOptions *options) { int *resultOffsets = malloc(sizeof(int) * options->frameCount); memset(resultOffsets, -1, sizeof(int) * options->frameCount); - for (int i = 0; i < options->sequenceCount; i++) { - for (int j = 0; j < options->sequenceData[i]->frameCount; j++) { - int frameOffset = offset + frameOffsets[i] + j * 0x8; + for (int i = 0; i < options->sequenceCount; i++) + { + for (int j = 0; j < options->sequenceData[i]->frameCount; j++) + { + int frameOffset = offset + frameOffsets[i] + j * 0x8; options->sequenceData[i]->frameData[j]->resultOffset = data[frameOffset] | (data[frameOffset + 1] << 8) | (data[frameOffset + 2] << 16) | (data[frameOffset + 3] << 24); - options->sequenceData[i]->frameData[j]->frameDelay = data[frameOffset + 4] | (data[frameOffset + 5] << 8); - // 0xBEEF + options->sequenceData[i]->frameData[j]->frameDelay = data[frameOffset + 4] | (data[frameOffset + 5] << 8); + //0xBEEF - // the following is messy + //the following is messy bool present = false; - // check for offset in array - for (int k = 0; k < options->frameCount; k++) { - if (resultOffsets[k] == options->sequenceData[i]->frameData[j]->resultOffset) { + //check for offset in array + for (int k = 0; k < options->frameCount; k++) + { + if (resultOffsets[k] == options->sequenceData[i]->frameData[j]->resultOffset) + { + options->sequenceData[i]->frameData[j]->resultId = k; present = true; break; } } - // add data if not present - if (!present) { - for (int k = 0; i < options->frameCount; k++) { - if (resultOffsets[k] == -1) { + //add data if not present + if (!present) + { + for (int k = 0; i < options->frameCount; k++) + { + if (resultOffsets[k] == -1) + { + options->sequenceData[i]->frameData[j]->resultId = k; resultOffsets[k] = options->sequenceData[i]->frameData[j]->resultOffset; break; } @@ -1291,14 +1462,14 @@ void ReadNtrAnimation(char *path, struct JsonToAnimationOptions *options) { free(frameOffsets); - offset = 0x18 + (data[0x24] | (data[0x25] << 8) | (data[0x26] << 16) | (data[0x27] << 24)); // start of animation results + offset = 0x18 + (data[0x24] | (data[0x25] << 8) | (data[0x26] << 16) | (data[0x27] << 24)); //start of animation results int k; - for (k = 0; k < options->frameCount; k++) { - if (resultOffsets[k] == -1) { + for (k = 0; k < options->frameCount; k++) + { + if (resultOffsets[k] == -1) break; - } } options->resultCount = k; @@ -1306,59 +1477,87 @@ void ReadNtrAnimation(char *path, struct JsonToAnimationOptions *options) { options->animationResults = malloc(sizeof(struct AnimationResults *) * options->resultCount); - for (int i = 0; i < options->resultCount; i++) { + for (int i = 0; i < options->resultCount; i++) + { options->animationResults[i] = malloc(sizeof(struct AnimationResults)); } - int resultOffset = 0; - for (int i = 0; i < options->resultCount; i++) { - if (data[offset + 2] == 0xCC && data[offset + 3] == 0xCC) { - options->animationResults[i]->resultType = 0; - } else if (data[offset + 2] == 0xEF && data[offset + 3] == 0xBE) { - options->animationResults[i]->resultType = 2; - } else { - options->animationResults[i]->resultType = 1; + // store the animationElement of the corresponding sequence as this result's resultType + for (int i = 0; i < options->sequenceCount; i++) + { + for (int j = 0; j < options->sequenceData[i]->frameCount; j++) + { + options->animationResults[options->sequenceData[i]->frameData[j]->resultId]->resultType = options->sequenceData[i]->animationElement; } - for (int j = 0; j < options->sequenceCount; j++) { - for (int k = 0; k < options->sequenceData[j]->frameCount; k++) { - if (options->sequenceData[j]->frameData[k]->resultOffset == resultOffset) { - options->sequenceData[j]->frameData[k]->resultId = i; + } + + int resultOffset = 0; + int lastSequence = 0; + for (int i = 0; i < options->resultCount; i++) + { + // find the earliest sequence matching this animation result, + // and add padding if the sequence changes + the total offset is not 4-byte aligned. + bool found = false; + for (int j = 0; j < options->sequenceCount; j++) + { + for (int k = 0; k < options->sequenceData[j]->frameCount; k++) + { + if (options->sequenceData[j]->frameData[k]->resultId == i) + { + if (lastSequence != j) + { + lastSequence = j; + if (resultOffset % 4 != 0) + { + resultOffset += 0x2; + offset += 0x2; + } + } + found = true; + break; } } + if (found) break; } - switch (options->animationResults[i]->resultType) { - case 0: // index - options->animationResults[i]->index = data[offset] | (data[offset + 1] << 8); - resultOffset += 0x4; - offset += 0x4; - break; - - case 1: // SRT - options->animationResults[i]->dataSrt.index = data[offset] | (data[offset + 1] << 8); - options->animationResults[i]->dataSrt.rotation = data[offset + 2] | (data[offset + 3] << 8); - options->animationResults[i]->dataSrt.scaleX = data[offset + 4] | (data[offset + 5] << 8) | (data[offset + 6] << 16) | (data[offset + 7] << 24); - options->animationResults[i]->dataSrt.scaleY = data[offset + 8] | (data[offset + 9] << 8) | (data[offset + 10] << 16) | (data[offset + 11] << 24); - options->animationResults[i]->dataSrt.positionX = data[offset + 12] | (data[offset + 13] << 8); - options->animationResults[i]->dataSrt.positionY = data[offset + 14] | (data[offset + 15] << 8); - resultOffset += 0x10; - offset += 0x10; - break; - - case 2: // T - options->animationResults[i]->dataT.index = data[offset] | (data[offset + 1] << 8); - options->animationResults[i]->dataT.positionX = data[offset + 4] | (data[offset + 5] << 8); - options->animationResults[i]->dataT.positionY = data[offset + 6] | (data[offset + 7] << 8); - resultOffset += 0x8; - offset += 0x8; - break; + switch (options->animationResults[i]->resultType) + { + case 0: //index + options->animationResults[i]->index = data[offset] | (data[offset + 1] << 8); + resultOffset += 0x2; + offset += 0x2; + break; + + case 1: //SRT + options->animationResults[i]->dataSrt.index = data[offset] | (data[offset + 1] << 8); + options->animationResults[i]->dataSrt.rotation = data[offset + 2] | (data[offset + 3] << 8); + options->animationResults[i]->dataSrt.scaleX = data[offset + 4] | (data[offset + 5] << 8) | (data[offset + 6] << 16) | (data[offset + 7] << 24); + options->animationResults[i]->dataSrt.scaleY = data[offset + 8] | (data[offset + 9] << 8) | (data[offset + 10] << 16) | (data[offset + 11] << 24); + options->animationResults[i]->dataSrt.positionX = data[offset + 12] | (data[offset + 13] << 8); + options->animationResults[i]->dataSrt.positionY = data[offset + 14] | (data[offset + 15] << 8); + resultOffset += 0x10; + offset += 0x10; + break; + + case 2: //T + options->animationResults[i]->dataT.index = data[offset] | (data[offset + 1] << 8); + options->animationResults[i]->dataT.positionX = data[offset + 4] | (data[offset + 5] << 8); + options->animationResults[i]->dataT.positionY = data[offset + 6] | (data[offset + 7] << 8); + resultOffset += 0x8; + offset += 0x8; + break; } } - if (options->labelEnabled) { + // add any missed padding from the final frame before processing labels + if (offset % 4 != 0) offset += 2; + + if (options->labelEnabled) + { options->labelCount = options->sequenceCount; //*should* be the same - options->labels = malloc(sizeof(char *) * options->labelCount); - offset += 0x8 + options->labelCount * 0x4; // skip to label data - for (int i = 0; i < options->labelCount; i++) { + options->labels = malloc(sizeof(char *) * options->labelCount); + offset += 0x8 + options->labelCount * 0x4; //skip to label data + for (int i = 0; i < options->labelCount; i++) + { options->labels[i] = malloc(strlen((char *)data + offset) + 1); strcpy(options->labels[i], (char *)data + offset); offset += strlen((char *)data + offset) + 1; @@ -1368,40 +1567,96 @@ void ReadNtrAnimation(char *path, struct JsonToAnimationOptions *options) { free(data); } -void WriteNtrAnimation(char *path, struct JsonToAnimationOptions *options) { +void WriteNtrAnimation(char *path, struct JsonToAnimationOptions *options) +{ FILE *fp = fopen(path, "wb"); - if (fp == NULL) { + if (fp == NULL) FATAL_ERROR("Failed to open \"%s\" for writing.\n", path); - } unsigned int totalSize = 0x20 + options->sequenceCount * 0x10 + options->frameCount * 0x8; - // todo: check these - for (int i = 0; i < options->resultCount; i++) { - if (options->animationResults[i]->resultType == 0) { - totalSize += 0x4; - } else if (options->animationResults[i]->resultType == 1) { + for (int i = 0; i < options->resultCount; i++) + { + if (options->animationResults[i]->resultType == 0) + totalSize += 0x2; + else if (options->animationResults[i]->resultType == 1) totalSize += 0x10; - } else if (options->animationResults[i]->resultType == 2) { + else if (options->animationResults[i]->resultType == 2) totalSize += 0x8; + } + + // foreach sequence, need to check whether padding is applied for its results + // then add 0x02 to totalSize if padding exists. + // padding exists if the animation results for that sequence are not 4-byte aligned. + // also flag the last result for the sequence with `padded` to save having to redo this same step later. + int *usedResults = malloc(sizeof(int) * options->frameCount); + memset(usedResults, -1, sizeof(int) * options->frameCount); + for (int i = 0; i < options->sequenceCount; i++) + { + int sequenceLen = 0; + int resultIndex = 0; + int lastNewResultIndex = -1; + for (int j = 0; j < options->sequenceData[i]->frameCount; j++) + { + // check if the result has already been used + bool isUsed = false; + for (resultIndex = 0; resultIndex < options->resultCount; resultIndex++) + { + if (usedResults[resultIndex] == options->sequenceData[i]->frameData[j]->resultId) + { + isUsed = true; + break; + } + + // if not already used, add it to the list + if (usedResults[resultIndex] == -1) + { + usedResults[resultIndex] = options->sequenceData[i]->frameData[j]->resultId; + lastNewResultIndex = options->sequenceData[i]->frameData[j]->resultId; + break; + } + } + + // if not already used, add it to the result size for the sequence + if (!isUsed) + { + if (options->animationResults[resultIndex]->resultType == 0) + sequenceLen += 0x2; + else if (options->animationResults[resultIndex]->resultType == 1) + sequenceLen += 0x10; + else if (options->animationResults[resultIndex]->resultType == 2) + sequenceLen += 0x8; + } + } + if (sequenceLen % 4 != 0 && lastNewResultIndex != -1) + { + totalSize += 0x02; + // mark the last new animationResult index for the sequence as padded, this saves needing to check this again later + options->animationResults[lastNewResultIndex]->padded = true; } } + free(usedResults); + unsigned int KNBASize = totalSize; - if (options->labelEnabled) { + if (options->labelEnabled) + { totalSize += options->multiCell ? 0x8 : 0x14; - for (int j = 0; j < options->labelCount; j++) { - totalSize += (unsigned)strlen(options->labels[j]) + 5; // strlen + terminator + pointer + for (int j = 0; j < options->labelCount; j++) + { + totalSize += (unsigned)strlen(options->labels[j]) + 5; //strlen + terminator + pointer } } WriteGenericNtrHeader(fp, options->multiCell ? "RAMN" : "RNAN", totalSize, true, false, options->labelEnabled ? (options->multiCell ? 2 : 3) : 1); - unsigned char KBNAHeader[0x20] = { - 0x4B, 0x4E, 0x42, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }; + unsigned char KBNAHeader[0x20] = + { + 0x4B, 0x4E, 0x42, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + }; KBNAHeader[4] = KNBASize & 0xff; KBNAHeader[5] = (KNBASize >> 8) & 0xff; @@ -1430,22 +1685,23 @@ void WriteNtrAnimation(char *path, struct JsonToAnimationOptions *options) { fwrite(KBNAHeader, 1, 0x20, fp); - int contentsSize = KNBASize - 0x20; + int contentsSize = KNBASize - 0x20; unsigned char *KBNAContents = malloc(contentsSize); int i; int framePtrCounter = 0; - for (i = 0; i < options->sequenceCount * 0x10; i += 0x10) { - KBNAContents[i] = options->sequenceData[i / 0x10]->frameCount & 0xff; - KBNAContents[i + 1] = options->sequenceData[i / 0x10]->frameCount >> 8; - KBNAContents[i + 2] = options->sequenceData[i / 0x10]->loopStartFrame & 0xff; - KBNAContents[i + 3] = options->sequenceData[i / 0x10]->loopStartFrame >> 8; - KBNAContents[i + 4] = options->sequenceData[i / 0x10]->animationElement & 0xff; - KBNAContents[i + 5] = options->sequenceData[i / 0x10]->animationElement >> 8; - KBNAContents[i + 6] = options->sequenceData[i / 0x10]->animationType & 0xff; - KBNAContents[i + 7] = options->sequenceData[i / 0x10]->animationType >> 8; - KBNAContents[i + 8] = options->sequenceData[i / 0x10]->playbackMode & 0xff; - KBNAContents[i + 9] = (options->sequenceData[i / 0x10]->playbackMode >> 8) & 0xff; + for (i = 0; i < options->sequenceCount * 0x10; i += 0x10) + { + KBNAContents[i] = options->sequenceData[i / 0x10]->frameCount & 0xff; + KBNAContents[i + 1] = options->sequenceData[i / 0x10]->frameCount >> 8; + KBNAContents[i + 2] = options->sequenceData[i / 0x10]->loopStartFrame & 0xff; + KBNAContents[i + 3] = options->sequenceData[i / 0x10]->loopStartFrame >> 8; + KBNAContents[i + 4] = options->sequenceData[i / 0x10]->animationElement & 0xff; + KBNAContents[i + 5] = (options->sequenceData[i / 0x10]->animationElement >> 8) & 0xff; + KBNAContents[i + 6] = options->sequenceData[i / 0x10]->animationType & 0xff; + KBNAContents[i + 7] = (options->sequenceData[i / 0x10]->animationType >> 8) & 0xff; + KBNAContents[i + 8] = options->sequenceData[i / 0x10]->playbackMode & 0xff; + KBNAContents[i + 9] = (options->sequenceData[i / 0x10]->playbackMode >> 8) & 0xff; KBNAContents[i + 10] = (options->sequenceData[i / 0x10]->playbackMode >> 16) & 0xff; KBNAContents[i + 11] = options->sequenceData[i / 0x10]->playbackMode >> 24; KBNAContents[i + 12] = framePtrCounter & 0xff; @@ -1457,19 +1713,21 @@ void WriteNtrAnimation(char *path, struct JsonToAnimationOptions *options) { int j; int m; - for (j = i, m = 0; m < options->sequenceCount; m++) { + for (j = i, m = 0; m < options->sequenceCount; m++) + { for (int k = 0; k < options->sequenceData[m]->frameCount; k++) { int resPtr = 0; for (int l = 0; l < options->sequenceData[m]->frameData[k]->resultId; l++) { - if (options->animationResults[l]->resultType == 0) { - resPtr += 0x4; - } else if (options->animationResults[l]->resultType == 1) { + if (options->animationResults[l]->resultType == 0) + resPtr += 0x2; + else if (options->animationResults[l]->resultType == 1) resPtr += 0x10; - } else if (options->animationResults[l]->resultType == 2) { + else if (options->animationResults[l]->resultType == 2) resPtr += 0x8; - } + + if (options->animationResults[l]->padded) resPtr += 0x02; } - KBNAContents[j + (k * 8)] = resPtr & 0xff; + KBNAContents[j + (k * 8)] = resPtr & 0xff; KBNAContents[j + (k * 8) + 1] = (resPtr >> 8) & 0xff; KBNAContents[j + (k * 8) + 2] = (resPtr >> 16) & 0xff; KBNAContents[j + (k * 8) + 3] = resPtr >> 24; @@ -1481,49 +1739,56 @@ void WriteNtrAnimation(char *path, struct JsonToAnimationOptions *options) { j += options->sequenceData[m]->frameCount * 8; } - // todo: these are extrapolated, need confirming int resPtrCounter = j; - for (int k = 0; k < options->resultCount; k++) { - switch (options->animationResults[k]->resultType) { - case 0: - KBNAContents[resPtrCounter] = options->animationResults[k]->index & 0xff; - KBNAContents[resPtrCounter + 1] = options->animationResults[k]->index >> 8; - KBNAContents[resPtrCounter + 2] = 0xCC; - KBNAContents[resPtrCounter + 3] = 0xCC; - resPtrCounter += 0x4; - break; - - case 1: - KBNAContents[resPtrCounter] = options->animationResults[k]->dataSrt.index & 0xff; - KBNAContents[resPtrCounter + 1] = options->animationResults[k]->dataSrt.index >> 8; - KBNAContents[resPtrCounter + 2] = options->animationResults[k]->dataSrt.rotation & 0xff; - KBNAContents[resPtrCounter + 3] = options->animationResults[k]->dataSrt.rotation >> 8; - KBNAContents[resPtrCounter + 4] = options->animationResults[k]->dataSrt.scaleX & 0xff; - KBNAContents[resPtrCounter + 5] = (options->animationResults[k]->dataSrt.scaleX >> 8) & 0xff; - KBNAContents[resPtrCounter + 6] = (options->animationResults[k]->dataSrt.scaleX >> 16) & 0xff; - KBNAContents[resPtrCounter + 7] = options->animationResults[k]->dataSrt.scaleX >> 24; - KBNAContents[resPtrCounter + 8] = options->animationResults[k]->dataSrt.scaleY & 0xff; - KBNAContents[resPtrCounter + 9] = (options->animationResults[k]->dataSrt.scaleY >> 8) & 0xff; - KBNAContents[resPtrCounter + 10] = (options->animationResults[k]->dataSrt.scaleY >> 16) & 0xff; - KBNAContents[resPtrCounter + 11] = options->animationResults[k]->dataSrt.scaleY >> 24; - KBNAContents[resPtrCounter + 12] = options->animationResults[k]->dataSrt.positionX & 0xff; - KBNAContents[resPtrCounter + 13] = options->animationResults[k]->dataSrt.positionX >> 8; - KBNAContents[resPtrCounter + 14] = options->animationResults[k]->dataSrt.positionY & 0xff; - KBNAContents[resPtrCounter + 15] = options->animationResults[k]->dataSrt.positionY >> 8; - resPtrCounter += 0x10; - break; + for (int k = 0; k < options->resultCount; k++) + { + switch (options->animationResults[k]->resultType) + { + case 0: + KBNAContents[resPtrCounter] = options->animationResults[k]->index & 0xff; + KBNAContents[resPtrCounter + 1] = options->animationResults[k]->index >> 8; + resPtrCounter += 0x2; + break; + + case 1: + KBNAContents[resPtrCounter] = options->animationResults[k]->dataSrt.index & 0xff; + KBNAContents[resPtrCounter + 1] = options->animationResults[k]->dataSrt.index >> 8; + KBNAContents[resPtrCounter + 2] = options->animationResults[k]->dataSrt.rotation & 0xff; + KBNAContents[resPtrCounter + 3] = options->animationResults[k]->dataSrt.rotation >> 8; + KBNAContents[resPtrCounter + 4] = options->animationResults[k]->dataSrt.scaleX & 0xff; + KBNAContents[resPtrCounter + 5] = (options->animationResults[k]->dataSrt.scaleX >> 8) & 0xff; + KBNAContents[resPtrCounter + 6] = (options->animationResults[k]->dataSrt.scaleX >> 16) & 0xff; + KBNAContents[resPtrCounter + 7] = options->animationResults[k]->dataSrt.scaleX >> 24; + KBNAContents[resPtrCounter + 8] = options->animationResults[k]->dataSrt.scaleY & 0xff; + KBNAContents[resPtrCounter + 9] = (options->animationResults[k]->dataSrt.scaleY >> 8) & 0xff; + KBNAContents[resPtrCounter + 10] = (options->animationResults[k]->dataSrt.scaleY >> 16) & 0xff; + KBNAContents[resPtrCounter + 11] = options->animationResults[k]->dataSrt.scaleY >> 24; + KBNAContents[resPtrCounter + 12] = options->animationResults[k]->dataSrt.positionX & 0xff; + KBNAContents[resPtrCounter + 13] = options->animationResults[k]->dataSrt.positionX >> 8; + KBNAContents[resPtrCounter + 14] = options->animationResults[k]->dataSrt.positionY & 0xff; + KBNAContents[resPtrCounter + 15] = options->animationResults[k]->dataSrt.positionY >> 8; + resPtrCounter += 0x10; + break; + + case 2: + KBNAContents[resPtrCounter] = options->animationResults[k]->dataT.index & 0xff; + KBNAContents[resPtrCounter + 1] = options->animationResults[k]->dataT.index >> 8; + KBNAContents[resPtrCounter + 2] = 0xEF; + KBNAContents[resPtrCounter + 3] = 0xBE; + KBNAContents[resPtrCounter + 4] = options->animationResults[k]->dataT.positionX & 0xff; + KBNAContents[resPtrCounter + 5] = options->animationResults[k]->dataT.positionX >> 8; + KBNAContents[resPtrCounter + 6] = options->animationResults[k]->dataT.positionY & 0xff; + KBNAContents[resPtrCounter + 7] = options->animationResults[k]->dataT.positionY >> 8; + resPtrCounter += 0x8; + break; + } - case 2: - KBNAContents[resPtrCounter] = options->animationResults[k]->dataT.index & 0xff; - KBNAContents[resPtrCounter + 1] = options->animationResults[k]->dataT.index >> 8; - KBNAContents[resPtrCounter + 2] = 0xEF; - KBNAContents[resPtrCounter + 3] = 0xBE; - KBNAContents[resPtrCounter + 4] = options->animationResults[k]->dataT.positionX & 0xff; - KBNAContents[resPtrCounter + 5] = options->animationResults[k]->dataT.positionX >> 8; - KBNAContents[resPtrCounter + 6] = options->animationResults[k]->dataT.positionY & 0xff; - KBNAContents[resPtrCounter + 7] = options->animationResults[k]->dataT.positionY >> 8; - resPtrCounter += 0x8; - break; + // use the `padded` flag which was stored earlier to inject padding + if (options->animationResults[k]->padded) + { + KBNAContents[resPtrCounter] = 0xCC; + KBNAContents[resPtrCounter + 1] = 0xCC; + resPtrCounter += 0x2; } } @@ -1531,9 +1796,11 @@ void WriteNtrAnimation(char *path, struct JsonToAnimationOptions *options) { free(KBNAContents); - if (options->labelEnabled) { + if (options->labelEnabled) + { unsigned int lablSize = 8; - for (int j = 0; j < options->labelCount; j++) { + for (int j = 0; j < options->labelCount; j++) + { lablSize += (unsigned)strlen(options->labels[j]) + 5; } @@ -1541,14 +1808,15 @@ void WriteNtrAnimation(char *path, struct JsonToAnimationOptions *options) { memset(labl, 0, lablSize); - strcpy((char *)labl, "LBAL"); + strcpy((char *) labl, "LBAL"); labl[4] = lablSize & 0xff; labl[5] = lablSize >> 8; unsigned int position = 0; i = 0; - for (int j = 0; j < options->labelCount; j++) { + for (int j = 0; j < options->labelCount; j++) + { labl[i + 8] = position & 0xff; labl[i + 9] = position >> 8; @@ -1556,8 +1824,9 @@ void WriteNtrAnimation(char *path, struct JsonToAnimationOptions *options) { i += 4; } - for (int j = 0; j < options->labelCount; j++) { - strcpy((char *)(labl + (i + 8)), options->labels[j]); + for (int j = 0; j < options->labelCount; j++) + { + strcpy((char *) (labl + (i + 8)), options->labels[j]); i += (int)strlen(options->labels[j]) + 1; } @@ -1565,8 +1834,9 @@ void WriteNtrAnimation(char *path, struct JsonToAnimationOptions *options) { free(labl); - if (!options->multiCell) { - unsigned char txeu[0xc] = { 0x54, 0x58, 0x45, 0x55, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + if(!options->multiCell) + { + unsigned char txeu[0xc] = {0x54, 0x58, 0x45, 0x55, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; fwrite(txeu, 1, 0xc, fp); } diff --git a/tools/nitrogfx/gfx.h b/tools/nitrogfx/gfx.h index 91f6978759..705b98ab37 100644 --- a/tools/nitrogfx/gfx.h +++ b/tools/nitrogfx/gfx.h @@ -58,9 +58,9 @@ void WriteNtrImage(char *path, int numTiles, int bitDepth, int colsPerChunk, int uint32_t mappingType, uint32_t key, bool wrongSize); void FreeImage(struct Image *image); void ReadGbaPalette(char *path, struct Palette *palette); -void ReadNtrPalette(char *path, struct Palette *palette, int bitdepth, int palIndex); +void ReadNtrPalette(char *path, struct Palette *palette, int bitdepth, int palIndex, bool inverted); void WriteGbaPalette(char *path, struct Palette *palette); -void WriteNtrPalette(char *path, struct Palette *palette, bool ncpr, bool ir, int bitdepth, bool pad, int compNum, bool pcmp); +void WriteNtrPalette(char *path, struct Palette *palette, bool ncpr, bool ir, int bitdepth, bool pad, int compNum, bool pcmp, bool inverted); void ReadNtrCell(char *path, struct JsonToCellOptions *options); void WriteNtrCell(char *path, struct JsonToCellOptions *options); void WriteNtrScreen(char *path, struct JsonToScreenOptions *options); diff --git a/tools/nitrogfx/json.c b/tools/nitrogfx/json.c index 12bc8a956d..f0156700cf 100644 --- a/tools/nitrogfx/json.c +++ b/tools/nitrogfx/json.c @@ -47,11 +47,13 @@ struct JsonToCellOptions *ParseNCERJson(char *path) } cJSON *labelBool = cJSON_GetObjectItemCaseSensitive(json, "labelEnabled"); + cJSON *vramTransferBool = cJSON_GetObjectItemCaseSensitive(json, "vramTransferEnabled"); cJSON *extended = cJSON_GetObjectItemCaseSensitive(json, "extended"); cJSON *cellCount = cJSON_GetObjectItemCaseSensitive(json, "cellCount"); cJSON *mappingType = cJSON_GetObjectItemCaseSensitive(json, "mappingType"); options->labelEnabled = GetBool(labelBool); + options->vramTransferEnabled = GetBool(vramTransferBool); options->extended = GetBool(extended); options->cellCount = GetInt(cellCount); options->mappingType = GetInt(mappingType); @@ -77,6 +79,30 @@ struct JsonToCellOptions *ParseNCERJson(char *path) } } + if (options->vramTransferEnabled) + { + cJSON *vramTransferMaxSize = cJSON_GetObjectItemCaseSensitive(json, "vramTransferMaxSize"); + options->vramTransferMaxSize = GetInt(vramTransferMaxSize); + + options->transferData = malloc(sizeof(struct CellVramTransferData *) * options->cellCount); + + cJSON *transfers = cJSON_GetObjectItemCaseSensitive(json, "transferData"); + cJSON *transfer = NULL; + + int j = 0; + cJSON_ArrayForEach(transfer, transfers) + { + cJSON *vramTransferOffset = cJSON_GetObjectItemCaseSensitive(transfer, "offset"); + cJSON *vramTransferSize = cJSON_GetObjectItemCaseSensitive(transfer, "size"); + + options->transferData[j] = malloc(sizeof(struct CellVramTransferData)); + options->transferData[j]->sourceDataOffset = GetInt(vramTransferOffset); + options->transferData[j]->size = GetInt(vramTransferSize); + + j++; + } + } + for (int i = 0; i < options->cellCount; i++) { options->cells[i] = malloc(sizeof(struct Cell)); @@ -195,6 +221,7 @@ char *GetNCERJson(struct JsonToCellOptions *options) cJSON_AddBoolToObject(ncer, "labelEnabled", options->labelEnabled); cJSON_AddBoolToObject(ncer, "extended", options->extended); + cJSON_AddBoolToObject(ncer, "vramTransferEnabled", options->vramTransferEnabled); cJSON_AddNumberToObject(ncer, "cellCount", options->cellCount); cJSON_AddNumberToObject(ncer, "mappingType", options->mappingType); @@ -263,6 +290,20 @@ char *GetNCERJson(struct JsonToCellOptions *options) cJSON_AddNumberToObject(ncer, "labelCount", options->labelCount); } + if (options->vramTransferEnabled) + { + cJSON_AddNumberToObject(ncer, "vramTransferMaxSize", options->vramTransferMaxSize); + cJSON *transfers = cJSON_AddArrayToObject(ncer, "transferData"); + + for (int idx = 0; idx < options->cellCount; idx++) + { + cJSON *transfer = cJSON_CreateObject(); + cJSON_AddNumberToObject(transfer, "offset", options->transferData[idx]->sourceDataOffset); + cJSON_AddNumberToObject(transfer, "size", options->transferData[idx]->size); + cJSON_AddItemToArray(transfers, transfer); + } + } + char *jsonString = cJSON_Print(ncer); cJSON_Delete(ncer); return jsonString; @@ -600,6 +641,14 @@ void FreeNCERCell(struct JsonToCellOptions *options) } free(options->labels); } + if (options->vramTransferEnabled) + { + for (int j = 0; j < options->cellCount; j++) + { + free(options->transferData[j]); + } + free(options->transferData); + } free(options->cells); free(options); } @@ -638,3 +687,79 @@ void FreeNANRAnimation(struct JsonToAnimationOptions *options) free(options->animationResults); free(options); } + +char *GetNtrFontMetadataJson(struct NtrFontMetadata *metadata) +{ + cJSON *json = cJSON_CreateObject(); + + cJSON_AddNumberToObject(json, "maxGlyphWidth", metadata->maxWidth); + cJSON_AddNumberToObject(json, "maxGlyphHeight", metadata->maxHeight); + + cJSON *glyphWidths = cJSON_AddArrayToObject(json, "glyphWidths"); + for (int i = 0; i < metadata->numGlyphs; i++) + { + cJSON *width = cJSON_CreateNumber(metadata->glyphWidthTable[i]); + cJSON_AddItemToArray(glyphWidths, width); + } + + char *jsonString = cJSON_Print(json); + cJSON_Delete(json); + return jsonString; +} + +#define TILE_DIMENSION_PIXELS 8 +#define PIXELS_FOR_DIMENSION(dim) ((dim) * TILE_DIMENSION_PIXELS) +#define TILES_FOR_PIXELS(num) (((num) + TILE_DIMENSION_PIXELS - 1) / TILE_DIMENSION_PIXELS) +#define PIXELS_PER_BYTE_2BPP 4 +#define NTR_FONT_HEADER_SIZE 16 + +struct NtrFontMetadata *ParseNtrFontMetadataJson(char *path) +{ + int fileLength; + unsigned char *jsonString = ReadWholeFile(path, &fileLength); + + cJSON *json = cJSON_Parse((const char *)jsonString); + if (json == NULL) + { + const char *errorPtr = cJSON_GetErrorPtr(); + FATAL_ERROR("Error in line \"%s\"\n", errorPtr); + } + + cJSON *labelMaxGlyphWidth = cJSON_GetObjectItemCaseSensitive(json, "maxGlyphWidth"); + cJSON *labelMaxGlyphHeight = cJSON_GetObjectItemCaseSensitive(json, "maxGlyphHeight"); + cJSON *labelGlyphWidths = cJSON_GetObjectItemCaseSensitive(json, "glyphWidths"); + int numGlyphs = cJSON_GetArraySize(labelGlyphWidths); + + struct NtrFontMetadata *metadata = malloc(sizeof(struct NtrFontMetadata)); + + metadata->size = NTR_FONT_HEADER_SIZE; + metadata->numGlyphs = numGlyphs; + metadata->maxWidth = GetInt(labelMaxGlyphWidth); + metadata->maxHeight = GetInt(labelMaxGlyphHeight); + + metadata->glyphWidth = TILES_FOR_PIXELS(metadata->maxWidth); + metadata->glyphHeight = TILES_FOR_PIXELS(metadata->maxHeight); + + int glyphBitmapSize = (PIXELS_FOR_DIMENSION(metadata->glyphWidth) * PIXELS_FOR_DIMENSION(metadata->glyphHeight)) / PIXELS_PER_BYTE_2BPP; + metadata->widthTableOffset = metadata->size + (metadata->numGlyphs * glyphBitmapSize); + + metadata->glyphWidthTable = malloc(metadata->numGlyphs); + + uint8_t *glyphWidthCursor = metadata->glyphWidthTable; + cJSON *glyphWidthIter = NULL; + cJSON_ArrayForEach(glyphWidthIter, labelGlyphWidths) + { + if (!cJSON_IsNumber(glyphWidthIter)) + { + const char *errorPtr = cJSON_GetErrorPtr(); + FATAL_ERROR("Error in line \"%s\"\n", errorPtr); + } + + *glyphWidthCursor = glyphWidthIter->valueint; + glyphWidthCursor++; + } + + cJSON_Delete(json); + free(jsonString); + return metadata; +} diff --git a/tools/nitrogfx/json.h b/tools/nitrogfx/json.h index eb7e2add77..8bdf307ff7 100644 --- a/tools/nitrogfx/json.h +++ b/tools/nitrogfx/json.h @@ -13,5 +13,7 @@ char *GetNANRJson(struct JsonToAnimationOptions *options); void FreeNCERCell(struct JsonToCellOptions *options); void FreeNSCRScreen(struct JsonToScreenOptions *options); void FreeNANRAnimation(struct JsonToAnimationOptions *options); +char *GetNtrFontMetadataJson(struct NtrFontMetadata *metadata); +struct NtrFontMetadata *ParseNtrFontMetadataJson(char *path); #endif //JSON_H diff --git a/tools/nitrogfx/lz.c b/tools/nitrogfx/lz.c index 97434ce506..de553178b3 100644 --- a/tools/nitrogfx/lz.c +++ b/tools/nitrogfx/lz.c @@ -1,153 +1,188 @@ // Copyright (c) 2015 YamaArashi +#include #include #include +#include #include "global.h" #include "lz.h" unsigned char *LZDecompress(unsigned char *src, int srcSize, int *uncompressedSize) { - if (srcSize < 4) - goto fail; + if (srcSize < 4) + goto fail; - int destSize = (src[3] << 16) | (src[2] << 8) | src[1]; + int destSize = (src[3] << 16) | (src[2] << 8) | src[1]; - unsigned char *dest = malloc(destSize); + unsigned char *dest = malloc(destSize); - if (dest == NULL) - goto fail; + if (dest == NULL) + goto fail; - int srcPos = 4; - int destPos = 0; + int srcPos = 4; + int destPos = 0; - for (;;) { - if (srcPos >= srcSize) - goto fail; + for (;;) { + if (srcPos >= srcSize) + goto fail; - unsigned char flags = src[srcPos++]; + unsigned char flags = src[srcPos++]; - for (int i = 0; i < 8; i++) { - if (flags & 0x80) { - if (srcPos + 1 >= srcSize) - goto fail; + for (int i = 0; i < 8; i++) { + if (flags & 0x80) { + if (srcPos + 1 >= srcSize) + goto fail; - int blockSize = (src[srcPos] >> 4) + 3; - int blockDistance = (((src[srcPos] & 0xF) << 8) | src[srcPos + 1]) + 1; + int blockSize = (src[srcPos] >> 4) + 3; + int blockDistance = (((src[srcPos] & 0xF) << 8) | src[srcPos + 1]) + 1; - srcPos += 2; + srcPos += 2; - int blockPos = destPos - blockDistance; + int blockPos = destPos - blockDistance; - // Some Ruby/Sapphire tilesets overflow. - if (destPos + blockSize > destSize) { - blockSize = destSize - destPos; - fprintf(stderr, "Destination buffer overflow.\n"); - } + // Some Ruby/Sapphire tilesets overflow. + if (destPos + blockSize > destSize) { + blockSize = destSize - destPos; + fprintf(stderr, "Destination buffer overflow.\n"); + } - if (blockPos < 0) - goto fail; + if (blockPos < 0) + goto fail; - for (int j = 0; j < blockSize; j++) - dest[destPos++] = dest[blockPos + j]; - } else { - if (srcPos >= srcSize || destPos >= destSize) - goto fail; + for (int j = 0; j < blockSize; j++) + dest[destPos++] = dest[blockPos + j]; + } else { + if (srcPos >= srcSize || destPos >= destSize) + goto fail; - dest[destPos++] = src[srcPos++]; - } + dest[destPos++] = src[srcPos++]; + } - if (destPos == destSize) { - *uncompressedSize = destSize; - return dest; - } + if (destPos == destSize) { + *uncompressedSize = destSize; + return dest; + } - flags <<= 1; - } - } + flags <<= 1; + } + } fail: - FATAL_ERROR("Fatal error while decompressing LZ file.\n"); + FATAL_ERROR("Fatal error while decompressing LZ file.\n"); } -unsigned char *LZCompress(unsigned char *src, int srcSize, int *compressedSize, const int minDistance) +static void FindBestBlockForwards(unsigned char *src, int srcPos, int srcSize, const int minDistance, int *outBestBlockDistance, int *outBestBlockSize) { - if (srcSize <= 0) - goto fail; - - int worstCaseDestSize = 4 + srcSize + ((srcSize + 7) / 8); - - // Round up to the next multiple of four. - worstCaseDestSize = (worstCaseDestSize + 3) & ~3; - - unsigned char *dest = malloc(worstCaseDestSize); - - if (dest == NULL) - goto fail; - - // header - dest[0] = 0x10; // LZ compression type - dest[1] = (unsigned char)srcSize; - dest[2] = (unsigned char)(srcSize >> 8); - dest[3] = (unsigned char)(srcSize >> 16); - - int srcPos = 0; - int destPos = 4; - - for (;;) { - unsigned char *flags = &dest[destPos++]; - *flags = 0; - - for (int i = 0; i < 8; i++) { - int bestBlockDistance = 0; - int bestBlockSize = 0; - int blockDistance = minDistance; - - while (blockDistance <= srcPos && blockDistance <= 0x1000) { - int blockStart = srcPos - blockDistance; - int blockSize = 0; - - while (blockSize < 18 - && srcPos + blockSize < srcSize - && src[blockStart + blockSize] == src[srcPos + blockSize]) - blockSize++; - - if (blockSize > bestBlockSize) { - bestBlockDistance = blockDistance; - bestBlockSize = blockSize; - - if (blockSize == 18) - break; - } - - blockDistance++; - } - - if (bestBlockSize >= 3) { - *flags |= (0x80 >> i); - srcPos += bestBlockSize; - bestBlockSize -= 3; - bestBlockDistance--; - dest[destPos++] = (bestBlockSize << 4) | ((unsigned int)bestBlockDistance >> 8); - dest[destPos++] = (unsigned char)bestBlockDistance; - } else { - dest[destPos++] = src[srcPos++]; - } - - if (srcPos == srcSize) { - // Pad to multiple of 4 bytes. - int remainder = destPos % 4; - - if (remainder != 0) { - for (int i = 0; i < 4 - remainder; i++) - dest[destPos++] = 0; - } - - *compressedSize = destPos; - return dest; - } - } - } + int blockStart = srcPos < 0x1000 ? 0 : srcPos - 0x1000; + while (blockStart != srcPos) { + int blockSize = 0; + + while (blockSize < 18 + && srcPos + blockSize < srcSize + && src[blockStart + blockSize] == src[srcPos + blockSize]) + blockSize++; + + if (blockSize > *outBestBlockSize + && srcPos - blockStart >= minDistance) { + *outBestBlockDistance = srcPos - blockStart; + *outBestBlockSize = blockSize; + + if (blockSize == 18) + break; + } + + blockStart++; + } +} + +static void FindBestBlockBackwards(unsigned char *src, int srcPos, int srcSize, const int minDistance, int *outBestBlockDistance, int *outBestBlockSize) +{ + int blockDistance = minDistance; + + while (blockDistance <= srcPos && blockDistance <= 0x1000) { + int blockStart = srcPos - blockDistance; + int blockSize = 0; + + while (blockSize < 18 + && srcPos + blockSize < srcSize + && src[blockStart + blockSize] == src[srcPos + blockSize]) + blockSize++; + + if (blockSize > *outBestBlockSize) { + *outBestBlockDistance = blockDistance; + *outBestBlockSize = blockSize; + + if (blockSize == 18) + break; + } + + blockDistance++; + } +} + +typedef void (*FindBestBlockFunc)(unsigned char *src, int srcPos, int srcSize, const int minDistance, int *outBestBlockDistance, int *outBestBlockSize); + +unsigned char *LZCompress(unsigned char *src, int srcSize, int *compressedSize, const int minDistance, bool forwardIteration) +{ + if (srcSize <= 0) + goto fail; + + int worstCaseDestSize = 4 + srcSize + ((srcSize + 7) / 8); + + // Round up to the next multiple of four. + worstCaseDestSize = (worstCaseDestSize + 3) & ~3; + + unsigned char *dest = malloc(worstCaseDestSize); + + if (dest == NULL) + goto fail; + + // header + dest[0] = 0x10; // LZ compression type + dest[1] = (unsigned char)srcSize; + dest[2] = (unsigned char)(srcSize >> 8); + dest[3] = (unsigned char)(srcSize >> 16); + + int srcPos = 0; + int destPos = 4; + FindBestBlockFunc FindBestBlock = forwardIteration ? FindBestBlockForwards : FindBestBlockBackwards; + + for (;;) { + unsigned char *flags = &dest[destPos++]; + *flags = 0; + + for (int i = 0; i < 8; i++) { + int bestBlockDistance = 0; + int bestBlockSize = 0; + + FindBestBlock(src, srcPos, srcSize, minDistance, &bestBlockDistance, &bestBlockSize); + + if (bestBlockSize >= 3) { + *flags |= (0x80 >> i); + srcPos += bestBlockSize; + bestBlockSize -= 3; + bestBlockDistance--; + dest[destPos++] = (bestBlockSize << 4) | ((unsigned int)bestBlockDistance >> 8); + dest[destPos++] = (unsigned char)bestBlockDistance; + } else { + dest[destPos++] = src[srcPos++]; + } + + if (srcPos == srcSize) { + // Pad to multiple of 4 bytes. + int remainder = destPos % 4; + + if (remainder != 0) { + for (int i = 0; i < 4 - remainder; i++) + dest[destPos++] = 0; + } + + *compressedSize = destPos; + return dest; + } + } + } fail: - FATAL_ERROR("Fatal error while compressing LZ file.\n"); + FATAL_ERROR("Fatal error while compressing LZ file.\n"); } diff --git a/tools/nitrogfx/lz.h b/tools/nitrogfx/lz.h index 90f56b6430..fdc137023a 100644 --- a/tools/nitrogfx/lz.h +++ b/tools/nitrogfx/lz.h @@ -3,7 +3,9 @@ #ifndef LZ_H #define LZ_H +#include "stdbool.h" + unsigned char *LZDecompress(unsigned char *src, int srcSize, int *uncompressedSize); -unsigned char *LZCompress(unsigned char *src, int srcSize, int *compressedSize, const int minDistance); +unsigned char *LZCompress(unsigned char *src, int srcSize, int *compressedSize, const int minDistance, bool forwardIteration); #endif // LZ_H diff --git a/tools/nitrogfx/main.c b/tools/nitrogfx/main.c index eb831fb3db..88fc487151 100644 --- a/tools/nitrogfx/main.c +++ b/tools/nitrogfx/main.c @@ -1,36 +1,39 @@ // Copyright (c) 2015 YamaArashi, 2021-2024 red031000 #include -#include #include #include - +#include #include "global.h" - -#include "convert_png.h" -#include "font.h" +#include "util.h" +#include "options.h" #include "gfx.h" -#include "huff.h" +#include "convert_png.h" #include "jasc_pal.h" -#include "json.h" #include "lz.h" -#include "options.h" #include "rl.h" -#include "util.h" +#include "font.h" +#include "huff.h" +#include "json.h" -struct CommandHandler { +struct CommandHandler +{ const char *inputFileExtension; const char *outputFileExtension; - void (*function)(char *inputPath, char *outputPath, int argc, char **argv); + void(*function)(char *inputPath, char *outputPath, int argc, char **argv); }; -void ConvertGbaToPng(char *inputPath, char *outputPath, struct GbaToPngOptions *options) { +void ConvertGbaToPng(char *inputPath, char *outputPath, struct GbaToPngOptions *options) +{ struct Image image; - if (options->paletteFilePath != NULL) { + if (options->paletteFilePath != NULL) + { ReadGbaPalette(options->paletteFilePath, &image.palette); image.hasPalette = true; - } else { + } + else + { image.hasPalette = false; } @@ -43,16 +46,20 @@ void ConvertGbaToPng(char *inputPath, char *outputPath, struct GbaToPngOptions * FreeImage(&image); } -void ConvertNtrToPng(char *inputPath, char *outputPath, struct NtrToPngOptions *options) { +void ConvertNtrToPng(char *inputPath, char *outputPath, struct NtrToPngOptions *options) +{ // handle empty files if possible FILE *fp = fopen(inputPath, "rb"); - if (options->handleEmpty) { - if (fp != NULL) { + if (options->handleEmpty) + { + if (fp != NULL) + { fseek(fp, 0, SEEK_END); uint32_t size = ftell(fp); rewind(fp); - if (size == 0) { + if (size == 0) + { FILE *out = fopen(outputPath, "wb+"); fclose(out); fclose(fp); @@ -65,23 +72,25 @@ void ConvertNtrToPng(char *inputPath, char *outputPath, struct NtrToPngOptions * struct Image image; - if (options->paletteFilePath != NULL) { - ReadNtrPalette(options->paletteFilePath, &image.palette, options->bitDepth, options->palIndex); + if (options->paletteFilePath != NULL) + { + ReadNtrPalette(options->paletteFilePath, &image.palette, options->bitDepth, options->palIndex, false); image.hasPalette = true; - } else { + } + else + { image.hasPalette = false; } uint32_t key = ReadNtrImage(inputPath, options->width, 0, options->colsPerChunk, options->rowsPerChunk, &image, !image.hasPalette, options->scanFrontToBack); - if (key) { - size_t outputStringSize = strlen(outputPath) + 5; - char *string = malloc(outputStringSize); - snprintf(string, outputStringSize, "%s.key", outputPath); + if (key) + { + char* string = malloc(strlen(outputPath) + 5); + sprintf(string, "%s.key", outputPath); FILE *fp = fopen(string, "wb"); - if (fp == NULL) { + if (fp == NULL) FATAL_ERROR("Failed to open key file for writing.\n"); - } fwrite(&key, 4, 1, fp); fclose(fp); free(string); @@ -94,7 +103,8 @@ void ConvertNtrToPng(char *inputPath, char *outputPath, struct NtrToPngOptions * FreeImage(&image); } -void ConvertPngToGba(char *inputPath, char *outputPath, struct PngToGbaOptions *options) { +void ConvertPngToGba(char *inputPath, char *outputPath, struct PngToGbaOptions *options) +{ struct Image image; image.bitDepth = options->bitDepth; @@ -106,16 +116,20 @@ void ConvertPngToGba(char *inputPath, char *outputPath, struct PngToGbaOptions * FreeImage(&image); } -void ConvertPngToNtr(char *inputPath, char *outputPath, struct PngToNtrOptions *options) { +void ConvertPngToNtr(char *inputPath, char *outputPath, struct PngToNtrOptions *options) +{ // handle empty files if possible FILE *fp = fopen(inputPath, "rb"); - if (options->handleEmpty) { - if (fp != NULL) { + if (options->handleEmpty) + { + if (fp != NULL) + { fseek(fp, 0, SEEK_END); uint32_t size = ftell(fp); rewind(fp); - if (size == 0) { + if (size == 0) + { FILE *out = fopen(outputPath, "wb+"); fclose(out); fclose(fp); @@ -127,269 +141,276 @@ void ConvertPngToNtr(char *inputPath, char *outputPath, struct PngToNtrOptions * fclose(fp); struct Image image; - image.bitDepth = options->bitDepth; + image.bitDepth = options->bitDepth == 0 ? 4 : options->bitDepth; ReadPng(inputPath, &image); uint32_t key = 0; - if (options->scanMode) { - size_t inputPathSize = strlen(inputPath) + 5; - char *string = malloc(inputPathSize); - snprintf(string, inputPathSize, "%s.key", inputPath); + if (options->scanMode) + { + char* string = malloc(strlen(inputPath) + 5); + sprintf(string, "%s.key", inputPath); FILE *fp2 = fopen(string, "rb"); - if (fp2 == NULL) { + if (fp2 == NULL) FATAL_ERROR("Failed to open key file for reading.\n"); - } size_t count = fread(&key, 4, 1, fp2); - if (count != 1) { + if (count != 1) FATAL_ERROR("Not a valid key file.\n"); - } fclose(fp2); free(string); } - WriteNtrImage(outputPath, options->numTiles, image.bitDepth, options->colsPerChunk, options->rowsPerChunk, &image, !image.hasPalette, options->clobberSize, options->byteOrder, options->version101, options->sopc, options->vramTransfer, options->scanMode, options->mappingType, key, options->wrongSize); + options->bitDepth = options->bitDepth == 0 ? image.bitDepth : options->bitDepth; + + WriteNtrImage(outputPath, options->numTiles, options->bitDepth, options->colsPerChunk, options->rowsPerChunk, + &image, !image.hasPalette, options->clobberSize, options->byteOrder, options->version101, + options->sopc, options->vramTransfer, options->scanMode, options->mappingType, key, options->wrongSize); FreeImage(&image); } -void HandleGbaToPngCommand(char *inputPath, char *outputPath, int argc, char **argv) { +void HandleGbaToPngCommand(char *inputPath, char *outputPath, int argc, char **argv) +{ char *inputFileExtension = GetFileExtension(inputPath); struct GbaToPngOptions options; options.paletteFilePath = NULL; - if (isdigit((unsigned char)inputFileExtension[0])) { + if (isdigit((unsigned char)inputFileExtension[0])) options.bitDepth = inputFileExtension[0] - '0'; - } else { + else options.bitDepth = 4; - } options.hasTransparency = false; - options.width = 1; - options.colsPerChunk = 1; - options.rowsPerChunk = 1; + options.width = 1; + options.colsPerChunk = 1; + options.rowsPerChunk = 1; - for (int i = 3; i < argc; i++) { + for (int i = 3; i < argc; i++) + { char *option = argv[i]; - if (strcmp(option, "-palette") == 0) { - if (i + 1 >= argc) { + if (strcmp(option, "-palette") == 0) + { + if (i + 1 >= argc) FATAL_ERROR("No palette file path following \"-palette\".\n"); - } i++; options.paletteFilePath = argv[i]; - } else if (strcmp(option, "-object") == 0) { + } + else if (strcmp(option, "-object") == 0) + { options.hasTransparency = true; - } else if (strcmp(option, "-width") == 0) { - if (i + 1 >= argc) { + } + else if (strcmp(option, "-width") == 0) + { + if (i + 1 >= argc) FATAL_ERROR("No width following \"-width\".\n"); - } i++; - if (!ParseNumber(argv[i], NULL, 10, &options.width)) { + if (!ParseNumber(argv[i], NULL, 10, &options.width)) FATAL_ERROR("Failed to parse width.\n"); - } - if (options.width < 1) { + if (options.width < 1) FATAL_ERROR("Width must be positive.\n"); - } - } else if (strcmp(option, "-mwidth") == 0 || strcmp(option, "-cpc") == 0) { - if (i + 1 >= argc) { + } + else if (strcmp(option, "-mwidth") == 0 || strcmp(option, "-cpc") == 0) + { + if (i + 1 >= argc) FATAL_ERROR("No columns per chunk value following \"%s\".\n", option); - } i++; - if (!ParseNumber(argv[i], NULL, 10, &options.colsPerChunk)) { + if (!ParseNumber(argv[i], NULL, 10, &options.colsPerChunk)) FATAL_ERROR("Failed to parse columns per chunk.\n"); - } - if (options.colsPerChunk < 1) { + if (options.colsPerChunk < 1) FATAL_ERROR("columns per chunk must be positive.\n"); - } - } else if (strcmp(option, "-mheight") == 0 || strcmp(option, "-rpc") == 0) { - if (i + 1 >= argc) { + } + else if (strcmp(option, "-mheight") == 0 || strcmp(option, "-rpc") == 0) + { + if (i + 1 >= argc) FATAL_ERROR("No rows per chunk value following \"%s\".\n", option); - } i++; - if (!ParseNumber(argv[i], NULL, 10, &options.rowsPerChunk)) { + if (!ParseNumber(argv[i], NULL, 10, &options.rowsPerChunk)) FATAL_ERROR("Failed to parse rows per chunk.\n"); - } - if (options.rowsPerChunk < 1) { + if (options.rowsPerChunk < 1) FATAL_ERROR("rows per chunk must be positive.\n"); - } - } else { + } + else + { FATAL_ERROR("Unrecognized option \"%s\".\n", option); } } - if (options.colsPerChunk > options.width) { + if (options.colsPerChunk > options.width) options.width = options.colsPerChunk; - } ConvertGbaToPng(inputPath, outputPath, &options); } -void HandleNtrToPngCommand(char *inputPath, char *outputPath, int argc, char **argv) { +void HandleNtrToPngCommand(char *inputPath, char *outputPath, int argc, char **argv) +{ struct NtrToPngOptions options; options.paletteFilePath = NULL; options.hasTransparency = false; - options.width = 0; - options.colsPerChunk = 1; - options.rowsPerChunk = 1; - options.palIndex = 1; + options.width = 0; + options.colsPerChunk = 1; + options.rowsPerChunk = 1; + options.palIndex = 1; options.scanFrontToBack = false; - options.handleEmpty = false; + options.handleEmpty = false; - for (int i = 3; i < argc; i++) { + for (int i = 3; i < argc; i++) + { char *option = argv[i]; - if (strcmp(option, "-palette") == 0) { - if (i + 1 >= argc) { + if (strcmp(option, "-palette") == 0) + { + if (i + 1 >= argc) FATAL_ERROR("No palette file path following \"-palette\".\n"); - } i++; options.paletteFilePath = argv[i]; - } else if (strcmp(option, "-object") == 0) { + } + else if (strcmp(option, "-object") == 0) + { options.hasTransparency = true; - } else if (strcmp(option, "-palindex") == 0) { - if (i + 1 >= argc) { + } + else if (strcmp(option, "-palindex") == 0) + { + if (i + 1 >= argc) FATAL_ERROR("No palette index following \"-palindex\".\n"); - } i++; - if (!ParseNumber(argv[i], NULL, 10, &options.palIndex)) { + if (!ParseNumber(argv[i], NULL, 10, &options.palIndex)) FATAL_ERROR("Failed to parse palette index.\n"); - } - if (options.palIndex < 1) { + if (options.palIndex < 1) FATAL_ERROR("Palette index must be positive.\n"); - } - } else if (strcmp(option, "-width") == 0) { - if (i + 1 >= argc) { + } + else if (strcmp(option, "-width") == 0) + { + if (i + 1 >= argc) FATAL_ERROR("No width following \"-width\".\n"); - } i++; - if (!ParseNumber(argv[i], NULL, 10, &options.width)) { + if (!ParseNumber(argv[i], NULL, 10, &options.width)) FATAL_ERROR("Failed to parse width.\n"); - } - if (options.width < 1) { + if (options.width < 1) FATAL_ERROR("Width must be positive.\n"); - } - } else if (strcmp(option, "-mwidth") == 0 || strcmp(option, "-cpc") == 0) { - if (i + 1 >= argc) { + } + else if (strcmp(option, "-mwidth") == 0 || strcmp(option, "-cpc") == 0) + { + if (i + 1 >= argc) FATAL_ERROR("No columns per chunk value following \"%s\".\n", option); - } i++; - if (!ParseNumber(argv[i], NULL, 10, &options.colsPerChunk)) { + if (!ParseNumber(argv[i], NULL, 10, &options.colsPerChunk)) FATAL_ERROR("Failed to parse columns per chunk.\n"); - } - if (options.colsPerChunk < 1) { + if (options.colsPerChunk < 1) FATAL_ERROR("columns per chunk must be positive.\n"); - } - } else if (strcmp(option, "-mheight") == 0 || strcmp(option, "-rpc") == 0) { - if (i + 1 >= argc) { + } + else if (strcmp(option, "-mheight") == 0 || strcmp(option, "-rpc") == 0) + { + if (i + 1 >= argc) FATAL_ERROR("No rows per chunk value following \"%s\".\n", option); - } i++; - if (!ParseNumber(argv[i], NULL, 10, &options.rowsPerChunk)) { + if (!ParseNumber(argv[i], NULL, 10, &options.rowsPerChunk)) FATAL_ERROR("Failed to parse rows per chunk.\n"); - } - if (options.rowsPerChunk < 1) { + if (options.rowsPerChunk < 1) FATAL_ERROR("rows per chunk must be positive.\n"); - } - } else if (strcmp(option, "-scanfronttoback") == 0) { + } + else if (strcmp(option, "-scanfronttoback") == 0) + { options.scanFrontToBack = true; - } else if (strcmp(option, "-handleempty") == 0) { + } + else if (strcmp(option, "-handleempty") == 0) + { options.handleEmpty = true; - } else { + } + else + { FATAL_ERROR("Unrecognized option \"%s\".\n", option); } } - if (options.width != 0 && options.colsPerChunk > options.width) { + if (options.width != 0 && options.colsPerChunk > options.width) options.width = options.colsPerChunk; - } ConvertNtrToPng(inputPath, outputPath, &options); } -void HandlePngToGbaCommand(char *inputPath, char *outputPath, int argc, char **argv) { +void HandlePngToGbaCommand(char *inputPath, char *outputPath, int argc, char **argv) +{ char *outputFileExtension = GetFileExtension(outputPath); int bitDepth; - if (strcmp(outputFileExtension, "nbfc") == 0) { + if (strcmp(outputFileExtension, "nbfc") == 0) bitDepth = 4; - } else { + else bitDepth = outputFileExtension[0] - '0'; - } struct PngToGbaOptions options; - options.numTiles = 0; - options.bitDepth = bitDepth; + options.numTiles = 0; + options.bitDepth = bitDepth; options.colsPerChunk = 1; options.rowsPerChunk = 1; - for (int i = 3; i < argc; i++) { + for (int i = 3; i < argc; i++) + { char *option = argv[i]; - if (strcmp(option, "-num_tiles") == 0) { - if (i + 1 >= argc) { + if (strcmp(option, "-num_tiles") == 0) + { + if (i + 1 >= argc) FATAL_ERROR("No number of tiles following \"-num_tiles\".\n"); - } i++; - if (!ParseNumber(argv[i], NULL, 10, &options.numTiles)) { + if (!ParseNumber(argv[i], NULL, 10, &options.numTiles)) FATAL_ERROR("Failed to parse number of tiles.\n"); - } - if (options.numTiles < 1) { + if (options.numTiles < 1) FATAL_ERROR("Number of tiles must be positive.\n"); - } - } else if (strcmp(option, "-mwidth") == 0 || strcmp(option, "-cpc") == 0) { - if (i + 1 >= argc) { + } + else if (strcmp(option, "-mwidth") == 0 || strcmp(option, "-cpc") == 0) + { + if (i + 1 >= argc) FATAL_ERROR("No columns per chunk value following \"%s\".\n", option); - } i++; - if (!ParseNumber(argv[i], NULL, 10, &options.colsPerChunk)) { + if (!ParseNumber(argv[i], NULL, 10, &options.colsPerChunk)) FATAL_ERROR("Failed to parse columns per chunk.\n"); - } - if (options.colsPerChunk < 1) { + if (options.colsPerChunk < 1) FATAL_ERROR("columns per chunk must be positive.\n"); - } - } else if (strcmp(option, "-mheight") == 0 || strcmp(option, "-rpc") == 0) { - if (i + 1 >= argc) { + } + else if (strcmp(option, "-mheight") == 0 || strcmp(option, "-rpc") == 0) + { + if (i + 1 >= argc) FATAL_ERROR("No rows per chunk value following \"%s\".\n", option); - } i++; - if (!ParseNumber(argv[i], NULL, 10, &options.rowsPerChunk)) { + if (!ParseNumber(argv[i], NULL, 10, &options.rowsPerChunk)) FATAL_ERROR("Failed to parse rows per chunk.\n"); - } - if (options.rowsPerChunk < 1) { + if (options.rowsPerChunk < 1) FATAL_ERROR("rows per chunk must be positive.\n"); - } - } else { + } + else + { FATAL_ERROR("Unrecognized option \"%s\".\n", option); } } @@ -397,120 +418,131 @@ void HandlePngToGbaCommand(char *inputPath, char *outputPath, int argc, char **a ConvertPngToGba(inputPath, outputPath, &options); } -void HandlePngToNtrCommand(char *inputPath, char *outputPath, int argc, char **argv) { +void HandlePngToNtrCommand(char *inputPath, char *outputPath, int argc, char **argv) +{ struct PngToNtrOptions options; - options.numTiles = 0; - options.bitDepth = 4; + options.numTiles = 0; + options.bitDepth = 0; options.colsPerChunk = 1; options.rowsPerChunk = 1; - options.wrongSize = false; - options.clobberSize = false; - options.byteOrder = true; - options.version101 = false; - options.sopc = false; - options.scanMode = 0; - options.handleEmpty = false; + options.wrongSize = false; + options.clobberSize = false; + options.byteOrder = true; + options.version101 = false; + options.sopc = false; + options.scanMode = 0; + options.handleEmpty = false; options.vramTransfer = false; - options.mappingType = 0; + options.mappingType = 0; - for (int i = 3; i < argc; i++) { + for (int i = 3; i < argc; i++) + { char *option = argv[i]; - if (strcmp(option, "-num_tiles") == 0) { - if (i + 1 >= argc) { + if (strcmp(option, "-num_tiles") == 0) + { + if (i + 1 >= argc) FATAL_ERROR("No number of tiles following \"-num_tiles\".\n"); - } i++; - if (!ParseNumber(argv[i], NULL, 10, &options.numTiles)) { + if (!ParseNumber(argv[i], NULL, 10, &options.numTiles)) FATAL_ERROR("Failed to parse number of tiles.\n"); - } - if (options.numTiles < 1) { + if (options.numTiles < 1) FATAL_ERROR("Number of tiles must be positive.\n"); - } - } else if (strcmp(option, "-mwidth") == 0 || strcmp(option, "-cpc") == 0) { - if (i + 1 >= argc) { + } + else if (strcmp(option, "-mwidth") == 0 || strcmp(option, "-cpc") == 0) + { + if (i + 1 >= argc) FATAL_ERROR("No columns per chunk value following \"%s\".\n", option); - } i++; - if (!ParseNumber(argv[i], NULL, 10, &options.colsPerChunk)) { + if (!ParseNumber(argv[i], NULL, 10, &options.colsPerChunk)) FATAL_ERROR("Failed to parse columns per chunk.\n"); - } - if (options.colsPerChunk < 1) { + if (options.colsPerChunk < 1) FATAL_ERROR("columns per chunk must be positive.\n"); - } - } else if (strcmp(option, "-mheight") == 0 || strcmp(option, "-rpc") == 0) { - if (i + 1 >= argc) { + } + else if (strcmp(option, "-mheight") == 0 || strcmp(option, "-rpc") == 0) { + if (i + 1 >= argc) FATAL_ERROR("No rows per chunk value following \"%s\".\n", option); - } i++; - if (!ParseNumber(argv[i], NULL, 10, &options.rowsPerChunk)) { + if (!ParseNumber(argv[i], NULL, 10, &options.rowsPerChunk)) FATAL_ERROR("Failed to parse rows per chunk.\n"); - } - if (options.rowsPerChunk < 1) { + if (options.rowsPerChunk < 1) FATAL_ERROR("rows per chunk must be positive.\n"); - } - } else if (strcmp(option, "-bitdepth") == 0) { - if (i + 1 >= argc) { + } + else if (strcmp(option, "-bitdepth") == 0) + { + if (i + 1 >= argc) FATAL_ERROR("No bitdepth value following \"-bitdepth\".\n"); - } i++; - if (!ParseNumber(argv[i], NULL, 10, &options.bitDepth)) { + if (!ParseNumber(argv[i], NULL, 10, &options.bitDepth)) FATAL_ERROR("Failed to parse bitdepth.\n"); - } - if (options.bitDepth != 4 && options.bitDepth != 8) { + if (options.bitDepth != 4 && options.bitDepth != 8) FATAL_ERROR("bitdepth must be either 4 or 8.\n"); - } - } else if (strcmp(option, "-clobbersize") == 0) { + } + else if (strcmp(option, "-clobbersize") == 0) + { options.clobberSize = true; - } else if (strcmp(option, "-nobyteorder") == 0) { + } + else if (strcmp(option, "-nobyteorder") == 0) + { options.byteOrder = false; - } else if (strcmp(option, "-version101") == 0) { + } + else if (strcmp(option, "-version101") == 0) + { options.version101 = true; - } else if (strcmp(option, "-sopc") == 0) { + } + else if (strcmp(option, "-sopc") == 0) + { options.sopc = true; - } else if (strcmp(option, "-scanned") == 0) { - if (options.scanMode != 0) { + } + else if (strcmp(option, "-scanned") == 0) + { + if (options.scanMode != 0) FATAL_ERROR("Scan mode specified more than once.\n-scanned goes back to front as in DP, -scanfronttoback goes front to back as in PtHGSS\n"); - } options.scanMode = 1; - } else if (strcmp(option, "-scanfronttoback") == 0) { - if (options.scanMode != 0) { + } + else if (strcmp(option, "-scanfronttoback") == 0) + { + if (options.scanMode != 0) FATAL_ERROR("Scan mode specified more than once.\n-scanned goes back to front as in DP, -scanfronttoback goes front to back as in PtHGSS\n"); - } options.scanMode = 2; - } else if (strcmp(option, "-wrongsize") == 0) { + } + else if (strcmp(option, "-wrongsize") == 0) { options.wrongSize = true; - } else if (strcmp(option, "-handleempty") == 0) { + } + else if (strcmp(option, "-handleempty") == 0) + { options.handleEmpty = true; - } else if (strcmp(option, "-vram") == 0) { + } + else if (strcmp(option, "-vram") == 0) + { options.vramTransfer = true; - } else if (strcmp(option, "-mappingtype") == 0) { - if (i + 1 >= argc) { + } + else if (strcmp(option, "-mappingtype") == 0) { + if (i + 1 >= argc) FATAL_ERROR("No mapping type value following \"-mappingtype\".\n"); - } i++; - if (!ParseNumber(argv[i], NULL, 10, &options.mappingType)) { + if (!ParseNumber(argv[i], NULL, 10, &options.mappingType)) FATAL_ERROR("Failed to parse mapping type.\n"); - } - if (options.mappingType != 0 && options.mappingType != 32 && options.mappingType != 64 && options.mappingType != 128 && options.mappingType != 256) { + if (options.mappingType != 0 && options.mappingType != 32 && options.mappingType != 64 && options.mappingType != 128 && options.mappingType != 256) FATAL_ERROR("bitdepth must be one of the following: 0, 32, 64, 128, or 256\n"); - } - } else { + } + else + { FATAL_ERROR("Unrecognized option \"%s\".\n", option); } } @@ -518,128 +550,153 @@ void HandlePngToNtrCommand(char *inputPath, char *outputPath, int argc, char **a ConvertPngToNtr(inputPath, outputPath, &options); } -void HandlePngToGbaPaletteCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED) { +void HandlePngToGbaPaletteCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED) +{ struct Palette palette; ReadPngPalette(inputPath, &palette); WriteGbaPalette(outputPath, &palette); } -void HandlePngToNtrPaletteCommand(char *inputPath, char *outputPath, int argc, char **argv) { +void HandlePngToNtrPaletteCommand(char *inputPath, char *outputPath, int argc, char **argv) +{ struct Palette palette; - bool ncpr = false; - bool ir = false; - bool nopad = false; + bool ncpr = false; + bool ir = false; + bool nopad = false; int bitdepth = 0; - int compNum = 0; - bool pcmp = false; + int compNum = 0; + bool pcmp = false; + bool inverted = false; - for (int i = 3; i < argc; i++) { + for (int i = 3; i < argc; i++) + { char *option = argv[i]; - if (strcmp(option, "-ncpr") == 0) { + if (strcmp(option, "-ncpr") == 0) + { ncpr = true; - } else if (strcmp(option, "-ir") == 0) { + } + else if (strcmp(option, "-ir") == 0) + { ir = true; - } else if (strcmp(option, "-nopad") == 0) { + } + else if (strcmp(option, "-nopad") == 0) + { nopad = true; - } else if (strcmp(option, "-bitdepth") == 0) { - if (i + 1 >= argc) { + } + else if (strcmp(option, "-bitdepth") == 0) + { + if (i + 1 >= argc) FATAL_ERROR("No bitdepth following \"-bitdepth\".\n"); - } i++; - if (!ParseNumber(argv[i], NULL, 10, &bitdepth)) { + if (!ParseNumber(argv[i], NULL, 10, &bitdepth)) FATAL_ERROR("Failed to parse bitdepth.\n"); - } - if (bitdepth != 4 && bitdepth != 8) { + if (bitdepth != 4 && bitdepth != 8) FATAL_ERROR("Bitdepth must be 4 or 8.\n"); - } - } else if (strcmp(option, "-comp") == 0) { - if (i + 1 >= argc) { + } + else if (strcmp(option, "-comp") == 0) + { + if (i + 1 >= argc) FATAL_ERROR("No compression value following \"-comp\".\n"); - } i++; - if (!ParseNumber(argv[i], NULL, 10, &compNum)) { + if (!ParseNumber(argv[i], NULL, 10, &compNum)) FATAL_ERROR("Failed to parse compression value.\n"); - } - if (compNum > 255) { + if (compNum > 255) FATAL_ERROR("Compression value must be 255 or below.\n"); - } - } else if (strcmp(option, "-pcmp") == 0) { + } + else if (strcmp(option, "-pcmp") == 0) + { pcmp = true; - } else { + } + else if (strcmp(option, "-invertsize") == 0) + { + inverted = true; + } + else + { FATAL_ERROR("Unrecognized option \"%s\".\n", option); } } ReadPngPalette(inputPath, &palette); - WriteNtrPalette(outputPath, &palette, ncpr, ir, bitdepth, !nopad, compNum, pcmp); + WriteNtrPalette(outputPath, &palette, ncpr, ir, bitdepth, !nopad, compNum, pcmp, inverted); } -void HandleGbaToJascPaletteCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED) { +void HandleGbaToJascPaletteCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED) +{ struct Palette palette; ReadGbaPalette(inputPath, &palette); WriteJascPalette(outputPath, &palette); } -void HandleNtrToJascPaletteCommand(char *inputPath, char *outputPath, int argc, char **argv) { +void HandleNtrToJascPaletteCommand(char *inputPath, char *outputPath, int argc, char **argv) +{ struct Palette palette; int bitdepth = 0; + bool inverted = false; - for (int i = 3; i < argc; i++) { + for (int i = 3; i < argc; i++) + { char *option = argv[i]; - if (strcmp(option, "-bitdepth") == 0) { - if (i + 1 >= argc) { + if (strcmp(option, "-bitdepth") == 0) + { + if (i + 1 >= argc) FATAL_ERROR("No bitdepth following \"-bitdepth\".\n"); - } i++; - if (!ParseNumber(argv[i], NULL, 10, &bitdepth)) { + if (!ParseNumber(argv[i], NULL, 10, &bitdepth)) FATAL_ERROR("Failed to parse bitdepth.\n"); - } - if (bitdepth != 4 && bitdepth != 8) { + if (bitdepth != 4 && bitdepth != 8) FATAL_ERROR("Bitdepth must be 4 or 8.\n"); - } - } else { + } + else if (strcmp(option, "-invertsize") == 0) + { + inverted = true; + } + else + { FATAL_ERROR("Unrecognized option \"%s\".\n", option); } } - ReadNtrPalette(inputPath, &palette, bitdepth, 0); + ReadNtrPalette(inputPath, &palette, bitdepth, 0, inverted); WriteJascPalette(outputPath, &palette); } -void HandleJascToGbaPaletteCommand(char *inputPath, char *outputPath, int argc, char **argv) { +void HandleJascToGbaPaletteCommand(char *inputPath, char *outputPath, int argc, char **argv) +{ int numColors = 0; - for (int i = 3; i < argc; i++) { + for (int i = 3; i < argc; i++) + { char *option = argv[i]; - if (strcmp(option, "-num_colors") == 0) { - if (i + 1 >= argc) { + if (strcmp(option, "-num_colors") == 0) + { + if (i + 1 >= argc) FATAL_ERROR("No number of colors following \"-num_colors\".\n"); - } i++; - if (!ParseNumber(argv[i], NULL, 10, &numColors)) { + if (!ParseNumber(argv[i], NULL, 10, &numColors)) FATAL_ERROR("Failed to parse number of colors.\n"); - } - if (numColors < 1) { + if (numColors < 1) FATAL_ERROR("Number of colors must be positive.\n"); - } - } else { + } + else + { FATAL_ERROR("Unrecognized option \"%s\".\n", option); } } @@ -648,76 +705,88 @@ void HandleJascToGbaPaletteCommand(char *inputPath, char *outputPath, int argc, ReadJascPalette(inputPath, &palette); - if (numColors != 0) { + if (numColors != 0) palette.numColors = numColors; - } WriteGbaPalette(outputPath, &palette); } -void HandleJascToNtrPaletteCommand(char *inputPath, char *outputPath, int argc, char **argv) { +void HandleJascToNtrPaletteCommand(char *inputPath, char *outputPath, int argc, char **argv) +{ int numColors = 0; - bool ncpr = false; - bool ir = false; - bool nopad = false; - int bitdepth = 0; - int compNum = 0; - bool pcmp = false; - - for (int i = 3; i < argc; i++) { + bool ncpr = false; + bool ir = false; + bool nopad = false; + int bitdepth = 0; + int compNum = 0; + bool pcmp = false; + bool inverted = false; + + for (int i = 3; i < argc; i++) + { char *option = argv[i]; - if (strcmp(option, "-num_colors") == 0) { - if (i + 1 >= argc) { + if (strcmp(option, "-num_colors") == 0) + { + if (i + 1 >= argc) FATAL_ERROR("No number of colors following \"-num_colors\".\n"); - } i++; - if (!ParseNumber(argv[i], NULL, 10, &numColors)) { + if (!ParseNumber(argv[i], NULL, 10, &numColors)) FATAL_ERROR("Failed to parse number of colors.\n"); - } - if (numColors < 1) { + if (numColors < 1) FATAL_ERROR("Number of colors must be positive.\n"); - } - } else if (strcmp(option, "-bitdepth") == 0) { - if (i + 1 >= argc) { + } + else if (strcmp(option, "-bitdepth") == 0) + { + if (i + 1 >= argc) FATAL_ERROR("No bitdepth following \"-bitdepth\".\n"); - } i++; - if (!ParseNumber(argv[i], NULL, 10, &bitdepth)) { + if (!ParseNumber(argv[i], NULL, 10, &bitdepth)) FATAL_ERROR("Failed to parse bitdepth.\n"); - } - if (bitdepth != 4 && bitdepth != 8) { + if (bitdepth != 4 && bitdepth != 8) FATAL_ERROR("Bitdepth must be 4 or 8.\n"); - } - } else if (strcmp(option, "-comp") == 0) { - if (i + 1 >= argc) { + } + else if (strcmp(option, "-comp") == 0) + { + if (i + 1 >= argc) FATAL_ERROR("No compression value following \"-comp\".\n"); - } i++; - if (!ParseNumber(argv[i], NULL, 10, &compNum)) { + if (!ParseNumber(argv[i], NULL, 10, &compNum)) FATAL_ERROR("Failed to parse compression value.\n"); - } - if (compNum > 255) { + if (compNum > 255) FATAL_ERROR("Compression value must be 255 or below.\n"); - } - } else if (strcmp(option, "-ncpr") == 0) { + } + else if (strcmp(option, "-ncpr") == 0) + { ncpr = true; - } else if (strcmp(option, "-ir") == 0) { + } + else if (strcmp(option, "-ir") == 0) + { ir = true; - } else if (strcmp(option, "-nopad") == 0) { + } + else if (strcmp(option, "-nopad") == 0) + { nopad = true; - } else if (strcmp(option, "-pcmp") == 0) { + } + else if (strcmp(option, "-pcmp") == 0) + { pcmp = true; - } else { + } + else if (strcmp(option, "-invertsize") == 0) + { + inverted = true; + } + else + { FATAL_ERROR("Unrecognized option \"%s\".\n", option); } } @@ -726,14 +795,14 @@ void HandleJascToNtrPaletteCommand(char *inputPath, char *outputPath, int argc, ReadJascPalette(inputPath, &palette); - if (numColors != 0) { + if (numColors != 0) palette.numColors = numColors; - } - WriteNtrPalette(outputPath, &palette, ncpr, ir, bitdepth, !nopad, compNum, pcmp); + WriteNtrPalette(outputPath, &palette, ncpr, ir, bitdepth, !nopad, compNum, pcmp, inverted); } -void HandleJsonToNtrCellCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED) { +void HandleJsonToNtrCellCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED) +{ struct JsonToCellOptions *options; options = ParseNCERJson(inputPath); @@ -743,7 +812,8 @@ void HandleJsonToNtrCellCommand(char *inputPath, char *outputPath, int argc UNUS FreeNCERCell(options); } -void HandleNtrCellToJsonCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED) { +void HandleNtrCellToJsonCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED) +{ struct JsonToCellOptions *options = malloc(sizeof(struct JsonToCellOptions)); ReadNtrCell(inputPath, options); @@ -755,31 +825,33 @@ void HandleNtrCellToJsonCommand(char *inputPath, char *outputPath, int argc UNUS FreeNCERCell(options); } -void HandleJsonToNtrScreenCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED) { +void HandleJsonToNtrScreenCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED) +{ struct JsonToScreenOptions *options; options = ParseNSCRJson(inputPath); int bitdepth = 4; - for (int i = 3; i < argc; i++) { + for (int i = 3; i < argc; i++) + { char *option = argv[i]; - if (strcmp(option, "-bitdepth") == 0) { - if (i + 1 >= argc) { + if (strcmp(option, "-bitdepth") == 0) + { + if (i + 1 >= argc) FATAL_ERROR("No bitdepth following \"-bitdepth\".\n"); - } i++; - if (!ParseNumber(argv[i], NULL, 10, &bitdepth)) { + if (!ParseNumber(argv[i], NULL, 10, &bitdepth)) FATAL_ERROR("Failed to parse bitdepth.\n"); - } - if (bitdepth != 4 && bitdepth != 8) { + if (bitdepth != 4 && bitdepth != 8) FATAL_ERROR("Bitdepth must be 4 or 8.\n"); - } - } else { + } + else + { FATAL_ERROR("Unrecognized option \"%s\".\n", option); } } @@ -791,7 +863,8 @@ void HandleJsonToNtrScreenCommand(char *inputPath, char *outputPath, int argc UN FreeNSCRScreen(options); } -void HandleJsonToNtrAnimationCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED) { +void HandleJsonToNtrAnimationCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED) +{ struct JsonToAnimationOptions *options; options = ParseNANRJson(inputPath); @@ -803,7 +876,8 @@ void HandleJsonToNtrAnimationCommand(char *inputPath, char *outputPath, int argc FreeNANRAnimation(options); } -void HandleNtrAnimationToJsonCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED) { +void HandleNtrAnimationToJsonCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED) +{ struct JsonToAnimationOptions *options = malloc(sizeof(struct JsonToAnimationOptions)); ReadNtrAnimation(inputPath, options); @@ -815,7 +889,8 @@ void HandleNtrAnimationToJsonCommand(char *inputPath, char *outputPath, int argc FreeNANRAnimation(options); } -void HandleJsonToNtrMulticellAnimationCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED) { +void HandleJsonToNtrMulticellAnimationCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED) +{ struct JsonToAnimationOptions *options; options = ParseNANRJson(inputPath); @@ -827,7 +902,8 @@ void HandleJsonToNtrMulticellAnimationCommand(char *inputPath, char *outputPath, FreeNANRAnimation(options); } -void HandleLatinFontToPngCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED) { +void HandleLatinFontToPngCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED) +{ struct Image image; ReadLatinFont(inputPath, &image); @@ -836,7 +912,8 @@ void HandleLatinFontToPngCommand(char *inputPath, char *outputPath, int argc UNU FreeImage(&image); } -void HandlePngToLatinFontCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED) { +void HandlePngToLatinFontCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED) +{ struct Image image; image.bitDepth = 2; @@ -847,7 +924,8 @@ void HandlePngToLatinFontCommand(char *inputPath, char *outputPath, int argc UNU FreeImage(&image); } -void HandleHalfwidthJapaneseFontToPngCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED) { +void HandleHalfwidthJapaneseFontToPngCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED) +{ struct Image image; ReadHalfwidthJapaneseFont(inputPath, &image); @@ -856,7 +934,8 @@ void HandleHalfwidthJapaneseFontToPngCommand(char *inputPath, char *outputPath, FreeImage(&image); } -void HandlePngToHalfwidthJapaneseFontCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED) { +void HandlePngToHalfwidthJapaneseFontCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED) +{ struct Image image; image.bitDepth = 2; @@ -867,7 +946,8 @@ void HandlePngToHalfwidthJapaneseFontCommand(char *inputPath, char *outputPath, FreeImage(&image); } -void HandleFullwidthJapaneseFontToPngCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED) { +void HandleFullwidthJapaneseFontToPngCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED) +{ struct Image image; ReadFullwidthJapaneseFont(inputPath, &image); @@ -876,7 +956,8 @@ void HandleFullwidthJapaneseFontToPngCommand(char *inputPath, char *outputPath, FreeImage(&image); } -void HandlePngToFullwidthJapaneseFontCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED) { +void HandlePngToFullwidthJapaneseFontCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED) +{ struct Image image; image.bitDepth = 2; @@ -887,42 +968,48 @@ void HandlePngToFullwidthJapaneseFontCommand(char *inputPath, char *outputPath, FreeImage(&image); } -void HandleLZCompressCommand(char *inputPath, char *outputPath, int argc, char **argv) { +void HandleLZCompressCommand(char *inputPath, char *outputPath, int argc, char **argv) +{ int overflowSize = 0; - int minDistance = 2; // default, for compatibility with LZ77UnCompVram() + int minDistance = 2; // default, for compatibility with LZ77UnCompVram() + bool forwardIteration = true; - for (int i = 3; i < argc; i++) { + for (int i = 3; i < argc; i++) + { char *option = argv[i]; - if (strcmp(option, "-overflow") == 0) { - if (i + 1 >= argc) { + if (strcmp(option, "-overflow") == 0) + { + if (i + 1 >= argc) FATAL_ERROR("No size following \"-overflow\".\n"); - } i++; - if (!ParseNumber(argv[i], NULL, 10, &overflowSize)) { + if (!ParseNumber(argv[i], NULL, 10, &overflowSize)) FATAL_ERROR("Failed to parse overflow size.\n"); - } - if (overflowSize < 1) { + if (overflowSize < 1) FATAL_ERROR("Overflow size must be positive.\n"); - } - } else if (strcmp(option, "-search") == 0) { - if (i + 1 >= argc) { + } + else if (strcmp(option, "-search") == 0) + { + if (i + 1 >= argc) FATAL_ERROR("No size following \"-overflow\".\n"); - } i++; - if (!ParseNumber(argv[i], NULL, 10, &minDistance)) { + if (!ParseNumber(argv[i], NULL, 10, &minDistance)) FATAL_ERROR("Failed to parse LZ min search distance.\n"); - } - if (minDistance < 1) { + if (minDistance < 1) FATAL_ERROR("LZ min search distance must be positive.\n"); - } - } else { + } + else if (strcmp(option, "-reverse") == 0) + { + forwardIteration = false; + } + else + { FATAL_ERROR("Unrecognized option \"%s\".\n", option); } } @@ -937,7 +1024,7 @@ void HandleLZCompressCommand(char *inputPath, char *outputPath, int argc, char * unsigned char *buffer = ReadWholeFileZeroPadded(inputPath, &fileSize, overflowSize); int compressedSize; - unsigned char *compressedData = LZCompress(buffer, fileSize + overflowSize, &compressedSize, minDistance); + unsigned char *compressedData = LZCompress(buffer, fileSize + overflowSize, &compressedSize, minDistance, forwardIteration); compressedData[1] = (unsigned char)fileSize; compressedData[2] = (unsigned char)(fileSize >> 8); @@ -950,7 +1037,8 @@ void HandleLZCompressCommand(char *inputPath, char *outputPath, int argc, char * free(compressedData); } -void HandleLZDecompressCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED) { +void HandleLZDecompressCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED) +{ int fileSize; unsigned char *buffer = ReadWholeFile(inputPath, &fileSize); @@ -964,7 +1052,8 @@ void HandleLZDecompressCommand(char *inputPath, char *outputPath, int argc UNUSE free(uncompressedData); } -void HandleRLCompressCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED) { +void HandleRLCompressCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED) +{ int fileSize; unsigned char *buffer = ReadWholeFile(inputPath, &fileSize); @@ -978,7 +1067,8 @@ void HandleRLCompressCommand(char *inputPath, char *outputPath, int argc UNUSED, free(compressedData); } -void HandleRLDecompressCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED) { +void HandleRLDecompressCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED) +{ int fileSize; unsigned char *buffer = ReadWholeFile(inputPath, &fileSize); @@ -992,28 +1082,30 @@ void HandleRLDecompressCommand(char *inputPath, char *outputPath, int argc UNUSE free(uncompressedData); } -void HandleHuffCompressCommand(char *inputPath, char *outputPath, int argc, char **argv) { +void HandleHuffCompressCommand(char *inputPath, char *outputPath, int argc, char **argv) +{ int fileSize; int bitDepth = 4; - for (int i = 3; i < argc; i++) { + for (int i = 3; i < argc; i++) + { char *option = argv[i]; - if (strcmp(option, "-depth") == 0) { - if (i + 1 >= argc) { + if (strcmp(option, "-depth") == 0) + { + if (i + 1 >= argc) FATAL_ERROR("No size following \"-depth\".\n"); - } i++; - if (!ParseNumber(argv[i], NULL, 10, &bitDepth)) { + if (!ParseNumber(argv[i], NULL, 10, &bitDepth)) FATAL_ERROR("Failed to parse bit depth.\n"); - } - if (bitDepth != 4 && bitDepth != 8) { + if (bitDepth != 4 && bitDepth != 8) FATAL_ERROR("GBA only supports bit depth of 4 or 8.\n"); - } - } else { + } + else + { FATAL_ERROR("Unrecognized option \"%s\".\n", option); } } @@ -1030,7 +1122,8 @@ void HandleHuffCompressCommand(char *inputPath, char *outputPath, int argc, char free(compressedData); } -void HandleHuffDecompressCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED) { +void HandleHuffDecompressCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED) +{ int fileSize; unsigned char *buffer = ReadWholeFile(inputPath, &fileSize); @@ -1044,68 +1137,140 @@ void HandleHuffDecompressCommand(char *inputPath, char *outputPath, int argc UNU free(uncompressedData); } -int main(int argc, char **argv) { - if (argc < 3) { - FATAL_ERROR("Usage: nitrogfx INPUT_PATH OUTPUT_PATH [options...]\n"); +void HandleNtrFontToPngCommand(char *inputPath, char *outputPath, int argc, char **argv) +{ + struct NtrFontOptions options; + options.metadataFilePath = NULL; + options.useSubscreenPalette = false; + + for (int i = 3; i < argc; i++) + { + char *option = argv[i]; + + if (strcmp(option, "-metadata") == 0) + { + if (i + 1 >= argc) + FATAL_ERROR("No file path following \"-metadata\".\n"); + + options.metadataFilePath = argv[++i]; + } + else if (strcmp(option, "-subscreen") == 0) + { + options.useSubscreenPalette = true; + } } - struct CommandHandler handlers[] = { - { "1bpp", "png", HandleGbaToPngCommand }, - { "4bpp", "png", HandleGbaToPngCommand }, - { "8bpp", "png", HandleGbaToPngCommand }, - { "nbfc", "png", HandleGbaToPngCommand }, - { "NCGR", "png", HandleNtrToPngCommand }, - { "png", "1bpp", HandlePngToGbaCommand }, - { "png", "4bpp", HandlePngToGbaCommand }, - { "png", "nbfc", HandlePngToGbaCommand }, - { "png", "8bpp", HandlePngToGbaCommand }, - { "png", "NCGR", HandlePngToNtrCommand }, - { "png", "gbapal", HandlePngToGbaPaletteCommand }, - { "png", "nbfp", HandlePngToGbaPaletteCommand }, - { "png", "NCLR", HandlePngToNtrPaletteCommand }, - { "gbapal", "pal", HandleGbaToJascPaletteCommand }, - { "NCLR", "pal", HandleNtrToJascPaletteCommand }, - { "NCPR", "pal", HandleNtrToJascPaletteCommand }, - { "pal", "gbapal", HandleJascToGbaPaletteCommand }, - { "pal", "NCLR", HandleJascToNtrPaletteCommand }, - { "latfont", "png", HandleLatinFontToPngCommand }, - { "png", "latfont", HandlePngToLatinFontCommand }, - { "hwjpnfont", "png", HandleHalfwidthJapaneseFontToPngCommand }, - { "png", "hwjpnfont", HandlePngToHalfwidthJapaneseFontCommand }, - { "fwjpnfont", "png", HandleFullwidthJapaneseFontToPngCommand }, - { "png", "fwjpnfont", HandlePngToFullwidthJapaneseFontCommand }, - { "json", "NCER", HandleJsonToNtrCellCommand }, - { "NCER", "json", HandleNtrCellToJsonCommand }, - { "json", "NSCR", HandleJsonToNtrScreenCommand }, - { "json", "NANR", HandleJsonToNtrAnimationCommand }, - { "NANR", "json", HandleNtrAnimationToJsonCommand }, - { "json", "NMAR", HandleJsonToNtrMulticellAnimationCommand }, - { "NMAR", "json", HandleNtrAnimationToJsonCommand }, - { NULL, "huff", HandleHuffCompressCommand }, - { NULL, "lz", HandleLZCompressCommand }, - { "huff", NULL, HandleHuffDecompressCommand }, - { "lz", NULL, HandleLZDecompressCommand }, - { NULL, "rl", HandleRLCompressCommand }, - { "rl", NULL, HandleRLDecompressCommand }, - { NULL, NULL, NULL } + if (options.metadataFilePath == NULL) + FATAL_ERROR("No file path given for \"-metadata\".\n"); + + struct Image image; + struct NtrFontMetadata metadata; + ReadNtrFont(inputPath, &image, &metadata, options.useSubscreenPalette); + WritePng(outputPath, &image); + + char *metadataJson = GetNtrFontMetadataJson(&metadata); + WriteWholeStringToFile(options.metadataFilePath, metadataJson); + + free(metadata.glyphWidthTable); + FreeImage(&image); +} + +void HandlePngToNtrFontCommand(char *inputPath, char *outputPath, int argc, char **argv) +{ + struct NtrFontOptions options; + options.metadataFilePath = NULL; + + for (int i = 3; i < argc; i++) + { + char *option = argv[i]; + + if (strcmp(option, "-metadata") == 0) + { + if (i + 1 >= argc) + FATAL_ERROR("No file path following \"-metadata\".\n"); + + options.metadataFilePath = argv[++i]; + } + } + + if (options.metadataFilePath == NULL) + FATAL_ERROR("No file path given for \"-metadata\".\n"); + + struct NtrFontMetadata *metadata = ParseNtrFontMetadataJson(options.metadataFilePath); + struct Image image = { .bitDepth = 2 }; + + ReadPng(inputPath, &image); + WriteNtrFont(outputPath, &image, metadata); + + FreeNtrFontMetadata(metadata); + FreeImage(&image); +} + +int main(int argc, char **argv) +{ + if (argc < 3) + FATAL_ERROR("Usage: nitrogfx INPUT_PATH OUTPUT_PATH [options...]\n"); + + struct CommandHandler handlers[] = + { + { "1bpp", "png", HandleGbaToPngCommand }, + { "4bpp", "png", HandleGbaToPngCommand }, + { "8bpp", "png", HandleGbaToPngCommand }, + { "nbfc", "png", HandleGbaToPngCommand }, + { "NCGR", "png", HandleNtrToPngCommand }, + { "png", "1bpp", HandlePngToGbaCommand }, + { "png", "4bpp", HandlePngToGbaCommand }, + { "png", "nbfc", HandlePngToGbaCommand }, + { "png", "8bpp", HandlePngToGbaCommand }, + { "png", "NCGR", HandlePngToNtrCommand }, + { "png", "gbapal", HandlePngToGbaPaletteCommand }, + { "png", "nbfp", HandlePngToGbaPaletteCommand }, + { "png", "NCLR", HandlePngToNtrPaletteCommand }, + { "gbapal", "pal", HandleGbaToJascPaletteCommand }, + { "NCLR", "pal", HandleNtrToJascPaletteCommand }, + { "NCPR", "pal", HandleNtrToJascPaletteCommand }, + { "pal", "gbapal", HandleJascToGbaPaletteCommand }, + { "pal", "NCLR", HandleJascToNtrPaletteCommand }, + { "latfont", "png", HandleLatinFontToPngCommand }, + { "png", "latfont", HandlePngToLatinFontCommand }, + { "hwjpnfont", "png", HandleHalfwidthJapaneseFontToPngCommand }, + { "png", "hwjpnfont", HandlePngToHalfwidthJapaneseFontCommand }, + { "fwjpnfont", "png", HandleFullwidthJapaneseFontToPngCommand }, + { "png", "fwjpnfont", HandlePngToFullwidthJapaneseFontCommand }, + { "json", "NCER", HandleJsonToNtrCellCommand }, + { "NCER", "json", HandleNtrCellToJsonCommand }, + { "json", "NSCR", HandleJsonToNtrScreenCommand }, + { "json", "NANR", HandleJsonToNtrAnimationCommand }, + { "NANR", "json", HandleNtrAnimationToJsonCommand }, + { "json", "NMAR", HandleJsonToNtrMulticellAnimationCommand }, + { "NMAR", "json", HandleNtrAnimationToJsonCommand }, + { NULL, "huff", HandleHuffCompressCommand }, + { NULL, "lz", HandleLZCompressCommand }, + { "huff", NULL, HandleHuffDecompressCommand }, + { "lz", NULL, HandleLZDecompressCommand }, + { NULL, "rl", HandleRLCompressCommand }, + { "rl", NULL, HandleRLDecompressCommand }, + { "NFGR", "png", HandleNtrFontToPngCommand }, + { "png", "NFGR", HandlePngToNtrFontCommand }, + { NULL, NULL, NULL } }; - char *inputPath = argv[1]; - char *outputPath = argv[2]; - char *inputFileExtension = GetFileExtension(inputPath); + char *inputPath = argv[1]; + char *outputPath = argv[2]; + char *inputFileExtension = GetFileExtension(inputPath); char *outputFileExtension = GetFileExtension(outputPath); - if (inputFileExtension == NULL) { + if (inputFileExtension == NULL) FATAL_ERROR("Input file \"%s\" has no extension.\n", inputPath); - } - if (outputFileExtension == NULL) { + if (outputFileExtension == NULL) FATAL_ERROR("Output file \"%s\" has no extension.\n", outputPath); - } - for (int i = 0; handlers[i].function != NULL; i++) { + for (int i = 0; handlers[i].function != NULL; i++) + { if ((handlers[i].inputFileExtension == NULL || strcmp(handlers[i].inputFileExtension, inputFileExtension) == 0) - && (handlers[i].outputFileExtension == NULL || strcmp(handlers[i].outputFileExtension, outputFileExtension) == 0)) { + && (handlers[i].outputFileExtension == NULL || strcmp(handlers[i].outputFileExtension, outputFileExtension) == 0)) + { handlers[i].function(inputPath, outputPath, argc, argv); return 0; } diff --git a/tools/nitrogfx/nitrogfx-debug b/tools/nitrogfx/nitrogfx-debug deleted file mode 100755 index 98ce8b2204cd615a25b40242fdf5d0220a5b5668..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1373376 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 z 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%0DdV_je@)Nfpx9gB!xV6oLTid{`x)j_(S{`(A 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%0DbX5`^Jkrqqa?|fuRg5k#Xc5OSk zx%c)@wq%k$jB9>B`Xf88w==Ghv*_HscWIobo}m^c?YOS7<9ep$GTXytHe90Pnlhu8 z8R|4`>Tx}jdNQu7E!H#-)-(?mWkxSE)SDJd>!ljKOa-Hmy-l5y-D3HsrS0grE-Nsu zYwWl#H*)H6U2%rvdVyzLSI~BJTrUWX>zY1}Yw+94oxW$PzjFF6Lq9UEhoPhBxE`kU zkvpy_(|YEP=SRYN7Mvkq6w>pMIoZpco~f(Hb&1hkX0WI2!PJS4Ysz%nv1`;9octx! zlX2Z??r6)zJy>xM7G;LVHENl|>NI!TWqy}`Ut0Qi+?N)WhcYA2wd(gBhR7rK`<|8O zeGk_A9xTd?JlCoj7E9ajd&u+_7;apjh_}#Bx#RjovL*9Y_je1n@%!`tXvcL8<67jL zkh4bih}`A9jCa_2PJN=t%rLT!JtfI9F3{l9EQllo&D*ZR-RoRtXP$Mu>5q4gTF>0i^LJrA3(j&d3h8-yZFY{+ zGj;X2UTk!iS?XzfDRrXbnljyXLtH)R>kE5zrWsU z$MY7(v*;^#-J2MFwfdukjnUKWSgx`9oax~)Q)A@X1!YDT{Z+ZsMGf_2EKjvq)gG*B z4;E!cCj-3*5ui#_yRQ+A%$iF)ebk?(Od3+N00g&r}Vw?U;To zX7cV6md6_&9&f-S8lNc}FY6SEfoh7=$qDMom_BB)j(f03fj+M>y*-eHi`7m_CG#qGS4y)<^D`rcCR(VUYU1#n84VI0wNfr00W) z>=LJE>gqAQ-{>xLz|-~t>O{vhWx8$doO!~@zn^+CruSN`eIBfR9xTcXkHKo2!`f?g zvCD(8%Y#9gk>?zBufq^|CLqraE6+|3)=m!=Wk#NJ)EbMW^|}L@wu9lubfsrZS2Cuz z_b{gU{ntORWBN7jtI~RljA`=jZL^GB>~37b{_xv7j!(C_ZjwFRTaZKco0k>k?l<4! z^l+};A3oCQqO6wv;iH-xxc^@6FidZME%dy> zVr}$bZKO`rhA1SV<2SWk%=ctA?U=;Fs zGZWddP6yKV1=vHi9Rt&>3^g7ZYCJMfX82s7mODPvsJ90`l@@EN2WzSai!#IK0`+@g zK9%q(2gCLI+^&9q!S(xG`n}wafkN-u`29bQT3=HQXXGrJoM^e|7CFZ|FBMRD6WR^4xh$Uq=1>9?Fa^ zE>x=>7H77a;(g6rX`YPzQfKI7{^&j^+coM2>u2y*w~Zc z?}^`P^?i}L!09M{i`6stE=Tg&6!$ad>-lDbk+?_=bQoIC+y^apHy7~jySbz_V$_$_3>N|l9+`o+dr;ivvd^UG9Ypg_> z+8bcq*^xPdA3ogWhmkAC{@V^SH+FouPdaMQuL-V=CeVosM-+sWxs-tD<(^g06eG;db&+SD=kv>cBMW$#zNf~;6ImY)@ zZVc;LaCUX0=Us{H&!02)FKxz%D~sLp$z{zl|Iu@Wn#f#Xhi$K6gq|y$=j5)Dxx%>S zJGmoY=X={tKV%;B@OaF_gEGToq$+cm+pR9Pc`&wlFeuX)4I|Y6$AvK@bE`}v7(wjs znuDcWUNnR`SYtQ&Fuy6MFYxdeSEo0F>C1;VJ1(QtD?Fofe9BT4#&;fx+qfM^&!=K7 zT3^h6biZ!`GurQ)XfN9Dlo_t0)Qhf-jnuoJvAWJ;t@mK9_h3*RMeuLB9De5EVzr|8kG~lo?%&R$HAe zmQoKtoL*$H7JIN3d$1@ox)`JWD6ES`=wbmF1>#BD0>1y_I7-{+61U@Baa-mYzPO#) zY`#fL`z_{5XA-wFJ9K~K#O?H4+K&3I9bMlkVLscpbtv%LlTP1bRE5*`O!Omu zs|FoK?Y9P*qV`Lf*7MOZYIIo7f-?<_LVBK-$Tol9`Yr0l@LQAJ^D>^M@~o_JEYJN; zN&8gW9`|2Nj5WN{28JG&%M&dr#^cyd>$fUQKV+Db+3JmYDIm1CGkj$s}-C^MYK zsc$<@L#QWtK#9c~?7)URwBy-Z;jpfXXmh)$v&4G zX+13OSjXR|H+`}R?kew_F7aVM4eLSXh4MX@+&SZDJ7=`>y!aT8UYH9;xa^7FVf8Xz zT^i^`=7W;=j+Q`=%#q}KE(O0y!tYNx{Uw(&XI$Dbx&P5Gx;dkpcbV@=jB8#Nk6n1A)qZoM z_0Hy0Ynjne@8*Bl&II)a?VGs)^TY}0h;0(s+S#BBRXOZ z)x>B#BFaoWxN>T`}e^G?=MbLWzLgT@z=nvxfqxg_7y5jpi-l6mKu#3Y%AI!-s( zJ8#VVDmRx-F@Fr^lF6I_nE7$QI4 z_mOYw1Y_xZ>7&S4`V?cShwuCF`?15;7qu>K7Tm&jJdSI=)ULy%->~m~PZj0+%2T|X zjOe1BGToOA7pn^`551?3v6FtyVx90{o$z2$rmU{2{Gu$h%FWwRzJL#9;WPL<158W5q&$qpg`}x3c zf6?jt5_JI1IxlKPKa$TKK}QiEC42qy`iwF&{w`7bEQZ`eoe`YFU=$cTZHM{(x6?Cq zW$dI68r|uAfYG)OdD^B-x1E@zwmSI_Qcv=g{TAy0GDNWsc(5olJSM3>3iH?xk9}Yi z;<2wbJJj)zw#iraw}!sm^H>3UskZjA)5xjqW!D+n%iMU2alf51^!!Y$p;CsfHNfl)}$+iJ7T z-?jNabz|7eWcNJrI^D>#lK&5h=f2}?wC%;JO#Tmsw(}uL?$jFF+~2KRY%=}8{(yWQ zn>{=zGd!wP#$j%vp7^Q_7HgviYoiB?GL03RtX{QPdJJtqC+oo|q?7fv*$qx7(stBW zEiGVsN9?|))kaQjduz_n_Kp|l+uj=5j@sVw(7vW4bNV*-1iyW?)AwZcr%vBX(T~_3 z`vqP5Y5Oj~?q|!jy~P%TyDI)9tY^Vl)Qz4O)n-RJJyTcvs`*BDnFXG<7f>e}+bGk0 zoS35Sbn?%qp7^Sy#hUBEn(M)$Ok*9LqUMEpB;hd|j6(J@yEc2O#f~A`mbuk!Jg?WG zda-^kXYIqv(2v;vFmx34y~B_x zYJ-$%J##n3_bi6?GlDY&j6!xZq&9oI(=&Br_}(A8=aa0xl<=(HUs9awdrNG4+(#j6 zFZTy>&oOJp+-G>C(ayOV@!{_mnKjW)JI9WDc*Q-uC^Nh+QxCc}I+=^hK9lz>*89x0 zqdIz@I?;V5lxZx!SGmD)lziqr=Id{PVRe)~(Y2QRf?G>I!CLZL#HDWLrEUBk16RH^ zntq@9$XWQV!Ew#O+UOgW$0-kwQ}BrPHDyL8m#bQ*lQ*a*{^m7{b;5&n!h=Pb(Mh$s zJgk$~(8+Ny3fax^ME1pI%T?Nz+^8{>8?_c#8{KZ->AYyVywiD!wxi>7 zU+A6A_CCJT0l)o4r|)X@A8j-1tP9*7MP7^{*DgVB47JK+aC8@$oTxKlbiQl>@{c}?bb&3 zn|>&`-!E!=2ON)&sV5!ge)z7$_V!w=eaIBm$v)~tu_)6zNnD|}2b>s>d(p{GFx+^Y z-8CLlZamIreC;&jk@q#jO7EY%E`7Y~TcU0JHVRBV7PWl5+t~r8@7>N0$LR{S)N!IL z?cVJqL*Hv{Y)2=1&|9O`+ZN=D>TL^kqI#pu*wU4%HmtWs^tK5M zr?*beyPZzn)oikUtiYa(Hh%x=lZxuhr>0Q$v1igXOW&!(*d|2W6)J zr>P-MCmX1DKRQ`wvDSOA)_brhGdh{3K0tOE1A2U|Lnmv%C^Wv-B(h(1T&3*`WIZk9 z#}*avW9+|^y&1n)YUI>@Z21}bvFAPSc$U+4)Q>$MddI`wzP{|uI0=6HQm5~atEa7w z(u>fK_^}1(C~A8PkSS_=lxaP4*Ts`zJqyl!Fbe5;ej+>D>6yB*qD1x?_k0pRmgHIS zW7{L|c#^g~?zk5}w#Lc5op(Hp%fOG#H2sj7?cp)o!-F!z;}h!h4s#~;#P+6HtQrqi zjR%V|jl~|)I~^yuXs>JabM!j1247ON9JXk|KSd0s{LVQZtBjEVZ zw#=)FkwxBF#rV53J}md0Rbz~IRz*#x+54BGFG_1G^!v4SV0@iFZQy-@zhz%wXJbsi z<2k+Q2=BOJYPUXfTA_C7-+z#j_doJmM`!1b)0?{fAB)k)zbaKljE9ri&S&PtV(PDW zrZi^Of9vc#Sz@1iF8nU7iFUMX_gC=VVw~L<$on%p)+c}Ali8-m@(wrO-V@jF%&@B& z>hEaB=x#Y{(91fe(!b(ACbKt9^f(2XZv4{xo%6mlc<1EP551LPe;DsMTeOd%uT0%R z+cMaK^Eb$%-~GtDGgnp`D$7WJ77ctW%^o-2FPOSzee{R4)gIWyO!ZmIOZq4L{w=Jx z7r0-_y@M3J?T(l8XL&~=W_1tOtycF((BE{4LHyp!ceRhi5;N6}R<5+@KztKA*1E+0 zovvIzrLkq#hpw!hGHv%qXR7Hz-z__%ceTg<-ufnK8{d?Ill1-W#^oJ3I%<{ov;&$> zH|qDac{&muXj#MhX)SMFYV{*~Uxias99xXUAlZW)<+O(~IQQ&MU&7beHu}N$WW={vzkn}p0WatMO1hF<3f<^AVWC`#-|w?} zl=uFnE6GEL#ad*au*7p28>yJtLnLL$-y$-w2e}2i(e>Q#*nr5O?ceafN=;zAJ;0w9 zD?4MT1^=k!r0&oZde(i`y1e=Hrt6zJTg`jrGqG#@it#D*+Y8pNx3XtBHa2;h_wOI{ z-M+6;%E>J@_Jh9I_ccoN9P}UKxTn1cqiw&)*ouuzXii#Jjmtmy|Al??orxO*PJOg* za+B!+)<&v_X`HI!hunx{(UU9(bK-%svdNBJ>ZYT})YwzY5aEq&7 zg0Hzr9?Dow_il~>x43%EVoC0ECi}tu*m6tJml@ih3_poqdHover~bjo8ON{Cx6-d} z+z0i|SVxwAs@c{T|B<48IpbXWt#8dmhvd}~-$Q;Tz-ZLI1>N*l`vQzRHHOi@c{UyF z-QsuW^j)0=L>$Hw#bx;2*kRLf|6tMrHLcXQ)X=KdPX z`A+<+-V29+)w*aTZ*=zYd(J-O{7|pXKcRyG>a&)I_&n{)_@0t$!|~QWC$eT@_rpCB zYZ#zzaTtup=ou=oa(x+o@!e;wFB3njW5hVda<9)pJrawRsE<1t*heQhb1%<9!KXw` za9ElT=b&W&oAqO|&(3jrA+Qnl7_lF&yPSD9zke&>jf^8D?;UZsw$pRNeQEdHvG*>& zA2{oj*AMz^5;`bV?}4xFg#C1~o{(ZMoaxhxJXoA1%EP+F#<)_|=CHI5IHSZKJEsH3 zKNZBMn>)S~aMLmdek>itC;FFtd|Dnk?-ZHGq&Vl4Cl6&h=Eer9?*;O(Z%w$d&&^<+ z)t))}cc5wtu&`J5#5HjSsvx)c!j9`5H}=fQTFGG6F5Gxbac0Tr*t7SIeP?-`C^MV} zsVz>9IQ6huIkzrY?6vRGpVhHG-yP|%_RTu>!fBBDLx)9w$y#`30~l_e_qJ!A_crsq z4L!{B_`RRwE;5E}_J$!{HrvZ}ZESY165Wa})9Z*&_oIW=RtIZ5I#@%Us17L8`fM1i zriFE|8Xd59?Q{^e*|z10?91P>`G>U4T7a|3Iv0EMa}Z=cM~!st;QJ+J$k`3O7P#2T zzLa(&_MKh|epGhKjO^zq(X-aWV(N(==3A@<9;^i(EXs^sovYq~m$6T5VLp183r3+l zY;Gd^u+zgL>eBvrbP+3>{i?I^UY=veF3(jzv9hFRBeU3e?{ZZ1ex5oU<`u~=(`!67 zz6Kj7&+N`GxAFUY$6sXBHeROva*mBx+Wwe|E~9-rmFJ>;OPT50^VDBB9aK`U9Ub&~ z-Fk?+H>`tl`b*Y?3ia*iM7GRvleWk5$I9NVjW-NYD_lFy##uM&(|UL8d?k9;Hcl?6 z^-yAUN>1wJaydu0>wXRAtE-%R;_ph(19@dZJ&;rWf6v&lK7_ioKOS8KHtrqg7pQXA zhSh;yA7@<1`kkzm{`Kk3vd+d56+RE&ne6w|57rN9I=$(9*1!A7ygKhZ{O@5{%-6UdfdnhyZc7b{au4e4wpY}+s z?A5sm#@tZ#dVnRdlJoJBAG%y9Il39ya@G%1`s_jv=i{00-fR0q&c>I)L#Wy zqLaf9cj2@%zUEz0iK_nT4X4+pJ#NX2wp}iOpPMb@M#Bu{mhl z%!K)Eg8glA*BN&C&Dh2;-miT2iJPtLQeGPS<8g8ZO^@wqc0A&vqxz6_fv7&(DKjzW zLgg^!4i5ePzt{fqLRA~mZ3e&fQQZ~tvjf%#aF#BEoT6J9C-O(^u5DQCwAMqJ)r0uf zh+TBE-i}>dq=s7A<-QHQ_KR=RIUW8p4+~$Er&G#IUtOd+k=Kl4eB5C4fWLHO53HPd zmAvCgS$=K95~rp8*vQ!F)0;lUT^$QJd(}_RM?2#s_@`0$r_oKPTLxeVRSKEea~SrXFTgOR|Vc<>}Ia`dsb&D ze4E7nRO5(d_a39Ebwo3B9KH8Q%2NDa_ebk(++$+ux!+UC+hokU_ZZkhS@0fXi<7-k z>WsNtzS$SVU(qr1OEZV?oU>~5oU@|L=%q~Ez`Lx~q{@yp;d>9@HSYrY3-z6Xmk!)dhoMwruFI3>X-lrtw2*?EqW zv<)Z8^_+cvM`8sWi#TsPq2XF}i1&%RwXY;66J5)?qsOlC6TCM^Co?UN*&ZIm|Gd7T z%;;pa+T?UHlX{|)X%_1&;#_^{p`vT4DSxy|WKOUV_MG?62iTp_dvA{9QXjt*p>$R04bBcy{p@%ZVk z_j_ITUv9)P|B4eH#CE=v1JE-(%m&@1}YxKB(E)xzbI9=lT{;+KeTVEldXneHfhEt# z9u)0g(39y4*^3g|*ARN|TMBo1H!C*e-sd@&+Wp7+z)nN5$r$9wKNnM3cnR@FVg z`3m-lm414Hs(Y{~yH)F=Le)J)`2^}cT$CLsvRa#|n-p(JJ@>>bspp=1H}%}>{Q2+Ju(R+L@w-JTevhkq)K7B64?D2w6>HWp;l)|mN2$}g!o~ip< zZFcR0wb^wK@a%p3d9o-w9$&FyZBh2pqGI(2cNJy-J3jE~&)r>={exT8D_@_UdiU!^ zvFxSr-p1ckYh!9He@k4eyGPCu#Z=~4zh?)QpLlm*dFQ(~^4lQl4lLjG%E0B%y?f)b z*ZK3IDd$6{Qbq!$uWhzR~MHwys`nVb(4}Uo1ZSq zewjX){e^zPJH3?;bKXY#y>aR#>S=Bd)n?24$Fg?UdJ=_t7@|Y;Vk&|xAGi3>XsB`>z48F zh)-F$%*q@qS5G>brR^pBS=ddR3v09U!)@M5oA8wP6Ls@w>n2ZIH#z;3t1aQS=F!&m z-L!RmZT4fKw&Z=M#FDyMv@^%k&K$>Sy!xDNXT_}Atjk+g&M3+j#~WTby&t=sf$rk` zO@G!sU2FOXALjbv&*_U5=v02In_iUdKP>i@Y3Ikj(jJdJy<&Q8b}!E|F25kTk9%gb z^xv{%FkZIW@4pMq#XKv0r1f+;ZC>e-|4OH)@#@;Jo-RjEQ>b6a4yM#*{~b=w4h9ZP zWb4OKU;2L{ZB6pDHOc8}f|?j^Ya(rp>ZYwxwb>)Ct#Qt{=^?NIk&-C3ywb|7ZUqpHRNyfajd*W6L&zdzL*ZxmxTk21mHAdh0p%wf#$n`IH z#J{T@h8wqvSfuUc*{;4ypC7T~*Sq9!&%;~mV8!d~|9?6({=|-7p}yGhtHwU+|DFFw z?fBo3C+e3eLl@*Q73!L>E?x!mC*8>KlSKC4oD8o}m+_Qi$Ilh8;|HxB|0ra~Kkkw> zu;U*itLuAb$CTCoNXm2fbk{xDM>__0CAeA-4HfDgc)9+m`;OJ;ce`YCc2xIWWQppN zGL3VzLZuy!*w%ND{aG*y`P64QFW~g~9CfK*MQqh_JWWh^j$DT^Q+HFm<*&u>Q|9y& z*ac(>wb^;t%5riJ9rvG(W$VA$jcngcWY;>`c)tGWgpT{# z-#Lwu|?V)7IBKZGFw@{9?5& z+}7i?^=LP3J&KM)ZRt4nAoV9Ojvk_|hdpgQ?08+GJ|AxDA=-MNo3W@rKJ1cVFiv(&jSST;*wVmE$-`m4(|} z2F{Xh+FZi-KY}*Vqs|kEA6qzI5!SD?y^ywV^|XDf<6EgZzzX8}LfXEmo3?La?a{UE z^h^7b`^Vm?pTl#~=Jm8W&(r2S$G1|w7H;!;+MLx*o3j$xKXq-+>C&;t?EIJW5mn*% zBJ$1X26sjxyUO8GSLaEWTMk#kVY-LIbf>o}^>moSmB=-vo3^GTvU6Qqmm3b@vqANv z3dE6FF_RBX48@U2v}0pN5Jx5@g0fNSV^^`DfPxI9_i>To2E3`O?yz$g?)&P!xFQ+Aw>qAvBTY#dohUpDBy z$Q7!%xZ#!K)T<*F46J3o%-ocEUlhC99EvsCj_xI9+)dlmy_9+DTgUoexs7?N%!>!} z9RL2}ROYS&%NrKfGk>jrj=Fb69m?)<14y(flI5mxzq> z!P9>ukNiDvWlY`3-=*zwMIM!vxiM=T7iyV#W;VYKzXc&`|g$R0_`UjN#rUoSBC?1#^`=;!Tvg{+^s{q=5*vWay$$I11hthGh^ zaSvtVwa$mC|D;`!kFy9mhtHhF+N8$do%k__Vb>aaT1)#p^<|zWZHf+Kr46s>wKUeB zg7rjn<2cBglB`PRzNKGej!(|ioxGe*YK9^O4_9VTkj0|AEYrRBT> z?_>*&r`@~@Ew?(9HbsZJJ?0ZztvwxS9oL*ZN6wAgwMqDrsWM$t4Hr~tc7;t~URqB%gmhirvJryGg^Jc$A`#xhksW@$uE0i+!n!CsC@p+2+sUF!F@4UzHl6SS(sC;w4^i!|)@WNw;YIZWPf7jSvulC`> zXQui)ho$?8J185w?x4)?r%!dvaeUYtEc=JUbIZ)zasPSYQzbel$h;p9)=0wNC`j4( zpW^OHXS1cDvdsI*yqq9?YHpwIPk55H+QBupKT|ESdT4t)nZ2Jg4HIJ5DmjNKHdAWX z_g=Wb*rCk#^jXj2B{^#zY5uR{$nm)?>0>1=QZHrKMAFCRw!lrV6VN7mB(BkWB<9e@ zte_8gC-jEVQRYfwvitrqKf57zS@EXoY;S*qP)$$P>~E4+_@Q6Q&l zJCe-a=lIZemG#AP?oRhT@n`R#!tp14$jW)xBj;g{oRk^Pv(zES`4IJl^8t%>(1Uf* zgGHI)JX`&3nDYTR?+2q0=l#iSt>v7SwuSRWw7)CPUIF@Xua#q;M~;0SIVdxnW~&Dr zr@ho8{-k$UteqaLogOU8zz$nD&v1Ilf$7vUJX}?hXNpG_(FQpZ-<8iF<6Ar!lo?({>gq5r!D$4e5U<8$_SL_$c_wuw{-ihB ze%fStZ1%{o*&_pGhDVVa;dpGKp4i@ci?zXnwZVf$nc-8c`iJ?fhtE1N3h`N&%s%P( zY@{yj=ft0-1>(<<0Ve*eHgZlb;=YPCU9!6PlU{?YHm7j$N6Ip*r95{|nm%%UpW@F+ zaNEH(IxSY;g_roSwxv4$JRgMd%?Ke<;%&5^?pY#Yr!q-b(CZuEm<~!J6;E zqD*5QjjPRpO!(os^ucT}tX-tH3=l54@n_5Rd`G*7_`~m`!IgPe1{uXi2l1!I$~w~{ z>r9WVlo{Ur)Xk1}4fSL^R9mcR9;|5|EXoY;eyTRiyBgk8!6-ByrY5tm|E=Xi+dBT> zi^K6JJ}@`_)XnV5rPCEw&PtD*l^!`MGo1UYGRL`sdct|M#VYq;m3y!#Go1UYeqqj| z;amnrA>kTGEp6MFn;vZa+7K(pFpnI=JaSNGI1NxI!PVnu2=ykwDQ>Y!JXj?j zEXoY00qP}-rSph5oH~mObLyOv{R78oFm-7^9DiQ8EYxT37n|7eJMbd&pY-qM(%Y?rV zIWqrwWI}9~p8tr=xcIYmWMuxcrGIYx;s1L4Y`Lx_-Pk`j{xn|Kk`sS8i#n0m(;hE= z`oq0;Ue3O-^kJi;%#kkr1o7txdWgm!$~1@AAoZ@rNgt-(O6=mG#X97{I^@BkOk;7T z^h6*N@#i3YupbO-7wP5wg-dSyS$5UG3pr4e!T#;LY#XI^M{r zWLp{v{+j_SX(?;lo{UVsMTTKjqu(KMj=12 zc}_Ow_|UeFyR5;5X&$U;9xTcXpYzq0FrRApOa-G5 zpQ&@Q7dt*R)TRBLxI4N)+@0Oe#N7%br;fXoU9tvow-Q;SahI}8g_K9)?(9$YE$)Kb z4zAJZ1?n27)6sME-mJHV6lVu9uHGD0+~eM?Om)8&CwI!OEvAQsxVWMww-@H#U5>0S9{CK@wP{fw>@%DW;hK~Uw53|qMrEI6Bg?Y57rwVEXoY0Vd|@4 zPAA~>8W@E*y;hr@?l_&IF71c?>kYSr`s|pM>9|Lx;~tqPGyE=8f9UufqYd$|FL^Lt z@?cPAc=7%3FfYM*5sX5-USyA{<3(NVUys;+YPCF`_sHIWfNG;YYhwIiSDyW#4nt*8A4<@$R~w(ruF zTBcn8TAAcdcfD`yQLlgHxB0Gr!PEZr@6G&W>s6sKxW)9N{n9n-+tO27CpEcO$E;|M{P?z>|#^B-t zWAIS18H3A>oO%qd?vgbagR7A>ItD4rESK`g7(6tmZ(|VLc5sbON2<8f>0&zu=i4#3 z;0(s#zTy@qcQ6JQgt)jdxNnYs3{tm!zLh00QnjID?GKP8Zwyjq`fj8;Ve6TB1bRvq z1$~#^u4T#{gWKn{WRl&CL4I57`d7D2j`IV?;J(N_W2Wgx{cWh|7@UpF(J@Gw(eo(v ztm8Hld1VaNAafL>#)Cnb;XO+23G)`5Xb{|lQw9^PkX<{4KkH}i~x#kup0 zoOPVHV`iMahg{Kd_Ff`?tWswBW2}1K>ELbZiH)DKSZ{f--tu5kX7n^xeLJkDQ;BTm z4KNDX_#27rr=1R@Z8y(2&e>?0XS`P>*tOBU;x2kV#z zi!#G$oZ1}b^b(w21fvkA7Zcerj?;1K(tdcJk+Y7|YGr!fBh&L9nJ6>-%GDCbua!2$ zzaH^m9PwaKW_XpW8^gQ==P($BcpXk;fBrYtUa717>jB$O2Q8079vKdKWT4FO7_X`v zkAu_`+uLWc_It4Qd$1@oe8#Jb!hH6@XD=9q`0Pz&pLKi=P?z>|{Oe=>J>{9|B9r6n zG;(VHx~ogpz`yQ7)~J7_Ouj3X=U=O9`+v-c}W5tu5BSZtMAs zU8Y?7vUlWeoRsrr+d^DiS-Jm=-AU@UZ?Uo@Ca8TOS+qXF^9n8A{xe#ThKPIa6P6r#QCpNy`Vr_^8HWJKBHh8coGkTh+?g;B?J$hOPMj;zt zm&j)S+KyRidmw*`Xn(mKx2vrjYru$dTBGaderJv{!>K~eaGX|CPyFj*i?!5)wbX+} znc-BSD#M%>!)Xy1g*YurWdFf&T25WsFX&(ATbUMkWLn^ni890QVpZ(;&8H3VuX8;Z zb3GW88D1BwcaT%Yp|)wkNrF*`SCacb9WUx?|5{`FX{O~d+atqlj|`L<9+#+>tql6! zd9l4}i#5%IHO+%Xnc;JZ`hJ*CHGHOmQHamfM0SbeQ$yXE5&t^6fPbAGGyb*0$f^Bn zWtXghf2~B;sDGs_Qz7M%{B?GsZ~hhBc5sbOC#k!gPDfk+I>h?dVQ1i9t79!r?v(ST z!$MqKS#`ochor82TS&{o_sbWAWYM@`|B8I3?qfrg zBWFfrUzp}8dy(CF5z2aVPba$J{+eN`#ObEdo)?LG&YZ}(j);%nLz%{iU8sJ8F7#L@ ze#l*#`pijzv9X(TCXZR&>9Z_Fw*Tq7t?s-CXNR^*z8~frx~DAFc=q4TFnljmF9x#O z^CEonLVR2kXHWv&S~={wj+{8KhqE4r_eH8Xz!Kh^7m+(W3-RVW$t?kIdtQWilxpO> zi1Z=nM6?`o<|Go2Qk*r((?4Z~(?#lWCx@IXAs(f;x7~0m%g2&C`ttg6vE?*eH99Qa zmva9eXHE)o;@?#fx%#JzquxcBnfp6y+G za`#_U7X{9ipo?c>4a3!tXu$eA~aC``+b_^e7f(hSLZ&*kS4Z z{S=(KIcLJzj8wphGbywm^e^w_UEkG>v1`}#U3!~|U779p*ht@{x1*DYZ0(d8o+H$M z(w5jqdK*4k@{TPYj4d7v$_&4e>X^llTs9*(jbIe8-?qj?_VbpXw5jtBa$UXuc9Z3? z*&_q_bsi7O43ClOS;u1&^{~NS=Dh5mAEkDM`K*V}I^-$DXI&zDjpIYkD|hhc%@{Tp|iRK-YNgkS)cO2WYvoS|8!O1Nn?Cj#eKF_Z{WoJMj5t zatqJq<{dl8JLYzicktWcuiCr=Je_yk561KOT70PXt=xzDLO*j~thQtFW<8dYv7qmQ z`BoB)=y;^e=zO$_h2Q{*m>~HpCHGbGxrsW~`*7A_w zJ6j6mAy>|mhcctjG3r0S*8X7{^<-R4wOHi!d05pREXoYGG3uWzmi7}<=^M$j3yrJF zME0{z@6tBB(&X@(Pq~$$!Xrb4M+V9apRp?C_>@y`0({7!wQkBhSY;k8$_$^e>Mz55 zhQWutyda+;iR_h*&uHq>e&E-!W$Z`qOVRwum9^13nM=caylQo_ zN-m9$>CL^^#{MU$XB?LBChu;N?#7sS=7c&+kSn0*I8^LO)%y62hHU(JZSH#5(akvnt zHe%)o%SpaH)5Q7mz|W9B-Y~kW&w6>cGJQ5t-D+h@6CX9NvyFAJ3UytWm*B{HQ-Qu} zBetE~VdF4$b>2u^)BcjUre%;g8PzTEF;BOYnSQEJ7dsv`)Wi0A9pCuw<^^FsXAs}M z>G%-eGPIwQHxiG$d1H;u8*L2Kd1ELJ26>~zL92^Wd!9T^nZ%vEys@T_c_X;(;2ND? ztbPP9@jY#2+&v@b$vL0Bit`R)Go|)Cd1=UJ_U0~N-PX~I)wgY1au=}fzuv~q#3gEv z#nSl+v9PB*mS@@illz0K#CPz$fkJWf^rl<6WBC@o57^(_u^jrgdK)s!cO1Cm`!{v{c4D`jVT|)kbq~)7KHr~Rc(OS5%pA^F_KW3y zw>{?$-gws?yv#RWsgiZEm9z9cyy?zP{ykgY!<%=SWuYWXjzwY^PL&qy96ML$El>2$QyI;4+bHDDx>^*rf zbieN7Mdp58?v&N{>aIP5dv)(Be6MciSpR41?|c2-`uohCx)MLQ^C!Fc36a^{S@U;~ zbEnah+_!YM*&|VZPf;*7T^=s?2SxqVO3JYFM`A}WQNIO4bWq2gN8;=1S9vg2c`zu` z7_8l990oe6m%Edefl|%7A|0{xV4D8&$_`_Qk%Ws zVem}-t#WTyOy}KlN3Q0vkmn;lyKW)vMdIN~%8V{1sY78NH-S5^8yV&yXGn&DaFDxt z>u*Z7)ZbU!QmVKEZH|>i?%|Efay_#2PvopeuB6Q9v{HQ~EXy2Z;eK7G)4F@Xw|4!4 zo$uD&JEx_7hS@7Mxxn{H$G*ZjR3?0Dc#UTp(YJY1%DxKL*FUZtixy-%VZal3Au#hU2Bn&`oz z%;=>`RX8kcx?b+{?cwgn z)Dv!lEY^7*tn)lrlo@W5)h`^Da2v#*9_|7Dvg0Q8>8rKKFb|GvKV-}l(|#d;QCyq7 z*FDQ~`hLE5V@CepnEb5%xBTDf%GylbZ_!`WW+^ken4-QHmj5^09rsHx3d!)xMD}(k z!-t9Nig&4xEOMvh1lC04jxo8bz3vHgCUS&q_Z7Ln)N-zWvzs>FOk{u0wE?#H`sd_X z##7x%%k$?Ro@U7z$J0-``fGd- z{q@;Uf32lI*ZwfZJ-pqt^P@!e71xfl&+kxw0$jgqxjx7LqxSh+BHunKGdjOiT^Q#2 zUF3hZ8yTKWWWN=bp+EJXqQ2<+X)D7wJu-aLBLihd-$Ze_WH0a;^)zk z$RoO5`5pYr54n@{(L{C%^+Z1N{Rc2b&ikyK5Agq}O+5fs)aOxVbauJg9G3GwS_Ot4wk{g>Z|TY`D^}l zKT5RJFDty}zk=U>{FwDgw1bboTKo4~ZJ#ayKia2DkTKe)lxZ0os?{JTflN+i#(2eNVSKn&HvW z43CZ|Gy49R`li#-bn1z|FSl4%da$naU{PlDeTCZTu!P&?=wS*Nh4eiok-f@sbNWUG zt?!BGdr~*gPQoVLvlIRLc6R61Pqdy!S#IMz+{SshQD*dXh5C%+Hi~+pr=b>WxCd*v z2aB?{V!pW-yHb7HVF~Y{$bTLfh4ge@BKyln?HH4`vBwqIle4YOA-mGH#@)PY*MfT& z{*5`do_CXb)qj(+LH>JvQ^A~zIuG$Y&(1Hh_xQr~MwyGY7X|nDmWcgQXCQTE+j*+w zchbJxAG}q*M`YJFwC}@S-Q4CKxOngHjjY|+b)JPkL}#)N^W^Vx*Lrf-VFm=>LaLH= zmG83#LtH79Zz0{^pY@nn_62a{yHIr!%cTE^kFsXtd=c}a{BI#W8q48Q_niIzb@T&c zvF`C0bGR7mG(|0|<`uPQ-qCd$a)K9Z4j*Hk=BvV=GOeqx(f9Xo51{x+e0Kf4$mZVn z%6E{$>ookP`}cAD5ixMxeLQ`h%x#u`a*t! zxbrJz{RF&%?;p*eomn1Ev$Q{g(-d`CxSbiab7dDNzAa$-nlb!>^AmTG7vT4qFFsmu zZHC|fDJ;)~SWEppzQ1x4c(Rs6Y>-%!w`N4#F#M;glCWG;kc+tB>;~QC%QX+VhzH%u z#qWDVa@F6&x7Xa7(I{jZ=g}2$!1VuAb&_YL|5xCPe}GSsJNRUMXanUd(ff+06WPzO zW{mIAd)lkq9AR8-OWOK@l@B?Nm#UvwJQ*9>)*rMnaA+)BFR`Uie-BS&>l_b>A++ss zjih}v1JMJdt*!FoAX<9zB!-&O=o!=)@+Gogwu*J@RO^^#?!waVdwcm# z`{fw-n*W})gH$8$l~?j^x3_ygxp(~P0873{pLakYHonYo^RA8~_wPnEo_xpbf{8))C5O4$Xbtj^upEM*f+S!z(IUahS+ zF;sTHtrspUVox(1(m7?tx{UT~M$jkn9ojv__`m!D`<%JkUiSOzzAey?L*yCi)bbuj z?smQlJ(@lq*DU>9VljUJX2Tg`{+96hxE@16Yx2^LnlRv#+ z{cCt^HXx(sT508*>XDCk(0TGvX1HFh{*U8YNj>4(yM0wJ%l+~T!(4e6+|##r-`;M< zT$;A!+q?hF^QHRxuwy#3-LTjFXP-Ya`@UA|g7cf~ztTDxW_7|l^t?Xfophc~C^I^l zp~gF%u%Aooq{Lzk_FxV6U{PlJe}+0YtdkOS5(lGD|Hl*Ar>#!fc%Pi6{UY@8Bzkz1 z^6+>S`y9m|cQ4RYn{vm3#76hq-I3qU3H|o{`*NS_&u?KHlXm3X#OY0+;@$Ovrp{zP z{q8z6u;!VPb(f`4#K=< z)qtXw)x`zoAg(XMs&4;GLgMrVl%mQm79lb@Y0rkkHs_f^K@>)`yu8Hl2=b4mz_i2NIoAOFDtK4 zWRJ?6zu{7KGZ;>9_2lY3eZ%SW!=X0G)q{Bhxp|>)IO(=xm#M46ZCy!Ql4lnfPbc87uhxa7doX z^xHt0I}|f_m}KV;Unbqa&n`C%T)&$fxd?$+j$|`CVFI>h-~NeARE7bB_vz@ zq|n@905T2o=xdPE*X8P%m1)HQJ$HE7%^f~N`ATeS#Y2hgEvGwotO(hw=CBMqy%i2i zB6&A+iuwVu7T>p;QcmYQD{IhedA7&An>yaS`-w!hPWHAGSkw6vCjou-{dGXQ-U-qMPrd2j4OZjoBlu}SvDt9_n3@#kDmcXX zf?SE+t&S^oWezD^f7EIA*QY{#Dt5iQbvZHf2I6J0+3VFR`?reOA01O|$jUd?TiCB= z{0M7JTU~y~chU#&d>c7L`;dkf)+6<|(=}$JeD5ms-S%YnHn^ud8?@hJPqmJ1HhE<4 zY>+&MJ59!^W9UX??28R*tfS-9QHyn^Hh8D&7iWWUvsYd6KxhBtB?~i^=-lc#u+JUD zSIV{QmGno6J;TwcZS@`LW1UaZXWGtWe}8mLi9JN;0F)Wsl&e2?x}i@shS*sY1N+Lu zpv>r`Tx|;LMB{)_Xk3yYUE z|C`F1PP4bMF6b zVwbrbQ!Y-hW?=4%fGcNFHCOq5T4cx$p;m@@3QiJ?LVhMm{NHBdKXpw^9MkbB z{LCio*k{Y!vC@*$&(oL}V$*5XRx5pPM0H4+ z;eWB35avG>{*_=9;$NA_K4?LDJ9HJ=E3DY50mB(wjNs8183sGtHO0FHc4j z$8z?Ywo_*M`4ZJZn;KKrSY(Zhd@m1!+%1nMWrpV^>XgOM>r#T#L!S4iuAiyv`uWTB zbF`1Ef-y{=5-YWQti|NXCu=LwexS^7oTQF8jzg#?eM-#KSj6Extic{E$_&>@>g!>y z#MGYFU~Y6=rETY@!ufkBE=jH?_A7aUi&df%IVX2|(_+?4ZfznydiVQ>pNNAUBS)uIl3W z5m|4>N4tJV+4)#FuJc=Pma$3KWuH)3hpk=j7@l>po$sAWAD_*)Q|V*Y9;c{ju8-q< zW3`sJ#=Q~-Yg8a-SFS<)kJ#QGasrK&n5xDHSn>_lCB(LF?w8;l#P=ERvWAk9wk5WU ze&SvEOzDL#cFQ+rN9g<~#eEZ6KFJ#*J}SkX6?yVeX1GpO9kgf0U7ya%vDSU5`Y(qS z7p^^@m3uhgdK-GVtwYYbh%HE*)_)VH4X?90FGn9EEzfL^JhMIWP-eJQt4kcWnbZ?*X+ba z`>UiLKCw6JLZ;uYP_J1m{eA1vaO)vo_+!US+QujLG8e!vT%o?_ct|{!J}R*~863;k z$za`Hj$de}%<#BUHHCSUz#|Sup+1TyvI`xL3hL6n_yy6a{L%5AI418;<^SeA$?e4a z+nPEXZOjj?`^dN2+mZPs^6zFXN8~z*46U5UTh05^e#CGSlS6AfjU~k7F~sDt#N-l* z$)U6Lqk@?HBr#_%bL+olu6%?!_mSl2=5Rc|p|~psIXg-PF}f?3^IKQkW^Czw2)?)- zAKm;v61S6gH1mvJ3s2d7oAU1NpN7l2)o9`Zv4Qw0W9qE$dOCWgy4Lj>gM*yI8xU1%C1bI|C_`n z(1onkUiw<+4y_O7k6Ql)bh=yTLZY)?&C3}t)6}n!N9-}hoZRTFmoYi#)i=nNS}XI~sXRCK20);2TD+Keam$Mro=Ib(be zWybG)Ts;%WyvXuD`)`dKfAI+y%}_{=rdXRbs3X#8JCooF1P%;;dcx+A26%o_Zl zxsem)VNqtd)u>Ct+{k%)x>w^8QT-gB zxzv-s>TN#5-j#Qd&y4*g9diF=M)H_KeO1H#pN>zGy0kx@{&M@TWo*VQ}GQ;mG_0LwObhYJ2Zlkd(Jy?|NiJ=cHGj>EJVwhh+9L~jP987H46m!zGuIK$<4!w=Uq9> zo#Zfgki(SZy}Rlrhj~PDn2X6_j`5y1=RH*@2h#7pN@CeG9JP*!gInFZFW#Za-W2&Q z4S(4u&py;gu~akHDXkgrhRtZCfQ zQ7&T!E^dwXEb}dKmi9#^5Ur~QC_H~#zhthn)6$s+tfKlW!7son8% za`15-C(%`~A0uZR+V{i}Uo=#5XvVY5UFChT%sWM=&L_!S?mt8un42WG_IGku5H=#d%j6)3UJ_AUg*CCcbeu?a5usC&6Q0sC}y7-3MN&ygLfX zEq*d(^&l}q&MwKmfmN?`?l=-E@6u0_wP-6tqsY)7KUoy^Gjn zpYPMh`Z?O-ZfHH$n((_(+mgPI+SVS*G#>Y-eaqscT}(!|dfdu5iROm%WfZHOG9%k~ z^@Nj&K9RY9cz;Ov{^}PjC)y0|uP$_UL}J{y^BG$Vl%|=oVe}w!n7`zc%sjuv8PbS8Xc38k(k8)wJjuxNv&gZV^XW$gVPn0 z8Y%)`Gs5}{}8QYV2cUyW9 zbAxKhH;IAFM|Iqi`E4|ANgf$puc6Guz>C$d8jbCzW&SF;cCTaLCF*AuOY)zOG6sGT zT$x|6CeV^W&cJ5jetOef@)Wyo(vvHZC!HqGIo*@ZUU3#Sd(j!$tlV=ul(qO_*loYu zys43UZX3sa;OzFXe~-)?$=j+fH@Qz>PuNUO?!^C%onlY%h&{z4_SA5Rwx?Ct(_OBQ z$b)(_-!%EoB(*BQVZMpo^k%*Z)-$mNz7gWE8tr_O_wjCymTDbk#w|K=xl^ijNwd6b z?{1E^o8RAhz}QVw92tv@uVb&p2fG_be4ytAar>^J(eqwi-XTQB%^u3M%&|%}(a9XA z-Vfm4i+y&6f2A7Yu!KMF2%6$u?;5nvf;)Y${myRQyEj{2oJE8O@A^l^P75#U{;KG* zmE+`FnN{{3i=LCtw?1Nl$44yi_z21j*D7_2_Qcj?ubA8^C+nEn-^}%3&GleW zX1G?Vf3;Zh-ZGOUPiFnn^|kDOa(rE1%U-C=%pT_B{Qh~XlZ?n1duC|WRZ`L6CK;uCVb zlQXv+;?XT-M#ibCCahcLydTwi>9PB5TypEB=vKyw`y*?7r#CHPeRLr)%HHGZiBTuv zCUbFLjM~e&Dfhm2YsZ=ARe$i4Gsvrwvi^Av>mGXj^O0cvQ{q#+ykoaMvvsX{>;KB! zo^?&)y3>7XOVvJyW#dx@ zpW()4q4*@{ce@>%{GPP-qvKPtjZfq>d+dD*Pao^t(N<~KlX~l0I0v`U%Adxs^!D7Y z8JCx-&xCX#cSHAdZueZvF+Bb>LNc;e>7RFPuJ3FZG=?*qsg zW@?}CLwrIDIyXL{*Y5+!8Lm;^usD5OzeBcb)YqI$#Pg4GEo8d2FInd;Ej_#SyPoXi zSO0V7cJi+;cG>Wm*vSpybAHB7UY7SpH~;V2$s@7Y3~eV*VkgzEPl&m0ZgQ6IjUI_L z%up2{jh!IdOm)7K=_9t2uX9(2teI&$=~viJa=vLAANI9)62ENA~+QH|Abh5GvdOV(M~ zqZe9df=5oSC+kNGtqx^xlf+>1dGbBZrm!AUHO%CDnrAQ8kqo~p)gysSx7)oRBZ4`W z%ZCenTh#EnQf&?}Wc^IO-2_IV{TlJxI>tC&vUXJ@abP%oMSrpGBssa>>zdcsoWqRd z~)>EvFmG*~EFV2D( z9v@ei25oZ=MC*d@iRS5oeVBQ=SY+qRA6KIT4C#-X`2$A5{#exU4^Do4F81b*D)udy zcqV;v_TMBmTt1<);F__+UR2G+^DWXw&$mb^Gkx(1CAu{j!et?Uz$nP&(;a{2xX5=< zu`Q>&x}5Q1zm3|+cTMwj`zeoZKV|J~x)NO(d8mh-rQfjg$WyVPEjMn`r)WRYPwkW$ zZqwDb0xZ@d-(c={0*nIO+D;_0HwD~i8#_xMlesK=Z;x9UUh~NCnnwo8Odr*#N30C# zBVxY2Tf<(0#I>z9IIc z4_J8)dgM9ik%uzF?P@jIaXUagVo!Rn#oFh=+ULQd%y7F}4G(kMi@dwQD8y}7B74wr z+fQBE4`L5%4OPM3Xl!qXm1(C(rkx&{C^P(KsCQ^X#!`9*ZHVnX=D~Q(gF%_$HAA&o z4A~!>5uEK{6ymi#k^Pe6MO|%sjkce*SRUIvGHmn6K$+n&Qyp)!)GQKh4{=&WcNEh()K|3 zOtWp*c-pSOU-&_6JkpQ3*yN9+iAA z!10(%UD|g(T*r8ct>sph3Xd!m9$6?mDti)RG1cODl~Yf6m07IO9<0$GEXp)iLrgst z=2eEQ!@wxSYgi(?!11DOy_Z(F47TkL@w7k0(>`T}OObleaT!e8;txtZ7$qJI$_$4h z^+#b28V8I*9O8-WILCpydM_;;4!G&KdG{svS1tZ;_Q%?N`%7d`EbB+6t;k(gjgjvgvVJXlCD~is za-y?y$2Xpj+>H>D%biJZXDVN&P5DNm{y!Mk&~DBdfo`7N@pkUBmqnkA$|+n$PIUVk zayCZg?56(f)ZZAbAD8oT?OLf7ATyUx@z4(BHCm!o1_Ca_>0EtM(A@H^V zOMWkW>^V~IVbHo@{_o}(-OkNparIYD2Ik%3gL*y3ZiuTtb69#kqUZY;CI)uw;FOd2(Yn^W?@w9l!me>z~lQ3-C#=GyUYw zK9zVOr<7X)|y!xxrAzqo)`0M4}_*wFi zf3UpL>!`cl#6Yn-`3AI}!}K;!iVaX5VC&dUj-+#x`Igt&<~t1o)PGqleGkxlWS!d$ zuepir1CAH@m)wJuGly|^|49Fl>u8?6&7Wc=>N&@g+)4B7Z9ddcqV|V*l9Oa44=NNV z$$f5iJju&4v@dgjI++6qH}V$!cV*1PZE~xq57F=4qU#h>U4B-owm5E;a1+}kf6+Mr zxltY#`9@yeOqsFGQuT*nZsa#T-OX@;<0ft6Lwd76)Qqu#>K4a?yhh7UK9nc_V2}Ki z8TkjQPln|eoDwh!^-W14``_IAuJis1>QcW7pDyD;zk_cb$6nm~vL)O@-U#0T{ z`lHwD=I5wKoD8ydt@8tWmji3^dHo`HG(`KBGBY;LQD6Fh+`WH%RMnY3K9d0wh!B36 zXn;gONgxUqgcMLRlOP~eP*AYo0)btbfeKq_WeXnx$u3yvM?A6%t#tXh3j?&G(h37x zK(i}UwqRiwy1E5|t<1m{D|Use3w+fy5) zsBd>;p-)f4f=%gZDIT)1NY5DPX`4aM=qs1z>hS@MB`}ZPRJFa)nl@?-iMjMN4m3}l zre`$kX(dW+4v#X1VGccDm_vt6>1ZViYz!)AkK!NZy*=8j^)-)N`H9wnwDvp7OPSd96((}Z}$VZM1hK5voT;We|k1KHBo(rQ6Hl;03 zoM8+auOtX(ATT_%of#Oio@H%uq$O?fK8k;$+>m#1 zbRn9vV5|-XtPTb&*p#L=;yX@F1>o5Z7+#v%g{*w7iSlk9w48m>q0aohljhWOnNyyD zQ=WknY~b{+&(~HwruF3_9q9`&R<;2v+kgd|#9Gu=gq->U(04tk|XkCk8Col#X^H&#B`hj8iTE!z)e~ zg4U0;4$7OxWT$!j`~h<~XW($ozyUU;r@gocOxYHEfOHg>lZ^Gg0qcDO7HmpSd+|PF z$u{96^c)9#ww)(@2Z_J>L@!@>u#Xb31C_cGSQPHl_1c@e{4{Fw#-n_A^$k z0jt)41)I`&tJvVwxgXs30>ew^UfgG;x>MU0@ZAIqFKwHGRy(b22ht*cdIuWB=TpVkFpqTx z9_tJ|U{jh3#4xRC4boA(Rx;LV1J-H-7HmpWf#~bhv=Tg50K-eu3f%wwZEi0pZ`3p0 zzozuVHC!f_GOy*pboImW<@l|;4~0!>yiMe3jZ2Y^G|p$Ng$AsJ1}xZ=#@odIfU_Fk zqd%SxjdOwFrEzZ1`hnI+c|)U~LrKgr0_1dWj<`4o?-1|CxlJYZ8=3dJ_9WfE(dV8EDQ zz<^C@DHP;eI~Ig94j5iq#s#f@S_{(J<34YsBe>wsPHC91m1u(ocRs^l9-{Lw&c{fLSE9bli8uA`!$Qw4L zqoW9E9py+z^`;kN^)X=eF<`-_baWIwojQ6!M;S1@bd&|HlUm0Jq(%O^Em!eY^FFc; zlo+^_7`VWubafKBT31(K)3=^t14gj{12(0nllTn$?6OBV9f0AbrvvT+)q0Rtf9r|2 z^Qrs`4EYxr@`p`nC=%~+{&EdA#U_`r@(fsc1}xZ=mLhS`sU;U$vVq~HB^!GIwU&13 z+Z&y$So-Gm)p{O<{6gn%UJtZN{eI=zd$9rYGPE}%=s`IDh{%i1|z3>}q z*Y4i@A%DXH4?34+7S2vcJ%7rvj@s~T$$j2u0DDE!&iM?a?kygca&}efyws-Jj=R6e zJXCLerep)ok2*v9c@GQ{6Lh=+nD42kZysO#d~JyptPsO&ESdvI{e}~*yodH&mf{tLd#qA#Fw z-;i|?N~d3J)jFx~Af0H-rO&8u&_30B*2)Y%gH7qo604j#OQ5qWFud9@w80gulh#Dw z+yiwMA?ZOo{zdx)r6)^#TkAo4PxZ1P?Yq(w5L29b(9R~%PHH_^vk`-TjkG&1f^G6P~QFV^`o_fz4 z3AoO{3dnv(?JK0V)z{13C;LC}6X~S9=nerY6I*LKrOyGPUbyQrogKbjp1sgZ{NBbv zIw}(=mkP`9Z2@z9=~(jH0=V5Peyy=;aQ=sD%z-u{y-ZZ7^E@)O)n`yvzr$r>D`K3} zh4;bLOu91AhjY*{o{)WT!^SGut8=f|!Mx>IZ|bsAkReSJi8<}J%*s1fCIQ6KRsxXSi|d~gHhavf{4%Vl$~a(QEA@V!G{avAj9 zXYcd+sn*(NJ2RBd#ui-v#s$cb%!5VrWYL9hrx8jV-rnC+&xhEChrsZ8kSO-UU5z#t0y7!&# zJ&4xwdbll)^;`k|j*oelLykRd^4+nj!|re4{pg*KQI_$0!c%pMzH6&9Nt&ad-&$2j z?bh*=kr}|$a6c=QJ>SjdG2!BzqJf)=|j(sSTp?D z+%?^=F1wHbAG+I5_RYNCth>L(a_73ZXn^y?w`t8M$6=%QBF)3T)VLDHUL-ke-DV`h?yFfJi%j<0-H;64TSvOoVvb1?InAa z&aFMHF|c-EE7r|zrElRpR*qH`>_*-xW6NmOxZQN8V5V`zdOV-N`@DM`u>m&eN1UCzjC~Lvhw%or{diB4W0FyZG07;ym;^S7g)?;LI{ZoJ zBh|NV>kjr4-StE3wrDP&?s{Jzcv9X^u^ZzqRqknRWJgs8Xly3$>+N*qe!4pp`lWBE zEa`g+$S0T|lsYiysGsX{5w9}nfKB;ika$r01n-H`Ck>lBL>a3Py`4TOhfbO^^m-rb z6SR)bQf*P3@@|fQT;J`vS&BQ}4@q~tj5XpNRHw5w;$6-i_d3{=#tLzZ)>wvg6nD)1 zNq^D%qI)cgF?JdjY`~K91{OH0IAIMf<_7DV16-vwQr^(mkoQBGH|7Z5e{NkWfM=o?=9PAk@^eca`Tzz)BD~Ae#eXAeT&XJraP)-yNve1txcYp5IJ#)RK>>pZ7M(IoaRBo{+z7g+IN>3B< zBy+Lj-hg*0V7=%IHWd#!blu39_0mkPqbNH%?kVR(y2c66{rj8;;ah(Y`fu(yVK&AI z2WWl#O&BNOzTbYTPyK&noN&M|evVi*YMg*Q0&i-Jn>gof5h>@qAanPwKsZvfISMc9Dcl!@xg8EAFuJjt9bXwG(H&gWsDE7KjH!H6Y8U> z?`-J!0Q($zIDK*h_yBWmO~oukW@5in#|?}R!dgc|#|KsPzKL^v=i{9d=Q@6w{m3-*BRwzPoPK23t%iQ2 zrF!3N;s5{P`zH3JlP<5UAhpT^+ z$lN!4H}(bk2E5IJi_gK2>b1P9mD<6f3M(Km{|M2?a14w*Ja zrZ(T@lRDU>j$n>>L;D2lM`YiC_dSV)J|YbZ?R^>+Y|1A&Vw2M+csHzXe^5~Sg!0CF zmCi5a-4XA1GVUeJtIWVlwYw?vCUl3Z(%4))t2LrslNuZFtx#!fE~Yy*;u}nT`-HN! zM#>u+8@Nvh@8&JU2(5$O3+dgl0q+n>M+@;)r;cps2*9si@A(1j&7HyhINqb>exatk zp3L*z@iDwRj=}kz{OxFH*CaOsXubx@S@MxQuNY3 zXY*Ec|8EAc7vkz<0!^$pP2N_@ara!haoeZwNHv2lF^ zbmWPD);b#3H$X?8c+IKf2Kt8aT1Nx>hLruJwQYWh_Xfv)(hT!Yn4^RbkmTI*3LBKUTyTD@Of)7&Gr+%A63)YetaGRou}X) zo6fnQYAo4@rk)`f zt!-n_{U~%lT958WuT0aru{SiQdoUJX7{EF)+K=0y^97;1o%oUFN_!`vJHCter|mWD zPupwQp9Y(XcRTR|jYaQHyRbiP2QWC^@o9mWJKphWRk6g55bb~RT)TP(&-=3O_`<5# zR`4vvy%TbM+!p4#-N1Fbfh%mPoVOPlka30c(>13pS;@y_n$Cy$-t9 z0K;p{y(VN`33DHaynVL^ubx@qze;h8uVfCZ4IEY*IKZa#+$siWJu8up^eknp<3oA3!8;kZ`G@p(UGy*U zY0PJafzJ#BAJ~+(0&$f2#HS%0X`94YQw>;C4Op-#Z3W_=oZ2Qq+XP^EX`2wTzOJ<) zZy&Thhd!0=kUqQz>t{ys9_um8XPkl0I0GNpl(yT%_qDb$NJrX+GS&zK)(8U@Y)ad0 z;%}VVhC*8vFub%?g{+>eErGn_qp(N04dxiAUJYap6$TC!1`e<(J-3TL*Lnsb9qH-A zSmg$+asw7@O3&@$QKz0h(9;VTUV3_ktc%n1SQ)sw96H82cjMe?)n}nRmN2g}1Ftdz zFW8jELQ$qQmLOdnG!`>fR|8g80~TybW1+assj(OuI{?E=V~3FSQ>~Hm?v$)+SeMJ| ziJ+|=^C>X!DKPMXO=;^O{s4UW9?%Zys-Z2HvGNR9c?K-ll(r6{jKrXZefWg}0 zd0FZGTV7=>5vZqs!}D)y9}q{qHv{WP;`aUp_~3J&n!me_`5f06G=3d^bB#gkU{gNm zD0XTee2#P!-%l9pvH|O|0Sh+egN|ao(+8hm&gdgxc*Xalp!I;(hP-M2!kG&`tG`@J z1Wg|>k8=hd=L|exQ<^%71zOVwNJpC9XROl(tkVW8*p#MDVun-G`_Oa}7+#uA0!wQ` z-lR#lq4O~BP5NYcyMQ^t!`%KHWp2j}+>RT#!M2Fj*!zmaV6F2g(vi+u#yV)gI%vRx zO=2x75?^uZtcA|~!0^(!KWM%86t_Qzkrw%vc49rdn8RKJhrI?4uqi#oqP5nu3+YJD z4#wJPz}jiRf=%fu7FWT~?$>vK<91+p>DeB%Ueb)wt9_~MoR*rEtG5;;d+g&fWAP;xFgiZP44)F`-AK!#@A^2hqW34k_tutW3rhIXS z*yHrY8u(&0FuZ)RI%tj4zM#CD2Qe4V>)L3~1M3*pNwvZ2VZ(a&(YMGmDzT0fbHi@m zeOLM;`P;bOS4Qi@mQ%UGda)I(Z>2%sN`pSwl&?CA#oAXZppEv3E;V2*HDJJ|eAHQd z)9E9^sR4$Uk7|Neq4v>oq(%BtKkJx_|B|lxtY@Kt%R&Pe*p!|wVx-nHAL%+H_Olpk zjsa_q0Sh*ztBV-u)HMrSX8^-X*NmX`o4??CJr`+_Kdl!dJ+!uQ0JY7eZ4zn4*l8;B znr7fN&A%7l4!p+z!%O2BoENM$PC{Db zPv7OVM%8AZJdR*KqYQjT8Ti1awB0FA0bjQBBY;okai{@fr~v~urRh%b3&xP+3BsuY zhL@(Qpfz1mQRR$<@ie*sS#pL^_IHAI2&- zV3ixNU{gBp5-XiL`#@(eV0h{56}0ZvIw^0oO`yt9_S1z9=%&QET?)JA#{yy#d zq0-n*JgqgBARTG!z*xlwtYQNeY)WG{G2W@M12h%@!%Jg9(7OERTn8y{Xl%&$L#3lc z4AeUEfJJRdHtWa*2e(ghWqzqXflcWs5v5KY+0YRHhL?^&(E6p;(G_WtzrFSpWzxC! zw51&LCCh1)=XKX3-LtQ$?;y_g=2W-jnaj0pQueI>VbngXL-AwZgHI%Ca(`KonE%oz z0iT#$>9?>K;n*P`%`sPq@DPm6eb^WA++89(9PhRJ)*g%Q+jl9t?-c%ByA&Sjr}q5S zoNvP){-70}$$vk{e~;$B+sMCT@S~iojEwbL$V0xH_-5>7XOUSBlV)Ot8aE8Or(+mApq$tC0i$d1@`nUK^q!7Qw?;k?m z6esYNzSVqbpGtUNR%|H03v14i{0w>IhpYle9y0#T{MH4u<1bl-Lj}$d`$aCq8#UNtB~Rd8=lE>67E(R17EqO zmH2A=6r`pmlX5}dglPsX!%rmFTREb~6l9~>n{&J(PG%R=O{WL`Rrjq_R1 zdQ;3+Q!GW!*2t1oh!cA!+82Pf&T^Niv2 zD{QJA?Jg2J9chIkJ4-=)}d zmBs$u7mDTdRX#6u+MZLk=XF`4bl+9BcsIvyf2M4QurH@C#^QE8crU3TEne^8J`c^0 zYi_Vbj*%UAhM~Uba*v}^<}=)E`^V%F?oKLL+{%ee*bpRy4|HW{5orVgUjh2lvDU%`o0?| zr%Pm+NUi_-l74~DRQ+G#QBIMzdXMzQyS@Y6MNs?V4aRVmQ`q3McYVGdqC%&mateE7 zTT*j)qU4lXPA8(AZp%oE3-c3>esXQTn9mC1+_w8A}zx@ICS>*r7=48HU zWovWL+NUv*R<;E%v9DLLuU}?gue||Z4>9<9E&IvY)(-LTHPTkU%syPyL;M!pWSg*x zF`T}JP5Syk5AhqFj(iP!WLZ*kxX9q^BKUe)24CaZEbW(~yYr3z$9q|3_15RHr zN#>j8>m@;Js>Wnr%X&MH>+u5i`(j|Y>+xc6U|U$1SJ)y8$ey7dBTY5ZNIwP3gmC(a z%EmJp_&$SkOqj2%$MaM@rg+f5E@;21(dSc{d#tJNZ;PDm+3XCsvx8P=mmk7YxU47j>;PB zk?~2b;eE;TB%(V1eZg2{e1@`yXa82s^_nng90pvB!}?F(jB()DBtA5$HbajI#s;k; z`nULAIz?iQE9N!HsT24BJ^eYxmv@u^Nn zx?ztDN@@)+G5B%`d^sqCFY)aEYJU(W%I5UV!PpF7V@%yYG9Zbc=F0&=Yrg)ivwrsE z`q`W7XFp)L>t{dK>Fj4=i}WUYhWd##)kq`#;k!p{b^3$qXO9egdjzcsnlG1|8Kk$T z)C%nxe%mc*1@&*a+{m`5khK=E)-J$sYwbds)Ob3q%Q$S2BC==DiZsa+iME0(7WI^ocmDU zJ2ssGp?w&&eTZ}3w6C?T_KDpXtERnUZ^T+?y0=$qz`ZHcYz;V*!Bsyu;H)|2^K9{y zosRYllQCDWHR^IL_ddG6Ct)sJaz2nP`a3w&UX=RI%{#$-$ zY1bDYd}oSjo>7j4JSWc;AKbZV94np0e0W_IYrwvh>)=FXRh~QGiVy8?QDrelT;p_9 zhZC?TXkMD*6Q7&je#YnG>@Cbmd&TDro_$yQ19&+UpYCd0p3}k+AIx3L_+UO<>$c;A zxovm5QwN(Wd(Fi!ot!bxouD~ukNR^4bJsI9AEcG-4&F->n46aQcUApp0`uRRhkiGY z)0{HVxeyHkN!Cfi!< z)o%y>^~{amt97>{zG!brw_{FQ{+$Odx{UFhL>%+a+7{NjVN1}QcP8CPLuZ<)demG@ zbm|6&`sTn}Yu!j2&sMts@!Iu*v~w0}n_(a2?U=vD9d_IKZ(8#=SN`w zkFCM8Z-dWs#SS~&&Fk9+Xn&xulx-*Xk2!ZI+s=lpB}bh^xxPg#PT@@V;U(9SqaL}& zY>!?r+n8w8W9G33($>w8 z?F#&Uix|cl;?uaDa=aVV!6vmHxJ3+gXidQGyiYHF(9pLXMBg?kL*IsH$No&!bCq{; z&S_XdGCmFYJ})^3TZ%#_XN*be`#!%*^Fdk}AB;U@yN|WSwCQ zG9uX*AYO95Cce&N41%J&$XGk$1e+?8t;DZ6og9O}elx}(VeJluUG!+aY% z2FcU9|M+7NwB>o?0jKU87=wKDq^jTY?7(a_1{o;FAmg!L_v>4)R#p37 zqI^5f1j1SBIMZnZ-l^p~HpV3C9k-L+=IODnd>3}Ti_kf{vTk6nS-$3v_h&k*aVypq zd5ssX>$W+n+h)A~Y8(D5+kt591ao_hv>UK@ zMb+=t;y=MjjS0pp3`aY#A;9T^t;PE~oz&`mX1mR)HhE^d`CakrSDv!{L3s!JM{5hP zw+r(gcxP5Ixy{y~Vw7P>wLqk(VXk zW538fev-q1w&FT4WxYgf6M2<*zsvG|FU_sAe#ji+NUMF8xX$|k0$Kci2@E~1)9;hn zls(g%8vkne*rBUn7$^ z8Hj0~Q9TYjM|jGw_^%q9ovbp?4Ii<|s#dlT35+~JO4O9I;gJ*v251Dsz{%+XcJI2sQIX=gcpF2Ls!Py-j*w)ip z{{!vCLr%^|!TE5KGq6(Lan2kLSs#w)F+I}C`0VBQ?C1E@-avd-1k&SEOL(sMtni2r z($?)~4Z&MQo{rC6#&E_5HmP;dt)i7vE9{A#{$zY+NlvNpnT7c5%n%!)2bjJiX$&3{ z$(kF8Nkt$%CTj@K6_W~&m>_N4YVGTMv5hs*-b{(%j0tS2{N;5d6(l4r0$EOhd$0ndd=p1?}2 zCksPXN6i6gWlUyqOy+P*=H5U|E@#Cw&!}#*<`SMOCYLMC?HJP5&C$Lt5D&73_$)dY0ywQ%)dNSlc><(_nsDGZs z@tKPJ-0_(T&hGfYCOI#mbf8pd%3=JJJaOe=Svb4{T*7jK* z=iiQfR*>Xj`>cS{yL<*)q8-^Y_zY?4kVf+LbrAQu`Q{=ouNdcstg}z>oB{a8^OVna zVJ)RBYXRn+o#bo#EgQVteuGWLu7fCW@(4i3b)Pqn>p|-$%p;Dpvi^U>bAX@lcgV{( zFb8-!eSKj3a?tiG{Hw;9m(A+~&mwKzCvs0H#$p}Bufa*y|Bo2MS^r^EKJO_0lheui z4}0QVQfvHV`uf25$xtkDF2h_co=wyKka?qh{-$58#T?)mXP)+{{__Lm=WYu=0B3i6 zU{mF~quAl(d>WkJPjUuUYWw_t(E6I@gS0X}2YIgcFvsaA&($8kfjI3j#OXNUy4z`w zI3aD_QSJXuVh(GGA7%_^oM2OBvXhwY)C{|G?<>yAh}pVzIa!K0?avS=Ji9uM`_Y5Q zo91e{9}VB*h|?~P(_Wvg(XK~(@jG{%V3V8=bP^9bIqw4Joxt#_&pUDdqUM9NGEVC_ zPMbJRTR2YJZy-*S3~|~{xUM)&@`w}C)@{-LFA~jloHj9rGfuFnvRNds-yk{OhTXZ3 zHC}FrQ#sZ^#}3B5^3GBflc!C6^m2AwBHL> zfag+Rc*SNZ*8gb^NGoGAhhsCBV>6#)v+xFDlWmC2Lc(>$Cfg%6NLx2w`@C3eWGz@D zp)j1WflZaiVzI%g8FuGBQ{2fOORGbt@m*?0hS=cQSG8XX5XU)~w{EKD)EctyRPqeo zA?7-HP6f|N8DcXjXtmcIkd|U2$2McQY>eYLO#p`Wubv;8!2WWq&5XlFcZg){w~?j} zX}}lj{_hZ#ZoZ?CmseRD6}0{^miuk+rL{Yyex6es%AE1dOmnr%^9XQqmuJ`{2VZB= z!^vSNG*o5aP!+TeG6%KRhkaJg`442DRU~=XW1R}{U_XX+TMJuaAlWmFb&#eGX(Zo8 zoyC76f4lw>-#!`m_6b^Bw9k+>Uaovbzt{h$|K5uASBWxc=#>GhSI~N1YcC_tti71E zcV+D*z;KtB5=!qH=fRffO7;xek%rdgsPfWTyy4Ui4)xuC5oW%m@jRt34$A#>^6rdw z;9UT&UgfO-{lC`Rj(D=(Z2XS)J?FCCJYcx>=23c=Uf6DQJ&r1yUBo=6UT~;yJT(4@MvX}IFjUQ`In_@31t!Kqv&S{k6rrtK`~I z+#dqJ$!{@VU=8YId9FuKF_JaK;oqEU?Ae9?q(2c4?K8XXlHc8R7dDBtsHYfc`v>Kh z{EOJ=c!FaLcydg4NY}Rlw9DD5UGClz>w*n?0_onx!;ka$Msf`H*EslZ+bH}%b!UC; zq}^BNKZv_z{OXRzTJmW#tZ({aKApfmZOFP_<5XE;;q=GC)4cFay952~Mb{mpgNU;HiWZ!YrBcGcf(SN+AE zrF5q()!#Q6m+S9rnw$MH%0lDY-1`Li`R25__lfV?SU0yU+zwp2SM%n#xqW5KDiO2C zoH1+j<<;Lt$86D8MK9aWjjX@E{-UFeb#r6(qcLAn%og>x@6A1jJY@Z(e)73L;h6ab zh_{%lD#MK#+YAspY^<9bvx+Y(X1;+kW^bXM&2z@gk9pBQ&9Tk9zC{DY&)ek=Q*Qf3n^Qv)5d+~^SYc;I&PC~A4nVOJjSqLu4@5|nfKQg?S7QwL3?@R z{1?(hISq}eqewH1)5Nh3LC%lR`Uh7Tmgi`@{9K214(h$wCq98cWIsO@-xq0K0P7JX z7S=eVVNF6BHx_IXYmrZ!VXP=(mY9HVn^>D*&kO9xqIdF?G92Gg8Kd*4GnL^pc>b3h zv$*7ld4YAnGQ=#tt}^D1nY3}tN;!_w#xXm@ZJ@Mq%)-1cN7^`MhlZ3IAG|1ZC*4`m->twx#;v2G#Fhp?%5_{9nxkD*BSCgOqh3^E>72COOr7HldW ze(`^t@u)yNutq}1L&rjwsWVs`aJ%+1@|I`s_wrw*HnJh-dMiCyVuIGwhxK5sg4Bcc z5^27{+JrRUz^3$MiD6DXCD23b7QE(WyN0aaKBDUSnO-=1ANl)npTHuV9h2iz=eA#AXBOPhG&hxWa z7m z_{FUeHl?wt__5ab3DS|q3yk%V0qY|J7HmpmQ}MD>;{|9u2Mn)rdoE~|YmJmQG}8Iq zvL2ph4j&jed|==Jo6^%vd`Ig!jdY~vIAfhOV4XBz!KU;y6Hhty9EYBx!0^&@6z6}i zo-^;$I_aS0ho=94P1Zw0zxEQ=*-#u`r1dtm-tHiCJ#655*uWJwr8`>;)VdEMT?o4O zGghqutJZ)8o6?;vN}am*L-$@_c`(*b#e&Q1^B+hg}8^y9^v) zQ+jelw$`%~=}6CZ#@b=P+F`(gP3g%Ie*ix&>12d0#D+7<L|QCC>BGenVRN zMkvbxG}GDNlEVrEhZP16uqhoa#NTKg%UQ=#1IAJV25d@43-K+d4#KGchFAP+f>s-? z18JoW#Q!;YM=R}Pqw`$wofhw!rr0&*xnLT%MzI%-%H8*IcG-TM6|=vl5bt4puNl3o zI`4Lv&pujc(6`W_4>st-dugt?U;Ai2(otQR!&q|-SaS_nut_ZJ3-9jq)g1V07BIYg zH7jVnJ(BA_<&C-$pW(BbKywb>`RV^<|2c!|P=_n34kq{FJ+I%(sjZmgLmHgvJe9dm zGjN|~;0~Me!!6=7aFO{vYy92lvGE*DjLwfDchMZxp zeAZI@So>@QG*UY;)ZnY324BIZeAQC?(CI6}smkE1s-V@MeHBMqRlho1nJ4R4a?ZxC z8&oz1avUoR+$s#*U{m^9iEnFt1CfsEMjys1H(-?;uwYXoUJ>^VSpIN~k| zl>1C|<3Y41>!E)G(ox;8KFeG;=x!NVH^^tXtTWG`GtZzCHs!O{;zRJ3G0KHTsvFq` zjBEo2Y|2-y#lJI#Y)2#xFuZ&f2wJmsnL%3BhZf4Zq2JwfpQ7hah~N6!iMy`{@?7g$ ze7`)C=et^$>$`d;FL>2=U~&=8x4GIG|MlHbT@*ic7q)9i^wg3I9wW zc=b%S!XXUbztt_M%MM?8Wx+$Jyv&eloOhrTHdV?67-Puyu^ zkiH4{2Mmugygo4g%A2-6s@JIVXlqG_ZpXKN(Yg0U_lW>=i0gJ7ZLh48XwThx;%J-Q zdg@?P@#-sn4}P+JK-)@ZL?qA_d+DJwxc)Eep*4fFMzO59Y7e^mbC=V)q8=FQJoM~{ zHN&6HUDN&QvI`0H@repwO!DJ4ySu-|a_1QtQ9Vb8Hd^z~ao7^nPV;&|)El*Lp&}Tg zH9|<=wmbgm`R!pm_bQ*cpMwk1%irs>y;RxnEB=xF5J%e{Mg3YIm~^EN{ET)(#S87a z)PTMM7$3{;D_rj6nl)FMsY72Nu@CeWt2H*-f7$P%{!1*h$7xv9*154@lUTui;;)_Y zLfcW_+P}^mFIxL|9_@K4;*|sc)BP{>zD=>eI)5bAJ_Teum2#g%;4b?<3B2PSL!Epv z=ihOc#P}xaE{QjLitxlHmTaTGO}IGUel7p~Apbq3i8Xmy6RUa&+uKNc47%mKaO9~b z)*<$zFK5xQ*5ErCHsTd|YOoa<-NY&-e7pMCp{Equ0@Qi*Fo-){)K5?)$ zV?2I47XPLl2Q)BBL}C&t{OJP?)N@liMW+x z7al%XVGJ-}3@~88CNUP3h$b2XIwQb|^aF-R`!l)UU~9t&)xJ`mGCn<;C>=dnM{fg% z-Ube^DIKNa17J#D_e47QE!>5%x*4##8L(hedP>E+8jJLF!M`G4cq)qoLzA}U4@+5B ziQmXJaSGB_XECQ>cQILWx>jX{7jwD!G@#1vX93$+sQ>c!;m@kl%Rg+;i0|Ls#p4?9 z(<+5=$$)XmfB~Dtz*+x;H3pRz;6yG0!>hbptg`BcbNNSFS^m!kRQdmqb(}YFIB(zp zo6^xkbk!U_L^>+}?=jXX1J)@67HmpSnP{!CNY8uFa{?G%dQMbXKh}EAA}#VyDgSQ= z%;kSowkrQe6i-?Hk0rU<<^LGCy30Rokt1YxmH$;k8(02;TMb<0(=zcd&?VcHx2sh7 ze}l{ao&euJ5vafXFUgK+{&xA_=g_3f|B|8R@{hFDdzjOKGO=EBqSy>VzcK{<${SVI zj0H`s;cfWdpV#3>uXw#)Wj(Cph2P^GXlvm-u1DLr%)El%yT%jYSHRgd2B?Njm6^Lm zjpntjO4Xyy28_)H4A_*v?-sK)25AFMWFs)VbZo4$^0W@5mGx*9*Q1wN$65o2wFVBb zDINESM>U6+k&f!o3yk%W0qZ3L7Hmq-Jz|i?B0Voa&oW?m=~-4~z5fum3#*V8`KQ#Q zc^>uXS~FFT7Au~z9xX|7wd>ImaCO%s*dmL`?y5)EhBU4o0k;~s%BMZWC(tG9(Yz|v zf6PSv@ndW=`v&UI#bzoekyi7 z#ZjG(Vh4NVDfpCQ7d|05$+4o%>BNv&-@6E@}lUgC#Z%fu>GH^&+<#u_kSQ~u~B zmTL_12XG>zf#Fq_M^{;;TI+bEMf&a-hf_HV4`DsSSJ~9O*iv zjt*k1N&{A<0Sh*z>t6A=#v)yVz;ysHymSqyvMvqdIywYtk$?B5N>{vmT_JsQip)gW zXv$*`ieGQ$T@1fE^akbfB5WIdcY zBzEXd_1!B>91FQ$E8=?DS)7_g~&*hehU7!(WOL@oittL|K?w7P0PXCZD#Z?_2_W~uS-dDe5$ zz~!QW3v5bHA2C&PIgfPICY)ldvj(iQ1}xZ=uKUCz8jEzDg0A;~;ic=nO6zw+xlQ;G zX_3F(CX^)C$_+!?5I&U?J4W{;%^r+B?%;@a-Y#25nC~%l)?MU8l6MZzFNIHlH`lMQ zu3xZ4j*(sU;Zg2OXpU0X!6`^njWo(v_lZ2M??@%`PxdvkjK9S^-ew-}7mV<1AF!9=*ZkVGncJm*ilV?|sP2-RHrkV%S%l*4TS0 zRr!A1fbqHk12*NSzT$|+pmG45$Sc6`DhIDrS~GMxcmrvX-Y(x8S4wrU31xtbX2}yW~{XathEL#*p#k*;`T+lL(C&z zskwD`9j0%p3(<#4|DGBa3qRE)rrQkLe@_jLsRymi=h#1h%7^B`<{P}$GEVEy8)AVYcAE@w66z>flfcc9w|z4 zz}&vABdYuLA%kO)q6}>xp1u7b`x1Dv?W1ukwS9cQe3*E(;(oj>my>+{yO8-Jy*<7t zBpfw<4{IKVSIr!)kvet#6WQwykv}8;kRw^5A(EXzQHq@9{Z;Lpwm+sqTe(F zH!efre1mWD;hSa|e1m5TwQmR$F`N!ud8gvFKrE7##0M|sGaffh&Z@M&qkoIv$+q^Q zIu|Z-Nv&0me9C`+mRx6S`|vZY2X^}qw#cVs&)`F(sYV*<6YR^{?DPqEM9w2GuX=Sp zWIdrdU&MWIl>Smko*$CtcRW{dx?ikv<^g-;Y%-7VkwDD$jV=pEs&JRG_qm9Z@$4SW z;~LTevlM5EhOiD=_QNx~_NP8Lf^tc|z}VsA_^$N6x;xU#vU`O6d`z7+IpYM*nnYVM z{k{6nnvCp|{6CiULGynvWXA^D)cff^^ZBe(khb~+`zrW=sMNkX#u&~q4s0rJ4~URX zN97Lo$lHE9ZsApuQ|cIJ75wye2A|^DzYgYlegt{rY%Ds%Ec_O5ANGG7Uyb@Z##cV$ zt&r8i=X-T{bzhO=^R<5HJKJ}|$IE^G;uG}!k?KHXUy_R*TV3w=g{-|gAEcG#{uTEB z>s;>N;J^0(hs(HK?)QM3yWGPTd4ud3%01FlBaLbc28lR0$hJds-j;#$wvhF*=KKnm z``10nJ)X-vf`i1boO!?=*_g~DJTefoeWT0BNW^Gkh8W@5EanjbUXEX#2ilkJyw*C_ zCiAfIweQ!4tS7Y&?fVzl*DtZ}SMlF31IO+AmnlzIyA4}p71=ZR9%-tPMzsfn#CM&3 zq4KgU1LtKSYoO-*0{i|Y58vatif@JZjx!I~Ba4%Hgj)q-wr{lWTfz5>Gx#3QS~HIb z@SbPipP=__?fV7EJZyaJ`voEEY8BTn?faSR>)Gu4XZY`Vz;XM2UdXnEHD}l&&yYQX z?~$e&X{28kRfrx=zmV^zXW%?NWc{b+Jd=Gt+r#&GuHsuE3Y~et9+{HNBYY$)-S4dW$+Q6tz{qSc6fTLkTo3Rm+9C17=tJA)5>O6$ojtituC7v)fsk?OKP23_JCH@5*Qrd;{$jfsK9<=6a&KGe9HI^^VlWWE7_d-0Ec^t?RKXv8-d*o~~kMI$H%=V3r`;idF;NItTPR6sZX&%>*7MP_N zgSSQ5oB~dhQ9i2|47R#;#F{o5kI$UiU*>^w5#>Hn&zTLyZ)mTG{+rI!n~wBU#uI@S z+sd8|uB7=GT4xzKl3ZswLawu1F4tK`Hv41$g*4wdq2ks9X{WzO=cnFsAyK}ra0YyH z0q+3A@%Q->`FC5`W_NG1tPtZ>(l6`6Fg=g+UNW{(Jukj56dRVs-?KJ{8aJN<{OS`N zpI|@?*6}%lIXAq=rp!OAO2$XWHoPj7oPX% z-o~E9kZU~h7Sg-R&|A8k2E?73BjLjy*^|T%FGzBX>N2zduj3BqF#eWxWM(K9p6*XM|1LZozTiAnJJUp-H?kP(Ha`Zw{M|CNm#=W0 zew}p|IObws52nwD!KUhH6Y*P(^9s^cV?Jy%V{J2FZ8KoOrnof~$21oCaWnk578rUS zVo1`DhqNDuz>jM)pC>pO&u6kPBg8Qa?*_N~Vl>YcehKS0N&hP5{IY@b%LdM{Dg8~w zKWfgakdEd9moe502CNqhSgrgY_qQjJBr zCW7mDV0h^oAGCg{bv=c&$e-3(%lM3D4r2`*#u_-lru1O{uam=Q_zIdLBQx+A8MHPr zj|kG2(wc9~T z+nXUshk7EvBUBo2Dh)WWDc#M*&z(3M5XS+`X^;VHkO2!e#i@mOLt{}K2Ou{6fZ-L# zenD#t`!7ryZUqk75Sllax)#%%jp{3-EgkdHJvi1qnP+bU&)x=}uqn+g#P>AMoS8O#YHPr1Yruj{>AFQcsIf>_D{yTA3@=?Rg4V?fZe#M17Wq^8r}!;I`Iq%T zf8Q95IqOPbVtr>B)^#>7M&FBmI8yXbEYivs`}vzojy3R|)()oq6EEiQ{s}o|MqLc^ z808!^Ol}p7?XRN!W1+2o81+_^?k)X4**@PRn1uWy{~Gd}FM|JNr1j$5+Lx;RdvIo^ z{B!U@%lZ7TG1#WRea(En+wk9%eJ?d_Q}(?)kG*|44^i30w+xEah5;gsZ#+@NJBoNm z5$`DC9me+_XDso)tNzw|VelPjGQRs&Ft2EGY>1K(q&x4^$HS=K|(q3^il zw;uNU#nYeqt&4cKnE9FCdK!CTevCaazd*TsxU*0E2><e7gb*DfumG)Q~lc+=PA|0Df{lTCW#|6{)2_L`H*UJKQv%`XuyC?Vl3(?iZlj&!vl`<`wsZ1?-2UE<1FU?2XWhk zwA4OG&Ui1>@n5*0iE5)pHi<25iZ%<{B}aTG&AAHw<-7)RUm!LtkNY5pZ{+&OJ%Lyb z&a0BYBOje$AH8SL_ntu?Y|2NS#E0N3aZVr|;*9rY<*Q=`tYZc&*p#n2iQ^iJe02oA zdIuO@?f5%53rzcp^2S&uLO#Ivmhe8mED!X3MvgJ)`;R;JZyUJ4rgRmFS2dTnkPhW7 z{03v~F<|X6V8Nzz6^XysSfuL>=z1L(UbS=S!mGLN)W=EJKvelN3*wFVAr4IE%oI_?lb&EaLFqjLEIW4&a+ddYwVo6>WK zxJP4=o)@5J88E!!w=876qxGypTI8Ryu4bO!ysqY2R!o-F#fqoeLy+Ve)pIXPz?I8# zj>AUZXY{-p=3!LbzE;_|c^KqX4P52Z&f+X|$?`TYWX(Wbv*(?rduTevnr1sRJ!8=H zj6oA@k=X`Kry8jVxYfXwnu49hkF}=h%mHmJ`e5n5YS>g6=q!Gu(@`0K{bqc(Dc9vh z<{j)G-j@~2`LXH~p4YM6R~gIssj|g&T*(&WzJt#v43q6moLzYr>`SpOM$eCs{Z_Rm zMeCAj|4!YNHmuyy4~*qHGCmn2`#0m^A9r5~n<^V!#Gh;bj18%FW3&Ndv;hM)<>M}5 zjK&}z11B;P7+&>kWXSsc{oHOKt!y_cx!oATI))oK3^#CqP3h<=dTS0tkdE4o0gN@s zfHlZ~1)I{-RTOJ1(lY>h`T@gBPrs1$Pg+kU(jxzqcB7j|9UIGatf%5B+l}5yu6Dc8 z8(iJ(25j{0B(2>T+sHZw+-l$|pWZ3{4Z38z(aqIv9nz|S?bunmyEmCCA z)UT16fLje*sVR7;Sf@4RGY4n80h=lVcZ#(-9hCvtBdwr=%K+A^#q9o2*Vk^9c(=^( zO^2T8aw79ayU{8u7Djsej{nYN0V2fM}rkAZx8~JSjxYfW_{=G{)U~8hhz{?qj zPdVLzyTtuE9mN6m$VFc=4j(4xm7_WiAFA&*p6i}32Cd@*x&3K{m;tjCa|6@p{c6FZ z{pq`rjLCWAf21h&X2va9cJ z_Bi2U0zn*y;O~T{rN}3YygWk&X$z zD@Be3z1O1S*-RZ1`bGy#ib)n?f@zWVk`uin(7q46H|_kN>jl~teg}EGM6>!Sf&2Z2Gq({q&64jkfi&UfZLSer4q zcjeW|8+}*91JGt}R`H2!Lp~fE-FAkz!7uJH4{Sj?x8p#mDA9h|jC60JOufulYYkXy z4Op;AES#y(USpAuUxtrY0mEyounOmevF^zmgIB}I-*>z3D(QM2>ks|+R9%(lS8Z8W zSenD*JJR|B^Lxp_?fShEdSvkh3VDZiA7l^TouG82Az3K-fiCwz82v;A@+ zi2cs>_yx~aj^FHf*vCQtFHGIJOE<{*5-exE!gsGfD^XXDVnJDw>YlnKA@ zskNh+JN+id_g6*uo*a|)Ydrg7BDA>c*F^Af*Du(VKkgP9Gdv#Y$hRXIYqSAtv;hk? z#qn-&ztguP;oBj=(7s(|@a-!2c1S(G#q(eF=l16nqz6y(E!7kHXMe9>l6v12>W-SX zSrUwe7pLBL6qILr4><%fIZ_xdULUf)z}pt?MOeKE-3i$Mloz@~h0kFda5*5v_6 zR}H`RW~_b&tbPV8*c7*(;zNx^Wwtl`+5;HcuM-V^od`emsK>8(zF7N}aM7;M0M`~+ z<24=M?IYcidB9hxbEw_0?uUO%>;1#{Exj93Um7mNcPpA7D`LI${mWe@yCAK*Ov0vo z*HdiMdW(=Q1mCq~tb7Ajz5xq1<-1;DwZ1q|U?$f%E_w+*gZUub5 zIS(#=y$!o zarK1W$@%HuxKi%DsVVrS#Ncl!QJlNC9_Jx$z`Zy7apvLv8geGm zwx%oQbdIKqc`tDf$4Q<~3$4+>7r!4z#r$4TsIhPc;8xr}v$f_n?{flcp188>tEzpG zdACHoH{{9pJ7|_|1fA7Jv5!`D+F6!~-sXUGDE|$)S4ZjTEtc6>6ra)1(>8;i(N{{e9^C)4HSpLK=bX~kK;?cg)@BL)k8X$Y>J7%=@k=>1Xci9Ns4Zu}C?IS8| zKRj}U&O^H}D+~RDPn@5FZ<+pFxvp_I{!8l_%TPaN;GGHoQAMfwBp9&xUp8v>7TS?nV^*y*S&K5`{7 zEz552<0sSi*u_r{jwPmf@3A|BXPe8peE=THYyX_5)m(3w^M4zAFXcT0lhoeB#8l+z zY7^p9q21N~)xoBGjWYs}hi(%RlfVaMI58o~9e62y@R3Cz%f38u|^rNMj5bRQ=0pVSDl(i zR9cCl!0>1{&J3-z9%j8VZ`m&+|AANw0G;s)=22zfQDxu(o6^)*yr4BzAYErVo13x9 z4Ory{EZCH$eqz2;Qy*yR1q?4uy(+ESw5EYbi~Q~HkmdNk(9sdI66RE9;8bSd1RFTL z>pRd-jMe%|kO%5G`T?LZXIxy zProYOhAwJ%;+I46%(4p?u!qBsHvXgf_i!Z61!9_a)Naom^VHgQ&b;^Z>_;K1?gDec z{jHlETqLfejjsbg6}$doBd3#RnZus=z;DMcepGTwnbV9Pt%@Z+@Sg8KgJ<{X_ySM1 z@!wY8?sOaf0NwrOXiww3_E5Gx@2mJGPJ@TL-9HUHce@Xp@_&CZOKW}~>8MN}XRMP3 ztdj;T*py!eh$o$XIS#)Z1%_9dJ{q#DzFbEsZ{42O`c->+ka-+7@HlMX0h`h^Kn&2D z4k8`3r+XP|zX5B%0Sh*zX`m=^YT64;yMW=PX;;YlXRWCgX_3F(o??u0NZ&O`{lyOE zw9~+8r-2h}O5Z?{<>a&jc_40y?HPD&#~vZ(l|Xv#t3ReSk-NBD#WyjZEe1YY418cy zKDu9=0=7MN*u;F+W#F?eWX;ojklx8h;*ft z^F6wI1otb@8Szv zE_KW$JAL*#h&0?%M2CO*-EZCH;L1MU5*DP?I0Sqr) zGq6YSK5j?mA}#VSZA!WjH^j^?Pg9xCGy|V$20pMUZ55)Mlh0Hx-;*+MniR6$VonL9 z=khJr;M3Unci*S-h)*%Q%ByU{i6b5NDu~@`#T? zIja1fu>%-@Y2*PWcAgW1|lu;xBCu^ z#dYk$DPwZxR%YN!(&-o9)H+L$mmHHDFuEErU{m_C#AK&F!YKxZm%d``|L>#6 z*!$M(80g~Hl-s=RA?OqNJnKbm$C8;Sa}94*p!}txZ9~G7kaXR;iV@# zWc^(0X@|7PKXpuQ{$`A^I*-ZKoHEV3BmzmU$uT*&rj5yw&vnebrH#oO_s#fh0OMfb zDxU^K9dyZheL2WuavzV$X+LQ_^DgJ)x4qPPmyd|E`X-M5s(F`lA@jTo($-yIF1{vW zpM#6UKs%}1ygKkxv1=lJ#_80UJcu#5&yHREX!3hwROf#*gfY4LMv>FW*DmL|?la;i zljDLjcs5MO7x~CB`D@(fq79Y)*;yHj?#Y&VoMZDGXZ!lTigV&L_@s@^ftxlq*Kuef zp4ZynM>;Co#~JIS0qdjz3pVASrsCU9{~U*ZjsnB0Y#$9;ZMAmFTeq*Z)URS}c93}- zHt;xX-~k(WU@oAk7^5{EL^^6;_cGRg1J-^67HkqL*h~bSn)X7|E?{_R+7+~Z-J9E= zTBJq(&h|B>UERT)b{aVCG;o4V>1!rBXni}72eqr)4H(-E7_cc_*`kG07vXFHhL^4_ zL2HZFg|xC=UBhu&$2v9{IBYU-fKBPh771X=GQJM!sO+s|tknjr)dnosl%5=Mg0W=X zTnRlZfZ?TQMbMg~^{hc!6F7#+uv$KdLk|{;})Woj>S0Wp*C>@YaV6LJj$RM zHl?|R_#FJD@9=FeF#_=#nnCZ-p!E+r7GsbW`O~`-{hq!z(zl$%($sYgar`aYg{8q* zye4&BL%b$PWmNWuN?Wd6*RT=m8jjk$aF63a)>mQBS7Fcxo6?snY8gk~e};HA%?ZBh1N~)5U*R5B(jv>pAzim7p=_6_vhB4-iS9}J8vB&)NXu!W&LNOxq?pPI z^mk?bB?kQ^2K}%p{kMo3t-mYMQM+8gSRD*l9Sm5oDg7m$!HuFT(=7)4B zmr<-Mkl)N}zR(&4Xl*UXx5-#Mj_>+dW8hKO)?-~kZ`LW-C{P*qQ~tb80qYeckAPvF z0>1yJX@X5@YAxny9#|_teN7Z=3zR0TF>v*-QLH^k!-7qlBc`*Z4bH)0*`q*CW_5qjd-Fn5i`bDD!Q^K+UNJ-`+9)ru7eLy68K4 z8ixFak65)8Jv0XCBAjUf?{;xom32_-LRvZgo)A#&;-r9j2bhZAyL=m;T9rO_flbA! zt!U01;**dLWiLL4vBnv&#u>0+Q*ml1J_SEr_7Y>Nti&i_c*N<xoZ5TI8QH z{;n|JkCa%d?ng=tRXpYRdqk3}J^mg6uDYJ;@i%OVp=5WBzn3=dex$R&tpl#|X*;o< z{SdEE_aj~CqwZljUta(HB8j=pVw!hUj|a*fTC{Dh`F@eJNL$y3x%k?P=N()mu5s@dX~rYyX_zrH;SjxF1RO z>s?hW6D7#gU4BdOTUQ;bgH8Fmz4*G5cUSO18BP=@xdTt})?@GDD(k;{a=(uBrH+1` z=D_b*nPELi0rTu&;Mu{z6E^UC)fc=~^wM!CKsu^td5qQ0fYr``1)Ib=aI5I()SQP{ zCncIqrV>xHQIA_3sP3bBSuQ_!Q&IiEo()B^5HB#$BTG_^*x)4`&+>ekyjii&oCq z!JgOxpK|Qt%x7u_K2s~L5AWu&1JXPB$Z;>m5Ag}i zXOe->Bm*DVlz%#jZpp;E3V>Gs$4uP6CeoJVTUKcL=Y-hjUo8P=1GqB2TziOg}F zf#Wy>N7$6lI*F^$FYDcyO4TQhFkp-@V8Ety7K#623|Zd@XDBed%I45Y>+jg-@li;N z^re294}y+?qzCIsDp*gIflHNv3v5bHk@&gRQ-O3;=lU>KxdE%(fCZbgofo zy@27Rt5>BpN$VPjw8-DMo}`5Nlo|Mx8Ti1av=xh&oP0{Se0R;jscWUxlQ|`jp3Aqr zp5*Hj78i1>AUn|Jqtuqi#AMWIvA=lEuS85mxAE{CjIttSBO$iK7`*Q1Y^ z!zTs~pBOm6ru1|X7BFRd@Db8ce9ke}1q0Rv0~TybPZ#kaW65^m9Q1qu3@<$&gsc@> z5ArTzj9OmHa*%l(Ht;xX-~pS`bf@^9)^rf*Iz!W5#@cVd+Hb&u zO=-GQe8;J2FEs4}hL@&YAuC^NszqAlZ;vyu_9*q+ICI)*;Iz}g2{v$g(HFc+Jf`*S zKpyhjxB+9k0RuLPfipg;oVo~S3oyKNZ3$UtdT?8TwDP@e4aaF6>)2%Au*tvyHl?GR z=%RJ3LpmyZD;aCG0c*7Z3pS;vo5*wOSqVKWfZ?TQMacS**0Tm_k$=j2+d_|h0NDZc z-nLZnRNuyvT2amZ-XtdliK*P%t*E?1i0+mN4HUMS0nNx<HoymwZ2Ga ze)M3!G;&=l+PvIDq1GSe$$E!3I@A}#WF_ANJY zT`P3<5PP-G668gFOjm=xt_FRuDSc&Pn^Pa*6lc&^9I}RLeMl?&n0Ad?*9skF;=5W$ z0WhhLY1q0}l)<~jGfq9Z(371(Pj<*^r}eZ$TI8S7$6WSUfAy!mt`$DLTa;;^UjAQQ z*NSt8?-4l;E@^!X_^GmZkH~h$4)&X|uJxr-ZexHa`xwKz*6=f5%DPs>;T~}e`OCKG zedJGN`#7&3Iq6Gpi%ueqyAOj+`KPDY&sef8Iu8FF1%_8!bTnu^skKwy_Sjv$qcm_` zD>U^Kf3Gzi1TM9&4O`cW`r1n@b86ZPO}jE^+7+})w5D35MgGqAHFfOHe%=W@cbmUc z`XjZ?hfVtVKritZTHg-jA;<0pjO_*t*i@|U6^}V}5zZE1c*SZ<(E7MUkKKWb^)~Uw zt!qV`?iGEsj&;DKvbU0bvKn06K3R=4?y?7)((@H@hf~i==&5I2>(8{FHAsv6Q`*&q z9_?zjpU3Ws=bzZRR`~QQ;@_c5jotrO*R`Tu?JZt+a7k-d7wXvc7O!zSHFiflW+47t z78|;*^?n^+m_2c%NL?`WDu; z-fr`1*t%Aw?>^B|`)VM3RSjSDVPBO)r@LJ$M;dp#1e@a4S9}KTR3Fv&9QwZ6Nxvn+m=B#T~`umDsFz0wzXrp$yfc1ZYb*)N&Ke5NDzX1B%CH1G3m3BdED(ku# z>spnbe&PpC4p^ru->vIe*V>nPG<03-#n~CwwFZhatZQxY%P7v2wAZ!P+-{$*wUN)) zqW5%KyBx(n>iu&%e0Bd+{2PORRsSD*Zy#S(b>)qp-x4gd~$_)XD zijYDS6lxNZz>S0?O@e5#k`|tk4zzGarZA(U@nz~ooWiJ2O)4X4;TdV`RH{y8s!t{A zQ}0!$Qf053wKXJv2w; zAB#PhFW7tezlU?Ev=)?-f;*;gXBFM!bHF#IXCU66#=ThQJ5RR1WNe4D|FD?H3FFQz z8HbRstCif|0U7ei?rHD3jDH-kboUj?<%H3eYF;DCr5*cCYkbC@c9IKcYE#-C0#3?$ zx>s4^QoO$?_$~V0Mo6sREg^Xb-mu{_rbr%EcSN^{_`SfHY_IvHj3xOm7xItl8Ho3% zw~k6c{?Quw>E0^mdAe}P3J>{jgZ#H~`MXlh52pyYo-SOnyo2uD@|ve>M_Msx z28_TPVbEi3{kQo3im>>O8ttJDWAAAS_NMR0epYVx!+Hkd{b}rzJ-^)#C%*nn{fDr$ z@vYeV8l$Ua9=hUpX)zsi4L0j79ncBPSecw798mcdtZ;*z7zKybOP6*tH`e6 z&M3wmUb;GkwEvzgbVd7a@m*T~zw>^P+qP~Nwne@oiZKei^9y4i@)aLqJas;uMYk~i z96F0&{N&bIWQ)hyQ^0n=z}ivxiZnA_=;9Q{LANK9uNVhkaficKMC7_Y;+e02|8UE7 zImt!7WQs97Qo+C7nIY$-D~db2;S+f|rJ3`S+Ft7?@{J;m^2@k&RF1zmIE?NyID$GT z+V+mfD!V)+ACXnXoqll-Kxlzca5dI^@tLcU$KexM9S0xwy$Gve3(4$zLXv0loniR* zNvtd=J;2f>edY&{?jJ+<5soh$BjJjJ4!Dq@4e%E)aKLSsa1%Kk-Q)dV z;`|rM$z*L=RT!bMVt?4)ilolSCg!7=ukXemLC$a*%LmS2Lt5+2= zyM6i5aiznhPbS&!eKtC}?KSwjzh+}gALi2^75$DUke{e)QufFbuqAiD3vs;chL{hF zyu({>@1gNsl*W`^K=7dWW;zqe;M#_o zOI4jAK8kU$)L8^$Usi644~z_ezrpy*)88QNkCV8+p);KkjI}dx=Q!K%u-RbWzywX! zrgd)?d>F$_>dRj(c}Beds~cXI^@PgBZ?p~fCrukfHdTM_+~_cDlG!6{Ds0`ww7O@1 z3E5i8)BY=he-mlMyb{?|i?FFpkj-sVn~;~=rVz*VGt3;I>Zb+zQO2p3ZiEjywI1jB zgzOQ(l1)Wc2|rpP&YD&y;74CINbgQRT21tL973kQ$g4s9dKzH6E2M6RoBsx$Se;xY zXsEV;IBqk;%~u2*t3Qa3E;npjILLT%wmk=fozdlSYyoN2(iT83(#UP$F6pzzqKq(( zWMy<=W788x*KqR@m2VoGme_p9lu-%3=PP)M0G5?ejwqu7QAXD$P)1ucWpu63FY1d` zMq50}2(aA+Quiaw8X-d@N6=8q2yxsVN0_8f=2OYXA>M0j8J0FufijvNr;L#H#Z{ud zf?i}1FC&%*`TcoDCo7*x2A_AF3f;Qv&{Xj3u0x0e&xcUdX1>bvB=9^QG`#%sczp9i z@blq3oN)y_m67{9?9lpSd`(ZP#bhX?)cAwpMeBh7aqyH&oVD_O8Dp<7kLNnDvWVfQGfi9(KXV%UzP{XqA?zndifaQxQ$U zaDTP5@$gYLhIaVQ@X^~l=uD_rJKBykzbIRpM?xJaqHm8yp2C{&C@(#a_R#Zaq31D* zp2t`^4O=>0X~o%kUI|$!-q~LXA6;>gdbZ{T4jFBio0Bd5t>8R3^t?ip$K~cE3y$=> z0)IGHDtt-!=%@~qkxS3FLC?3v(erIRKet)dOGT{?On~jzZ#k_$- z*WVCjGTLmg;7Hfs=!tH%eSR4CgoA&VO_y~e58vS*t+(kY z`p7yT9sR`UB;OoG-(C7>Hb#(bqR?ps{eHKeDK5I1;+=Yqd~%U(Cg_T>1AO#o^Kzj- z-sg7OG~Kzvee@V}q@w32;?=(Vg|0b0D)cP+`$hh-&@+6;aSz`S#dtug=OaST)ry|i z!4BMdUZ>GB;%HqdM$bnsQqQ2<4Z2K!ZDY(AAuIWg$ST2uV$a=(<89^`^JfAs>|5Ov zMf{~0M=X?jW_iP&ry0XiVAHDq7=?KYxBsBAfL7nTgucbNgRSc->tfP>M3!pwjX1j7 zB}U)7E>hp1+YP!*kHN8Kh17S6M&F3z9NM64B z6w;#j?l;Y^Mp)j^_y0JL|G*lTR?ihe&lqD_{sZHz7`w(;NXGf4PeB}wabon0F%8{~ z1NaO2M%%lf+YP!*f5teoztl6vLW~F1t`Wz}W1QJf)idIwlOTs&vtFthA1{TTC&ke- z(soHbv%I0_zdMirz*t7BXN+B#pT^kA(sMfabNi2UAtQ}ZrJfNN9Z&HtKaFwDMd=xI zyFr)fuWOun0J1XwF+%X5>KSpoJjR<(3pnOK5FZ@`Ii#M`HF{2mo(ILzGt%;;o>|_) zf54_y|G~yd@>?%QCv;p1Uq}4XA3IAnn2&ShcY6pof^jH~v!G`_r-gAClcR0C`8~{O zeM`!Wc>jh8%c-B^po#Sey5IOG_)a3xqx*B%xDELe9J>?e=m5t!t*d|AvMyi6?;LmI zY#r$wuVEY&^Nk+#t)x9fF0=aq7xLX6UMH?K=gG3#iaVUxSZ(Zt~VdDc)0NUb+|m&o7*i~B+vQp*O_9;+30;Cw%7$SznPi%9++=X{{SF?+9Wj+(VtB%6Ja@u)mD6XZy?I-X9AYBRD@8MgGHy9xcY%Z@c~bjJ_{H z<@F-xJ$l6E+o}skz@NJ=Adb;)^O-kD+Ajj`yC|>c1g#e|v|iBALL8%o`=oQ!@_G)s zIRF~6Z&%^#l>XzmwSH0389l(yYVs-c58uJ8Wln<|}dl-*vz(?c3s4{2y2j`P&tJSJ!{-?0~E z_aJC^)wKul4S886B*PV=?}Bm1_8E#l+#&ecrQv6nh9AUn*)B8NrEEI@Cw26IhRy>T zI*8+PU1t7Jr9(Q}B6!-Wp|w>*3vryM0p?~^M_Zty&7k3>qs_&=W2BBq2Iz>s+rez7 zMewjm!^0*G4~XOP3^4DI^0Xj-vYYi98tXMQ5Xa^4n>VU*5S?|P;U&kq;@&@w7xk|Z zuz(Mst#}OkO^l>@ziY?%hK--74q(h@orxg7R3YT7*6>)Z;Sq6MPQMwDa#jFNmj5aZ zomCn-h~u)Rm}x4VpQHSj3!YYJXsyuDLLBEQ#rzU_kp27Ua_C|yXn5&uX>sp9sW*~g zEXuz`l>Z{Z!_68VZr1RCI4;jX^Y?;>$RgxVA#l6=_nUHsSf7+)2drcSlPtxQ+Ns~X~xGbq=tCS@jc~iNJ*U%WR zp@BFqL#kP=%0P5RgNBz3qj6qX$^ck=6S!9$e|(JfmJwpjB{D?FHA2JF2n|n&15a4r zA8cMPEzng*Zm5ZLm3A(i$Li_3-`tgq7;XMrx?`e2I9G7RP`HYn39pq2-<4p~XH#Ia6$K@DmKBUS)bY2GyFF9Th z_7+Mx-U2M(9e(TALY7xGe7vgR194oIVdlM3mR|#o{MJ!H>tzkCmo>By$7LF3u2p3^ z3Om|0%gE@mIgv~uAWILeY>wtzY#Bte1n4~LK7oQTc zJ*uJcsD=jOxNIZLufeO;<`bQVK*LM6hl0HiN!b9)#?-rn91jXP_G)<8tKk80T#k|E z{}wz%9t2!5?Ck+TYlnu`4h=2Dad}3Xzf$FS0P<`F4KI1N27A{Dd1(LXsVCqIh=-J5 zZ!+e2mLQF_o0|ncTQvM^(eQ&fF5BhikELvz0Vn|R1JOkRy*A##@mDg+yjoBI+h~x5%HQy67 znB5Vb>7d~y&-7sLPAN|gU;&?zB;-jK@=Ox)Ox5r*Rl^J7xIAM`(iM|u65z<^j25)U zYiNzv&_W!SYn=H{s$8SN>j=>Bl50e;_a-S^I5&n$gu z|5uxn_J37^Iijs8znvG|{5PNZFn^7;$5PtAc}0>L`W6J9zy1_F_HOyw z=nY*~+#C8=ZXmiYqLc;A?9BpF|Yk};kVqxez)x3TqW|>4Wl2d>CoABEtJ{0E)e zBHoTG_?6?3=Q!loRXMQ~=X{g$N_gH1F5nABN**TyeqtPW;AMz9L}grz@>>JC^Ns7w z|3EoZqKvO4T1X?A&y^Uzji9bknF!e3^V_aBe*@SM$_snUpC(wqnRUP=c*L2=qqhov z<4R+m`LBSbbbmk8d6dI(F<(x0LiSSkcpUq99R2xG!Y;`^l7e4VfvAW9 z&+|Op|RiMjc3QjPelQR8K@BllBh<2e0aSX0)g88h3BiliI-Csct;nPB+ zV$Ym~MiqC~{gwCro=T)$C+&;n9W1K5e^C+ST~D@JD)wSh*{(;~Sh~L3L)ZV!`w4aT zE4uz3cy#OfdqPfC*NCgTpWcadbv)7h zFX)5SEA@93J!G=;mKWX5Oj1-KC&`%5vPwu3?Fte-Q0Olpo{6(;L2KwED(%Y6{ zJX16sef8+;{j=-PSFamBzq2mQ==|l+|LV1r!(ld-k@^UWK2!*F>iz&)pmTE)`gG{W z-E^g4(zwUporEzL*Y5!G*?>s_%sfg14D`OuR>N~|kh;2vCd z&)1zo2KL>^V%ozwmhZ)-eY7rp(AjRcJ|06H(`{Fdd9$R2J-dl~vl8XV#+xi}*ml@A zf$isG`NDS`7xrR(>+|UNj{dmAhrWYwCFUqzJ%c-oUHb!cI6Z8g@|)O4Fow&d_$6__ z5Ok4ij(6}+XBS5+=hoO=KD>^KxMIY z;utT%Jo7gyFI&rdrd5F#`nIJPFE|f)m*fTT8G}*Bh?l|KchJ6l$%FrTJ|=2M++)z$ z_1{y*d>Y%hALUH8G4WsVjSS$>o?z}LaQ-mHma)gzRky{xLl|S_nfolcmJ1s8`9Ry( z;2dBK4R(eP_LOfvV9}s*!oFU7uhUyE%X%gYz0fx{$m?Pi$ZXP8DNoY#xt zhn*FKO!;QD#Sh?2s_SA;Fzz^#dD*hD`+gjEiav%rg$%mWFIZrfS+qzt+%@!^?fb9~ zsT1^AT{$l5N~95Ye>}(AaL>JXNIx}P_yn9~^iK(LI;gK`XNH%e&6|e#l9bCaHpCpB z|2x44X>4zExP*CAH7MXY&&80;U@ z*`0ud^N^zJdA6>@lBapl^+VqMrBg`TDfAo#z3pNgM)q|fcd9Zz+X~HJOSv9|K44#w z9YUwOz^|+RMRozEf6!rHv>{Xq~i`DzLrKj zO8Y|J1mDeMWyRKOT7(U368vu#@5=h4WfNFyl(K~+FNniF(D*h17&?c_bysAzNZqvn zcaw)rAdSIy6`4({eh6p1qMvtS`_Pehf}PRzaclx<1B7nqe5;?neJ;i<1M+Iz!9S%Dt)>DfI%%Xym>Sz++{ zx=QdxWhm-iWEJ>#`9V5k%5^u#yi)3V1>n$j(z+w7`%5*nmTG7rj?oHUYo@7k-we4I zfrdxhcWP0v_kfUz?lt{zxwB8t+jOjhVx5ukQ=;LgM8gl_xNO&&AA&yfE%U$&`Lk;^ zG_KXqKpdB8uK6E=2J<&WrvNm(WGV>u-Yv@su+(l*KQ0YpTk^}r=%>|wnwU@iA?wq? z2Tc|AZMx9IZ1J9B%VO2P9Lf`RN#hGy{}30QP4RJjGGMv^!}T`Td{F9bDsZQJ)IX## zc+8dWR&_);SQC{x!o5VDG4{R)_MRTc-jOy{=rIaaRc4GDs9WHC%OyuM?z0xe3sBS>Ot|H=rHav zDqZVFR z73$;1*q0cu1e44H2cKnPY>BaoM_bg6amecyA7wr2*pl^ak0x{f^>Q-W250?_ygWbF ze<6=j zXKM!&J_^&WV z_`f@CJ-dTRwk1d_6S^UKrMNRWL-uVkZj9{0`B66Z5jxpx>q7ef$X>|ovejhlbV;4K2hmS~%x+uPXlokbf&^c-Z`@t@C?FN!gJ1hr7f#M#Vfa zZ%6DomB^39IEUojEO^|a;c<(GN5mO4{%`ANl0I3PZU!9HhZaF=lZMtNz_{xJ;utNX zzj>W1ZwusI4;r#QywlI>zZ{qSyLT2~EOVavfb@S$6XOTsQK=85QxzRlh_bI1{IApS zzYh5BvPT@(MSpX!)I~Mm(65QC5VTflXsy!FLLAq{W#$*)S+@Pr70|_U(C{kz<@0;@ z3K>sT%r7m-DPMgG&E3+AT^FgB2P zdsBaUy6}0k1#daxy};(t@__~5(d`2f7tNvgI6e?C-GJeG!P!2km+8Qr?coEF#^AdK znD?l%6V4=C_Q+DZPK0HhSc*C^DUJ_B+7O|iDClLVKG27|5YcA|!xrwR`*F!Pj2F5| zw{>Fq!gR>)t`CS~ya#dqPs%zTaAX4`1g+5;TB9|z5Xbf4H}h3JjDQ}7fQFY144L2i z`e0G#DQ}cN|GqHf86bEVq~T$Zh6luPc~Z>Fr91-wN51__aYpG}l4To~Zq8xfnp-!B zeWamCHH$c z|0~N8c^g;IdC+h6tnY8^@f(;&f}F=i+pew+-PvEv|98~8^%+PBvQtv5Ba-UN)heM20VeUSM-RM}sL?7s#LA$#OeUnl&Fv%mLfNhh8A zk2khCh4jm%j)+Iuz9lfWVP|Xqlvo>qu?!p6&>aA5Ui^sA!%^}6GGuX$Ya%a$AGgm$ zT=Xc#$MKnf=>`lhgH&^tEQ1$;d!$(3Z$uh{$M->|t9mA!=fIoPbED7Fv*j}zOVF?8 zde-(Ek@gF$&(faQDCm_Au*Wr#14(==aS(Y3SuG!M5OTVG0OA;*IP;h!9wh+f<9&G*z{8{~lCm{1fpdn?R=d)x!F58KDkolqW*cQ_77jj34M`>H` zvBVBx1G@zO4~qA_;K6MZdqKx-6NrmGNbzxO0x;cx;krvR_X~L=JAk{(!zPf%;Dc%A zk5&B;&Q|ay^)tk0=_f4pGo%FT2ytuzY1aweL_yEdj?!3S6V70h@7bKh?PCk_bKA!j z$n3Tc#4(<`(#(6MjGF;R?Mg7ttx*bC;FNOM0e9wtohkg6o@z-I`iZ%MfF9|(iRTR#~t>nJ#?fBq7^W@jl(=&l-D7CpxaR4a7yK zQhXer37Brca9s>HS4&-_19y^#&qNx7H%6GZt8x?0Xz(WMNr7EY!m^$epq`A5<1>+V zdZ1`WL2tWQZ)WWl`N|;K)A=5VQtqXbl34 z+dm+V(ZaU|#;bAQXK`SmK%K&lF&nZ5RT>z#VFkE*d&EJ79=1V>S?q?orUPxo`xX=D|0nhvf z;d}tzq+PseugQlcPj6yP{)0H{Oh~&++6Cx2=H+~_i}!@=@H5gLy5AH01TQxas{9~6 z`j*1a5e+{_z|UK8_(9qYf}aTJS!>R(iZ$og4eoQ_6ns(L7Hwzb&0wsZB980sa&w#D zHS#*(s7-%a(E7E8)~_|R5XWfY9`O%pOjk@ttMI@g?;pM6pA zazw++5e+Yh<8qBMmq@u@1RvBMy`Z7-f`$g-xIClH>r{D&&U2vQCC_ug-ruK)_7<>m zz4_%Y#Jt5*qO1-GnGS0BIjG?Waa^X+=2$7y0l<+@c~sDPLPP5bz_@)1;<#*M%*#~S z9))asK||J=0^3F{pHcuD-FqINg7hCr9T1O-Pw@{><~DZ;z8}=^{UGq%eidtL+;zXUDjHy(fvwt|LN`ECvNu931)-h=UnxhdR5 z-P;fIm8IBEK+nY6si)x2wgh```7p75#cj0bi`tt_LYB?o!`(OEjQresK^)i1So3eB zUN!-aY@<=oYSGYY0gT%=5Xbd0&fKEvr4f2r2O82g-ZVPFn{!^^&0uGA-Fa*S=|iOc zh)2aXGKO*6ID&6S^0xPm9{R=<(@BMpqgo?JHR!l?f;g^|apo;jCl!DrTUjn>tF#?WF1m=~`nf&3N-G@W<-WJm8jiw6REI@Wur53jxpS3gHyk z^22T|n+VG`b`xx(fZK$24g+bX&`}ihoa0s8flTwhu!rwp-j~?~wYyV=UZx8@%@*%D z8a?G`^n|!R?7u-j4(I=*o~8nKx`&>S#`QYEJf!N0aMBe$Ez;;|5%iQEM^8vwB=rP( zVY!A)`WP?dR{J62rOjSp{y^mg@t0!%&1AvLCD?y+!ob1(XH zfB}$C>I3lS-GAd7=e_@?WY}**bVtBKvK8nS`)l0yiyy(Bu_L&5oYterAF;XzeIJjR z=N;EkCGIqqFcEQ{nD(1hp?&ye1nmLs>A`%AgwfGi3OaOOS21|I5_?b{hrIUQqH!II zc@zG%enr~N;|e}zjl-*PIs9eXQQ#@So3 zvgdCHa39C^_t5uPM7ywE_;a@J#N%uO(D3 zEkAw3^npi}?`qxF;m<-meFGHn+lB86A4UB4c^fBn$>PNKcx9P|mG!9^X!p6iVvmth zCuu(sFNaBH*dgz2kQrwiWH}tQ_Y;LJUa+4C=Ni1va@^XJW66uXL{tvn1@AA|Hp=+C zoUfyiuH_%`%k~6qweKe9@0vY9TQz%v5J%rpir4Nu4jB5rGB5ARW`&d=dx_{90pFl? zJ@By~``n0*`2HE@XmHm*>J8lqgL!H5iw_d3J8f)TfWD!I`3aQ4cI$iDICp_>B=c`3 z5AVVJ5Wbl_Jb`Z}kLX~uFs8D~1bc~O974W7yJUGsSo^JT{{1A#kFyt(&2&qC>@gBN zN*j9&`;{16+hlX1grl=Gh^Oy8TXs@1jCkU6q*nglKz+qtB(HB(A?<%&#_KE5D;4{w z$rrKp6U_0mZzCT_>K%x-_rrrp=lwSF{*s|Fx``abT!QGI*t#jx>gHX*b{}B#9N23& z#XJfA$Tm+sRg5!eclJDvvTs2g@krl-r*DKz2X8cMY)E%0@+@!q3+zJ=X~^MpO;5|;N`KcVoc#6=∾1gH75+O?P;znK3_)Jqpv!Gw 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 XJos3^>u@b%WsCFRtBvmXzqa{52L2j- diff --git a/tools/nitrogfx/options.h b/tools/nitrogfx/options.h index 4304f1eca5..ed5dab6e2b 100644 --- a/tools/nitrogfx/options.h +++ b/tools/nitrogfx/options.h @@ -51,6 +51,11 @@ struct NtrToPngOptions { bool handleEmpty; }; +struct CellVramTransferData { + int sourceDataOffset; + int size; +}; + struct Attr0 { int YCoordinate; bool Rotation; @@ -100,9 +105,12 @@ struct Cell { struct JsonToCellOptions { bool labelEnabled; bool extended; + bool vramTransferEnabled; int mappingType; int cellCount; struct Cell **cells; + int vramTransferMaxSize; + struct CellVramTransferData **transferData; char **labels; int labelCount; }; @@ -147,6 +155,7 @@ struct AnimationDataT { struct AnimationResults { short resultType; + bool padded; union { short index; struct AnimationDataSRT dataSrt; @@ -166,4 +175,21 @@ struct JsonToAnimationOptions { short resultCount; }; +struct NtrFontOptions { + char *metadataFilePath; + bool useSubscreenPalette; +}; + +struct NtrFontMetadata { + uint32_t size; + uint32_t widthTableOffset; + uint32_t numGlyphs; + uint8_t maxWidth; + uint8_t maxHeight; + uint8_t glyphWidth; + uint8_t glyphHeight; + + uint8_t *glyphWidthTable; +}; + #endif // OPTIONS_H diff --git a/tools/nitrogfx/util.c b/tools/nitrogfx/util.c index 65df5e2298..4d668dc7ab 100644 --- a/tools/nitrogfx/util.c +++ b/tools/nitrogfx/util.c @@ -12,129 +12,129 @@ bool ParseNumber(char *s, char **end, int radix, int *intValue) { - char *localEnd; + char *localEnd; - if (end == NULL) - end = &localEnd; + if (end == NULL) + end = &localEnd; - errno = 0; + errno = 0; - const long longValue = strtol(s, end, radix); + const long longValue = strtol(s, end, radix); - if (*end == s) - return false; // not a number + if (*end == s) + return false; // not a number - if ((longValue == LONG_MIN || longValue == LONG_MAX) && errno == ERANGE) - return false; + if ((longValue == LONG_MIN || longValue == LONG_MAX) && errno == ERANGE) + return false; - if (longValue > INT_MAX) - return false; + if (longValue > INT_MAX) + return false; - if (longValue < INT_MIN) - return false; + if (longValue < INT_MIN) + return false; - *intValue = (int)longValue; + *intValue = (int)longValue; - return true; + return true; } char *GetFileExtension(char *path) { - char *extension = path; + char *extension = path; - while (*extension != 0) - extension++; + while (*extension != 0) + extension++; - while (extension > path && *extension != '.') - extension--; + while (extension > path && *extension != '.') + extension--; - if (extension == path) - return NULL; + if (extension == path) + return NULL; - extension++; + extension++; - if (*extension == 0) - return NULL; + if (*extension == 0) + return NULL; - return extension; + return extension; } unsigned char *ReadWholeFile(char *path, int *size) { - FILE *fp = fopen(path, "rb"); + FILE *fp = fopen(path, "rb"); - if (fp == NULL) - FATAL_ERROR("Failed to open \"%s\" for reading.\n", path); + if (fp == NULL) + FATAL_ERROR("Failed to open \"%s\" for reading.\n", path); - fseek(fp, 0, SEEK_END); + fseek(fp, 0, SEEK_END); - *size = ftell(fp); + *size = ftell(fp); - unsigned char *buffer = malloc(*size); + unsigned char *buffer = malloc(*size); - if (buffer == NULL) - FATAL_ERROR("Failed to allocate memory for reading \"%s\".\n", path); + if (buffer == NULL) + FATAL_ERROR("Failed to allocate memory for reading \"%s\".\n", path); - rewind(fp); + rewind(fp); - if (fread(buffer, *size, 1, fp) != 1) - FATAL_ERROR("Failed to read \"%s\".\n", path); + if (fread(buffer, *size, 1, fp) != 1) + FATAL_ERROR("Failed to read \"%s\".\n", path); - fclose(fp); + fclose(fp); - return buffer; + return buffer; } unsigned char *ReadWholeFileZeroPadded(char *path, int *size, int padAmount) { - FILE *fp = fopen(path, "rb"); + FILE *fp = fopen(path, "rb"); - if (fp == NULL) - FATAL_ERROR("Failed to open \"%s\" for reading.\n", path); + if (fp == NULL) + FATAL_ERROR("Failed to open \"%s\" for reading.\n", path); - fseek(fp, 0, SEEK_END); + fseek(fp, 0, SEEK_END); - *size = ftell(fp); + *size = ftell(fp); - unsigned char *buffer = calloc(*size + padAmount, 1); + unsigned char *buffer = calloc(*size + padAmount, 1); - if (buffer == NULL) - FATAL_ERROR("Failed to allocate memory for reading \"%s\".\n", path); + if (buffer == NULL) + FATAL_ERROR("Failed to allocate memory for reading \"%s\".\n", path); - rewind(fp); + rewind(fp); - if (fread(buffer, *size, 1, fp) != 1) - FATAL_ERROR("Failed to read \"%s\".\n", path); + if (fread(buffer, *size, 1, fp) != 1) + FATAL_ERROR("Failed to read \"%s\".\n", path); - fclose(fp); + fclose(fp); - return buffer; + return buffer; } void WriteWholeStringToFile(char *path, char *string) { - FILE *fp = fopen(path, "wb"); + FILE *fp = fopen(path, "wb"); - if (fp == NULL) - FATAL_ERROR("Failed to open \"%s\" for writing.\n", path); + if (fp == NULL) + FATAL_ERROR("Failed to open \"%s\" for writing.\n", path); - if (fputs(string, fp) == EOF) - FATAL_ERROR("Failed to write to \"%s\".\n", path); + if (fputs(string, fp) == EOF) + FATAL_ERROR("Failed to write to \"%s\".\n", path); - fclose(fp); + fclose(fp); } void WriteWholeFile(char *path, void *buffer, int bufferSize) { - FILE *fp = fopen(path, "wb"); + FILE *fp = fopen(path, "wb"); - if (fp == NULL) - FATAL_ERROR("Failed to open \"%s\" for writing.\n", path); + if (fp == NULL) + FATAL_ERROR("Failed to open \"%s\" for writing.\n", path); - if (fwrite(buffer, bufferSize, 1, fp) != 1) - FATAL_ERROR("Failed to write to \"%s\".\n", path); + if (fwrite(buffer, bufferSize, 1, fp) != 1) + FATAL_ERROR("Failed to write to \"%s\".\n", path); - fclose(fp); + fclose(fp); } void WriteGenericNtrHeader(FILE* fp, const char* magicNumber, uint32_t size, bool byteorder, bool version101, uint16_t sectionCount)