From e56c2a067ed4b1368bad9580df53297cd846f8d5 Mon Sep 17 00:00:00 2001 From: Klemen Plestenjak Date: Wed, 8 Nov 2023 16:40:20 +0100 Subject: [PATCH] Update cute_tiled.h --- engine/libs/cute_tiled/cute_tiled.c | 4 +++ engine/libs/cute_tiled/cute_tiled.h | 47 ++++++++++++++++++++++++----- 2 files changed, 44 insertions(+), 7 deletions(-) diff --git a/engine/libs/cute_tiled/cute_tiled.c b/engine/libs/cute_tiled/cute_tiled.c index 1da3260..5665be1 100644 --- a/engine/libs/cute_tiled/cute_tiled.c +++ b/engine/libs/cute_tiled/cute_tiled.c @@ -1,6 +1,8 @@ #include #include +#if 1 + #define CUTE_TILED_WARNING(msg) bzLogWarning(msg) #define CUTE_TILED_ALLOC(size, ctx) bzAlloc(size) @@ -8,5 +10,7 @@ #define CUTE_TILED_MEMCPY bzMemCpy #define CUTE_TILED_MEMSET bzMemSet +#endif + #define CUTE_TILED_IMPLEMENTATION #include "cute_tiled.h" diff --git a/engine/libs/cute_tiled/cute_tiled.h b/engine/libs/cute_tiled/cute_tiled.h index 105a067..6e1677b 100644 --- a/engine/libs/cute_tiled/cute_tiled.h +++ b/engine/libs/cute_tiled/cute_tiled.h @@ -105,6 +105,8 @@ #if !defined(CUTE_TILED_H) +#include // uint32_t + // Read this in the event of errors extern const char* cute_tiled_error_reason; extern int cute_tiled_error_line; @@ -305,6 +307,7 @@ static CUTE_TILED_INLINE void cute_tiled_get_flags(int tile_data_gid, int* flip_ struct cute_tiled_layer_t { /* chunks */ // Not currently supported. + cute_tiled_string_t class_; // The class of the layer (since 1.9, optional). /* compression; */ // Not currently supported. int data_count; // Number of integers in `data`. int* data; // Array of GIDs. `tilelayer` only. Only support CSV style exports. @@ -319,8 +322,8 @@ struct cute_tiled_layer_t float opacity; // Value between 0 and 1. int property_count; // Number of elements in the `properties` array. cute_tiled_property_t* properties; // Array of properties. - int transparentcolor; // Hex-formatted color (#RRGGBB or #AARRGGBB) (optional). - int tintcolor; // Hex-formatted color (#RRGGBB or #AARRGGBB) (optional). + uint32_t transparentcolor; // Hex-formatted color (#AARRGGBB) (optional). + uint32_t tintcolor; // Hex-formatted color (#AARRGGBB) (optional). cute_tiled_string_t type; // `tilelayer`, `objectgroup`, `imagelayer` or `group`. cute_tiled_string_t image; // An image filepath. Used if layer is type `imagelayer`. int visible; // 0 or 1. Whether layer is shown or hidden in editor. @@ -371,6 +374,7 @@ struct cute_tiled_tile_descriptor_t struct cute_tiled_tileset_t { int backgroundcolor; // Hex-formatted color (#RRGGBB or #AARRGGBB) (optional). + cute_tiled_string_t class_; // The class of the tileset (since 1.9, optional). int columns; // The number of tile columns in the tileset. int firstgid; // GID corresponding to the first tile in the set. /* grid */ // Not currently supported. @@ -391,7 +395,7 @@ struct cute_tiled_tileset_t int tileoffset_y; // Pixel offset to align tiles to the grid. cute_tiled_tile_descriptor_t* tiles; // Linked list of tile descriptors. Can be NULL. int tilewidth; // Maximum width of tiles in this set. - int transparentcolor; // Hex-formatted color (#RRGGBB or #AARRGGBB) (optional). + uint32_t transparentcolor; // Hex-formatted color (#AARRGGBB) (optional). cute_tiled_string_t type; // `tileset` (for tileset files, since 1.0). cute_tiled_string_t source; // Relative path to tileset, when saved externally from the map file. cute_tiled_tileset_t* next; // Pointer to next tileset. NULL if final tileset. @@ -402,6 +406,7 @@ struct cute_tiled_tileset_t struct cute_tiled_map_t { int backgroundcolor; // Hex-formatted color (#RRGGBB or #AARRGGBB) (optional). + cute_tiled_string_t class_; // The class of the map (since 1.9, optional). int height; // Number of tile rows. /* hexsidelength */ // Not currently supported. int infinite; // Whether the map has infinite dimensions. @@ -1639,8 +1644,22 @@ static int cute_tiled_read_hex_int_internal(cute_tiled_map_internal_t* m, int* o val = CUTE_TILED_STRTOULL(m->in, &end, 16); CUTE_TILED_CHECK(m->in != end, "Invalid integer found during parse."); + + // Count the length to determine if we need to force AARRGGBB, instead of RRGGBB. + int length = 0; + while (m->in != end) { + m->in++; + length++; + } + *out = (uint32_t)val; + + // When less than 6 characters, force an alpha channel of 0xFF. + if (length <= 6) { + uint32_t alpha = 0xFF << 24; + *out = (*out & 0x00FFFFFF) | alpha; + } + m->in = end; - *out = (int)val; return 1; cute_tiled_err: @@ -2066,9 +2085,8 @@ cute_tiled_object_t* cute_tiled_read_object(cute_tiled_map_internal_t* m) break; case 1485919047363370797U: // class - CUTE_TILED_WARNING("Class field of Tiled objects is not yet supported. Ignoring field."); - while (cute_tiled_peak(m) != ',' && cute_tiled_peak(m) != '}') cute_tiled_next(m); - if (cute_tiled_peak(m) == '}') continue; + // This is technically different than type, but it used the same way in newer versions of Tiled + cute_tiled_intern_string(m, &object->type); break; default: @@ -2105,6 +2123,10 @@ cute_tiled_layer_t* cute_tiled_layers(cute_tiled_map_internal_t* m) switch (h) { + case 1485919047363370797U: // class + cute_tiled_intern_string(m, &layer->class_); + break; + case 14868627273436340303U: // compression CUTE_TILED_CHECK(0, "Compression is not yet supported. The expected tile format is CSV (uncompressed). Please see the docs if you are interested in compression."); break; @@ -2453,6 +2475,10 @@ cute_tiled_tileset_t* cute_tiled_tileset(cute_tiled_map_internal_t* m) cute_tiled_expect(m, '"'); break; + case 1485919047363370797U: // class + cute_tiled_intern_string(m, &tileset->class_); + break; + case 12570673734542705940U: // columns cute_tiled_read_int(m, &tileset->columns); break; @@ -2607,6 +2633,10 @@ static int cute_tiled_dispatch_map_internal(cute_tiled_map_internal_t* m) cute_tiled_expect(m, '"'); break; + case 1485919047363370797U: // class + cute_tiled_intern_string(m, &m->map.class_); + break; + case 5549108793316760247U: // compressionlevel { int compressionlevel; @@ -2741,6 +2771,7 @@ static void cute_tiled_deintern_layer(cute_tiled_map_internal_t* m, cute_tiled_l while (layer) { cute_tiled_object_t* object; + cute_tiled_deintern_string(m, &layer->class_); cute_tiled_deintern_string(m, &layer->draworder); cute_tiled_deintern_string(m, &layer->name); cute_tiled_deintern_string(m, &layer->type); @@ -2765,6 +2796,7 @@ static void cute_tiled_deintern_layer(cute_tiled_map_internal_t* m, cute_tiled_l static void cute_tiled_patch_tileset_strings(cute_tiled_map_internal_t* m, cute_tiled_tileset_t* tileset) { cute_tiled_tile_descriptor_t* tile_descriptor; + cute_tiled_deintern_string(m, &tileset->class_); cute_tiled_deintern_string(m, &tileset->image); cute_tiled_deintern_string(m, &tileset->name); cute_tiled_deintern_string(m, &tileset->type); @@ -2786,6 +2818,7 @@ static void cute_tiled_patch_interned_strings(cute_tiled_map_internal_t* m) { cute_tiled_tileset_t* tileset; cute_tiled_layer_t* layer; + cute_tiled_deintern_string(m, &m->map.class_); cute_tiled_deintern_string(m, &m->map.orientation); cute_tiled_deintern_string(m, &m->map.renderorder); cute_tiled_deintern_string(m, &m->map.tiledversion);