|
|
|
@ -42,7 +42,7 @@ NLOHMANN_JSON_SERIALIZE_ENUM(FillPattern, { |
|
|
|
NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT(ScrollFlags, endless, invertDirection, padBefore, padAfter) |
|
|
|
NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT(ScrollFlags, endless, invertDirection, padBefore, padAfter) |
|
|
|
NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT(LineFlags, dark) |
|
|
|
NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT(LineFlags, dark) |
|
|
|
NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT(FillFlags, dark) |
|
|
|
NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT(FillFlags, dark) |
|
|
|
NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT(TextFlags, dark) |
|
|
|
NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT(TextFlags, dark, autoWordWrap) |
|
|
|
NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT(TimeDisplayFlags, use12h, showHours, showMinutes, showSeconds) |
|
|
|
NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT(TimeDisplayFlags, use12h, showHours, showMinutes, showSeconds) |
|
|
|
|
|
|
|
|
|
|
|
ImageElement::ImageElement(std::uint16_t x, std::uint16_t y, std::uint16_t width, std::uint16_t height) |
|
|
|
ImageElement::ImageElement(std::uint16_t x, std::uint16_t y, std::uint16_t width, std::uint16_t height) |
|
|
|
@ -1466,8 +1466,63 @@ void ClippedTextElement::drawTo(OneBitBufferInterface* imageBuffer, std::size_t |
|
|
|
bool fgColor = !m_textFlags.dark; |
|
|
|
bool fgColor = !m_textFlags.dark; |
|
|
|
|
|
|
|
|
|
|
|
auto renderer = FontRenderer{fontData}.withIgnoreUnknownChars(true); |
|
|
|
auto renderer = FontRenderer{fontData}.withIgnoreUnknownChars(true); |
|
|
|
|
|
|
|
if (m_textFlags.autoWordWrap) { |
|
|
|
|
|
|
|
std::string_view text = m_text; |
|
|
|
|
|
|
|
auto dimensions = renderer.getRenderedDimensions(text, Point{0, 0}); |
|
|
|
|
|
|
|
if (!dimensions) { |
|
|
|
|
|
|
|
return; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
std::int32_t y = 0; |
|
|
|
|
|
|
|
while (dimensions->boundingBox && dimensions->boundingBox->size.width > m_width) { |
|
|
|
|
|
|
|
std::size_t pos = text.find('\n'); |
|
|
|
|
|
|
|
if (pos == std::string_view::npos) { |
|
|
|
|
|
|
|
pos = text.size(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
std::string_view currentLine = text.substr(0, pos); |
|
|
|
|
|
|
|
if (pos < text.size()) { |
|
|
|
|
|
|
|
text = text.substr(pos + 1); |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
text = text.substr(pos); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
while (currentLine.size() > 0) { |
|
|
|
|
|
|
|
dimensions = renderer.getRenderedDimensions(currentLine, Point{0, 0}); |
|
|
|
|
|
|
|
if (!dimensions) { |
|
|
|
|
|
|
|
return; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
std::size_t pos = currentLine.size(); |
|
|
|
|
|
|
|
while (pos > 0 && dimensions->boundingBox && dimensions->boundingBox->size.width > m_width) { |
|
|
|
|
|
|
|
std::size_t prevPos = pos; |
|
|
|
|
|
|
|
pos = currentLine.rfind(' ', prevPos - 1); |
|
|
|
|
|
|
|
if (pos == std::string_view::npos) { |
|
|
|
|
|
|
|
pos = prevPos; |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
dimensions = renderer.getRenderedDimensions(currentLine.substr(0, pos), Point{0, 0}); |
|
|
|
|
|
|
|
if (!dimensions) { |
|
|
|
|
|
|
|
return; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
renderer.render(currentLine.substr(0, pos), Point{0, y + static_cast<std::int32_t>(renderer.lineHeight() - 2)}, target, fgColor, bgColor); |
|
|
|
|
|
|
|
y += renderer.lineHeight(); |
|
|
|
|
|
|
|
if (pos < currentLine.size()) { |
|
|
|
|
|
|
|
currentLine = currentLine.substr(pos + 1); |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
currentLine = currentLine.substr(pos); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
dimensions = renderer.getRenderedDimensions(text, Point{0, 0}); |
|
|
|
|
|
|
|
if (!dimensions) { |
|
|
|
|
|
|
|
return; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if (text.size() > 0) { |
|
|
|
|
|
|
|
renderer.render(text, Point{0, y + static_cast<std::int32_t>(renderer.lineHeight() - 2)}, target, fgColor, bgColor); |
|
|
|
|
|
|
|
y += renderer.lineHeight(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} else { |
|
|
|
renderer.render(m_text, Point{0, static_cast<std::int32_t>(renderer.lineHeight() - 2)}, target, fgColor, bgColor); |
|
|
|
renderer.render(m_text, Point{0, static_cast<std::int32_t>(renderer.lineHeight() - 2)}, target, fgColor, bgColor); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
std::expected<std::unique_ptr<ClippedTextElement>, ParseError> ClippedTextElement::parse(std::span<std::byte const>& buffer, std::uint32_t formatVersion) { |
|
|
|
std::expected<std::unique_ptr<ClippedTextElement>, ParseError> ClippedTextElement::parse(std::span<std::byte const>& buffer, std::uint32_t formatVersion) { |
|
|
|
auto type = readU16LE(buffer); |
|
|
|
auto type = readU16LE(buffer); |
|
|
|
|