From eaff42c84000dd39be0e42fe3bb8e488d9d193b3 Mon Sep 17 00:00:00 2001 From: Mario Zechner Date: Sun, 13 Jul 2025 04:43:05 +0200 Subject: [PATCH] [cpp] Fix primitive type array reading in SkeletonJson/SkeletonBinary --- .../2025-01-11-03-02-54-test-suite/task.md | 2 +- spine-cpp/include/spine/Json.h | 21 +++++++++++++++++-- spine-cpp/include/spine/SkeletonBinary.h | 2 +- spine-cpp/src/spine/SkeletonBinary.cpp | 8 +++---- spine-cpp/src/spine/SkeletonJson.cpp | 12 ++++++----- 5 files changed, 32 insertions(+), 13 deletions(-) diff --git a/docs/todos/work/2025-01-11-03-02-54-test-suite/task.md b/docs/todos/work/2025-01-11-03-02-54-test-suite/task.md index dc55381f9..5ebb29104 100644 --- a/docs/todos/work/2025-01-11-03-02-54-test-suite/task.md +++ b/docs/todos/work/2025-01-11-03-02-54-test-suite/task.md @@ -320,7 +320,7 @@ interface NestedArray { - [ ] Update language generators to consume IR: - [x] Replace tests/generate-java-serializer.ts with IR-based version - [x] Sort skin entries by slot index before emission in Java - - [ ] Modify tests/generate-cpp-serializer.ts to use IR + - [x] Modify tests/generate-cpp-serializer.ts to use IR - [ ] Create tests/generate-ts-serializer.ts using IR - [ ] Create tests/generate-cs-serializer.ts using IR - [ ] Language generators focus purely on syntax transformation diff --git a/spine-cpp/include/spine/Json.h b/spine-cpp/include/spine/Json.h index 8f025075f..fc5095160 100644 --- a/spine-cpp/include/spine/Json.h +++ b/spine-cpp/include/spine/Json.h @@ -52,8 +52,16 @@ namespace spine { static const int JSON_ARRAY; static const int JSON_OBJECT; - template - static bool asArray(Json *value, Array &array) { + static bool asFloatArray(Json *value, Array &array) { + if (value == NULL) return false; + array.setSize(value->_size, 0); + Json *vertex = value->_child; + for (int i = 0; vertex; vertex = vertex->_next, i++) + array[i] = vertex->_valueFloat; + return true; + } + + static bool asIntArray(Json *value, Array &array) { if (value == NULL) return false; array.setSize(value->_size, 0); Json *vertex = value->_child; @@ -62,6 +70,15 @@ namespace spine { return true; } + static bool asUnsignedShortArray(Json *value, Array &array) { + if (value == NULL) return false; + array.setSize(value->_size, 0); + Json *vertex = value->_child; + for (int i = 0; vertex; vertex = vertex->_next, i++) + array[i] = (unsigned short)vertex->_valueInt; + return true; + } + /* Get item "string" from object. Case insensitive. */ static Json *getItem(Json *object, const char *string); diff --git a/spine-cpp/include/spine/SkeletonBinary.h b/spine-cpp/include/spine/SkeletonBinary.h index 729514457..dec56fb56 100644 --- a/spine-cpp/include/spine/SkeletonBinary.h +++ b/spine-cpp/include/spine/SkeletonBinary.h @@ -243,7 +243,7 @@ namespace spine { void readFloatArray(DataInput &input, int n, float scale, Array &array); - void readShortArray(DataInput &input, Array &array, int n); + void readUnsignedShortArray(DataInput &input, Array &array, int n); Animation *readAnimation(DataInput &input, const String &name, SkeletonData &skeletonData); diff --git a/spine-cpp/src/spine/SkeletonBinary.cpp b/spine-cpp/src/spine/SkeletonBinary.cpp index 52d50c118..c2b233912 100644 --- a/spine-cpp/src/spine/SkeletonBinary.cpp +++ b/spine-cpp/src/spine/SkeletonBinary.cpp @@ -642,12 +642,12 @@ Attachment *SkeletonBinary::readAttachment(DataInput &input, Skin &skin, int slo Array uvs; readFloatArray(input, verticesLength, 1, uvs); Array triangles; - readShortArray(input, triangles, (verticesLength - hullLength - 2) * 3); + readUnsignedShortArray(input, triangles, (verticesLength - hullLength - 2) * 3); Array edges; float width = 0, height = 0; if (nonessential) { - readShortArray(input, edges, input.readInt(true)); + readUnsignedShortArray(input, edges, input.readInt(true)); width = input.readFloat(); height = input.readFloat(); } @@ -798,10 +798,10 @@ void SkeletonBinary::readFloatArray(DataInput &input, int n, float scale, Array< } } -void SkeletonBinary::readShortArray(DataInput &input, Array &array, int n) { +void SkeletonBinary::readUnsignedShortArray(DataInput &input, Array &array, int n) { array.setSize(n, 0); for (int i = 0; i < n; ++i) { - array[i] = (short) input.readInt(true); + array[i] = (unsigned short) input.readInt(true); } } diff --git a/spine-cpp/src/spine/SkeletonJson.cpp b/spine-cpp/src/spine/SkeletonJson.cpp index c20d2a5e3..48d59ae4b 100644 --- a/spine-cpp/src/spine/SkeletonJson.cpp +++ b/spine-cpp/src/spine/SkeletonJson.cpp @@ -679,17 +679,17 @@ Attachment *SkeletonJson::readAttachment(Json *map, Skin *skin, int slotIndex, c } Array uvs; - if (!Json::asArray(Json::getItem(map, "uvs"), uvs)) return NULL; + if (!Json::asFloatArray(Json::getItem(map, "uvs"), uvs)) return NULL; readVertices(map, mesh, uvs.size()); Array triangles; - if (!Json::asArray(Json::getItem(map, "triangles"), triangles)) return NULL; + if (!Json::asUnsignedShortArray(Json::getItem(map, "triangles"), triangles)) return NULL; mesh->_triangles.clearAndAddAll(triangles); mesh->_regionUVs.clearAndAddAll(uvs); if (mesh->_region != NULL) mesh->updateRegion(); if (Json::getInt(map, "hull", 0)) mesh->setHullLength(Json::getInt(map, "hull", 0) << 1); Array edges; - Json::asArray(Json::getItem(map, "edges"), edges); + Json::asUnsignedShortArray(Json::getItem(map, "edges"), edges); if (edges.size() > 0) mesh->_edges.clearAndAddAll(edges); return mesh; } @@ -702,7 +702,7 @@ Attachment *SkeletonJson::readAttachment(Json *map, Skin *skin, int slotIndex, c int vertexCount = Json::getInt(map, "vertexCount", 0); readVertices(map, path, vertexCount << 1); - if (!Json::asArray(Json::getItem(map, "lengths"), path->_lengths)) return NULL; + if (!Json::asFloatArray(Json::getItem(map, "lengths"), path->_lengths)) return NULL; for (int i = 0; i < (int) path->_lengths.size(); i++) path->_lengths[i] *= scale; @@ -755,7 +755,9 @@ Sequence *SkeletonJson::readSequence(Json *item) { void SkeletonJson::readVertices(Json *map, VertexAttachment *attachment, size_t verticesLength) { attachment->setWorldVerticesLength(verticesLength); Array vertices; - if (!Json::asArray(Json::getItem(map, "vertices"), vertices)) return; + if (!Json::asFloatArray(Json::getItem(map, "vertices"), vertices)) { + return; + } if (verticesLength == vertices.size()) { if (_scale != 1) { for (int i = 0; i < (int) vertices.size(); ++i)