From 42a509705e63a88b88ddefb51db7441994f3df2d Mon Sep 17 00:00:00 2001 From: Christian Seiler Date: Thu, 2 Jul 2026 23:14:08 +0200 Subject: [PATCH] C++: fix line rendering logic --- cpp/src/monoformat_parseonly.cpp | 8 ++++++++ cpp/src/monoformat_structured.cpp | 22 ++++++++++++++++++---- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/cpp/src/monoformat_parseonly.cpp b/cpp/src/monoformat_parseonly.cpp index 3f3c992..7456b2c 100644 --- a/cpp/src/monoformat_parseonly.cpp +++ b/cpp/src/monoformat_parseonly.cpp @@ -946,10 +946,18 @@ std::expected handleLine(std::span& buffer, O bool value = !lineFlags.dark; if (dx == 0) { + if (dy < 0) { + std::swap(originY, targetY); + dy = -dy; + } for (std::int32_t i = 0; i <= dy; ++i) { screen->setPixel(*originX, *originY + i, value); } } else if (dy == 0) { + if (dx < 0) { + std::swap(originX, targetX); + dx = -dx; + } for (std::int32_t i = 0; i <= dx; ++i) { screen->setPixel(*originX + i, *originY, value); } diff --git a/cpp/src/monoformat_structured.cpp b/cpp/src/monoformat_structured.cpp index 7f2e02d..88f348e 100644 --- a/cpp/src/monoformat_structured.cpp +++ b/cpp/src/monoformat_structured.cpp @@ -1145,18 +1145,32 @@ void LineElement::drawTo(OneBitBufferInterface* imageBuffer, std::size_t animati std::int32_t dy = static_cast(m_targetY) - static_cast(m_originY); bool value = true; + std::uint16_t originX = m_originX; + std::uint16_t originY = m_originY; + std::uint16_t targetX = m_targetX; + std::uint16_t targetY = m_targetY; + + if (dx == 0) { + if (dy < 0) { + std::swap(originY, targetY); + dy = -dy; + } for (std::int32_t i = 0; i <= dy; ++i) { - imageBuffer->setPixel(m_originX, m_originY + i, value); + imageBuffer->setPixel(originX, originY + i, value); } } else if (dy == 0) { + if (dx < 0) { + std::swap(originX, targetX); + dx = -dx; + } for (std::int32_t i = 0; i <= dx; ++i) { - imageBuffer->setPixel(m_originX + i, m_originY, value); + imageBuffer->setPixel(originX + i, originY, value); } } else { for (std::int32_t i = 0; i <= dx; ++i) { - std::int32_t x = m_originX + i; - std::int32_t y = i * dy / dx + m_originY; + std::int32_t x = originX + i; + std::int32_t y = i * dy / dx + originY; imageBuffer->setPixel(static_cast(x), static_cast(y), value); } }