mirror of
https://github.com/pret/pokediamond.git
synced 2026-08-06 18:53:21 -05:00
NCER processing
This commit is contained in:
parent
75dc81c75d
commit
4367cf2bbb
6
Makefile
6
Makefile
|
|
@ -162,7 +162,7 @@ clean: mostlyclean clean-fs clean-tools
|
|||
|
||||
clean-fs:
|
||||
$(RM) $(filter %.narc %.arc,$(HOSTFS_FILES))
|
||||
$(RM) $(NCGR_CLEAN_LIST) $(NCLR_CLEAN_LIST)
|
||||
$(RM) $(NCGR_CLEAN_LIST) $(NCLR_CLEAN_LIST) $(NCER_CLEAN_LIST)
|
||||
find . \( -iname '*.1bpp' -o -iname '*.4bpp' -o -iname '*.8bpp' -o -iname '*.gbapal' -o -iname '*.lz' \) -exec $(RM) {} +
|
||||
$(RM) files/msgdata/msg/narc_*.bin
|
||||
|
||||
|
|
@ -271,8 +271,12 @@ $(8BPP_COMP10_NOPAD_NCLR_PAL_FILES): GFX_FLAGS = -bitdepth 8 -nopad -comp 10
|
|||
%.NCLR: %.pal
|
||||
$(GFX) $< $@ $(GFX_FLAGS)
|
||||
|
||||
%.NCER: %.json
|
||||
$(GFX) $< $@
|
||||
|
||||
%.png: ;
|
||||
%.pal: ;
|
||||
%.json: ;
|
||||
|
||||
######################## Misc #######################
|
||||
|
||||
|
|
|
|||
1
files/poketool/icongra/poke_icon/.gitignore
vendored
1
files/poketool/icongra/poke_icon/.gitignore
vendored
|
|
@ -1,4 +1,5 @@
|
|||
narc_0000.NCLR
|
||||
narc_0002.NCER
|
||||
narc_0007.NCGR
|
||||
narc_0008.NCGR
|
||||
narc_0009.NCGR
|
||||
|
|
|
|||
|
|
@ -1,2 +1,3 @@
|
|||
*.png
|
||||
*.pal
|
||||
*.json
|
||||
|
|
|
|||
Binary file not shown.
67
files/poketool/icongra/poke_icon/narc_0002.json
Normal file
67
files/poketool/icongra/poke_icon/narc_0002.json
Normal file
|
|
@ -0,0 +1,67 @@
|
|||
{
|
||||
"label": true,
|
||||
"extended": true,
|
||||
"imageHeight": 32,
|
||||
"imageWidth": 32,
|
||||
"cellCount": 2,
|
||||
"cells": [
|
||||
{
|
||||
"readOnly": 2054,
|
||||
"maxX": 15,
|
||||
"maxY": 15,
|
||||
"minX": 65520,
|
||||
"minY": 65520,
|
||||
"OAM": {
|
||||
"Attr0": {
|
||||
"YCoordinate": 240,
|
||||
"Rotation": false,
|
||||
"SizeDisable": false,
|
||||
"Mode": 0,
|
||||
"Mosaic": false,
|
||||
"Colours": 16,
|
||||
"Shape": 0
|
||||
},
|
||||
"Attr1": {
|
||||
"XCoordinate": 496,
|
||||
"RotationScaling": 0,
|
||||
"Size": 2
|
||||
},
|
||||
"Attr2": {
|
||||
"CharName": 0,
|
||||
"Priority": 0,
|
||||
"Palette": 0
|
||||
}
|
||||
},
|
||||
"label": "CellAnime0"
|
||||
},
|
||||
{
|
||||
"readOnly": 2054,
|
||||
"maxX": 15,
|
||||
"maxY": 15,
|
||||
"minX": 65520,
|
||||
"minY": 65520,
|
||||
"OAM": {
|
||||
"Attr0": {
|
||||
"YCoordinate": 240,
|
||||
"Rotation": false,
|
||||
"SizeDisable": false,
|
||||
"Mode": 0,
|
||||
"Mosaic": false,
|
||||
"Colours": 16,
|
||||
"Shape": 0
|
||||
},
|
||||
"Attr1": {
|
||||
"XCoordinate": 496,
|
||||
"RotationScaling": 0,
|
||||
"Size": 2
|
||||
},
|
||||
"Attr2": {
|
||||
"CharName": 16,
|
||||
"Priority": 0,
|
||||
"Palette": 0
|
||||
}
|
||||
},
|
||||
"label": "CellAnime1"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -2579,6 +2579,7 @@ files/poketool/pokegra/pokegra.narc: \
|
|||
|
||||
files/poketool/icongra/poke_icon.narc: \
|
||||
files/poketool/icongra/poke_icon/narc_0000.NCLR \
|
||||
files/poketool/icongra/poke_icon/narc_0002.NCER \
|
||||
files/poketool/icongra/poke_icon/narc_0007.NCGR \
|
||||
files/poketool/icongra/poke_icon/narc_0008.NCGR \
|
||||
files/poketool/icongra/poke_icon/narc_0009.NCGR \
|
||||
|
|
|
|||
|
|
@ -873,3 +873,5 @@ NCLR_CLEAN_LIST := files/data/cell0.NCLR \
|
|||
files/poketool/trgra/trfgra/narc_0190.NCLR \
|
||||
files/poketool/trgra/trfgra/narc_0192.NCLR \
|
||||
files/poketool/trgra/trfgra/narc_0194.NCLR \
|
||||
|
||||
NCER_CLEAN_LIST := files/poketool/icongra/poke_icon/narc_0002.NCER
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ CFLAGS = -Wall -Wextra -Werror -Wno-sign-compare -std=c11 -O2 -DPNG_SKIP_SETJMP_
|
|||
|
||||
LIBS = -lpng -lz
|
||||
|
||||
SRCS = main.c convert_png.c gfx.c jasc_pal.c lz.c rl.c util.c font.c huff.c
|
||||
SRCS = main.c convert_png.c gfx.c jasc_pal.c lz.c rl.c util.c font.c huff.c json.c cJSON.c
|
||||
|
||||
.PHONY: all clean
|
||||
|
||||
|
|
|
|||
3110
tools/nitrogfx/cJSON.c
Normal file
3110
tools/nitrogfx/cJSON.c
Normal file
File diff suppressed because it is too large
Load Diff
293
tools/nitrogfx/cJSON.h
Normal file
293
tools/nitrogfx/cJSON.h
Normal file
|
|
@ -0,0 +1,293 @@
|
|||
/*
|
||||
Copyright (c) 2009-2017 Dave Gamble and cJSON contributors
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef cJSON__h
|
||||
#define cJSON__h
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
#if !defined(__WINDOWS__) && (defined(WIN32) || defined(WIN64) || defined(_MSC_VER) || defined(_WIN32))
|
||||
#define __WINDOWS__
|
||||
#endif
|
||||
|
||||
#ifdef __WINDOWS__
|
||||
|
||||
/* When compiling for windows, we specify a specific calling convention to avoid issues where we are being called from a project with a different default calling convention. For windows you have 3 define options:
|
||||
|
||||
CJSON_HIDE_SYMBOLS - Define this in the case where you don't want to ever dllexport symbols
|
||||
CJSON_EXPORT_SYMBOLS - Define this on library build when you want to dllexport symbols (default)
|
||||
CJSON_IMPORT_SYMBOLS - Define this if you want to dllimport symbol
|
||||
|
||||
For *nix builds that support visibility attribute, you can define similar behavior by
|
||||
|
||||
setting default visibility to hidden by adding
|
||||
-fvisibility=hidden (for gcc)
|
||||
or
|
||||
-xldscope=hidden (for sun cc)
|
||||
to CFLAGS
|
||||
|
||||
then using the CJSON_API_VISIBILITY flag to "export" the same symbols the way CJSON_EXPORT_SYMBOLS does
|
||||
|
||||
*/
|
||||
|
||||
#define CJSON_CDECL __cdecl
|
||||
#define CJSON_STDCALL __stdcall
|
||||
|
||||
/* export symbols by default, this is necessary for copy pasting the C and header file */
|
||||
#if !defined(CJSON_HIDE_SYMBOLS) && !defined(CJSON_IMPORT_SYMBOLS) && !defined(CJSON_EXPORT_SYMBOLS)
|
||||
#define CJSON_EXPORT_SYMBOLS
|
||||
#endif
|
||||
|
||||
#if defined(CJSON_HIDE_SYMBOLS)
|
||||
#define CJSON_PUBLIC(type) type CJSON_STDCALL
|
||||
#elif defined(CJSON_EXPORT_SYMBOLS)
|
||||
#define CJSON_PUBLIC(type) __declspec(dllexport) type CJSON_STDCALL
|
||||
#elif defined(CJSON_IMPORT_SYMBOLS)
|
||||
#define CJSON_PUBLIC(type) __declspec(dllimport) type CJSON_STDCALL
|
||||
#endif
|
||||
#else /* !__WINDOWS__ */
|
||||
#define CJSON_CDECL
|
||||
#define CJSON_STDCALL
|
||||
|
||||
#if (defined(__GNUC__) || defined(__SUNPRO_CC) || defined (__SUNPRO_C)) && defined(CJSON_API_VISIBILITY)
|
||||
#define CJSON_PUBLIC(type) __attribute__((visibility("default"))) type
|
||||
#else
|
||||
#define CJSON_PUBLIC(type) type
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* project version */
|
||||
#define CJSON_VERSION_MAJOR 1
|
||||
#define CJSON_VERSION_MINOR 7
|
||||
#define CJSON_VERSION_PATCH 14
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
/* cJSON Types: */
|
||||
#define cJSON_Invalid (0)
|
||||
#define cJSON_False (1 << 0)
|
||||
#define cJSON_True (1 << 1)
|
||||
#define cJSON_NULL (1 << 2)
|
||||
#define cJSON_Number (1 << 3)
|
||||
#define cJSON_String (1 << 4)
|
||||
#define cJSON_Array (1 << 5)
|
||||
#define cJSON_Object (1 << 6)
|
||||
#define cJSON_Raw (1 << 7) /* raw json */
|
||||
|
||||
#define cJSON_IsReference 256
|
||||
#define cJSON_StringIsConst 512
|
||||
|
||||
/* The cJSON structure: */
|
||||
typedef struct cJSON
|
||||
{
|
||||
/* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */
|
||||
struct cJSON *next;
|
||||
struct cJSON *prev;
|
||||
/* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */
|
||||
struct cJSON *child;
|
||||
|
||||
/* The type of the item, as above. */
|
||||
int type;
|
||||
|
||||
/* The item's string, if type==cJSON_String and type == cJSON_Raw */
|
||||
char *valuestring;
|
||||
/* writing to valueint is DEPRECATED, use cJSON_SetNumberValue instead */
|
||||
int valueint;
|
||||
/* The item's number, if type==cJSON_Number */
|
||||
double valuedouble;
|
||||
|
||||
/* The item's name string, if this item is the child of, or is in the list of subitems of an object. */
|
||||
char *string;
|
||||
} cJSON;
|
||||
|
||||
typedef struct cJSON_Hooks
|
||||
{
|
||||
/* malloc/free are CDECL on Windows regardless of the default calling convention of the compiler, so ensure the hooks allow passing those functions directly. */
|
||||
void *(CJSON_CDECL *malloc_fn)(size_t sz);
|
||||
void (CJSON_CDECL *free_fn)(void *ptr);
|
||||
} cJSON_Hooks;
|
||||
|
||||
typedef int cJSON_bool;
|
||||
|
||||
/* Limits how deeply nested arrays/objects can be before cJSON rejects to parse them.
|
||||
* This is to prevent stack overflows. */
|
||||
#ifndef CJSON_NESTING_LIMIT
|
||||
#define CJSON_NESTING_LIMIT 1000
|
||||
#endif
|
||||
|
||||
/* returns the version of cJSON as a string */
|
||||
CJSON_PUBLIC(const char*) cJSON_Version(void);
|
||||
|
||||
/* Supply malloc, realloc and free functions to cJSON */
|
||||
CJSON_PUBLIC(void) cJSON_InitHooks(cJSON_Hooks* hooks);
|
||||
|
||||
/* Memory Management: the caller is always responsible to free the results from all variants of cJSON_Parse (with cJSON_Delete) and cJSON_Print (with stdlib free, cJSON_Hooks.free_fn, or cJSON_free as appropriate). The exception is cJSON_PrintPreallocated, where the caller has full responsibility of the buffer. */
|
||||
/* Supply a block of JSON, and this returns a cJSON object you can interrogate. */
|
||||
CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value);
|
||||
CJSON_PUBLIC(cJSON *) cJSON_ParseWithLength(const char *value, size_t buffer_length);
|
||||
/* ParseWithOpts allows you to require (and check) that the JSON is null terminated, and to retrieve the pointer to the final byte parsed. */
|
||||
/* If you supply a ptr in return_parse_end and parsing fails, then return_parse_end will contain a pointer to the error so will match cJSON_GetErrorPtr(). */
|
||||
CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return_parse_end, cJSON_bool require_null_terminated);
|
||||
CJSON_PUBLIC(cJSON *) cJSON_ParseWithLengthOpts(const char *value, size_t buffer_length, const char **return_parse_end, cJSON_bool require_null_terminated);
|
||||
|
||||
/* Render a cJSON entity to text for transfer/storage. */
|
||||
CJSON_PUBLIC(char *) cJSON_Print(const cJSON *item);
|
||||
/* Render a cJSON entity to text for transfer/storage without any formatting. */
|
||||
CJSON_PUBLIC(char *) cJSON_PrintUnformatted(const cJSON *item);
|
||||
/* Render a cJSON entity to text using a buffered strategy. prebuffer is a guess at the final size. guessing well reduces reallocation. fmt=0 gives unformatted, =1 gives formatted */
|
||||
CJSON_PUBLIC(char *) cJSON_PrintBuffered(const cJSON *item, int prebuffer, cJSON_bool fmt);
|
||||
/* Render a cJSON entity to text using a buffer already allocated in memory with given length. Returns 1 on success and 0 on failure. */
|
||||
/* NOTE: cJSON is not always 100% accurate in estimating how much memory it will use, so to be safe allocate 5 bytes more than you actually need */
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_PrintPreallocated(cJSON *item, char *buffer, const int length, const cJSON_bool format);
|
||||
/* Delete a cJSON entity and all subentities. */
|
||||
CJSON_PUBLIC(void) cJSON_Delete(cJSON *item);
|
||||
|
||||
/* Returns the number of items in an array (or object). */
|
||||
CJSON_PUBLIC(int) cJSON_GetArraySize(const cJSON *array);
|
||||
/* Retrieve item number "index" from array "array". Returns NULL if unsuccessful. */
|
||||
CJSON_PUBLIC(cJSON *) cJSON_GetArrayItem(const cJSON *array, int index);
|
||||
/* Get item "string" from object. Case insensitive. */
|
||||
CJSON_PUBLIC(cJSON *) cJSON_GetObjectItem(const cJSON * const object, const char * const string);
|
||||
CJSON_PUBLIC(cJSON *) cJSON_GetObjectItemCaseSensitive(const cJSON * const object, const char * const string);
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_HasObjectItem(const cJSON *object, const char *string);
|
||||
/* For analysing failed parses. This returns a pointer to the parse error. You'll probably need to look a few chars back to make sense of it. Defined when cJSON_Parse() returns 0. 0 when cJSON_Parse() succeeds. */
|
||||
CJSON_PUBLIC(const char *) cJSON_GetErrorPtr(void);
|
||||
|
||||
/* Check item type and return its value */
|
||||
CJSON_PUBLIC(char *) cJSON_GetStringValue(const cJSON * const item);
|
||||
CJSON_PUBLIC(double) cJSON_GetNumberValue(const cJSON * const item);
|
||||
|
||||
/* These functions check the type of an item */
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_IsInvalid(const cJSON * const item);
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_IsFalse(const cJSON * const item);
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_IsTrue(const cJSON * const item);
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_IsBool(const cJSON * const item);
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_IsNull(const cJSON * const item);
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_IsNumber(const cJSON * const item);
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_IsString(const cJSON * const item);
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_IsArray(const cJSON * const item);
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_IsObject(const cJSON * const item);
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_IsRaw(const cJSON * const item);
|
||||
|
||||
/* These calls create a cJSON item of the appropriate type. */
|
||||
CJSON_PUBLIC(cJSON *) cJSON_CreateNull(void);
|
||||
CJSON_PUBLIC(cJSON *) cJSON_CreateTrue(void);
|
||||
CJSON_PUBLIC(cJSON *) cJSON_CreateFalse(void);
|
||||
CJSON_PUBLIC(cJSON *) cJSON_CreateBool(cJSON_bool boolean);
|
||||
CJSON_PUBLIC(cJSON *) cJSON_CreateNumber(double num);
|
||||
CJSON_PUBLIC(cJSON *) cJSON_CreateString(const char *string);
|
||||
/* raw json */
|
||||
CJSON_PUBLIC(cJSON *) cJSON_CreateRaw(const char *raw);
|
||||
CJSON_PUBLIC(cJSON *) cJSON_CreateArray(void);
|
||||
CJSON_PUBLIC(cJSON *) cJSON_CreateObject(void);
|
||||
|
||||
/* Create a string where valuestring references a string so
|
||||
* it will not be freed by cJSON_Delete */
|
||||
CJSON_PUBLIC(cJSON *) cJSON_CreateStringReference(const char *string);
|
||||
/* Create an object/array that only references it's elements so
|
||||
* they will not be freed by cJSON_Delete */
|
||||
CJSON_PUBLIC(cJSON *) cJSON_CreateObjectReference(const cJSON *child);
|
||||
CJSON_PUBLIC(cJSON *) cJSON_CreateArrayReference(const cJSON *child);
|
||||
|
||||
/* These utilities create an Array of count items.
|
||||
* The parameter count cannot be greater than the number of elements in the number array, otherwise array access will be out of bounds.*/
|
||||
CJSON_PUBLIC(cJSON *) cJSON_CreateIntArray(const int *numbers, int count);
|
||||
CJSON_PUBLIC(cJSON *) cJSON_CreateFloatArray(const float *numbers, int count);
|
||||
CJSON_PUBLIC(cJSON *) cJSON_CreateDoubleArray(const double *numbers, int count);
|
||||
CJSON_PUBLIC(cJSON *) cJSON_CreateStringArray(const char *const *strings, int count);
|
||||
|
||||
/* Append item to the specified array/object. */
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToArray(cJSON *array, cJSON *item);
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item);
|
||||
/* Use this when string is definitely const (i.e. a literal, or as good as), and will definitely survive the cJSON object.
|
||||
* WARNING: When this function was used, make sure to always check that (item->type & cJSON_StringIsConst) is zero before
|
||||
* writing to `item->string` */
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToObjectCS(cJSON *object, const char *string, cJSON *item);
|
||||
/* Append reference to item to the specified array/object. Use this when you want to add an existing cJSON to a new cJSON, but don't want to corrupt your existing cJSON. */
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item);
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_AddItemReferenceToObject(cJSON *object, const char *string, cJSON *item);
|
||||
|
||||
/* Remove/Detach items from Arrays/Objects. */
|
||||
CJSON_PUBLIC(cJSON *) cJSON_DetachItemViaPointer(cJSON *parent, cJSON * const item);
|
||||
CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromArray(cJSON *array, int which);
|
||||
CJSON_PUBLIC(void) cJSON_DeleteItemFromArray(cJSON *array, int which);
|
||||
CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObject(cJSON *object, const char *string);
|
||||
CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObjectCaseSensitive(cJSON *object, const char *string);
|
||||
CJSON_PUBLIC(void) cJSON_DeleteItemFromObject(cJSON *object, const char *string);
|
||||
CJSON_PUBLIC(void) cJSON_DeleteItemFromObjectCaseSensitive(cJSON *object, const char *string);
|
||||
|
||||
/* Update array items. */
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_InsertItemInArray(cJSON *array, int which, cJSON *newitem); /* Shifts pre-existing items to the right. */
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemViaPointer(cJSON * const parent, cJSON * const item, cJSON * replacement);
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInArray(cJSON *array, int which, cJSON *newitem);
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInObject(cJSON *object,const char *string,cJSON *newitem);
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInObjectCaseSensitive(cJSON *object,const char *string,cJSON *newitem);
|
||||
|
||||
/* Duplicate a cJSON item */
|
||||
CJSON_PUBLIC(cJSON *) cJSON_Duplicate(const cJSON *item, cJSON_bool recurse);
|
||||
/* Duplicate will create a new, identical cJSON item to the one you pass, in new memory that will
|
||||
* need to be released. With recurse!=0, it will duplicate any children connected to the item.
|
||||
* The item->next and ->prev pointers are always zero on return from Duplicate. */
|
||||
/* Recursively compare two cJSON items for equality. If either a or b is NULL or invalid, they will be considered unequal.
|
||||
* case_sensitive determines if object keys are treated case sensitive (1) or case insensitive (0) */
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_Compare(const cJSON * const a, const cJSON * const b, const cJSON_bool case_sensitive);
|
||||
|
||||
/* Minify a strings, remove blank characters(such as ' ', '\t', '\r', '\n') from strings.
|
||||
* The input pointer json cannot point to a read-only address area, such as a string constant,
|
||||
* but should point to a readable and writable adress area. */
|
||||
CJSON_PUBLIC(void) cJSON_Minify(char *json);
|
||||
|
||||
/* Helper functions for creating and adding items to an object at the same time.
|
||||
* They return the added item or NULL on failure. */
|
||||
CJSON_PUBLIC(cJSON*) cJSON_AddNullToObject(cJSON * const object, const char * const name);
|
||||
CJSON_PUBLIC(cJSON*) cJSON_AddTrueToObject(cJSON * const object, const char * const name);
|
||||
CJSON_PUBLIC(cJSON*) cJSON_AddFalseToObject(cJSON * const object, const char * const name);
|
||||
CJSON_PUBLIC(cJSON*) cJSON_AddBoolToObject(cJSON * const object, const char * const name, const cJSON_bool boolean);
|
||||
CJSON_PUBLIC(cJSON*) cJSON_AddNumberToObject(cJSON * const object, const char * const name, const double number);
|
||||
CJSON_PUBLIC(cJSON*) cJSON_AddStringToObject(cJSON * const object, const char * const name, const char * const string);
|
||||
CJSON_PUBLIC(cJSON*) cJSON_AddRawToObject(cJSON * const object, const char * const name, const char * const raw);
|
||||
CJSON_PUBLIC(cJSON*) cJSON_AddObjectToObject(cJSON * const object, const char * const name);
|
||||
CJSON_PUBLIC(cJSON*) cJSON_AddArrayToObject(cJSON * const object, const char * const name);
|
||||
|
||||
/* When assigning an integer value, it needs to be propagated to valuedouble too. */
|
||||
#define cJSON_SetIntValue(object, number) ((object) ? (object)->valueint = (object)->valuedouble = (number) : (number))
|
||||
/* helper for the cJSON_SetNumberValue macro */
|
||||
CJSON_PUBLIC(double) cJSON_SetNumberHelper(cJSON *object, double number);
|
||||
#define cJSON_SetNumberValue(object, number) ((object != NULL) ? cJSON_SetNumberHelper(object, (double)number) : (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);
|
||||
|
||||
/* 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)
|
||||
|
||||
/* malloc/free objects using the malloc/free functions that have been set with cJSON_InitHooks */
|
||||
CJSON_PUBLIC(void *) cJSON_malloc(size_t size);
|
||||
CJSON_PUBLIC(void) cJSON_free(void *object);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
@ -736,3 +736,165 @@ void WriteNtrPalette(char *path, struct Palette *palette, bool ncpr, bool ir, in
|
|||
|
||||
fclose(fp);
|
||||
}
|
||||
|
||||
void WriteNtrCell(char *path, struct JsonToCellOptions *options)
|
||||
{
|
||||
FILE *fp = fopen(path, "wb");
|
||||
|
||||
if (fp == NULL)
|
||||
FATAL_ERROR("Failed to open \"%s\" for writing.\n", path);
|
||||
|
||||
unsigned int totalSize = (options->label > 0 ? 0x34 : 0x20) + options->cellCount * (options->extended ? 0x16 : 0xe);
|
||||
|
||||
if (options->label)
|
||||
{
|
||||
for (int i = 0; i < options->cellCount; i++) {
|
||||
totalSize += strlen(options->cells[i]->label) + 5; //strlen + terminator + pointer
|
||||
}
|
||||
}
|
||||
|
||||
WriteGenericNtrHeader(fp, "RECN", totalSize, true, false, options->label ? 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
|
||||
};
|
||||
|
||||
KBECHeader[8] = options->cellCount; //cell count
|
||||
|
||||
if (options->extended)
|
||||
{
|
||||
KBECHeader[10] = 1; //extended
|
||||
}
|
||||
|
||||
unsigned int size = options->cellCount * (options->extended ? 0x16 : 0xe);
|
||||
|
||||
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
|
||||
|
||||
fwrite(KBECHeader, 1, 0x20, fp);
|
||||
|
||||
|
||||
unsigned char *KBECContents = malloc(size);
|
||||
|
||||
memset(KBECContents, 0, size);
|
||||
|
||||
if (!options->extended)
|
||||
{
|
||||
FATAL_ERROR("Don't know how to deal with not extended yet, bug red031000.\n");
|
||||
}
|
||||
|
||||
int i;
|
||||
for (i = 0; i < options->cellCount * 0x10; i += 0x10)
|
||||
{
|
||||
KBECContents[i] = 0x01; //number of images
|
||||
KBECContents[i + 2] = options->cells[i / 0x10]->readOnly & 0xff; //unknown
|
||||
KBECContents[i + 3] = options->cells[i / 0x10]->readOnly >> 8;
|
||||
KBECContents[i + 4] = (i / 0x10 * 6) & 0xff; //pointer to OAM data
|
||||
KBECContents[i + 5] = (i / 0x10 * 6) >> 8; //unlikely to be more than 16 bits, but there are 32 allocated, change if necessary
|
||||
KBECContents[i + 8] = options->cells[i / 0x10]->maxX & 0xff; //maxX
|
||||
KBECContents[i + 9] = options->cells[i / 0x10]->maxX >> 8;
|
||||
KBECContents[i + 10] = options->cells[i / 0x10]->maxY & 0xff; //maxY
|
||||
KBECContents[i + 11] = options->cells[i / 0x10]->maxY >> 8;
|
||||
KBECContents[i + 12] = options->cells[i / 0x10]->minX & 0xff; //minX
|
||||
KBECContents[i + 13] = options->cells[i / 0x10]->minX >> 8;
|
||||
KBECContents[i + 14] = options->cells[i / 0x10]->minY & 0xff; //minY
|
||||
KBECContents[i + 15] = options->cells[i / 0x10]->minY >> 8;
|
||||
}
|
||||
|
||||
//OAM data
|
||||
for (int j = i; j < options->cellCount * 6 + i; j += 6)
|
||||
{
|
||||
//Attr0
|
||||
|
||||
//bits 0-7 Y coordinate
|
||||
KBECContents[j] = options->cells[(j - i) / 6]->oam.attr0.YCoordinate & 0xff;
|
||||
|
||||
//bit 8 rotation
|
||||
KBECContents[j + 1] = options->cells[(j - i) / 6]->oam.attr0.Rotation;
|
||||
|
||||
//bit 9 Obj Size (if rotation) or Obj Disable (if not rotation)
|
||||
KBECContents[j + 1] |= options->cells[(j - i) / 6]->oam.attr0.SizeDisable << 1;
|
||||
|
||||
//bits 10-11 Obj Mode
|
||||
KBECContents[j + 1] |= options->cells[(j - i) / 6]->oam.attr0.Mode << 2;
|
||||
|
||||
//bit 12 Obj Mosaic
|
||||
KBECContents[j + 1] |= options->cells[(j - i) / 6]->oam.attr0.Mosaic << 4;
|
||||
|
||||
//bit 13 Colours
|
||||
KBECContents[j + 1] |= (options->cells[(j - i) / 6]->oam.attr0.Colours == 16 ? 0 : 1) << 5;
|
||||
|
||||
//bits 14-15 Obj Shape
|
||||
KBECContents[j + 1] |= options->cells[(j - i) / 6]->oam.attr0.Shape << 6;
|
||||
|
||||
//Attr1
|
||||
|
||||
//bits 0-8 X coordinate
|
||||
KBECContents[j + 2] = options->cells[(j - i) / 6]->oam.attr1.XCoordinate & 0xff;
|
||||
KBECContents[j + 3] = options->cells[(j - i) / 6]->oam.attr1.XCoordinate >> 8;
|
||||
|
||||
//bits 9-13 Rotation and scaling (if rotation) bit 12 Horizontal flip, bit 13 Vertical flip (if not rotation)
|
||||
KBECContents[j + 3] |= options->cells[(j - i) / 6]->oam.attr1.RotationScaling << 1;
|
||||
|
||||
//bits 14-15 Obj Size
|
||||
KBECContents[j + 3] |= options->cells[(j - i) / 6]->oam.attr1.Size << 6;
|
||||
|
||||
//Attr2
|
||||
|
||||
//bits 0-9 Character Name?
|
||||
KBECContents[j + 4] = options->cells[(j - i) / 6]->oam.attr2.CharName & 0xff;
|
||||
KBECContents[j + 5] = options->cells[(j - i) / 6]->oam.attr2.CharName >> 8;
|
||||
|
||||
//bits 10-11 Priority
|
||||
KBECContents[j + 5] |= options->cells[(j - i) / 6]->oam.attr2.Priority << 2;
|
||||
|
||||
//bits 12-15 Palette Number
|
||||
KBECContents[j + 5] |= options->cells[(j - i) / 6]->oam.attr2.Palette << 4;
|
||||
}
|
||||
|
||||
fwrite(KBECContents, 1, size, fp);
|
||||
|
||||
free(KBECContents);
|
||||
|
||||
unsigned int lablSize = 8 + options->cellCount * 4;
|
||||
for (i = 0; i < options->cellCount; i++)
|
||||
{
|
||||
lablSize += strlen(options->cells[i]->label) + 1;
|
||||
}
|
||||
|
||||
unsigned char *labl = malloc(lablSize);
|
||||
|
||||
memset(labl, 0, lablSize);
|
||||
|
||||
strcpy((char *)labl, "LBAL");
|
||||
labl[4] = lablSize & 0xff;
|
||||
labl[5] = lablSize >> 8;
|
||||
|
||||
unsigned int position = 0;
|
||||
|
||||
for (i = 0; i < options->cellCount * 4; i += 4)
|
||||
{
|
||||
labl[i + 8] = position & 0xff;
|
||||
labl[i + 9] = position >> 8;
|
||||
|
||||
position += strlen(options->cells[i / 4]->label) + 1;
|
||||
}
|
||||
|
||||
for (int j = 0; j < options->cellCount; j++)
|
||||
{
|
||||
strcpy((char *)(labl + (i + 8)), options->cells[j]->label);
|
||||
i += strlen(options->cells[j]->label) + 1;
|
||||
}
|
||||
|
||||
fwrite(labl, 1, lablSize, fp);
|
||||
|
||||
free(labl);
|
||||
|
||||
unsigned char texu[0xc] = { 0x54, 0x58, 0x45, 0x55, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||||
|
||||
fwrite(texu, 1, 0xc, fp);
|
||||
|
||||
fclose(fp);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@
|
|||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include "options.h"
|
||||
|
||||
struct Color {
|
||||
unsigned char red;
|
||||
|
|
@ -37,5 +38,6 @@ void ReadGbaPalette(char *path, struct Palette *palette);
|
|||
void ReadNtrPalette(char *path, struct Palette *palette, int bitdepth, int palIndex);
|
||||
void WriteGbaPalette(char *path, struct Palette *palette);
|
||||
void WriteNtrPalette(char *path, struct Palette *palette, bool ncpr, bool ir, int bitdepth, bool pad, int compNum);
|
||||
void WriteNtrCell(char *path, struct JsonToCellOptions *options);
|
||||
|
||||
#endif // GFX_H
|
||||
|
|
|
|||
163
tools/nitrogfx/json.c
Normal file
163
tools/nitrogfx/json.c
Normal file
|
|
@ -0,0 +1,163 @@
|
|||
// Copyright (c) 2021 red031000
|
||||
|
||||
#include "global.h"
|
||||
#include "cJSON.h"
|
||||
#include "json.h"
|
||||
#include "util.h"
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
static inline bool GetBool(cJSON * in)
|
||||
{
|
||||
if (!cJSON_IsBool(in))
|
||||
return false;
|
||||
|
||||
return cJSON_IsTrue(in);
|
||||
}
|
||||
|
||||
static inline int GetInt(cJSON * in)
|
||||
{
|
||||
if (!cJSON_IsNumber(in))
|
||||
return 0;
|
||||
|
||||
return in->valueint;
|
||||
}
|
||||
|
||||
static inline char *GetString(cJSON * in)
|
||||
{
|
||||
if (!cJSON_IsString(in))
|
||||
return NULL;
|
||||
|
||||
return in->valuestring;
|
||||
}
|
||||
|
||||
struct JsonToCellOptions *ParseNCERJson(char *path)
|
||||
{
|
||||
int fileLength;
|
||||
unsigned char *jsonString = ReadWholeFile(path, &fileLength);
|
||||
|
||||
cJSON *json = cJSON_Parse((const char *)jsonString);
|
||||
|
||||
struct JsonToCellOptions *options = malloc(sizeof(struct JsonToCellOptions));
|
||||
|
||||
if (json == NULL)
|
||||
{
|
||||
const char *errorPtr = cJSON_GetErrorPtr();
|
||||
FATAL_ERROR("Error in line \"%s\"\n", errorPtr);
|
||||
}
|
||||
|
||||
cJSON *labelBool = cJSON_GetObjectItemCaseSensitive(json, "label");
|
||||
cJSON *extended = cJSON_GetObjectItemCaseSensitive(json, "extended");
|
||||
cJSON *imageHeight = cJSON_GetObjectItemCaseSensitive(json, "imageHeight");
|
||||
cJSON *imageWidth = cJSON_GetObjectItemCaseSensitive(json, "imageWidth");
|
||||
cJSON *cellCount = cJSON_GetObjectItemCaseSensitive(json, "cellCount");
|
||||
|
||||
options->label = GetBool(labelBool);
|
||||
options->extended = GetBool(extended);
|
||||
options->imageHeight = GetInt(imageHeight);
|
||||
options->imageWidth = GetInt(imageWidth);
|
||||
options->cellCount = GetInt(cellCount);
|
||||
|
||||
options->cells = malloc(sizeof(struct Cell *) * options->cellCount);
|
||||
|
||||
for (int i = 0; i < options->cellCount; i++)
|
||||
{
|
||||
options->cells[i] = malloc(sizeof(struct Cell));
|
||||
}
|
||||
|
||||
int i = 0;
|
||||
cJSON *cells = cJSON_GetObjectItemCaseSensitive(json, "cells");
|
||||
cJSON *cell = NULL;
|
||||
|
||||
cJSON_ArrayForEach(cell, cells)
|
||||
{
|
||||
if (i > options->cellCount - 1)
|
||||
FATAL_ERROR("Cell count is incorrect.\n");
|
||||
|
||||
cJSON *readOnly = cJSON_GetObjectItemCaseSensitive(cell, "readOnly");
|
||||
|
||||
options->cells[i]->readOnly = (short)GetInt(readOnly);
|
||||
if (options->extended)
|
||||
{
|
||||
cJSON *maxX = cJSON_GetObjectItemCaseSensitive(cell, "maxX");
|
||||
cJSON *maxY = cJSON_GetObjectItemCaseSensitive(cell, "maxY");
|
||||
cJSON *minX = cJSON_GetObjectItemCaseSensitive(cell, "minX");
|
||||
cJSON *minY = cJSON_GetObjectItemCaseSensitive(cell, "minY");
|
||||
|
||||
options->cells[i]->maxX = (short)GetInt(maxX);
|
||||
options->cells[i]->maxY = (short)GetInt(maxY);
|
||||
options->cells[i]->minX = (short)GetInt(minX);
|
||||
options->cells[i]->minY = (short)GetInt(minY);
|
||||
}
|
||||
|
||||
if (options->label)
|
||||
{
|
||||
cJSON *label = cJSON_GetObjectItemCaseSensitive(cell, "label");
|
||||
char *labelString = GetString(label);
|
||||
options->cells[i]->label = malloc(strlen(labelString) + 1);
|
||||
strcpy(options->cells[i]->label, labelString);
|
||||
}
|
||||
//OAM data
|
||||
cJSON *OAM = cJSON_GetObjectItemCaseSensitive(cell, "OAM");
|
||||
|
||||
//Attr0
|
||||
cJSON *Attr0 = cJSON_GetObjectItemCaseSensitive(OAM, "Attr0");
|
||||
|
||||
cJSON *YCoordinate = cJSON_GetObjectItemCaseSensitive(Attr0, "YCoordinate");
|
||||
cJSON *Rotation = cJSON_GetObjectItemCaseSensitive(Attr0, "Rotation");
|
||||
cJSON *SizeDisable = cJSON_GetObjectItemCaseSensitive(Attr0, "SizeDisable");
|
||||
cJSON *Mode = cJSON_GetObjectItemCaseSensitive(Attr0, "Mode");
|
||||
cJSON *Mosaic = cJSON_GetObjectItemCaseSensitive(Attr0, "Mosaic");
|
||||
cJSON *Colours = cJSON_GetObjectItemCaseSensitive(Attr0, "Colours");
|
||||
cJSON *Shape = cJSON_GetObjectItemCaseSensitive(Attr0, "Shape");
|
||||
|
||||
options->cells[i]->oam.attr0.YCoordinate = GetInt(YCoordinate);
|
||||
options->cells[i]->oam.attr0.Rotation = GetBool(Rotation);
|
||||
options->cells[i]->oam.attr0.SizeDisable = GetBool(SizeDisable);
|
||||
options->cells[i]->oam.attr0.Mode = GetInt(Mode);
|
||||
options->cells[i]->oam.attr0.Mosaic = GetBool(Mosaic);
|
||||
options->cells[i]->oam.attr0.Colours = GetInt(Colours);
|
||||
options->cells[i]->oam.attr0.Shape = GetInt(Shape);
|
||||
|
||||
//Attr1
|
||||
cJSON *Attr1 = cJSON_GetObjectItemCaseSensitive(OAM, "Attr1");
|
||||
|
||||
cJSON *XCoordinate = cJSON_GetObjectItemCaseSensitive(Attr1, "XCoordinate");
|
||||
cJSON *RotationScaling = cJSON_GetObjectItemCaseSensitive(Attr1, "RotationScaling");
|
||||
cJSON *Size = cJSON_GetObjectItemCaseSensitive(Attr1, "Size");
|
||||
|
||||
options->cells[i]->oam.attr1.XCoordinate = GetInt(XCoordinate);
|
||||
options->cells[i]->oam.attr1.RotationScaling = GetInt(RotationScaling);
|
||||
options->cells[i]->oam.attr1.Size = GetInt(Size);
|
||||
|
||||
//Attr2
|
||||
cJSON *Attr2 = cJSON_GetObjectItemCaseSensitive(OAM, "Attr2");
|
||||
|
||||
cJSON *CharName = cJSON_GetObjectItemCaseSensitive(Attr2, "CharName");
|
||||
cJSON *Priority = cJSON_GetObjectItemCaseSensitive(Attr2, "Priority");
|
||||
cJSON *Palette = cJSON_GetObjectItemCaseSensitive(Attr2, "Palette");
|
||||
|
||||
options->cells[i]->oam.attr2.CharName = GetInt(CharName);
|
||||
options->cells[i]->oam.attr2.Priority = GetInt(Priority);
|
||||
options->cells[i]->oam.attr2.Palette = GetInt(Palette);
|
||||
|
||||
i++;
|
||||
}
|
||||
|
||||
cJSON_Delete(json);
|
||||
free(jsonString);
|
||||
return options;
|
||||
}
|
||||
|
||||
void FreeNCERCell(struct JsonToCellOptions *options)
|
||||
{
|
||||
for (int i = 0; i < options->cellCount; i++)
|
||||
{
|
||||
if (options->label)
|
||||
{
|
||||
free(options->cells[i]->label);
|
||||
}
|
||||
free(options->cells[i]);
|
||||
}
|
||||
free(options);
|
||||
}
|
||||
11
tools/nitrogfx/json.h
Normal file
11
tools/nitrogfx/json.h
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
// Copyright (c) 2021 red031000
|
||||
|
||||
#ifndef JSON_H
|
||||
#define JSON_H
|
||||
|
||||
#include "options.h"
|
||||
|
||||
struct JsonToCellOptions *ParseNCERJson(char *path);
|
||||
void FreeNCERCell(struct JsonToCellOptions *options);
|
||||
|
||||
#endif //JSON_H
|
||||
|
|
@ -13,6 +13,7 @@
|
|||
#include "rl.h"
|
||||
#include "font.h"
|
||||
#include "huff.h"
|
||||
#include "json.h"
|
||||
|
||||
struct CommandHandler
|
||||
{
|
||||
|
|
@ -674,6 +675,17 @@ void HandleJascToNtrPaletteCommand(char *inputPath, char *outputPath, int argc,
|
|||
WriteNtrPalette(outputPath, &palette, ncpr, ir, bitdepth, !nopad, compNum);
|
||||
}
|
||||
|
||||
void HandleJsonToNtrCellCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED)
|
||||
{
|
||||
struct JsonToCellOptions *options;
|
||||
|
||||
options = ParseNCERJson(inputPath);
|
||||
|
||||
WriteNtrCell(outputPath, options);
|
||||
|
||||
FreeNCERCell(options);
|
||||
}
|
||||
|
||||
void HandleLatinFontToPngCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED)
|
||||
{
|
||||
struct Image image;
|
||||
|
|
@ -932,6 +944,7 @@ int main(int argc, char **argv)
|
|||
{ "png", "hwjpnfont", HandlePngToHalfwidthJapaneseFontCommand },
|
||||
{ "fwjpnfont", "png", HandleFullwidthJapaneseFontToPngCommand },
|
||||
{ "png", "fwjpnfont", HandlePngToFullwidthJapaneseFontCommand },
|
||||
{ "json", "NCER", HandleJsonToNtrCellCommand },
|
||||
{ NULL, "huff", HandleHuffCompressCommand },
|
||||
{ NULL, "lz", HandleLZCompressCommand },
|
||||
{ "huff", NULL, HandleHuffDecompressCommand },
|
||||
|
|
|
|||
|
|
@ -34,5 +34,51 @@ struct PngToNtrOptions {
|
|||
bool scanned;
|
||||
};
|
||||
|
||||
struct Attr0 {
|
||||
int YCoordinate;
|
||||
bool Rotation;
|
||||
bool SizeDisable;
|
||||
int Mode;
|
||||
bool Mosaic;
|
||||
int Colours;
|
||||
int Shape;
|
||||
};
|
||||
|
||||
struct Attr1 {
|
||||
int XCoordinate;
|
||||
int RotationScaling;
|
||||
int Size;
|
||||
};
|
||||
|
||||
struct Attr2 {
|
||||
int CharName;
|
||||
int Priority;
|
||||
int Palette;
|
||||
};
|
||||
|
||||
struct OAM {
|
||||
struct Attr0 attr0;
|
||||
struct Attr1 attr1;
|
||||
struct Attr2 attr2;
|
||||
};
|
||||
|
||||
struct Cell {
|
||||
short readOnly;
|
||||
short maxX;
|
||||
short maxY;
|
||||
short minX;
|
||||
short minY;
|
||||
struct OAM oam;
|
||||
char *label;
|
||||
};
|
||||
|
||||
struct JsonToCellOptions {
|
||||
bool label;
|
||||
bool extended;
|
||||
int imageHeight;
|
||||
int imageWidth;
|
||||
int cellCount;
|
||||
struct Cell **cells;
|
||||
};
|
||||
|
||||
#endif // OPTIONS_H
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user