From 122e961e8aec95dc674681c3706b9d43e7d3fb4c Mon Sep 17 00:00:00 2001 From: Jonas Diemer Date: Sun, 14 Dec 2025 21:43:56 +0100 Subject: [PATCH] Added setting for extra paragraph spacing. --- lib/Epub/Epub/Section.cpp | 19 +++++++++++++------ lib/Epub/Epub/Section.h | 6 +++--- .../Epub/parsers/ChapterHtmlSlimParser.cpp | 6 ++++-- lib/Epub/Epub/parsers/ChapterHtmlSlimParser.h | 5 ++++- src/CrossPointSettings.cpp | 2 ++ src/CrossPointSettings.h | 3 +++ src/screens/EpubReaderScreen.cpp | 5 +++-- src/screens/SettingsScreen.cpp | 3 ++- src/screens/SettingsScreen.h | 2 +- 9 files changed, 35 insertions(+), 16 deletions(-) diff --git a/lib/Epub/Epub/Section.cpp b/lib/Epub/Epub/Section.cpp index c8118a2..aa92b22 100644 --- a/lib/Epub/Epub/Section.cpp +++ b/lib/Epub/Epub/Section.cpp @@ -24,7 +24,8 @@ void Section::onPageComplete(std::unique_ptr page) { } void Section::writeCacheMetadata(const int fontId, const float lineCompression, const int marginTop, - const int marginRight, const int marginBottom, const int marginLeft) const { + const int marginRight, const int marginBottom, const int marginLeft, + const bool extraParagraphSpacing) const { std::ofstream outputFile(("/sd" + cachePath + "/section.bin").c_str()); serialization::writePod(outputFile, SECTION_FILE_VERSION); serialization::writePod(outputFile, fontId); @@ -33,12 +34,14 @@ void Section::writeCacheMetadata(const int fontId, const float lineCompression, serialization::writePod(outputFile, marginRight); serialization::writePod(outputFile, marginBottom); serialization::writePod(outputFile, marginLeft); + serialization::writePod(outputFile, extraParagraphSpacing); serialization::writePod(outputFile, pageCount); outputFile.close(); } bool Section::loadCacheMetadata(const int fontId, const float lineCompression, const int marginTop, - const int marginRight, const int marginBottom, const int marginLeft) { + const int marginRight, const int marginBottom, const int marginLeft, + const bool extraParagraphSpacing) { if (!SD.exists(cachePath.c_str())) { return false; } @@ -63,15 +66,18 @@ bool Section::loadCacheMetadata(const int fontId, const float lineCompression, c int fileFontId, fileMarginTop, fileMarginRight, fileMarginBottom, fileMarginLeft; float fileLineCompression; + bool fileExtraParagraphSpacing; serialization::readPod(inputFile, fileFontId); serialization::readPod(inputFile, fileLineCompression); serialization::readPod(inputFile, fileMarginTop); serialization::readPod(inputFile, fileMarginRight); serialization::readPod(inputFile, fileMarginBottom); serialization::readPod(inputFile, fileMarginLeft); + serialization::readPod(inputFile, fileExtraParagraphSpacing); if (fontId != fileFontId || lineCompression != fileLineCompression || marginTop != fileMarginTop || - marginRight != fileMarginRight || marginBottom != fileMarginBottom || marginLeft != fileMarginLeft) { + marginRight != fileMarginRight || marginBottom != fileMarginBottom || marginLeft != fileMarginLeft || + extraParagraphSpacing != fileExtraParagraphSpacing) { inputFile.close(); Serial.printf("[%lu] [SCT] Deserialization failed: Parameters do not match\n", millis()); clearCache(); @@ -107,7 +113,8 @@ bool Section::clearCache() const { } bool Section::persistPageDataToSD(const int fontId, const float lineCompression, const int marginTop, - const int marginRight, const int marginBottom, const int marginLeft) { + const int marginRight, const int marginBottom, const int marginLeft, + const bool extraParagraphSpacing) { const auto localPath = epub->getSpineItem(spineIndex); // TODO: Should we get rid of this file all together? @@ -128,7 +135,7 @@ bool Section::persistPageDataToSD(const int fontId, const float lineCompression, const auto sdTmpHtmlPath = "/sd" + tmpHtmlPath; ChapterHtmlSlimParser visitor(sdTmpHtmlPath.c_str(), renderer, fontId, lineCompression, marginTop, marginRight, - marginBottom, marginLeft, + marginBottom, marginLeft, extraParagraphSpacing, [this](std::unique_ptr page) { this->onPageComplete(std::move(page)); }); success = visitor.parseAndBuildPages(); @@ -138,7 +145,7 @@ bool Section::persistPageDataToSD(const int fontId, const float lineCompression, return false; } - writeCacheMetadata(fontId, lineCompression, marginTop, marginRight, marginBottom, marginLeft); + writeCacheMetadata(fontId, lineCompression, marginTop, marginRight, marginBottom, marginLeft, extraParagraphSpacing); return true; } diff --git a/lib/Epub/Epub/Section.h b/lib/Epub/Epub/Section.h index 4c98fbe..35a17df 100644 --- a/lib/Epub/Epub/Section.h +++ b/lib/Epub/Epub/Section.h @@ -13,7 +13,7 @@ class Section { std::string cachePath; void writeCacheMetadata(int fontId, float lineCompression, int marginTop, int marginRight, int marginBottom, - int marginLeft) const; + int marginLeft, bool extraParagraphSpacing) const; void onPageComplete(std::unique_ptr page); public: @@ -26,10 +26,10 @@ class Section { } ~Section() = default; bool loadCacheMetadata(int fontId, float lineCompression, int marginTop, int marginRight, int marginBottom, - int marginLeft); + int marginLeft, bool extraParagraphSpacing); void setupCacheDir() const; bool clearCache() const; bool persistPageDataToSD(int fontId, float lineCompression, int marginTop, int marginRight, int marginBottom, - int marginLeft); + int marginLeft, bool extraParagraphSpacing); std::unique_ptr loadPageFromSD() const; }; diff --git a/lib/Epub/Epub/parsers/ChapterHtmlSlimParser.cpp b/lib/Epub/Epub/parsers/ChapterHtmlSlimParser.cpp index 4c77a5d..3c1f5ca 100644 --- a/lib/Epub/Epub/parsers/ChapterHtmlSlimParser.cpp +++ b/lib/Epub/Epub/parsers/ChapterHtmlSlimParser.cpp @@ -274,6 +274,8 @@ void ChapterHtmlSlimParser::makePages() { currentTextBlock->layoutAndExtractLines( renderer, fontId, marginLeft + marginRight, [this](const std::shared_ptr& textBlock) { addLineToPage(textBlock); }); - // Extra paragrpah spacing - //currentPageNextY += lineHeight / 2; + // Extra paragraph spacing if enabled + if (extraParagraphSpacing) { + currentPageNextY += lineHeight / 2; + } } diff --git a/lib/Epub/Epub/parsers/ChapterHtmlSlimParser.h b/lib/Epub/Epub/parsers/ChapterHtmlSlimParser.h index 9791f50..67ed5a1 100644 --- a/lib/Epub/Epub/parsers/ChapterHtmlSlimParser.h +++ b/lib/Epub/Epub/parsers/ChapterHtmlSlimParser.h @@ -35,6 +35,7 @@ class ChapterHtmlSlimParser { int marginRight; int marginBottom; int marginLeft; + bool extraParagraphSpacing; void startNewTextBlock(TextBlock::BLOCK_STYLE style); void makePages(); @@ -46,7 +47,8 @@ class ChapterHtmlSlimParser { public: explicit ChapterHtmlSlimParser(const char* filepath, GfxRenderer& renderer, const int fontId, const float lineCompression, const int marginTop, const int marginRight, - const int marginBottom, const int marginLeft, + const int marginBottom, const int marginLeft, + const bool extraParagraphSpacing, const std::function)>& completePageFn) : filepath(filepath), renderer(renderer), @@ -56,6 +58,7 @@ class ChapterHtmlSlimParser { marginRight(marginRight), marginBottom(marginBottom), marginLeft(marginLeft), + extraParagraphSpacing(extraParagraphSpacing), completePageFn(completePageFn) {} ~ChapterHtmlSlimParser() = default; bool parseAndBuildPages(); diff --git a/src/CrossPointSettings.cpp b/src/CrossPointSettings.cpp index 31a2c18..a740405 100644 --- a/src/CrossPointSettings.cpp +++ b/src/CrossPointSettings.cpp @@ -19,6 +19,7 @@ bool CrossPointSettings::saveToFile() const { std::ofstream outputFile(SETTINGS_FILE); serialization::writePod(outputFile, SETTINGS_FILE_VERSION); serialization::writePod(outputFile, whiteSleepScreen); + serialization::writePod(outputFile, extraParagraphSpacing); outputFile.close(); Serial.printf("[%lu] [CPS] Settings saved to file\n", millis()); @@ -42,6 +43,7 @@ bool CrossPointSettings::loadFromFile() { } serialization::readPod(inputFile, whiteSleepScreen); + serialization::readPod(inputFile, extraParagraphSpacing); inputFile.close(); Serial.printf("[%lu] [CPS] Settings loaded from file\n", millis()); diff --git a/src/CrossPointSettings.h b/src/CrossPointSettings.h index bf5a6ca..8924121 100644 --- a/src/CrossPointSettings.h +++ b/src/CrossPointSettings.h @@ -17,6 +17,9 @@ class CrossPointSettings { // Sleep screen settings bool whiteSleepScreen = false; + // Text rendering settings + bool extraParagraphSpacing = false; + ~CrossPointSettings() = default; // Get singleton instance diff --git a/src/screens/EpubReaderScreen.cpp b/src/screens/EpubReaderScreen.cpp index d0a3103..e914d07 100644 --- a/src/screens/EpubReaderScreen.cpp +++ b/src/screens/EpubReaderScreen.cpp @@ -5,6 +5,7 @@ #include #include "Battery.h" +#include "CrossPointSettings.h" #include "EpubReaderChapterSelectionScreen.h" #include "config.h" @@ -205,7 +206,7 @@ void EpubReaderScreen::renderScreen() { Serial.printf("[%lu] [ERS] Loading file: %s, index: %d\n", millis(), filepath.c_str(), currentSpineIndex); section = std::unique_ptr
(new Section(epub, currentSpineIndex, renderer)); if (!section->loadCacheMetadata(READER_FONT_ID, lineCompression, marginTop, marginRight, marginBottom, - marginLeft)) { + marginLeft, SETTINGS.extraParagraphSpacing)) { Serial.printf("[%lu] [ERS] Cache not found, building...\n", millis()); { @@ -228,7 +229,7 @@ void EpubReaderScreen::renderScreen() { section->setupCacheDir(); if (!section->persistPageDataToSD(READER_FONT_ID, lineCompression, marginTop, marginRight, marginBottom, - marginLeft)) { + marginLeft, SETTINGS.extraParagraphSpacing)) { Serial.printf("[%lu] [ERS] Failed to persist page data to SD\n", millis()); section.reset(); return; diff --git a/src/screens/SettingsScreen.cpp b/src/screens/SettingsScreen.cpp index e16da05..723af3a 100644 --- a/src/screens/SettingsScreen.cpp +++ b/src/screens/SettingsScreen.cpp @@ -7,7 +7,8 @@ // Define the static settings list const SettingInfo SettingsScreen::settingsList[SettingsScreen::settingsCount] = { - {"White Splash Screen", &CrossPointSettings::whiteSleepScreen} + {"White Splash Screen", &CrossPointSettings::whiteSleepScreen}, + {"Extra Paragraph Spacing", &CrossPointSettings::extraParagraphSpacing} }; void SettingsScreen::taskTrampoline(void* param) { diff --git a/src/screens/SettingsScreen.h b/src/screens/SettingsScreen.h index e431f3b..fd66de4 100644 --- a/src/screens/SettingsScreen.h +++ b/src/screens/SettingsScreen.h @@ -24,7 +24,7 @@ class SettingsScreen final : public Screen { const std::function onGoHome; // Static settings list - static constexpr int settingsCount = 1; // Number of settings + static constexpr int settingsCount = 2; // Number of settings static const SettingInfo settingsList[settingsCount]; static void taskTrampoline(void* param);