[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