From 1011f03467269c09ff36affffab6e9661a507b39 Mon Sep 17 00:00:00 2001 From: Annika Date: Sat, 4 Jul 2026 04:05:20 -0700 Subject: [PATCH] added line drawing --- test | Bin 36928 -> 37000 bytes test.cpp | 209 +++++++++++++++++++++++++++++++++++-------------------- 2 files changed, 135 insertions(+), 74 deletions(-) diff --git a/test b/test index 90078994392fc14db76c64505a8860a232c7c515..eb1e3b1c680f76519fc5c8771e30f73f4ea46662 100755 GIT binary patch delta 7623 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 delta 6127 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 V`8feF%gHBhnc_&|k8ip2{{Yk@>V*IR diff --git a/test.cpp b/test.cpp index 75dede3..f226c89 100644 --- a/test.cpp +++ b/test.cpp @@ -44,91 +44,144 @@ namespace UwU { }; class Draw { - // private: - // lineLow() + private: + + // plot lines if m<= 1 + void lineLow(int32_t x0, int32_t y0, int32_t x1, int32_t y1, Color color) { + int32_t dx = x1 - x0; + int32_t dy = y1 - y0; + int32_t yi = 1; + if (dy < 0) { + yi = -1; + dy = -dy; + } + int32_t d = (2 * dy) - dx; + int32_t y = y0; + for (int32_t x = x0; x < x1; x++) { + size_t i = (size_t)y * waymini_get_stride(this->wm) + (size_t)x * 4; + this->pixels[i + 0] = color.b; // B + this->pixels[i + 1] = color.g; // G + this->pixels[i + 2] = color.r; // R + this->pixels[i + 3] = 0xFF; // A + if (d > 0) { + y += yi; + d += (2 * (dy - dx)); + } else { + d += (2 * dy); + } + } + return; + } + + // plot lines if m<= 1 + void lineHigh(int32_t x0, int32_t y0, int32_t x1, int32_t y1, Color color) { + int32_t dx = x1 - x0; + int32_t dy = y1 - y0; + int32_t xi = 1; + if (dx < 0) { + xi = -1; + dx = -dx; + } + int32_t d = (2 * dx) - dy; + int32_t x = x0; + for (int32_t y = y0; y < y1; y++) { + size_t i = (size_t)y * waymini_get_stride(this->wm) + (size_t)x * 4; + this->pixels[i + 0] = color.b; // B + this->pixels[i + 1] = color.g; // G + this->pixels[i + 2] = color.r; // R + this->pixels[i + 3] = 0xFF; // A + if (d > 0) { + x += xi; + d += (2 * (dx - dy)); + } else { + d += (2 * dx); + } + } + return; + } public: - struct waymini* wm; - uint32_t width; - uint32_t height; - uint32_t stride; - uint8_t *pixels; - - Draw(uint32_t width, uint32_t height, waymini_key_cb on_key) { - this->wm = waymini_create(width, height, on_key, NULL); - if (!this->wm) exit(1); + struct waymini* wm; + uint32_t width; + uint32_t height; + uint32_t stride; + uint8_t *pixels; - this->width = waymini_get_width(this->wm); - this->height = waymini_get_height(this->wm); - this->stride = waymini_get_stride(this->wm); - printf("surface: %ux%u stride=%u\n", this->width, this->height, this->stride); - - this->pixels = (uint8_t *)waymini_get_pixels(this->wm); - if (!this->pixels) { - waymini_destroy(this->wm); - exit(1); - } - } - - // Draw a rectangle (duh) - void rectangle(Coord2 point0, Coord2 point1, Color color) { - if (point0.x > this->width || point0.y > this->height || point1.x > this->width || point1.y > this->height) {return;}; - for (uint32_t y = point0.y; y < point1.y; y++) { - for (uint32_t x = point0.x; x < point1.x; x++) { - size_t i = (size_t)y * waymini_get_stride(this->wm) + (size_t)x * 4; - this->pixels[i + 0] = color.b; // B - this->pixels[i + 1] = color.g; // G - this->pixels[i + 2] = color.r; // R - this->pixels[i + 3] = 0xFF; // A + Draw(uint32_t width, uint32_t height, waymini_key_cb on_key) { + this->wm = waymini_create(width, height, on_key, NULL); + if (!this->wm) exit(1); + + this->width = waymini_get_width(this->wm); + this->height = waymini_get_height(this->wm); + this->stride = waymini_get_stride(this->wm); + printf("surface: %ux%u stride=%u\n", this->width, this->height, this->stride); + + this->pixels = (uint8_t *)waymini_get_pixels(this->wm); + if (!this->pixels) { + waymini_destroy(this->wm); + exit(1); } } - return; - } - - // Fill a simple gradient. Each row is stride bytes. - void rainbow() { - for (uint32_t y = 0; y < this->height; y++) { - for (uint32_t x = 0; x < this->width; x++) { - size_t i = (size_t)y * waymini_get_stride(this->wm) + (size_t)x * 4; - this->pixels[i + 0] = (uint8_t)(y * 255 / this->height); // B - this->pixels[i + 1] = 0x00; // G - this->pixels[i + 2] = (uint8_t)(x * 255 / this->width); // R - this->pixels[i + 3] = 0xFF; // A + + // Draw a rectangle (duh) + void rectangle(Coord2 point0, Coord2 point1, Color color) { + if (point0.x > this->width || point0.y > this->height || point1.x > this->width || point1.y > this->height) {return;}; + for (uint32_t y = point0.y; y < point1.y; y++) { + for (uint32_t x = point0.x; x < point1.x; x++) { + size_t i = (size_t)y * waymini_get_stride(this->wm) + (size_t)x * 4; + this->pixels[i + 0] = color.b; // B + this->pixels[i + 1] = color.g; // G + this->pixels[i + 2] = color.r; // R + this->pixels[i + 3] = 0xFF; // A + } + } + return; + } + + // Fill a simple gradient. Each row is stride bytes. + void rainbow() { + for (uint32_t y = 0; y < this->height; y++) { + for (uint32_t x = 0; x < this->width; x++) { + size_t i = (size_t)y * waymini_get_stride(this->wm) + (size_t)x * 4; + this->pixels[i + 0] = (uint8_t)(y * 255 / this->height); // B + this->pixels[i + 1] = 0x00; // G + this->pixels[i + 2] = (uint8_t)(x * 255 / this->width); // R + this->pixels[i + 3] = 0xFF; // A + } } } - } - // Draw a single point - void point (Coord2 point, Color color) { - if (point.x > this->width || point.y > this->height) {return;}; - size_t i = (size_t)point.y * waymini_get_stride(this->wm) + (size_t)point.x * 4; - this->pixels[i + 0] = color.b; // B - this->pixels[i + 1] = color.g; // G - this->pixels[i + 2] = color.r; // R - this->pixels[i + 3] = 0xFF; // A - } - - // Uses Bresenham's line algorithm to draw line of any slope - void line (Coord2 point0, Coord2 point1, Color color) { - if (point0.x > this->width || point0.y > this->height || point1.x > this->width || point1.y > this->height) {return;}; - int32_t dx = (int32_t)x1 - (int32_t)x0; - int32_t dy = (int32_t)y1 - (int32_t)y1; - int32_t yi = 1; - if (dy < 0) { - yi = -1; - dy = -dy; + // Draw a single point + void point (Coord2 point, Color color) { + if (point.x > this->width || point.y > this->height) {return;}; + size_t i = (size_t)point.y * waymini_get_stride(this->wm) + (size_t)point.x * 4; + this->pixels[i + 0] = color.b; // B + this->pixels[i + 1] = color.g; // G + this->pixels[i + 2] = color.r; // R + this->pixels[i + 3] = 0xFF; // A } - int32_t d = (2 * dy) - dx; - int32_t y = y0 - for (uint32_t x = x0; x < x1; x++) { + // Uses Bresenham's line algorithm to draw line of any slope + void line (Coord2 point0, Coord2 point1, Color color) { + if (point0.x > this->width || point0.y > this->height || point1.x > this->width || point1.y > this->height) {return;}; + int32_t x0 = (int32_t)point0.x; + int32_t y0 = (int32_t)point0.y; + int32_t x1 = (int32_t)point1.x; + int32_t y1 = (int32_t)point1.y; + if (abs(y1 - y0) < abs(x1 - x0)) { + if (x0 > x1) { + this->lineLow(x1, y1, x0, y0, color); + } else { + this->lineLow(x0, y0, x1, y1, color); + } + } else { + if (y0 > y1) { + this->lineHigh(x1, y1, x0, y0, color); + } else { + this->lineHigh(x0, y0, x1, y1, color); + } + } } - size_t i = (size_t)y * waymini_get_stride(this->wm) + (size_t)x * 4; - this->pixels[i + 0] = b; // B - this->pixels[i + 1] = g; // G - this->pixels[i + 2] = r; // R - this->pixels[i + 3] = 0xFF; // A - } }; } @@ -146,6 +199,14 @@ int main(void) { waymini_present(draw.wm); draw.rectangle(UwU::Coord2(69, 69), UwU::Coord2(420, 420), fuchsia); draw.point(UwU::Coord2(387, 43), green); + draw.line(UwU::Coord2(300, 100), UwU::Coord2(250, 469), green); + draw.line(UwU::Coord2(250, 100), UwU::Coord2(300, 469), green); + draw.line(UwU::Coord2(300, 100), UwU::Coord2(469, 250), green); + draw.line(UwU::Coord2(469, 100), UwU::Coord2(300, 250), green); + draw.line(UwU::Coord2(100, 300), UwU::Coord2(250, 469), green); + draw.line(UwU::Coord2(250, 300), UwU::Coord2(100, 469), green); + draw.line(UwU::Coord2(100, 300), UwU::Coord2(469, 250), green); + draw.line(UwU::Coord2(469, 300), UwU::Coord2(100, 250), green); while (!waymini_should_close(draw.wm)) { if (waymini_dispatch(draw.wm) < 0) break;