From d2c76354e20f3b3db9d6ac245a129fd856b2f767 Mon Sep 17 00:00:00 2001 From: Annika Date: Sun, 5 Jul 2026 07:48:33 -0700 Subject: [PATCH] added some checks for trapezoid ordering --- test | Bin 41176 -> 41176 bytes test.cpp | 63 ++++++++++++++++++++++++++++++++++++++++++------------- 2 files changed, 48 insertions(+), 15 deletions(-) diff --git a/test b/test index 2d09d8cde5e5d343fb8b1be31596a04c0c03b025..eb536b97974dd53381f9b91f6bdc6b6d48c02df8 100755 GIT binary patch delta 4470 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 coords.y0 + void pTrapezoid (Trapezoid coords, Color color) { + uint16_t height = 1 + coords.y1 - coords.y0; + int16_t LeftBound[height]; + int16_t RightBound[height]; + + this->bresenham(coords.xl0, coords.y1 - coords.y0, coords.xl1, LeftBound); + this->bresenham(coords.xr0, coords.y1 - coords.y0, coords.xr1, RightBound); + + for (uint16_t i = 0; i <= height; i++) { + for (uint16_t x = LeftBound[i]; x <= RightBound[i]; x++) { + this->putPixel((uint32_t)x, (uint32_t)i + coords.y0, color.r, color.g, color.b, color.a); + } + } + return; + } public: struct waymini* wm; @@ -325,22 +343,37 @@ namespace UwU { } } - // Draw a horizontally bounded trapezoid - // coords.y1 >= coords.y0 + // Draws a horizontally bounded trapezoid void trapezoid (Trapezoid coords, Color color) { - uint16_t height = 1 + coords.y1 - coords.y0; - int16_t LeftBound[height]; - int16_t RightBound[height]; - - this->bresenham(coords.xl0, coords.y1 - coords.y0, coords.xl1, LeftBound); - this->bresenham(coords.xr0, coords.y1 - coords.y0, coords.xr1, RightBound); - - for (uint16_t i = 0; i <= height; i++) { - for (uint16_t x = LeftBound[i]; x <= RightBound[i]; x++) { - this->putPixel((uint32_t)x, (uint32_t)i + coords.y0, color.r, color.g, color.b, color.a); - } + UwU::Trapezoid saneCoords = coords; + if (coords.y0 > coords.y1) { + saneCoords.y0 = coords.y1; + saneCoords.y1 = coords.y0; + saneCoords.xl0 = coords.xl1; + saneCoords.xl1 = coords.xl0; + saneCoords.xr0 = coords.xr1; + saneCoords.xr1 = coords.xr0; } - return; + uint16_t tempVal; + bool hflip0 = false; + if (saneCoords.xl0 > saneCoords.xr0) { + tempVal = saneCoords.xl0; + saneCoords.xl0 = saneCoords.xr0; + saneCoords.xr0 = tempVal; + hflip0 = true; + } + if (saneCoords.xl1 > saneCoords.xr1) { + if (!hflip0) { + // invalid geometry; emit console warning and don't attempt to draw + // possible options are: don't draw, lazy draw (incorrect geometry) - + // or split into two (way more work) + return; + } + tempVal = saneCoords.xl1; + saneCoords.xl1 = saneCoords.xr1; + saneCoords.xr1 = tempVal; + } + this->pTrapezoid(saneCoords, color); } }; } @@ -363,7 +396,7 @@ int main(void) { draw.rectangle(UwU::Coord2(69, 69), UwU::Coord2(420, 420), fuchsia); draw.rectangleGradient(UwU::Coord2(200, 200), UwU::Coord2(600, 400), red, blue, alpha, red); - draw.trapezoid(UwU::Trapezoid(300, 400, 360, 360, 600, 401), green); + draw.trapezoid(UwU::Trapezoid(500, 400, 360, 360, 600, 401), green); draw.point(UwU::Coord2(387, 43), green);