Эх сурвалжийг харах

[c][cpp] fix parsing of default skins without attachment for binary files.

badlogic 6 жил өмнө
parent
commit
fada823dcb

+ 12 - 7
spine-c/spine-c/src/spine/SkeletonBinary.c

@@ -825,12 +825,15 @@ spAttachment* spSkeletonBinary_readAttachment(spSkeletonBinary* self, _dataInput
 
 spSkin* spSkeletonBinary_readSkin(spSkeletonBinary* self, _dataInput* input, int/*bool*/ defaultSkin,
 		spSkeletonData* skeletonData, int/*bool*/ nonessential) {
-	spSkin* skin;
-	int i, n, ii, nn;
-	const char* skinName = defaultSkin ? "default" : readStringRef(input, skeletonData);
-	skin = spSkin_create(skinName);
-
-	if (!defaultSkin) {
+	spSkin *skin;
+	int i, n, ii, nn, slotCount;
+
+	if (defaultSkin) {
+		slotCount = readVarint(input, 1);
+		if (slotCount == 0) return 0;
+		skin = spSkin_create("default");
+	} else {
+		skin = spSkin_create(readStringRef(input, skeletonData));
 		for (i = 0, n = readVarint(input, 1); i < n; i++)
 			spBoneDataArray_add(skin->bones, skeletonData->bones[readVarint(input, 1)]);
 
@@ -842,9 +845,11 @@ spSkin* spSkeletonBinary_readSkin(spSkeletonBinary* self, _dataInput* input, int
 
 		for (i = 0, n = readVarint(input, 1); i < n; i++)
 			spPathConstraintDataArray_add(skin->pathConstraints, skeletonData->pathConstraints[readVarint(input, 1)]);
+
+		slotCount = readVarint(input, 1);
 	}
 
-	for (i = 0, n = readVarint(input, 1); i < n; ++i) {
+	for (i = 0; i < slotCount; ++i) {
 		int slotIndex = readVarint(input, 1);
 		for (ii = 0, nn = readVarint(input, 1); ii < nn; ++ii) {
 			const char* name = readStringRef(input, skeletonData);

+ 10 - 4
spine-cpp/spine-cpp/src/spine/SkeletonBinary.cpp

@@ -457,9 +457,14 @@ int SkeletonBinary::readVarint(DataInput *input, bool optimizePositive) {
 
 Skin *
 SkeletonBinary::readSkin(DataInput *input, bool defaultSkin, SkeletonData *skeletonData, bool nonessential) {
-	Skin *skin = new(__FILE__, __LINE__) Skin(defaultSkin ? "default" : readStringRef(input, skeletonData));
-
-	if (!defaultSkin) {
+	Skin *skin;
+	int slotCount = 0;
+	if (defaultSkin) {
+		slotCount = readVarint(input, true);
+		if (slotCount == 0) return NULL;
+		skin = new(__FILE__, __LINE__) Skin("default");
+	} else {
+		skin = new(__FILE__, __LINE__) Skin(readStringRef(input, skeletonData));
 		for (int i = 0, n = readVarint(input, true); i < n; i++)
 			skin->getBones().add(skeletonData->_bones[readVarint(input, true)]);
 
@@ -471,9 +476,10 @@ SkeletonBinary::readSkin(DataInput *input, bool defaultSkin, SkeletonData *skele
 
 		for (int i = 0, n = readVarint(input, true); i < n; i++)
 			skin->getConstraints().add(skeletonData->_pathConstraints[readVarint(input, true)]);
+		slotCount = readVarint(input, true);
 	}
 
-	for (int i = 0, n = readVarint(input, true); i < n; ++i) {
+	for (int i = 0; i < slotCount; ++i) {
 		int slotIndex = readVarint(input, true);
 		for (int ii = 0, nn = readVarint(input, true); ii < nn; ++ii) {
 			String name(readStringRef(input, skeletonData));