diff --git a/source/blender/blenkernel/BKE_grease_pencil.hh b/source/blender/blenkernel/BKE_grease_pencil.hh index 2e97596e9d8..d3151b7d0b5 100644 --- a/source/blender/blenkernel/BKE_grease_pencil.hh +++ b/source/blender/blenkernel/BKE_grease_pencil.hh @@ -1035,7 +1035,7 @@ GreasePencil *BKE_grease_pencil_new_nomain(); GreasePencil *BKE_grease_pencil_copy_for_eval(const GreasePencil *grease_pencil_src); /** * Move data from a grease pencil outside of the main data-base into a grease pencil in the - * data-base. Takes ownership of the source mesh. */ + * data-base. Takes ownership of the source grease pencil. */ void BKE_grease_pencil_nomain_to_grease_pencil(GreasePencil *grease_pencil_src, GreasePencil *grease_pencil_dst); diff --git a/source/blender/blenkernel/intern/grease_pencil.cc b/source/blender/blenkernel/intern/grease_pencil.cc index 5f164babfeb..820b1b9c806 100644 --- a/source/blender/blenkernel/intern/grease_pencil.cc +++ b/source/blender/blenkernel/intern/grease_pencil.cc @@ -1801,37 +1801,43 @@ void BKE_grease_pencil_nomain_to_grease_pencil(GreasePencil *grease_pencil_src, /* Drawings. */ const int drawing_array_num = grease_pencil_src->drawing_array_num; - grease_pencil_dst->resize_drawings(drawing_array_num); - for (const int i : IndexRange(drawing_array_num)) { - if (grease_pencil_dst->drawing_array[i]) { - switch (grease_pencil_dst->drawing_array[i]->type) { - case GP_DRAWING: - MEM_delete(&reinterpret_cast(grease_pencil_dst->drawing_array[i]) - ->wrap()); + if (drawing_array_num > 0) { + grease_pencil_dst->resize_drawings(drawing_array_num); + for (const int i : IndexRange(drawing_array_num)) { + if (grease_pencil_dst->drawing_array[i]) { + switch (grease_pencil_dst->drawing_array[i]->type) { + case GP_DRAWING: + MEM_delete( + &reinterpret_cast(grease_pencil_dst->drawing_array[i]) + ->wrap()); + break; + case GP_DRAWING_REFERENCE: + MEM_delete(&reinterpret_cast( + grease_pencil_dst->drawing_array[i]) + ->wrap()); + break; + } + } + switch (grease_pencil_src->drawing_array[i]->type) { + case GP_DRAWING: { + const Drawing &src_drawing = + reinterpret_cast(grease_pencil_src->drawing_array[i])->wrap(); + grease_pencil_dst->drawing_array[i] = reinterpret_cast( + MEM_new(__func__, src_drawing)); break; + } case GP_DRAWING_REFERENCE: - MEM_delete(&reinterpret_cast( - grease_pencil_dst->drawing_array[i]) - ->wrap()); + const DrawingReference &src_drawing_ref = + reinterpret_cast(grease_pencil_src->drawing_array[i]) + ->wrap(); + grease_pencil_dst->drawing_array[i] = reinterpret_cast( + MEM_new(__func__, src_drawing_ref)); break; } } - switch (grease_pencil_src->drawing_array[i]->type) { - case GP_DRAWING: { - const Drawing &src_drawing = - reinterpret_cast(grease_pencil_src->drawing_array[i])->wrap(); - grease_pencil_dst->drawing_array[i] = reinterpret_cast( - MEM_new(__func__, src_drawing)); - break; - } - case GP_DRAWING_REFERENCE: - const DrawingReference &src_drawing_ref = reinterpret_cast( - grease_pencil_src->drawing_array[i]) - ->wrap(); - grease_pencil_dst->drawing_array[i] = reinterpret_cast( - MEM_new(__func__, src_drawing_ref)); - break; - } + } + else { + free_drawing_array(*grease_pencil_dst); } /* Layers. */ @@ -1843,6 +1849,9 @@ void BKE_grease_pencil_nomain_to_grease_pencil(GreasePencil *grease_pencil_src, __func__, grease_pencil_src->root_group_ptr->wrap()); BLI_assert(grease_pencil_src->layers().size() == grease_pencil_dst->layers().size()); + /* Reset the active node. */ + grease_pencil_dst->active_node = nullptr; + CustomData_init_from(&grease_pencil_src->layers_data, &grease_pencil_dst->layers_data, eCustomDataMask(CD_MASK_ALL),