Fix T66957: GPencil material isolate crash when slot is empty
authorAntonioya <blendergit@gmail.com>
Mon, 15 Jul 2019 07:52:14 +0000 (09:52 +0200)
committerAntonioya <blendergit@gmail.com>
Mon, 15 Jul 2019 07:53:27 +0000 (09:53 +0200)
When the slot of the material is empty, the loop to lock the materials tried to use the material but this was NULL.

Check if material is NULL before using it in other operators too.

source/blender/editors/gpencil/gpencil_data.c

index 941c7645dc02a523753523ba9933cd2ee8fda480..90a2b2d613cd035112d64e99e142dee10819ba0e 100644 (file)
@@ -1521,8 +1521,10 @@ static int gp_stroke_lock_color_exec(bContext *C, wmOperator *UNUSED(op))
   /* first lock all colors */
   for (short i = 0; i < *totcol; i++) {
     Material *tmp_ma = give_current_material(ob, i + 1);
-    tmp_ma->gp_style->flag |= GP_STYLE_COLOR_LOCKED;
-    DEG_id_tag_update(&tmp_ma->id, ID_RECALC_COPY_ON_WRITE);
+    if (tmp_ma) {
+      tmp_ma->gp_style->flag |= GP_STYLE_COLOR_LOCKED;
+      DEG_id_tag_update(&tmp_ma->id, ID_RECALC_COPY_ON_WRITE);
+    }
   }
 
   /* loop all selected strokes and unlock any color */
@@ -2433,10 +2435,12 @@ static int gpencil_lock_layer_exec(bContext *C, wmOperator *UNUSED(op))
 
   for (short i = 0; i < *totcol; i++) {
     ma = give_current_material(ob, i + 1);
-    gp_style = ma->gp_style;
-    gp_style->flag |= GP_STYLE_COLOR_LOCKED;
-    gp_style->flag |= GP_STYLE_COLOR_HIDE;
-    DEG_id_tag_update(&ma->id, ID_RECALC_COPY_ON_WRITE);
+    if (ma) {
+      gp_style = ma->gp_style;
+      gp_style->flag |= GP_STYLE_COLOR_LOCKED;
+      gp_style->flag |= GP_STYLE_COLOR_HIDE;
+      DEG_id_tag_update(&ma->id, ID_RECALC_COPY_ON_WRITE);
+    }
   }
 
   /* loop all selected strokes and unlock any color used in active layer */
@@ -2515,7 +2519,7 @@ static int gpencil_color_isolate_exec(bContext *C, wmOperator *op)
   for (short i = 0; i < *totcol; i++) {
     ma = give_current_material(ob, i + 1);
     /* Skip if this is the active one */
-    if (ma == active_ma) {
+    if ((ma == NULL) || (ma == active_ma)) {
       continue;
     }
 
@@ -2534,6 +2538,9 @@ static int gpencil_color_isolate_exec(bContext *C, wmOperator *op)
     /* Set flags on all "other" colors */
     for (short i = 0; i < *totcol; i++) {
       ma = give_current_material(ob, i + 1);
+      if (ma == NULL) {
+        continue;
+      }
       gp_style = ma->gp_style;
       if (gp_style == active_color) {
         continue;
@@ -2548,6 +2555,9 @@ static int gpencil_color_isolate_exec(bContext *C, wmOperator *op)
     /* Clear flags - Restore everything else */
     for (short i = 0; i < *totcol; i++) {
       ma = give_current_material(ob, i + 1);
+      if (ma == NULL) {
+        continue;
+      }
       gp_style = ma->gp_style;
       gp_style->flag &= ~flags;
       DEG_id_tag_update(&ma->id, ID_RECALC_COPY_ON_WRITE);
@@ -2610,10 +2620,12 @@ static int gpencil_color_hide_exec(bContext *C, wmOperator *op)
     MaterialGPencilStyle *color = NULL;
     for (short i = 0; i < *totcol; i++) {
       ma = give_current_material(ob, i + 1);
-      color = ma->gp_style;
-      if (active_color != color) {
-        color->flag |= GP_STYLE_COLOR_HIDE;
-        DEG_id_tag_update(&ma->id, ID_RECALC_COPY_ON_WRITE);
+      if (ma) {
+        color = ma->gp_style;
+        if (active_color != color) {
+          color->flag |= GP_STYLE_COLOR_HIDE;
+          DEG_id_tag_update(&ma->id, ID_RECALC_COPY_ON_WRITE);
+        }
       }
     }
   }
@@ -2671,9 +2683,11 @@ static int gpencil_color_reveal_exec(bContext *C, wmOperator *UNUSED(op))
 
   for (short i = 0; i < *totcol; i++) {
     ma = give_current_material(ob, i + 1);
-    gp_style = ma->gp_style;
-    gp_style->flag &= ~GP_STYLE_COLOR_HIDE;
-    DEG_id_tag_update(&ma->id, ID_RECALC_COPY_ON_WRITE);
+    if (ma) {
+      gp_style = ma->gp_style;
+      gp_style->flag &= ~GP_STYLE_COLOR_HIDE;
+      DEG_id_tag_update(&ma->id, ID_RECALC_COPY_ON_WRITE);
+    }
   }
 
   /* updates */
@@ -2722,9 +2736,11 @@ static int gpencil_color_lock_all_exec(bContext *C, wmOperator *UNUSED(op))
 
   for (short i = 0; i < *totcol; i++) {
     ma = give_current_material(ob, i + 1);
-    gp_style = ma->gp_style;
-    gp_style->flag |= GP_STYLE_COLOR_LOCKED;
-    DEG_id_tag_update(&ma->id, ID_RECALC_COPY_ON_WRITE);
+    if (ma) {
+      gp_style = ma->gp_style;
+      gp_style->flag |= GP_STYLE_COLOR_LOCKED;
+      DEG_id_tag_update(&ma->id, ID_RECALC_COPY_ON_WRITE);
+    }
   }
 
   /* updates */
@@ -2773,9 +2789,11 @@ static int gpencil_color_unlock_all_exec(bContext *C, wmOperator *UNUSED(op))
 
   for (short i = 0; i < *totcol; i++) {
     ma = give_current_material(ob, i + 1);
-    gp_style = ma->gp_style;
-    gp_style->flag &= ~GP_STYLE_COLOR_LOCKED;
-    DEG_id_tag_update(&ma->id, ID_RECALC_COPY_ON_WRITE);
+    if (ma) {
+      gp_style = ma->gp_style;
+      gp_style->flag &= ~GP_STYLE_COLOR_LOCKED;
+      DEG_id_tag_update(&ma->id, ID_RECALC_COPY_ON_WRITE);
+    }
   }
 
   /* updates */