From 32c954661547c7ca361a97dedaba5e64eab381c7 Mon Sep 17 00:00:00 2001 From: Brandon502 <105077712+Brandon502@users.noreply.github.com> Date: Fri, 18 Oct 2024 11:49:34 -0400 Subject: [PATCH] Arc - gPC fix --- wled00/FX_2Dfcn.cpp | 24 +++++++++++++----------- wled00/FX_fcn.cpp | 20 +++++++++++++++----- 2 files changed, 28 insertions(+), 16 deletions(-) diff --git a/wled00/FX_2Dfcn.cpp b/wled00/FX_2Dfcn.cpp index cc4bad5c5b..f7de58aa0c 100644 --- a/wled00/FX_2Dfcn.cpp +++ b/wled00/FX_2Dfcn.cpp @@ -841,17 +841,19 @@ void Segment::drawArc(unsigned x0, unsigned y0, int radius, uint32_t color, uint const int starty = max(0, int(y0)-radius-1); const int endy = min(height, int(y0)+radius+1); - for (int x=startx; x= minradius2) && (distance2 <= maxradius2)) { - setPixelColorXY(x, y, color); - } else { - if (fillColor != 0) - if (distance2 < minradius2) - setPixelColorXY(x, y, fillColor); + for (int x=startx; x= minradius2) && (distance2 <= maxradius2)) { + setPixelColorXY(x, y, color); + } else { + if (fillColor != 0) + if (distance2 < minradius2) + setPixelColorXY(x, y, fillColor); + } } } } diff --git a/wled00/FX_fcn.cpp b/wled00/FX_fcn.cpp index 099e618c9f..f745c9105b 100644 --- a/wled00/FX_fcn.cpp +++ b/wled00/FX_fcn.cpp @@ -873,7 +873,6 @@ uint16_t Segment::virtualLength() const { break; case M12_pArc: vLen = sqrt16(vW * vW + vH * vH); - if (vW != vH) vLen++; // round up break; case M12_jMap: //WLEDMM jMap if (jMap) @@ -957,6 +956,7 @@ void IRAM_ATTR_YN __attribute__((hot)) Segment::setPixelColor(int i, uint32_t co if (i==0) setPixelColorXY(0, 0, col); else { + if (i == virtualLength() - 1) setPixelColorXY(vW-1, vH-1, col); // Last i always fill corner if (!_isSuperSimpleSegment) { // WLEDMM: drawArc() is faster if it's NOT "super simple" as the regular M12_pArc // can do "useSymmetry" to speed things along, but a more complicated segment likey @@ -1227,10 +1227,20 @@ uint32_t __attribute__((hot)) Segment::getPixelColor(int i) const return vW>vH ? getPixelColorXY(i, 0) : getPixelColorXY(0, i); // Corner and Arc break; } - int length = virtualLength(); - int x = i * vW / length; - int y = i * vH / length; - return getPixelColorXY(x, y); // Not 100% accurate + float minradius = float(i) - .5; + const int minradius2 = roundf(minradius * minradius); + int startX, startY; + if (vW >= vH) {startX = vW - 1; startY = 1;} // Last Column + else {startX = 1; startY = vH - 1;} // Last Row + + // Loop through only last row/column depending on orientation + for (int x = startX; x < vW; x++) { + int newX2 = x * x; + for (int y = startY; y < vH; y++) { + int newY2 = y * y; + if (newX2 + newY2 >= minradius2) return getPixelColorXY(x, y); + } + } break; } case M12_jMap: //WLEDMM jMap