mirror of
https://github.com/wled/WLED.git
synced 2025-04-23 14:27:18 +00:00
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:
parent
992d11be10
commit
b07658b460
@ -173,34 +173,30 @@ void IRAM_ATTR_YN Segment::setPixelColorXY(int x, int y, uint32_t col)
|
||||
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 (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();
|
||||
if (_bri_t < 255) {
|
||||
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
|
||||
if(yY >= H) continue;
|
||||
int xX = x;
|
||||
for (int g = 0; g < grouping; g++) { // groupping horizontally
|
||||
int xX = (x+g), yY = (y+j);
|
||||
if (xX >= W || yY >= H) continue; // we have reached one dimension's end
|
||||
|
||||
if (xX >= W) continue; // we have reached one dimension's end
|
||||
#ifndef WLED_DISABLE_MODE_BLEND
|
||||
// if blending modes, blend with underlying pixel
|
||||
if (_modeBlend) col = color_blend(strip.getPixelColorXY(start + xX, startY + yY), col, 0xFFFFU - progress(), true);
|
||||
#endif
|
||||
|
||||
strip.setPixelColorXY(start + xX, startY + yY, col);
|
||||
|
||||
if (mirror) { //set the corresponding horizontally mirrored pixel
|
||||
if (transpose) strip.setPixelColorXY(start + xX, startY + height() - yY - 1, 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
|
||||
strip.setPixelColorXY(start + width() - xX - 1, startY + height() - yY - 1, col);
|
||||
}
|
||||
xX++;
|
||||
}
|
||||
yY++;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
}
|
||||
unsigned hi4 = byte(index) >> 4;
|
||||
unsigned lo4 = index & 0x0F;
|
||||
unsigned hi4XsizeofCRGB = hi4 * sizeof(CRGB);
|
||||
// We then add that to a base array pointer.
|
||||
const CRGB* entry = (CRGB*)( (uint8_t*)(&(pal[0])) + hi4XsizeofCRGB);
|
||||
unsigned red1 = entry->red;
|
||||
unsigned green1 = entry->green;
|
||||
unsigned blue1 = entry->blue;
|
||||
const CRGB* entry = (CRGB*)( (uint8_t*)(&(pal[0])) + (hi4 * sizeof(CRGB)));
|
||||
unsigned red1 = entry->r;
|
||||
unsigned green1 = entry->g;
|
||||
unsigned blue1 = entry->b;
|
||||
if(blendType != NOBLEND) {
|
||||
if(hi4 == 15) entry = &(pal[0]);
|
||||
else ++entry;
|
||||
unsigned red2 = entry->red;
|
||||
unsigned green2 = entry->green;
|
||||
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 red2 = entry->red;
|
||||
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 f1 = (257 - f2); // f2 is 1 minimum, so this is 256 max
|
||||
red1 *= f1;
|
||||
green1 *= f1;
|
||||
blue1 *= f1;
|
||||
red2 *= f2;
|
||||
green2 *= f2;
|
||||
blue2 *= f2;
|
||||
red1 = (red1 + red2) >> 8;
|
||||
green1 = (green1 + green2) >> 8;
|
||||
blue1 = (blue1 + blue2) >> 8;
|
||||
red1 = (red1 * f1 + (unsigned)entry->r * f2) >> 8;
|
||||
green1 = (green1 * f1 + (unsigned)entry->g * f2) >> 8;
|
||||
blue1 = (green1 * f1 + (unsigned)entry->b * f2) >> 8;
|
||||
}
|
||||
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;
|
||||
scale++; // adjust for rounding (bitshift)
|
||||
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 + 1; // adjust for rounding (bitshift)
|
||||
red1 = (red1 * scale) >> 8;
|
||||
green1 = (green1 * scale) >> 8;
|
||||
blue1 = (blue1 * scale) >> 8;
|
||||
|
Loading…
x
Reference in New Issue
Block a user