[Bf-blender-cvs] [ad8ec8d8283] greasepencil-refactor: GPencil: Move mask functions to BKE and fix delete layer
Antonio Vazquez
noreply at git.blender.org
Tue Feb 11 19:03:51 CET 2020
Commit: ad8ec8d8283c6bd8e811db8f1f44a21280b3a0a0
Author: Antonio Vazquez
Date: Tue Feb 11 19:03:23 2020 +0100
Branches: greasepencil-refactor
https://developer.blender.org/rBad8ec8d8283c6bd8e811db8f1f44a21280b3a0a0
GPencil: Move mask functions to BKE and fix delete layer
When delete a layer, all layers using this layer as mask must be updated.
===================================================================
M source/blender/blenkernel/BKE_gpencil.h
M source/blender/blenkernel/intern/gpencil.c
M source/blender/editors/gpencil/gpencil_data.c
===================================================================
diff --git a/source/blender/blenkernel/BKE_gpencil.h b/source/blender/blenkernel/BKE_gpencil.h
index ee2651949ca..f907e7dc871 100644
--- a/source/blender/blenkernel/BKE_gpencil.h
+++ b/source/blender/blenkernel/BKE_gpencil.h
@@ -39,6 +39,7 @@ struct ToolSettings;
struct bDeformGroup;
struct bGPDframe;
struct bGPDlayer;
+struct bGPDlayer_Mask;
struct bGPDspoint;
struct bGPDstroke;
struct bGPdata;
@@ -186,6 +187,11 @@ void BKE_gpencil_layer_active_set(struct bGPdata *gpd, struct bGPDlayer *active)
void BKE_gpencil_layer_delete(struct bGPdata *gpd, struct bGPDlayer *gpl);
void BKE_gpencil_layer_autolock_set(struct bGPdata *gpd, const bool unlock);
+struct bGPDlayer_Mask *BKE_gpencil_layer_mask_add(struct bGPDlayer *gpl, const char *name);
+void BKE_gpencil_layer_mask_remove(struct bGPDlayer *gpl, struct bGPDlayer_Mask *mask);
+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);
+
/* Brush */
struct Material *BKE_gpencil_brush_material_get(struct Brush *brush);
void BKE_gpencil_brush_material_set(struct Brush *brush, struct Material *material);
diff --git a/source/blender/blenkernel/intern/gpencil.c b/source/blender/blenkernel/intern/gpencil.c
index a55fe76b7c0..3533e8e66f6 100644
--- a/source/blender/blenkernel/intern/gpencil.c
+++ b/source/blender/blenkernel/intern/gpencil.c
@@ -1030,6 +1030,46 @@ bGPDlayer *BKE_gpencil_layer_named_get(bGPdata *gpd, const char *name)
return BLI_findstring(&gpd->layers, name, offsetof(bGPDlayer, info));
}
+bGPDlayer_Mask *BKE_gpencil_layer_mask_named_get(bGPDlayer *gpl, const char *name)
+{
+ if (name[0] == '\0') {
+ return NULL;
+ }
+ return BLI_findstring(&gpl->mask_layers, name, offsetof(bGPDlayer_Mask, name));
+}
+
+bGPDlayer_Mask *BKE_gpencil_layer_mask_add(bGPDlayer *gpl, const char *name)
+{
+
+ bGPDlayer_Mask *mask = MEM_callocN(sizeof(bGPDlayer_Mask), "bGPDlayer_Mask");
+ BLI_addtail(&gpl->mask_layers, mask);
+ BLI_strncpy(mask->name, name, sizeof(mask->name));
+ gpl->act_mask++;
+
+ return mask;
+}
+
+void BKE_gpencil_layer_mask_remove(bGPDlayer *gpl, bGPDlayer_Mask *mask)
+{
+ BLI_freelinkN(&gpl->mask_layers, mask);
+ gpl->act_mask--;
+ CLAMP_MIN(gpl->act_mask, 0);
+}
+
+void BKE_gpencil_layer_mask_remove_ref(bGPdata *gpd, const char *name)
+{
+ bGPDlayer_Mask *mask_next;
+
+ LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) {
+ for (bGPDlayer_Mask *mask = gpl->mask_layers.first; mask; mask = mask_next) {
+ mask_next = mask->next;
+ if (STREQ(mask->name, name)) {
+ BKE_gpencil_layer_mask_remove(gpl, mask);
+ }
+ }
+ }
+}
+
/* get the active gp-layer for editing */
bGPDlayer *BKE_gpencil_layer_active_get(bGPdata *gpd)
{
@@ -1117,6 +1157,9 @@ void BKE_gpencil_layer_delete(bGPdata *gpd, bGPDlayer *gpl)
/* Free Masks. */
BKE_gpencil_free_layer_masks(gpl);
+ /* Remove any reference to that layer in masking lists. */
+ BKE_gpencil_layer_mask_remove_ref(gpd, gpl->info);
+
/* free icon providing preview of icon color */
BKE_icon_delete(gpl->runtime.icon_id);
diff --git a/source/blender/editors/gpencil/gpencil_data.c b/source/blender/editors/gpencil/gpencil_data.c
index 4d7c016fb94..75064b59528 100644
--- a/source/blender/editors/gpencil/gpencil_data.c
+++ b/source/blender/editors/gpencil/gpencil_data.c
@@ -1203,7 +1203,7 @@ static int gp_merge_layer_exec(bContext *C, wmOperator *op)
STREQ(mask->name, gpl_current->info)) {
continue;
}
- if (!BLI_findstring(&gpl_current->mask_layers, mask->name, offsetof(bGPDlayer_Mask, name))) {
+ if (!BKE_gpencil_layer_mask_named_get(gpl_current, mask->name)) {
bGPDlayer_Mask *mask_new = MEM_dupallocN(mask);
BLI_addtail(&gpl_current->mask_layers, mask_new);
gpl_current->act_mask++;
@@ -3338,7 +3338,7 @@ static int gp_layer_mask_add_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
- if (BLI_findstring(&gpl_active->mask_layers, name, offsetof(bGPDlayer_Mask, name))) {
+ if (BKE_gpencil_layer_mask_named_get(gpl_active, name)) {
BKE_report(op->reports, RPT_ERROR, "Layer already added");
return OPERATOR_CANCELLED;
}
@@ -3348,10 +3348,7 @@ static int gp_layer_mask_add_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
- bGPDlayer_Mask *mask = MEM_callocN(sizeof(bGPDlayer_Mask), "bGPDlayer_Mask");
- BLI_addtail(&gpl_active->mask_layers, mask);
- BLI_strncpy(mask->name, name, sizeof(mask->name));
- gpl_active->act_mask++;
+ BKE_gpencil_layer_mask_add(gpl_active, name);
/* notifiers */
if (gpd) {
@@ -3395,9 +3392,7 @@ static int gp_layer_mask_remove_exec(bContext *C, wmOperator *op)
if (gpl->act_mask > 0) {
bGPDlayer_Mask *mask = BLI_findlink(&gpl->mask_layers, gpl->act_mask - 1);
if (mask != NULL) {
- BLI_freelinkN(&gpl->mask_layers, mask);
- gpl->act_mask--;
- CLAMP_MIN(gpl->act_mask, 0);
+ BKE_gpencil_layer_mask_remove(gpl, mask);
if ((gpl->mask_layers.first != NULL) && (gpl->act_mask == 0)) {
gpl->act_mask = 1;
}
More information about the Bf-blender-cvs
mailing list