From a89a4dacb5066b79760947ac22e3a80e5d1e8f0e Mon Sep 17 00:00:00 2001 From: Annika Date: Sat, 4 Jul 2026 05:02:37 -0700 Subject: [PATCH] added alpha blending and putPixel helper function --- test | Bin 37000 -> 36992 bytes test.cpp | 51 +++++++++++++++++++++++++++------------------------ 2 files changed, 27 insertions(+), 24 deletions(-) diff --git a/test b/test index eb1e3b1c680f76519fc5c8771e30f73f4ea46662..4f0a237ac7d1651da054f89f4758143bba8ef61b 100755 GIT binary patch delta 7968 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 diff --git a/test.cpp b/test.cpp index f226c89..db3e5ab 100644 --- a/test.cpp +++ b/test.cpp @@ -46,7 +46,26 @@ namespace UwU { class Draw { private: - // plot lines if m<= 1 + uint8_t lerp8(uint8_t a, uint8_t b, uint8_t t) { + uint16_t product = (a * (255 - t)) + (b * t); + return product / 255; + } + + void putPixel(uint32_t x, uint32_t y, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 0xff) { + size_t i = (size_t)y * waymini_get_stride(this->wm) + (size_t)x * 4; + uint8_t b0 = this->pixels[i + 0]; + uint8_t g0 = this->pixels[i + 1]; + uint8_t r0 = this->pixels[i + 2]; + b = lerp8(b0, b, a); + g = lerp8(g0, g, a); + r = lerp8(r0, r, a); + this->pixels[i + 0] = b; // B + this->pixels[i + 1] = g; // G + this->pixels[i + 2] = r; // R + this->pixels[i + 3] = 0xff; // A + } + + // 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; @@ -58,11 +77,7 @@ namespace UwU { 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 + putPixel(x, y, color.r, color.g, color.b, color.a); if (d > 0) { y += yi; d += (2 * (dy - dx)); @@ -73,7 +88,7 @@ namespace UwU { return; } - // plot lines if m<= 1 + // 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; @@ -85,11 +100,7 @@ namespace UwU { 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 + putPixel(x, y, color.r, color.g, color.b, color.a); if (d > 0) { x += xi; d += (2 * (dx - dy)); @@ -128,11 +139,7 @@ namespace UwU { 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 + putPixel(x, y, color.r, color.g, color.b, color.a); } } return; @@ -154,11 +161,7 @@ namespace UwU { // 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 + putPixel(point.x, point.y, color.r, color.g, color.b, color.a); } // Uses Bresenham's line algorithm to draw line of any slope @@ -187,8 +190,8 @@ namespace UwU { int main(void) { uint32_t w = 800, h = 480; - UwU::Color fuchsia = UwU::Color(0xb00b69ff); - UwU::Color green = UwU::Color(0x00ff00ff); + UwU::Color fuchsia = UwU::Color(0xb00b6980); + UwU::Color green = UwU::Color(0x00ff0060); printf("r: %u, g:%u, b:%u, a:%u\n", fuchsia.r, fuchsia.g, fuchsia.b, fuchsia.a); // struct waymini *wm = waymini_create(w, h, on_key, NULL);