more sPC optimizations

* made setPixelColorXY_fast private
* optimized Segment::fill() to use setPixelColorXY_fast
* "bar" 1D expand optimization
This commit is contained in:
Frank
2024-07-14 23:49:37 +02:00
parent dddd1574ec
commit 6aaf7a908d
3 changed files with 32 additions and 16 deletions

View File

@@ -920,7 +920,8 @@ void IRAM_ATTR_YN Segment::setPixelColor(int i, uint32_t col) //WLEDMM: IRAM_ATT
case M12_pBar:
// expand 1D effect vertically or have it play on virtual strips
if (vStrip>0) setPixelColorXY(vStrip - 1, vH - i - 1, col);
else for (int x = 0; x < vW; x++) setPixelColorXY(x, vH - i - 1, col);
//else for (int x = 0; x < vW; x++) setPixelColorXY(x, vH - i - 1, col);
else drawLine(0, vH - i - 1, vW-1, vH - i - 1, col, false); // WLEDMM draw line instead of plotting each pixel
break;
case M12_pArc:
// expand in circular fashion from center
@@ -1315,15 +1316,29 @@ void Segment::refreshLightCapabilities() {
}
/*
* Fills segment with color
* Fills segment with color - WLEDMM using faster sPC if possible
*/
void Segment::fill(uint32_t c) {
if (!isActive()) return; // not active
const uint_fast16_t cols = is2D() ? virtualWidth() : virtualLength(); // WLEDMM use fast int types
const uint_fast16_t rows = virtualHeight(); // will be 1 for 1D
for(uint_fast16_t y = 0; y < rows; y++) for (uint_fast16_t x = 0; x < cols; x++) {
if (is2D()) setPixelColorXY((uint16_t)x, (uint16_t)y, c);
else setPixelColor((uint16_t)x, c);
if (is2D()) {
// pre-calculate scaled color
uint32_t scaled_col = c;
bool simpleSegment = !reverse && (grouping == 1) && (spacing == 0); // !reverse is just for back-to-back testing against "slow" functions
if (simpleSegment) {
uint8_t _bri_t = currentBri(on ? opacity : 0);
if (!_bri_t && !transitional) return;
if (_bri_t < 255) scaled_col = color_fade(c, _bri_t);
}
// fill 2D segment
for(int y = 0; y < rows; y++) for (int x = 0; x < cols; x++) {
if (simpleSegment) setPixelColorXY_fast(x, y, c, scaled_col, cols, rows);
else setPixelColorXY(x, y, c);
}
} else { // fill 1D strip
for (int x = 0; x < cols; x++) setPixelColor(x, c);
}
}