C++: fix line rendering logic

main
Christian Seiler 5 days ago
parent 4f36b72f5c
commit 42a509705e
  1. 8
      cpp/src/monoformat_parseonly.cpp
  2. 22
      cpp/src/monoformat_structured.cpp

@ -946,10 +946,18 @@ std::expected<void, ParseError> handleLine(std::span<std::byte const>& buffer, O
bool value = !lineFlags.dark; bool value = !lineFlags.dark;
if (dx == 0) { if (dx == 0) {
if (dy < 0) {
std::swap(originY, targetY);
dy = -dy;
}
for (std::int32_t i = 0; i <= dy; ++i) { for (std::int32_t i = 0; i <= dy; ++i) {
screen->setPixel(*originX, *originY + i, value); screen->setPixel(*originX, *originY + i, value);
} }
} else if (dy == 0) { } else if (dy == 0) {
if (dx < 0) {
std::swap(originX, targetX);
dx = -dx;
}
for (std::int32_t i = 0; i <= dx; ++i) { for (std::int32_t i = 0; i <= dx; ++i) {
screen->setPixel(*originX + i, *originY, value); screen->setPixel(*originX + i, *originY, value);
} }

@ -1145,18 +1145,32 @@ void LineElement::drawTo(OneBitBufferInterface* imageBuffer, std::size_t animati
std::int32_t dy = static_cast<std::int32_t>(m_targetY) - static_cast<std::int32_t>(m_originY); std::int32_t dy = static_cast<std::int32_t>(m_targetY) - static_cast<std::int32_t>(m_originY);
bool value = true; 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 (dx == 0) {
if (dy < 0) {
std::swap(originY, targetY);
dy = -dy;
}
for (std::int32_t i = 0; i <= dy; ++i) { 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) { } else if (dy == 0) {
if (dx < 0) {
std::swap(originX, targetX);
dx = -dx;
}
for (std::int32_t i = 0; i <= dx; ++i) { for (std::int32_t i = 0; i <= dx; ++i) {
imageBuffer->setPixel(m_originX + i, m_originY, value); imageBuffer->setPixel(originX + i, originY, value);
} }
} else { } else {
for (std::int32_t i = 0; i <= dx; ++i) { for (std::int32_t i = 0; i <= dx; ++i) {
std::int32_t x = m_originX + i; std::int32_t x = originX + i;
std::int32_t y = i * dy / dx + m_originY; std::int32_t y = i * dy / dx + originY;
imageBuffer->setPixel(static_cast<std::uint16_t>(x), static_cast<std::uint16_t>(y), value); imageBuffer->setPixel(static_cast<std::uint16_t>(x), static_cast<std::uint16_t>(y), value);
} }
} }

Loading…
Cancel
Save