improved Segment::setPixelColorXY a tiny bit

uses less flash so it should be faster (did not notice any FPS difference though)
also cleaned code in ColorFromPaletteWLED (it is not faster, same amount of code)
This commit is contained in:
Damian Schneider 2024-09-12 14:09:09 +02:00
parent 992d11be10
commit b07658b460
2 changed files with 25 additions and 38 deletions

View File

@ -173,34 +173,30 @@ void IRAM_ATTR_YN Segment::setPixelColorXY(int x, int y, uint32_t col)
if (!isActive()) return; // not active if (!isActive()) return; // not active
if (x >= virtualWidth() || y >= virtualHeight() || x<0 || y<0) return; // if pixel would fall out of virtual segment just exit if (x >= virtualWidth() || y >= virtualHeight() || x<0 || y<0) return; // if pixel would fall out of virtual segment just exit
if (reverse ) x = virtualWidth() - x - 1;
if (reverse_y) y = virtualHeight() - y - 1;
if (transpose) { std::swap(x,y); } // swap X & Y if segment transposed
x *= groupLength(); // expand to physical pixels
y *= groupLength(); // expand to physical pixels
int W = width();
int H = height();
if (x >= W || y >= H) return; // if pixel would fall out of segment just exit
uint8_t _bri_t = currentBri(); uint8_t _bri_t = currentBri();
if (_bri_t < 255) { if (_bri_t < 255) {
col = color_fade(col, _bri_t); col = color_fade(col, _bri_t);
} }
if (reverse ) x = virtualWidth() - x - 1;
if (reverse_y) y = virtualHeight() - y - 1;
if (transpose) { std::swap(x,y); } // swap X & Y if segment transposed
x *= groupLength(); // expand to physical pixels
y *= groupLength(); // expand to physical pixels
int W = width();
int H = height();
int yY = y;
for (int j = 0; j < grouping; j++) { // groupping vertically for (int j = 0; j < grouping; j++) { // groupping vertically
if(yY >= H) continue;
int xX = x;
for (int g = 0; g < grouping; g++) { // groupping horizontally for (int g = 0; g < grouping; g++) { // groupping horizontally
int xX = (x+g), yY = (y+j); if (xX >= W) continue; // we have reached one dimension's end
if (xX >= W || yY >= H) continue; // we have reached one dimension's end
#ifndef WLED_DISABLE_MODE_BLEND #ifndef WLED_DISABLE_MODE_BLEND
// if blending modes, blend with underlying pixel // if blending modes, blend with underlying pixel
if (_modeBlend) col = color_blend(strip.getPixelColorXY(start + xX, startY + yY), col, 0xFFFFU - progress(), true); if (_modeBlend) col = color_blend(strip.getPixelColorXY(start + xX, startY + yY), col, 0xFFFFU - progress(), true);
#endif #endif
strip.setPixelColorXY(start + xX, startY + yY, col); strip.setPixelColorXY(start + xX, startY + yY, col);
if (mirror) { //set the corresponding horizontally mirrored pixel if (mirror) { //set the corresponding horizontally mirrored pixel
if (transpose) strip.setPixelColorXY(start + xX, startY + height() - yY - 1, col); if (transpose) strip.setPixelColorXY(start + xX, startY + height() - yY - 1, col);
else strip.setPixelColorXY(start + width() - xX - 1, startY + yY, col); else strip.setPixelColorXY(start + width() - xX - 1, startY + yY, col);
@ -212,7 +208,9 @@ void IRAM_ATTR_YN Segment::setPixelColorXY(int x, int y, uint32_t col)
if (mirror_y && mirror) { //set the corresponding vertically AND horizontally mirrored pixel if (mirror_y && mirror) { //set the corresponding vertically AND horizontally mirrored pixel
strip.setPixelColorXY(start + width() - xX - 1, startY + height() - yY - 1, col); strip.setPixelColorXY(start + width() - xX - 1, startY + height() - yY - 1, col);
} }
xX++;
} }
yY++;
} }
} }

View File

@ -92,34 +92,23 @@ CRGB ColorFromPaletteWLED(const CRGBPalette16& pal, unsigned index, uint8_t brig
index = (index*240) >> 8; // Blend range is affected by lo4 blend of values, remap to avoid wrapping index = (index*240) >> 8; // Blend range is affected by lo4 blend of values, remap to avoid wrapping
} }
unsigned hi4 = byte(index) >> 4; unsigned hi4 = byte(index) >> 4;
unsigned lo4 = index & 0x0F;
unsigned hi4XsizeofCRGB = hi4 * sizeof(CRGB);
// We then add that to a base array pointer. // We then add that to a base array pointer.
const CRGB* entry = (CRGB*)( (uint8_t*)(&(pal[0])) + hi4XsizeofCRGB); const CRGB* entry = (CRGB*)( (uint8_t*)(&(pal[0])) + (hi4 * sizeof(CRGB)));
unsigned red1 = entry->red; unsigned red1 = entry->r;
unsigned green1 = entry->green; unsigned green1 = entry->g;
unsigned blue1 = entry->blue; unsigned blue1 = entry->b;
if(blendType != NOBLEND) { if(blendType != NOBLEND) {
if(hi4 == 15) entry = &(pal[0]); if(hi4 == 15) entry = &(pal[0]);
else ++entry; else ++entry;
unsigned red2 = entry->red; // unsigned red2 = entry->red;
unsigned green2 = entry->green; unsigned f2 = ((index & 0x0F) << 4) + 1; // +1 so we scale by 256 as a max value, then result can just be shifted by 8
unsigned blue2 = entry->blue;
unsigned f2 = (lo4 << 4)+1; // +1 so we scale by 256 as a max value, then result can just be shifted by 8
unsigned f1 = (257 - f2); // f2 is 1 minimum, so this is 256 max unsigned f1 = (257 - f2); // f2 is 1 minimum, so this is 256 max
red1 *= f1; red1 = (red1 * f1 + (unsigned)entry->r * f2) >> 8;
green1 *= f1; green1 = (green1 * f1 + (unsigned)entry->g * f2) >> 8;
blue1 *= f1; blue1 = (green1 * f1 + (unsigned)entry->b * f2) >> 8;
red2 *= f2;
green2 *= f2;
blue2 *= f2;
red1 = (red1 + red2) >> 8;
green1 = (green1 + green2) >> 8;
blue1 = (blue1 + blue2) >> 8;
} }
if( brightness != 255) { // note: zero checking could be done to return black but that is hardly ever used so it is omitted if( brightness < 255) { // note: zero checking could be done to return black but that is hardly ever used so it is omitted
uint32_t scale = brightness; uint32_t scale = brightness + 1; // adjust for rounding (bitshift)
scale++; // adjust for rounding (bitshift)
red1 = (red1 * scale) >> 8; red1 = (red1 * scale) >> 8;
green1 = (green1 * scale) >> 8; green1 = (green1 * scale) >> 8;
blue1 = (blue1 * scale) >> 8; blue1 = (blue1 * scale) >> 8;