diff --git a/wled00/FX_2Dfcn.cpp b/wled00/FX_2Dfcn.cpp index bea551860..69a43d7b8 100644 --- a/wled00/FX_2Dfcn.cpp +++ b/wled00/FX_2Dfcn.cpp @@ -175,7 +175,7 @@ void IRAM_ATTR Segment::setPixelColorXY(int x, int y, uint32_t col) uint8_t _bri_t = currentBri(); if (_bri_t < 255) { - col = color_scale(col, _bri_t); + col = color_fade(col, _bri_t); } if (reverse ) x = virtualWidth() - x - 1; @@ -274,15 +274,13 @@ uint32_t IRAM_ATTR Segment::getPixelColorXY(int x, int y) { } // blurRow: perform a blur on a row of a rectangular matrix -void Segment::blurRow(uint32_t row, fract8 blur_amount, bool smear) -{ +void Segment::blurRow(uint32_t row, fract8 blur_amount, bool smear){ if (!isActive() || blur_amount == 0) return; // not active const uint_fast16_t cols = virtualWidth(); const uint_fast16_t rows = virtualHeight(); - if (row >= rows) - return; + if (row >= rows) return; // blur one row uint8_t keep = smear ? 255 : 255 - blur_amount; uint8_t seep = blur_amount >> 1; @@ -292,8 +290,8 @@ void Segment::blurRow(uint32_t row, fract8 blur_amount, bool smear) uint32_t curnew; for (unsigned x = 0; x < cols; x++) { uint32_t cur = getPixelColorXY(x, row); - uint32_t part = color_scale(cur, seep); - curnew = color_scale(cur, keep); + uint32_t part = color_fade(cur, seep); + curnew = color_fade(cur, keep); if (x > 0) { if (carryover) curnew = color_add(curnew, carryover, true); @@ -301,7 +299,7 @@ void Segment::blurRow(uint32_t row, fract8 blur_amount, bool smear) if (last != prev) // optimization: only set pixel if color has changed setPixelColorXY(x - 1, row, prev); } - else // first pixel or last pixel + else // first pixel setPixelColorXY(x, row, curnew); lastnew = curnew; last = cur; // save original value for comparison on next iteration @@ -326,8 +324,8 @@ void Segment::blurCol(uint32_t col, fract8 blur_amount, bool smear) { uint32_t curnew; for (unsigned y = 0; y < rows; y++) { uint32_t cur = getPixelColorXY(col, y); - uint32_t part = color_scale(cur, seep); - curnew = color_scale(cur, keep); + uint32_t part = color_fade(cur, seep); + curnew = color_fade(cur, keep); if (y > 0) { if (carryover) curnew = color_add(curnew, carryover, true); diff --git a/wled00/FX_fcn.cpp b/wled00/FX_fcn.cpp index 9a372ddf1..f3f74ba25 100644 --- a/wled00/FX_fcn.cpp +++ b/wled00/FX_fcn.cpp @@ -735,7 +735,7 @@ void IRAM_ATTR Segment::setPixelColor(int i, uint32_t col) uint16_t len = length(); uint8_t _bri_t = currentBri(); if (_bri_t < 255) { - col = color_scale(col, _bri_t); + col = color_fade(col, _bri_t); } // expand pixel (taking into account start, grouping, spacing [and offset]) @@ -1003,7 +1003,7 @@ void Segment::blur(uint8_t blur_amount, bool smear) { return; } #endif - uint8_t keep = smear ? 250 : 255 - blur_amount; + uint8_t keep = smear ? 255 : 255 - blur_amount; uint8_t seep = blur_amount >> 1; unsigned vlength = virtualLength(); uint32_t carryover = BLACK; @@ -1012,10 +1012,9 @@ void Segment::blur(uint8_t blur_amount, bool smear) { uint32_t curnew; for (unsigned i = 0; i < vlength; i++) { uint32_t cur = getPixelColor(i); - uint32_t part = color_scale(cur, seep); - curnew = color_scale(cur, keep); - if (i > 0) - { + uint32_t part = color_fade(cur, seep); + curnew = color_fade(cur, keep); + if (i > 0) { if (carryover) curnew = color_add(curnew, carryover, true); uint32_t prev = color_add(lastnew, part, true); diff --git a/wled00/colors.cpp b/wled00/colors.cpp index 188c67f41..30d2c069e 100644 --- a/wled00/colors.cpp +++ b/wled00/colors.cpp @@ -61,21 +61,6 @@ uint32_t color_add(uint32_t c1, uint32_t c2, bool fast) } } -/* - * color scale function that replaces scale8 for 32bit colors - */ - -uint32_t color_scale(uint32_t c1, uint8_t scale) -{ - uint32_t fixedscale = 1 + scale; - uint32_t scaledcolor; //color order is: W R G B from MSB to LSB - scaledcolor = ((R(c1) * fixedscale) >> 8) << 16; - scaledcolor |= ((G(c1) * fixedscale) >> 8) << 8; - scaledcolor |= (B(c1) * fixedscale) >> 8; - scaledcolor |= ((W(c1) * fixedscale) >> 8) << 24; - return scaledcolor; -} - /* * fades color toward black * if using "video" method the resulting color will never become black unless it is already black @@ -83,17 +68,26 @@ uint32_t color_scale(uint32_t c1, uint8_t scale) uint32_t color_fade(uint32_t c1, uint8_t amount, bool video) { - if (video) - { - uint8_t r = scale8_video(R(c1), amount); - uint8_t g = scale8_video(G(c1), amount); - uint8_t b = scale8_video(B(c1), amount); - uint8_t w = scale8_video(W(c1), amount); - return RGBW32(r, g, b, w); + uint32_t scaledcolor; // color order is: W R G B from MSB to LSB + uint32_t r = R(c1); + uint32_t g = G(c1); + uint32_t b = B(c1); + uint32_t w = W(c1); + if (video) { + uint32_t scale = amount; // 32bit for faster calculation + scaledcolor = (((r * scale) >> 8) << 16) + ((r && scale) ? 1 : 0); + scaledcolor |= (((g * scale) >> 8) << 8) + ((g && scale) ? 1 : 0); + scaledcolor |= ((b * scale) >> 8) + ((b && scale) ? 1 : 0); + scaledcolor |= (((w * scale) >> 8) << 24) + ((w && scale) ? 1 : 0); + return scaledcolor; } - else - { - return color_scale(c1, amount); + else { + uint32_t scale = 1 + amount; + scaledcolor = ((r * scale) >> 8) << 16; + scaledcolor |= ((g * scale) >> 8) << 8; + scaledcolor |= (b * scale) >> 8; + scaledcolor |= ((w * scale) >> 8) << 24; + return scaledcolor; } } diff --git a/wled00/fcn_declare.h b/wled00/fcn_declare.h index 0e1329267..2461ebb28 100644 --- a/wled00/fcn_declare.h +++ b/wled00/fcn_declare.h @@ -80,7 +80,6 @@ class NeoGammaWLEDMethod { #define gamma8(c) NeoGammaWLEDMethod::rawGamma8(c) uint32_t color_blend(uint32_t,uint32_t,uint16_t,bool b16=false); uint32_t color_add(uint32_t,uint32_t, bool fast=false); -uint32_t color_scale(uint32_t c1, uint8_t scale); uint32_t color_fade(uint32_t c1, uint8_t amount, bool video=false); CRGBPalette16 generateHarmonicRandomPalette(CRGBPalette16 &basepalette); CRGBPalette16 generateRandomPalette(void);