1
1

Fix: improve CD_ASSIGN handling when adding custom data layer

Previously, the code would incorrectly free the passed in custom data
layer even when `CD_ASSIGN` was not used. Now the function actually
supports assigning the data to the layer. This only fixes the case for
custom data layer types that only support a single layer like `CD_MEDGE`.

Informally reviewed by Hans Goudey.
This commit is contained in:
2022-11-08 16:25:49 +01:00
parent c3391d537b
commit 0a7308a0f1

View File

@@ -2799,11 +2799,6 @@ static CustomDataLayer *customData_add_layer__internal(CustomData *data,
const LayerTypeInfo *typeInfo = layerType_getInfo(type);
int flag = 0;
if (!typeInfo->defaultname && CustomData_has_layer(data, type)) {
MEM_SAFE_FREE(layerdata);
return &data->layers[CustomData_get_layer_index(data, type)];
}
void *newlayerdata = nullptr;
switch (alloctype) {
case CD_SET_DEFAULT:
@@ -2856,6 +2851,21 @@ static CustomDataLayer *customData_add_layer__internal(CustomData *data,
break;
}
/* Some layer types only support a single layer. */
const bool reuse_existing_layer = !typeInfo->defaultname && CustomData_has_layer(data, type);
if (reuse_existing_layer) {
CustomDataLayer &layer = data->layers[CustomData_get_layer_index(data, type)];
if (layer.data != nullptr) {
if (typeInfo->free) {
typeInfo->free(layer.data, totelem, typeInfo->size);
}
MEM_SAFE_FREE(layer.data);
}
layer.data = newlayerdata;
layer.flag = flag;
return &layer;
}
int index = data->totlayer;
if (index >= data->maxlayer) {
if (!customData_resize(data, CUSTOMDATA_GROW)) {