[Bf-blender-cvs] [ba077b368c7] greasepencil-object: Add function to fix palette bug

Antonio Vazquez noreply at git.blender.org
Tue Oct 3 17:59:06 CEST 2017


Commit: ba077b368c77180065e2156adb08c5454ee3b110
Author: Antonio Vazquez
Date:   Tue Oct 3 17:58:34 2017 +0200
Branches: greasepencil-object
https://developer.blender.org/rBba077b368c77180065e2156adb08c5454ee3b110

Add function to fix palette bug

Added a function to fix old files with palette set to NULL by program error.

This fix will be removed in the future, but now it's required to work in open movie files.

===================================================================

M	source/blender/blenkernel/BKE_gpencil.h
M	source/blender/blenkernel/intern/gpencil.c
M	source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_gpencil.h b/source/blender/blenkernel/BKE_gpencil.h
index de433d1ccb4..b897a9c89a0 100644
--- a/source/blender/blenkernel/BKE_gpencil.h
+++ b/source/blender/blenkernel/BKE_gpencil.h
@@ -82,7 +82,7 @@ struct bGPDlayer *BKE_gpencil_layer_addnew(struct bGPdata *gpd, const char *name
 struct bGPdata   *BKE_gpencil_data_addnew(const char name[]);
 
 struct bGPDframe *BKE_gpencil_frame_duplicate(const struct bGPDframe *gpf_src);
-struct bGPDframe *BKE_gpencil_frame_color_duplicate(const struct bGPDframe *gpf_src);
+struct bGPDframe *BKE_gpencil_frame_color_duplicate(const struct bContext *C, const struct bGPDframe *gpf_src, struct ToolSettings *ts);
 struct bGPDlayer *BKE_gpencil_layer_duplicate(const struct bGPDlayer *gpl_src);
 
 void BKE_gpencil_copy_data(struct Main *bmain, struct bGPdata *gpd_dst, const struct bGPdata *gpd_src, const int flag);
diff --git a/source/blender/blenkernel/intern/gpencil.c b/source/blender/blenkernel/intern/gpencil.c
index 131c0d974f4..9c37b2c4d2a 100644
--- a/source/blender/blenkernel/intern/gpencil.c
+++ b/source/blender/blenkernel/intern/gpencil.c
@@ -812,17 +812,39 @@ bGPDframe *BKE_gpencil_frame_duplicate(const bGPDframe *gpf_src)
 	return gpf_dst;
 }
 
+/* fix any null value in palettes (this must be removed in the future) */
+static void gpencil_fix_null_palette(const bContext *C, bGPDstroke *gps_src)
+{
+	Palette *tmp_palette = NULL;
+
+	tmp_palette = BKE_palette_get_active_from_context(C);
+	if (!tmp_palette) {
+		tmp_palette = BKE_palette_add_gpencil(C);
+	}
+
+	gps_src->palette = tmp_palette;
+	if (BKE_palette_is_empty(tmp_palette)) {
+		gps_src->palcolor = BKE_palette_color_add_name(tmp_palette, gps_src->colorname);
+	}
+	else {
+		gps_src->palcolor = BKE_palette_color_getbyname(tmp_palette, gps_src->colorname);
+		if (gps_src->palcolor == NULL) {
+			gps_src->palcolor = BKE_palette_color_get_active(tmp_palette);
+		}
+	}
+}
+
 /* make a copy of a given gpencil frame and copy colors too */
-bGPDframe *BKE_gpencil_frame_color_duplicate(const bGPDframe *gpf_src)
+bGPDframe *BKE_gpencil_frame_color_duplicate(const bContext *C, const bGPDframe *gpf_src, ToolSettings *ts)
 {
 	bGPDstroke *gps_dst;
 	bGPDframe *gpf_dst;
-
+	
 	/* error checking */
 	if (gpf_src == NULL) {
 		return NULL;
 	}
-
+	
 	/* make a copy of the source frame */
 	gpf_dst = MEM_dupallocN(gpf_src);
 
@@ -835,7 +857,13 @@ bGPDframe *BKE_gpencil_frame_color_duplicate(const bGPDframe *gpf_src)
 		BKE_gpencil_stroke_weights_duplicate(gps_src, gps_dst);
 
 		gps_dst->triangles = MEM_dupallocN(gps_src->triangles);
+		/* antoniov XXX: The palette never must be null, but this avoid crash after open if NULL */
+		if (gps_src->palette == NULL) {
+			gpencil_fix_null_palette(C, gps_src);
+		}
+
 		gps_dst->palcolor = MEM_dupallocN(gps_src->palcolor);
+
 		BLI_addtail(&gpf_dst->strokes, gps_dst);
 	}
 	/* return new frame */
diff --git a/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c b/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
index b0ee0623ab0..0c2f3122fbc 100644
--- a/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
+++ b/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
@@ -1063,6 +1063,8 @@ void DRW_gpencil_populate_multiedit(GPENCIL_e_data *e_data, void *vedata, Scene
 void DRW_gpencil_populate_datablock(GPENCIL_e_data *e_data, void *vedata, Scene *scene, Object *ob, ToolSettings *ts, bGPdata *gpd)
 {
 	GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl;
+	const DRWContextState *draw_ctx = DRW_context_state_get();
+	const bContext *C = draw_ctx->evil_C;
 	bGPDframe *derived_gpf = NULL;
 	bool no_onion = (bool)(gpd->flag & GP_DATA_STROKE_WEIGHTMODE);
 
@@ -1108,7 +1110,7 @@ void DRW_gpencil_populate_datablock(GPENCIL_e_data *e_data, void *vedata, Scene
 				BLI_ghash_remove(gpl->derived_data, ob->id.name, NULL, NULL);
 			}
 			/* create new data */
-			derived_gpf = BKE_gpencil_frame_color_duplicate(gpf);
+			derived_gpf = BKE_gpencil_frame_color_duplicate(C, gpf, ts);
 			BLI_ghash_insert(gpl->derived_data, ob->id.name, derived_gpf);
 		}



More information about the Bf-blender-cvs mailing list