diff options
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r-- | source/blender/blenkernel/BKE_gpencil.h | 4 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/gpencil.c | 51 |
2 files changed, 42 insertions, 13 deletions
diff --git a/source/blender/blenkernel/BKE_gpencil.h b/source/blender/blenkernel/BKE_gpencil.h index d0a1f102a43..657e66729e1 100644 --- a/source/blender/blenkernel/BKE_gpencil.h +++ b/source/blender/blenkernel/BKE_gpencil.h @@ -214,6 +214,10 @@ void BKE_gpencil_layer_mask_remove_ref(struct bGPdata *gpd, const char *name); struct bGPDlayer_Mask *BKE_gpencil_layer_mask_named_get(struct bGPDlayer *gpl, const char *name); void BKE_gpencil_layer_mask_sort(struct bGPdata *gpd, struct bGPDlayer *gpl); void BKE_gpencil_layer_mask_sort_all(struct bGPdata *gpd); +void BKE_gpencil_layer_mask_copy(const struct bGPDlayer *gpl_src, struct bGPDlayer *gpl_dst); +void BKE_gpencil_layer_mask_cleanup(struct bGPdata *gpd, struct bGPDlayer *gpl); +void BKE_gpencil_layer_mask_cleanup_all_layers(struct bGPdata *gpd); + void BKE_gpencil_layer_frames_sort(struct bGPDlayer *gpl, bool *r_has_duplicate_frames); struct bGPDlayer *BKE_gpencil_layer_get_by_name(struct bGPdata *gpd, diff --git a/source/blender/blenkernel/intern/gpencil.c b/source/blender/blenkernel/intern/gpencil.c index a66c3cf3573..64b5462f824 100644 --- a/source/blender/blenkernel/intern/gpencil.c +++ b/source/blender/blenkernel/intern/gpencil.c @@ -1076,12 +1076,7 @@ bGPDlayer *BKE_gpencil_layer_duplicate(const bGPDlayer *gpl_src, gpl_dst->prev = gpl_dst->next = NULL; /* Copy masks. */ - BLI_listbase_clear(&gpl_dst->mask_layers); - LISTBASE_FOREACH (bGPDlayer_Mask *, mask_src, &gpl_src->mask_layers) { - bGPDlayer_Mask *mask_dst = MEM_dupallocN(mask_src); - mask_dst->prev = mask_dst->next = NULL; - BLI_addtail(&gpl_dst->mask_layers, mask_dst); - } + BKE_gpencil_layer_mask_copy(gpl_src, gpl_dst); /* copy frames */ BLI_listbase_clear(&gpl_dst->frames); @@ -1122,13 +1117,8 @@ void BKE_gpencil_layer_copy_settings(const bGPDlayer *gpl_src, bGPDlayer *gpl_ds copy_v3_v3(gpl_dst->scale, gpl_src->scale); copy_m4_m4(gpl_dst->layer_mat, gpl_src->layer_mat); copy_m4_m4(gpl_dst->layer_invmat, gpl_src->layer_invmat); - /* Use Lights flag. */ - if (gpl_src->flag & GP_LAYER_USE_LIGHTS) { - gpl_dst->flag |= GP_LAYER_USE_LIGHTS; - } - else { - gpl_dst->flag &= ~GP_LAYER_USE_LIGHTS; - } + gpl_dst->blend_mode = gpl_src->blend_mode; + gpl_dst->flag = gpl_src->flag; } /** @@ -1647,6 +1637,41 @@ void BKE_gpencil_layer_mask_sort_all(bGPdata *gpd) } } +/** + * Make a copy of a given gpencil mask layers. + */ +void BKE_gpencil_layer_mask_copy(const bGPDlayer *gpl_src, bGPDlayer *gpl_dst) +{ + BLI_listbase_clear(&gpl_dst->mask_layers); + LISTBASE_FOREACH (bGPDlayer_Mask *, mask_src, &gpl_src->mask_layers) { + bGPDlayer_Mask *mask_dst = MEM_dupallocN(mask_src); + mask_dst->prev = mask_dst->next = NULL; + BLI_addtail(&gpl_dst->mask_layers, mask_dst); + } +} + +/** + * Clean any invalid mask layer. + */ +void BKE_gpencil_layer_mask_cleanup(bGPdata *gpd, bGPDlayer *gpl) +{ + LISTBASE_FOREACH_MUTABLE (bGPDlayer_Mask *, mask, &gpl->mask_layers) { + if (BKE_gpencil_layer_named_get(gpd, mask->name) == NULL) { + BKE_gpencil_layer_mask_remove(gpl, mask); + } + } +} + +/** + * Clean any invalid mask layer for all layers. + */ +void BKE_gpencil_layer_mask_cleanup_all_layers(bGPdata *gpd) +{ + LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) { + BKE_gpencil_layer_mask_cleanup(gpd, gpl); + } +} + static int gpencil_cb_cmp_frame(void *thunk, const void *a, const void *b) { const bGPDframe *frame_a = a; |