From 5cfb6f984b562b0736b89375719995950be17396 Mon Sep 17 00:00:00 2001 From: Damian Schneider Date: Sat, 3 Jan 2026 10:07:04 +0100 Subject: [PATCH] Palettes fix (#5263) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix for #5201 - use constants instead of magic numbers Authored-by: Blaž Kristan --- .../usermod_v2_rotary_encoder_ui_ALT.cpp | 14 ++++----- wled00/FX_fcn.cpp | 8 ++--- wled00/const.h | 6 ++-- wled00/json.cpp | 29 +++++++++---------- 4 files changed, 28 insertions(+), 29 deletions(-) diff --git a/usermods/usermod_v2_rotary_encoder_ui_ALT/usermod_v2_rotary_encoder_ui_ALT.cpp b/usermods/usermod_v2_rotary_encoder_ui_ALT/usermod_v2_rotary_encoder_ui_ALT.cpp index 79ce3f85..f7e90865 100644 --- a/usermods/usermod_v2_rotary_encoder_ui_ALT/usermod_v2_rotary_encoder_ui_ALT.cpp +++ b/usermods/usermod_v2_rotary_encoder_ui_ALT/usermod_v2_rotary_encoder_ui_ALT.cpp @@ -401,19 +401,19 @@ void RotaryEncoderUIUsermod::sortModesAndPalettes() { re_sortModes(modes_qstrings, modes_alpha_indexes, strip.getModeCount(), MODE_SORT_SKIP_COUNT); DEBUG_PRINT(F("Sorting palettes: ")); DEBUG_PRINT(getPaletteCount()); DEBUG_PRINT('/'); DEBUG_PRINTLN(customPalettes.size()); - palettes_qstrings = re_findModeStrings(JSON_palette_names, getPaletteCount() + 1); // +1 for default palette - palettes_alpha_indexes = re_initIndexArray(getPaletteCount()); + palettes_qstrings = re_findModeStrings(JSON_palette_names, getPaletteCount()); // allocates memory for all palette names + palettes_alpha_indexes = re_initIndexArray(getPaletteCount()); // allocates memory for all palette indexes if (customPalettes.size()) { for (int i=0; i FIXED_PALETTE_COUNT && pal <= 255-customPalettes.size()) pal = 0; // out of bounds palette + if (pal >= FIXED_PALETTE_COUNT && pal <= 255-customPalettes.size()) pal = 0; // out of bounds palette //default palette. Differs depending on effect if (pal == 0) pal = _default_palette; // _default_palette is set in setMode() switch (pal) { @@ -268,11 +268,11 @@ CRGBPalette16 &Segment::loadPalette(CRGBPalette16 &targetPalette, uint8_t pal) { default: //progmem palettes if (pal > 255 - customPalettes.size()) { targetPalette = customPalettes[255-pal]; // we checked bounds above - } else if (pal < DYNAMIC_PALETTE_COUNT+FASTLED_PALETTE_COUNT+1) { // palette 6 - 12, fastled palettes - targetPalette = *fastledPalettes[pal-DYNAMIC_PALETTE_COUNT-1]; + } else if (pal < DYNAMIC_PALETTE_COUNT + FASTLED_PALETTE_COUNT) { // palette 6 - 12, fastled palettes + targetPalette = *fastledPalettes[pal - DYNAMIC_PALETTE_COUNT]; } else { byte tcp[72]; - memcpy_P(tcp, (byte*)pgm_read_dword(&(gGradientPalettes[pal-(DYNAMIC_PALETTE_COUNT+FASTLED_PALETTE_COUNT)-1])), 72); + memcpy_P(tcp, (byte*)pgm_read_dword(&(gGradientPalettes[pal - (DYNAMIC_PALETTE_COUNT + FASTLED_PALETTE_COUNT)])), sizeof(tcp)); targetPalette.loadDynamicGradientPalette(tcp); } break; diff --git a/wled00/const.h b/wled00/const.h index 9067d9b1..6d1825d5 100644 --- a/wled00/const.h +++ b/wled00/const.h @@ -6,9 +6,9 @@ * Readability defines and their associated numerical values + compile-time constants */ -constexpr size_t FASTLED_PALETTE_COUNT = 7; // = sizeof(fastledPalettes) / sizeof(fastledPalettes[0]); -constexpr size_t GRADIENT_PALETTE_COUNT = 59; // = sizeof(gGradientPalettes) / sizeof(gGradientPalettes[0]); -constexpr size_t DYNAMIC_PALETTE_COUNT = 5; // 1-5 are dynamic palettes (1=random,2=primary,3=primary+secondary,4=primary+secondary+tertiary,5=primary+secondary(+tertiary if not black) +constexpr size_t FASTLED_PALETTE_COUNT = 7; // 6-12 = sizeof(fastledPalettes) / sizeof(fastledPalettes[0]); +constexpr size_t GRADIENT_PALETTE_COUNT = 59; // 13-72 = sizeof(gGradientPalettes) / sizeof(gGradientPalettes[0]); +constexpr size_t DYNAMIC_PALETTE_COUNT = 6; // 0- 5 = dynamic palettes (0=default(virtual),1=random,2=primary,3=primary+secondary,4=primary+secondary+tertiary,5=primary+secondary(+tertiary if not black) constexpr size_t FIXED_PALETTE_COUNT = DYNAMIC_PALETTE_COUNT + FASTLED_PALETTE_COUNT + GRADIENT_PALETTE_COUNT; // total number of fixed palettes #ifndef ESP8266 #define WLED_MAX_CUSTOM_PALETTES (255 - FIXED_PALETTE_COUNT) // allow up to 255 total palettes, user is warned about stability issues when adding more than 10 diff --git a/wled00/json.cpp b/wled00/json.cpp index f2308013..02c349ca 100644 --- a/wled00/json.cpp +++ b/wled00/json.cpp @@ -945,26 +945,25 @@ void serializePalettes(JsonObject root, int page) { byte tcp[72]; #ifdef ESP8266 - int itemPerPage = 5; + constexpr int itemPerPage = 5; #else - int itemPerPage = 8; + constexpr int itemPerPage = 8; #endif - int customPalettesCount = customPalettes.size(); - int palettesCount = getPaletteCount() - customPalettesCount; // palettesCount is number of palettes, not palette index + const int customPalettesCount = customPalettes.size(); + const int palettesCount = FIXED_PALETTE_COUNT; // palettesCount is number of palettes, not palette index - int maxPage = (palettesCount + customPalettesCount -1) / itemPerPage; + const int maxPage = (palettesCount + customPalettesCount) / itemPerPage; if (page > maxPage) page = maxPage; - int start = itemPerPage * page; - int end = start + itemPerPage; - if (end > palettesCount + customPalettesCount) end = palettesCount + customPalettesCount; + const int start = itemPerPage * page; + int end = min(start + itemPerPage, palettesCount + customPalettesCount); root[F("m")] = maxPage; // inform caller how many pages there are JsonObject palettes = root.createNestedObject("p"); - for (int i = start; i <= end; i++) { - JsonArray curPalette = palettes.createNestedArray(String(i<=palettesCount ? i : 255 - (i - (palettesCount + 1)))); + for (int i = start; i < end; i++) { + JsonArray curPalette = palettes.createNestedArray(String(i >= palettesCount ? 255 - i + palettesCount : i)); switch (i) { case 0: //default palette setPaletteColors(curPalette, PartyColors_p); @@ -993,12 +992,12 @@ void serializePalettes(JsonObject root, int page) curPalette.add("c1"); break; default: - if (i > palettesCount) - setPaletteColors(curPalette, customPalettes[i - (palettesCount + 1)]); - else if (i < 13) // palette 6 - 12, fastled palettes - setPaletteColors(curPalette, *fastledPalettes[i-6]); + if (i >= palettesCount) // custom palettes + setPaletteColors(curPalette, customPalettes[i - palettesCount]); + else if (i < DYNAMIC_PALETTE_COUNT + FASTLED_PALETTE_COUNT) // palette 6 - 12, fastled palettes + setPaletteColors(curPalette, *fastledPalettes[i - DYNAMIC_PALETTE_COUNT]); else { - memcpy_P(tcp, (byte*)pgm_read_dword(&(gGradientPalettes[i - 13])), 72); + memcpy_P(tcp, (byte*)pgm_read_dword(&(gGradientPalettes[i - (DYNAMIC_PALETTE_COUNT + FASTLED_PALETTE_COUNT)])), sizeof(tcp)); setPaletteColors(curPalette, tcp); } break;