From e70066e7c24d7f14c62621114640e74f5c4e9f4c Mon Sep 17 00:00:00 2001 From: jpirnay Date: Thu, 19 Feb 2026 11:52:13 +0100 Subject: [PATCH] fix: add bresenham for arbitrary lines (#923) ## Summary * GfxRender did handle horizontal and vertical lines but had a TODO for arbitrary lines. * Added integer based Bresenham line drawing ## Additional Context --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**NO**_ --- lib/GfxRenderer/GfxRenderer.cpp | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/lib/GfxRenderer/GfxRenderer.cpp b/lib/GfxRenderer/GfxRenderer.cpp index 802c3357..8b8c9eac 100644 --- a/lib/GfxRenderer/GfxRenderer.cpp +++ b/lib/GfxRenderer/GfxRenderer.cpp @@ -147,8 +147,28 @@ void GfxRenderer::drawLine(int x1, int y1, int x2, int y2, const bool state) con drawPixel(x, y1, state); } } else { - // TODO: Implement - LOG_ERR("GFX", "Line drawing not supported"); + // Bresenham's line algorithm — integer arithmetic only + int dx = x2 - x1; + int dy = y2 - y1; + int sx = (dx > 0) ? 1 : -1; + int sy = (dy > 0) ? 1 : -1; + dx = sx * dx; // abs + dy = sy * dy; // abs + + int err = dx - dy; + while (true) { + drawPixel(x1, y1, state); + if (x1 == x2 && y1 == y2) break; + int e2 = 2 * err; + if (e2 > -dy) { + err -= dy; + x1 += sx; + } + if (e2 < dx) { + err += dx; + y1 += sy; + } + } } }