[Bf-blender-cvs] [5d69c71adf1] greasepencil-object: Palette Slots: Internal API's for managing Palettes

Joshua Leung noreply at git.blender.org
Wed Oct 4 14:16:55 CEST 2017


Commit: 5d69c71adf1ac74fc48f72fda9f6cbd2414b2c8c
Author: Joshua Leung
Date:   Mon Oct 2 15:17:00 2017 +1300
Branches: greasepencil-object
https://developer.blender.org/rB5d69c71adf1ac74fc48f72fda9f6cbd2414b2c8c

Palette Slots: Internal API's for managing Palettes

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

M	source/blender/blenkernel/BKE_gpencil.h
M	source/blender/blenkernel/intern/gpencil.c

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

diff --git a/source/blender/blenkernel/BKE_gpencil.h b/source/blender/blenkernel/BKE_gpencil.h
index b897a9c89a0..d99e3a16670 100644
--- a/source/blender/blenkernel/BKE_gpencil.h
+++ b/source/blender/blenkernel/BKE_gpencil.h
@@ -39,6 +39,7 @@ struct bGPDlayer;
 struct bGPDframe;
 struct bGPDspoint;
 struct bGPDstroke;
+struct bGPDpaletteref;
 struct bGPDpalette;
 struct bGPDpalettecolor;
 struct Main;
@@ -146,7 +147,14 @@ void BKE_gpencil_brush_setactive(struct ToolSettings *ts, struct bGPDbrush *acti
 void BKE_gpencil_brush_delete(struct ToolSettings *ts, struct bGPDbrush *brush);
 
 /* Palette Slots */
+void BKE_gpencil_palette_slot_free(struct bGPdata *gpd, struct bGPDpaletteref *gpref);
 
+struct bGPDpaletteref *BKE_gpencil_paletteslot_get_active(const struct bGPdata *gpd);
+void BKE_gpencil_paletteslot_set_active(struct bGPdata *gpd, const struct bGPDpaletteref *gpref);
+void BKE_gpencil_paletteslot_set_active_palette(struct bGPdata *gpd, const struct Palette *palette);
+struct bGPDpaletteref *BKE_gpencil_paletteslot_find(struct bGPdata *gpd, const struct Palette *palette);
+
+struct bGPDpaletteref *BKE_gpencil_paletteslot_addnew(struct bGPdata *gpd, struct Palette *palette);
 
 
 /* Palettes - Deprecated (2.78-2.79) */
diff --git a/source/blender/blenkernel/intern/gpencil.c b/source/blender/blenkernel/intern/gpencil.c
index 9c37b2c4d2a..6fc10ed66a4 100644
--- a/source/blender/blenkernel/intern/gpencil.c
+++ b/source/blender/blenkernel/intern/gpencil.c
@@ -239,6 +239,39 @@ void BKE_gpencil_free_layers(ListBase *list)
 	}
 }
 
+/* Free palette slot
+ * NOTE: This doesn't unlink the palette from any strokes that may be using it
+ */
+void BKE_gpencil_palette_slot_free(bGPdata *gpd, bGPDpaletteref *gpref)
+{
+	if (ELEM(NULL, gpd, gpref))
+		return;
+	
+	/* unlink palette */
+	if (gpref->palette) {
+		id_us_min(&gpref->palette->id);
+	}
+	
+	/* free slot */
+	BLI_freelinkN(&gpd->palette_slots, gpref);
+}
+
+/* Free palette slots */
+static void BKE_gpencil_free_paletteslots(bGPdata *gpd)
+{
+	bGPDpaletteref *gpref, *gpr_next;
+	
+	/* error checking */
+	if (gpd == NULL) return;
+	
+	/* delete palette slots */
+	for (gpref = gpd->palette_slots.first; gpref; gpref = gpr_next) {
+		gpr_next = gpref->next;
+		
+		BKE_gpencil_palette_slot_free(gpd, gpref);
+	}
+}
+
 /* clear all runtime derived data */
 static void BKE_gpencil_clear_derived(bGPDlayer *gpl)
 {
@@ -306,6 +339,11 @@ void BKE_gpencil_free(bGPdata *gpd, bool free_all)
 	if (free_all) {
 		/* clear cache */
 		BKE_gpencil_batch_cache_free(gpd);
+		
+		/* free palette slots */
+		BKE_gpencil_free_paletteslots(gpd);
+		
+		/* free palettes (deprecated) */
 		BKE_gpencil_free_palettes(&gpd->palettes);
 	}
 }
@@ -1371,6 +1409,89 @@ void BKE_gpencil_brush_delete(ToolSettings *ts, bGPDbrush *brush)
 }
 
 /* ************************************************** */
+/* GP Palette Slots API */
+
+/* Get active palette slot */
+bGPDpaletteref *BKE_gpencil_paletteslot_get_active(const bGPdata *gpd)
+{
+	/* sanity checks */
+	if (ELEM(NULL, gpd, gpd->palette_slots.first))
+		return NULL;
+	
+	/* use active_index value to find the relevant slot */
+	return BLI_findlink(&gpd->palette_slots, gpd->active_palette_slot);
+}
+
+/* Set active palette slot */
+void BKE_gpencil_paletteslot_set_active(bGPdata *gpd, const bGPDpaletteref *gpref)
+{
+	/* sanity checks */
+	if (ELEM(NULL, gpd, gpref))
+		return;
+	
+	/* try to find index of this item, assuming it exists in the list */
+	gpd->active_palette_slot = BLI_findindex(&gpd->palette_slots, gpref);
+}
+
+/* Make the slot using this palette active */
+void BKE_gpencil_paletteslot_set_active_palette(bGPdata *gpd, const Palette *palette)
+{
+	bGPDpaletteref *gpref = BKE_gpencil_paletteslot_find(gpd, palette);
+	BKE_gpencil_paletteslot_set_active(gpd, gpref);
+}
+
+/* Get palette slot that uses this Palette */
+bGPDpaletteref *BKE_gpencil_paletteslot_find(bGPdata *gpd, const Palette *palette)
+{
+	bGPDpaletteref *gpref;
+	
+	/* sanity checks */
+	if (ELEM(NULL, gpd, palette))
+		return NULL;
+	
+	/* search for the palette */
+	for (gpref = gpd->palette_slots.first; gpref; gpref = gpref->next) {
+		if (gpref->palette == palette)
+			return gpref;
+	}
+	
+	/* not found */
+	return NULL;
+}
+
+/* Create a new palette slot (and optionally assign a palette to it) */
+bGPDpaletteref *BKE_gpencil_paletteslot_addnew(bGPdata *gpd, Palette *palette)
+{
+	bGPDpaletteref *gpref;
+	
+	/* sanity checks */
+	if (gpd == NULL) {
+		return NULL;
+	}
+	if (palette) {
+		/* check if it's used already - don't allow for duplicates */
+		gpref = BKE_gpencil_paletteslot_find(gpd, palette);
+		if (gpref) {
+			/* just return existing? */
+			return gpref;
+		}
+	}
+	
+	/* allocate a new slot, and assigned palette as user */
+	gpref = MEM_callocN(sizeof(bGPDpaletteref), "bGPDpaletteref");
+	BLI_addtail(&gpd->palette_slots, gpref);
+	
+	/* assign palette */
+	if (palette) {
+		gpref->palette = palette;
+		id_us_plus(&palette->id);
+	}
+	
+	/* return new slot */
+	return gpref;
+}
+
+/* ************************************************** */
 /* GP Palettes API (Deprecated) */
 
 /* Free all of a gp-colors */



More information about the Bf-blender-cvs mailing list