From 5060f26f500997232aa1033c3d5fccbb1eb71ae4 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Sat, 5 Nov 2022 18:14:26 +0100 Subject: Cleanup: Move function to legacy mesh conversion file --- source/blender/blenkernel/intern/customdata.cc | 33 -------------------------- 1 file changed, 33 deletions(-) (limited to 'source/blender/blenkernel/intern/customdata.cc') diff --git a/source/blender/blenkernel/intern/customdata.cc b/source/blender/blenkernel/intern/customdata.cc index 03a0f17a4bb..75f41dae8d3 100644 --- a/source/blender/blenkernel/intern/customdata.cc +++ b/source/blender/blenkernel/intern/customdata.cc @@ -3596,39 +3596,6 @@ const char *CustomData_get_layer_name(const CustomData *data, const int type, co /* BMesh functions */ -void CustomData_bmesh_update_active_layers(CustomData *fdata, CustomData *ldata) -{ - int act; - - if (CustomData_has_layer(ldata, CD_MLOOPUV)) { - act = CustomData_get_active_layer(ldata, CD_MLOOPUV); - CustomData_set_layer_active(fdata, CD_MTFACE, act); - - act = CustomData_get_render_layer(ldata, CD_MLOOPUV); - CustomData_set_layer_render(fdata, CD_MTFACE, act); - - act = CustomData_get_clone_layer(ldata, CD_MLOOPUV); - CustomData_set_layer_clone(fdata, CD_MTFACE, act); - - act = CustomData_get_stencil_layer(ldata, CD_MLOOPUV); - CustomData_set_layer_stencil(fdata, CD_MTFACE, act); - } - - if (CustomData_has_layer(ldata, CD_PROP_BYTE_COLOR)) { - act = CustomData_get_active_layer(ldata, CD_PROP_BYTE_COLOR); - CustomData_set_layer_active(fdata, CD_MCOL, act); - - act = CustomData_get_render_layer(ldata, CD_PROP_BYTE_COLOR); - CustomData_set_layer_render(fdata, CD_MCOL, act); - - act = CustomData_get_clone_layer(ldata, CD_PROP_BYTE_COLOR); - CustomData_set_layer_clone(fdata, CD_MCOL, act); - - act = CustomData_get_stencil_layer(ldata, CD_PROP_BYTE_COLOR); - CustomData_set_layer_stencil(fdata, CD_MCOL, act); - } -} - void CustomData_bmesh_init_pool(CustomData *data, const int totelem, const char htype) { int chunksize; -- cgit v1.2.3 From e031a45d6026d2fce23fca2b1001e783d2642031 Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Mon, 7 Nov 2022 11:42:26 +0100 Subject: Fix T102238: double free when storing attribute on empty geometry --- source/blender/blenkernel/intern/customdata.cc | 1 + 1 file changed, 1 insertion(+) (limited to 'source/blender/blenkernel/intern/customdata.cc') diff --git a/source/blender/blenkernel/intern/customdata.cc b/source/blender/blenkernel/intern/customdata.cc index 03a0f17a4bb..e4405abdde8 100644 --- a/source/blender/blenkernel/intern/customdata.cc +++ b/source/blender/blenkernel/intern/customdata.cc @@ -2800,6 +2800,7 @@ static CustomDataLayer *customData_add_layer__internal(CustomData *data, int flag = 0; if (!typeInfo->defaultname && CustomData_has_layer(data, type)) { + MEM_SAFE_FREE(layerdata); return &data->layers[CustomData_get_layer_index(data, type)]; } -- cgit v1.2.3 From 0a7308a0f1493a5b0d8ab7b764893f1772ab1008 Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Tue, 8 Nov 2022 16:25:49 +0100 Subject: 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. --- source/blender/blenkernel/intern/customdata.cc | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) (limited to 'source/blender/blenkernel/intern/customdata.cc') diff --git a/source/blender/blenkernel/intern/customdata.cc b/source/blender/blenkernel/intern/customdata.cc index e4405abdde8..01017466764 100644 --- a/source/blender/blenkernel/intern/customdata.cc +++ b/source/blender/blenkernel/intern/customdata.cc @@ -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)) { -- cgit v1.2.3