From f2e3d117dcf90c4fa2a8ade244cd848a5d9aeba5 Mon Sep 17 00:00:00 2001 From: Zach Nelson Date: Thu, 11 Jun 2026 10:23:49 -0500 Subject: [PATCH] fix: Hanging indent causes overlapping words (#2324) --- lib/Epub/Epub/ParsedText.cpp | 10 +++++----- lib/Epub/Epub/Section.cpp | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/Epub/Epub/ParsedText.cpp b/lib/Epub/Epub/ParsedText.cpp index 74a29d1a..d4d66144 100644 --- a/lib/Epub/Epub/ParsedText.cpp +++ b/lib/Epub/Epub/ParsedText.cpp @@ -799,7 +799,7 @@ void ParsedText::extractLine(const size_t breakIndex, const int pageWidth, const } for (size_t wordIdx = 0; wordIdx < reorderedWidthsScratch.size(); wordIdx++) { - lineXPos.push_back(static_cast(xpos < 0 ? 0 : xpos)); + lineXPos.push_back(static_cast(xpos)); xpos += reorderedWidthsScratch[wordIdx]; const bool nextIsContinuation = @@ -830,7 +830,7 @@ void ParsedText::extractLine(const size_t breakIndex, const int pageWidth, const // Standard LTR/RTL positioning loop when no visual reordering is needed if (blockStyle.isRtl) { // RTL: position words from right to left - auto xpos = static_cast(effectivePageWidth); + int xpos = effectivePageWidth; if (effectiveAlignment == CssTextAlign::Left) { // Explicit left alignment in RTL context xpos = lineWordWidthSum + totalNaturalGaps; @@ -841,7 +841,7 @@ void ParsedText::extractLine(const size_t breakIndex, const int pageWidth, const for (size_t wordIdx = 0; wordIdx < lineWordCount; wordIdx++) { xpos -= wordWidths[lastBreakAt + wordIdx]; - lineXPos.push_back(static_cast(xpos < 0 ? 0 : xpos)); + lineXPos.push_back(static_cast(xpos)); const bool nextIsContinuation = wordIdx + 1 < lineWordCount && continuesVec[lastBreakAt + wordIdx + 1]; if (nextIsContinuation) { @@ -867,7 +867,7 @@ void ParsedText::extractLine(const size_t breakIndex, const int pageWidth, const } } else { // LTR: position words from left to right - auto xpos = static_cast(firstLineIndent); + int xpos = firstLineIndent; if (effectiveAlignment == CssTextAlign::Right) { xpos = effectivePageWidth - lineWordWidthSum - totalNaturalGaps; } else if (effectiveAlignment == CssTextAlign::Center) { @@ -875,7 +875,7 @@ void ParsedText::extractLine(const size_t breakIndex, const int pageWidth, const } for (size_t wordIdx = 0; wordIdx < lineWordCount; wordIdx++) { - lineXPos.push_back(static_cast(xpos < 0 ? 0 : xpos)); + lineXPos.push_back(static_cast(xpos)); const bool nextIsContinuation = wordIdx + 1 < lineWordCount && continuesVec[lastBreakAt + wordIdx + 1]; if (nextIsContinuation) { diff --git a/lib/Epub/Epub/Section.cpp b/lib/Epub/Epub/Section.cpp index 4ccfac0f..c13da526 100644 --- a/lib/Epub/Epub/Section.cpp +++ b/lib/Epub/Epub/Section.cpp @@ -10,7 +10,7 @@ #include "parsers/ChapterHtmlSlimParser.h" namespace { -constexpr uint8_t SECTION_FILE_VERSION = 25; +constexpr uint8_t SECTION_FILE_VERSION = 26; constexpr uint32_t HEADER_SIZE = sizeof(uint8_t) + sizeof(int) + sizeof(float) + sizeof(bool) + sizeof(uint8_t) + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(bool) + sizeof(bool) + sizeof(uint8_t) + sizeof(bool) + sizeof(uint32_t) + sizeof(uint32_t) +