Segment width & height fix.

Auto 2D segment.
pull/2737/head
Blaz Kristan 2022-05-08 14:28:02 +02:00
rodzic f0d36fd769
commit cf189663a7
2 zmienionych plików z 16 dodań i 9 usunięć

Wyświetl plik

@ -134,10 +134,8 @@ void IRAM_ATTR WS2812FX::setPixelColorXY(uint16_t x, uint16_t y, byte r, byte g,
}
uint32_t col = RGBW32(r, g, b, w);
uint16_t width = _segments[segIdx].virtualWidth(); // segment width in logical pixels
uint16_t height = _segments[segIdx].virtualHeight(); // segment height in logical pixels
if (_segments[segIdx].options & MIRROR ) width = (width + 1) /2; // divide by 2 if mirror, leave at least a single LED
if (_segments[segIdx].options & MIRROR_Y_2D) height = (height + 1) /2; // divide by 2 if mirror, leave at least a single LED
uint16_t width = _segments[segIdx].virtualWidth(); // segment width in logical pixels (includes mirror)
uint16_t height = _segments[segIdx].virtualHeight(); // segment height in logical pixels (includes mirror)
if (_segments[segIdx].options & TRANSPOSED ) { uint16_t t = x; x = y; y = t; } // swap X & Y if segment transposed
x *= _segments[segIdx].groupLength();
@ -157,12 +155,12 @@ void IRAM_ATTR WS2812FX::setPixelColorXY(uint16_t x, uint16_t y, byte r, byte g,
busses.setPixelColor(index, col);
if (_segments[segIdx].options & MIRROR) { //set the corresponding horizontally mirrored pixel
index = XY(_segments[segIdx].stop - xX - 1, yY, segIdx);
index = XY(_segments[segIdx].width() - xX - 1, yY, segIdx);
if (index < customMappingSize) index = customMappingTable[index];
busses.setPixelColor(index, col);
}
if (_segments[segIdx].options & MIRROR_Y_2D) { //set the corresponding vertically mirrored pixel
index = XY(xX, _segments[segIdx].stopY - yY - 1, segIdx);
index = XY(xX, _segments[segIdx].height() - yY - 1, segIdx);
if (index < customMappingSize) index = customMappingTable[index];
busses.setPixelColor(index, col);
}
@ -176,8 +174,6 @@ uint32_t WS2812FX::getPixelColorXY(uint16_t x, uint16_t y)
uint8_t segIdx = _segment_index;
uint16_t width = _segments[segIdx].virtualWidth(); // segment width in logical pixels
uint16_t height = _segments[segIdx].virtualHeight(); // segment height in logical pixels
if (_segments[segIdx].options & MIRROR ) width = (width + 1) /2; // divide by 2 if mirror, leave at least a single LED
if (_segments[segIdx].options & MIRROR_Y_2D) height = (height + 1) /2; // divide by 2 if mirror, leave at least a single LED
if (_segments[segIdx].options & TRANSPOSED ) { uint16_t t = x; x = y; y = t; } // swap X & Y if segment transposed
x *= _segments[segIdx].groupLength();

Wyświetl plik

@ -733,7 +733,18 @@ void WS2812FX::resetSegments() {
}
void WS2812FX::makeAutoSegments(bool forceReset) {
if (autoSegments) { //make one segment per bus
if (isMatrix) {
// only create 1 2D segment
uint8_t mainSeg = getMainSegmentId();
if (forceReset) {
for (uint8_t i = 0; i < MAX_NUM_SEGMENTS; i++) {
setSegment(i, 0, 0);
}
}
if (getActiveSegmentsNum() < 2) {
setSegment(mainSeg, 0, matrixWidth, 1, 0, 0, 0, matrixHeight);
}
} else if (autoSegments) { //make one segment per bus
uint16_t segStarts[MAX_NUM_SEGMENTS] = {0};
uint16_t segStops [MAX_NUM_SEGMENTS] = {0};
uint8_t s = 0;