Commit: d76e64aad4325eeef009d83f5b8ae81be29eaa52 Author: Antonio Vazquez Date: Wed Feb 19 18:02:02 2020 +0100 Branches: greasepencil-object https://developer.blender.org/rBd76e64aad4325eeef009d83f5b8ae81be29eaa52
GPencil: Add new Value and Luminance sorting for Palettes =================================================================== M source/blender/blenkernel/BKE_paint.h M source/blender/blenkernel/intern/paint.c M source/blender/editors/interface/interface_templates.c M source/blender/editors/sculpt_paint/paint_ops.c =================================================================== diff --git a/source/blender/blenkernel/BKE_paint.h b/source/blender/blenkernel/BKE_paint.h index c26d8f8ec57..ae305720142 100644 --- a/source/blender/blenkernel/BKE_paint.h +++ b/source/blender/blenkernel/BKE_paint.h @@ -146,6 +146,8 @@ void BKE_palette_clear(struct Palette *palette); void BKE_palette_sort_hsv(struct tPaletteColorHSV *color_array, const int totcol); void BKE_palette_sort_svh(struct tPaletteColorHSV *color_array, const int totcol); +void BKE_palette_sort_vhs(struct tPaletteColorHSV *color_array, const int totcol); +void BKE_palette_sort_luminance(struct tPaletteColorHSV *color_array, const int totcol); bool BKE_palette_from_hash(struct Main *bmain, struct GHash *color_table, const char *name, diff --git a/source/blender/blenkernel/intern/paint.c b/source/blender/blenkernel/intern/paint.c index 327ab9d30d4..3ca58928933 100644 --- a/source/blender/blenkernel/intern/paint.c +++ b/source/blender/blenkernel/intern/paint.c @@ -754,6 +754,54 @@ static int palettecolor_compare_svh(const void *a1, const void *a2) return 0; } +static int palettecolor_compare_vhs(const void *a1, const void *a2) +{ + const tPaletteColorHSV *ps1 = a1, *ps2 = a2; + + /* Value. */ + if (1.0f - ps1->v > 1.0f - ps2->v) { + return 1; + } + else if (1.0f - ps1->v < 1.0f - ps2->v) { + return -1; + } + + /* Hue */ + if (ps1->h > ps2->h) { + return 1; + } + else if (ps1->h < ps2->h) { + return -1; + } + + /* Saturation. */ + if (ps1->s > ps2->s) { + return 1; + } + else if (ps1->s < ps2->s) { + return -1; + } + + return 0; +} + +static int palettecolor_compare_luminance(const void *a1, const void *a2) +{ + const tPaletteColorHSV *ps1 = a1, *ps2 = a2; + + float lumi1 = (ps1->rgb[0] + ps1->rgb[1] + ps1->rgb[2]) / 3.0f; + float lumi2 = (ps2->rgb[0] + ps2->rgb[1] + ps2->rgb[2]) / 3.0f; + + if (lumi1 > lumi2) { + return 1; + } + else if (lumi1 < lumi2) { + return -1; + } + + return 0; +} + void BKE_palette_sort_hsv(tPaletteColorHSV *color_array, const int totcol) { /* Sort by Hue , Saturation and Value. */ @@ -766,6 +814,18 @@ void BKE_palette_sort_svh(tPaletteColorHSV *color_array, const int totcol) qsort(color_array, totcol, sizeof(tPaletteColorHSV), palettecolor_compare_svh); } +void BKE_palette_sort_vhs(tPaletteColorHSV *color_array, const int totcol) +{ + /* Sort by Saturation, Value and Hue. */ + qsort(color_array, totcol, sizeof(tPaletteColorHSV), palettecolor_compare_vhs); +} + +void BKE_palette_sort_luminance(tPaletteColorHSV *color_array, const int totcol) +{ + /* Sort by Luminance (calculated with the average, enough for sorting). */ + qsort(color_array, totcol, sizeof(tPaletteColorHSV), palettecolor_compare_luminance); +} + bool BKE_palette_from_hash(Main *bmain, GHash *color_table, const char *name, const bool linear) { tPaletteColorHSV *color_array = NULL; diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c index 232c86f22bc..87d37746a75 100644 --- a/source/blender/editors/interface/interface_templates.c +++ b/source/blender/editors/interface/interface_templates.c @@ -5389,13 +5389,15 @@ static void ui_template_palette_menu(bContext *C, uiLayout *layout, void *but_p) { uiLayout *row; - uiItemL(layout, IFACE_("Sort by"), ICON_NONE); + uiItemL(layout, IFACE_("Sort by:"), ICON_NONE); row = uiLayoutRow(layout, false); - uiItemEnumO_value( - row, IFACE_("Hue, Saturation, Value"), ICON_NONE, "PALETTE_OT_sort", "type", 1); + uiItemEnumO_value(row, IFACE_("Hue"), ICON_NONE, "PALETTE_OT_sort", "type", 1); row = uiLayoutRow(layout, false); - uiItemEnumO_value( - row, IFACE_("Saturation, Value, Hue"), ICON_NONE, "PALETTE_OT_sort", "type", -1); + uiItemEnumO_value(row, IFACE_("Saturation"), ICON_NONE, "PALETTE_OT_sort", "type", 2); + row = uiLayoutRow(layout, false); + uiItemEnumO_value(row, IFACE_("Value"), ICON_NONE, "PALETTE_OT_sort", "type", 3); + row = uiLayoutRow(layout, false); + uiItemEnumO_value(row, IFACE_("Luminance"), ICON_NONE, "PALETTE_OT_sort", "type", 4); } void uiTemplatePalette(uiLayout *layout, diff --git a/source/blender/editors/sculpt_paint/paint_ops.c b/source/blender/editors/sculpt_paint/paint_ops.c index e615f60a9ed..bd82f05c34b 100644 --- a/source/blender/editors/sculpt_paint/paint_ops.c +++ b/source/blender/editors/sculpt_paint/paint_ops.c @@ -420,12 +420,18 @@ static int palette_sort_exec(bContext *C, wmOperator *op) t++; } /* Sort */ - if (type == -1) { + if (type == 1) { BKE_palette_sort_hsv(color_array, totcol); } - else { + else if (type == 2) { BKE_palette_sort_svh(color_array, totcol); } + else if (type == 3) { + BKE_palette_sort_vhs(color_array, totcol); + } + else { + BKE_palette_sort_luminance(color_array, totcol); + } /* Clear old color swatches. */ PaletteColor *color_next = NULL; @@ -457,15 +463,17 @@ static int palette_sort_exec(bContext *C, wmOperator *op) static void PALETTE_OT_sort(wmOperatorType *ot) { static const EnumPropertyItem sort_type[] = { - {-1, "HSV", 0, "Hue, Saturation, Value", ""}, - {1, "SVH", 0, "Saturation, Value, Hue", ""}, + {1, "HSV", 0, "Hue, Saturation, Value", ""}, + {2, "SVH", 0, "Saturation, Value, Hue", ""}, + {3, "VHS", 0, "Value, Hue, Saturation", ""}, + {4, "LUMINANCE", 0, "Luminance", ""}, {0, NULL, 0, NULL, NULL}, }; /* identifiers */ ot->name = "Sort Palette"; ot->idname = "PALETTE_OT_sort"; - ot->description = "Sort Palette Colors by Hue, Saturation and Value"; + ot->description = "Sort Palette Colors"; /* api callbacks */ ot->exec = palette_sort_exec; _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs