[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