From a6e465c26af5bc76b420f8e76cfcc8abeef3b4e2 Mon Sep 17 00:00:00 2001 From: Jason Yang Date: Mon, 29 Jul 2024 01:56:13 -0700 Subject: [PATCH 1/3] Add: page controller to change background color together with zoom value --- src/adapters/controllers/page_controller.cpp | 2 +- src/application/core/metadata_extractor.cpp | 2 +- src/application/core/page_generator.cpp | 39 +++++++++++++++++++- src/application/core/page_generator.hpp | 6 ++- 4 files changed, 45 insertions(+), 4 deletions(-) diff --git a/src/adapters/controllers/page_controller.cpp b/src/adapters/controllers/page_controller.cpp index 65ac8502a..4acc81927 100644 --- a/src/adapters/controllers/page_controller.cpp +++ b/src/adapters/controllers/page_controller.cpp @@ -60,7 +60,7 @@ QImage PageController::renderPage() return m_pageImage; auto zoom = m_matrix.a; - m_pageImage = utils::qImageFromPixmap(m_pageGenerator.renderPage(zoom)); + m_pageImage = utils::qImageFromPixmap(m_pageGenerator.renderPage(zoom, "#445577")); auto xOffset = m_pageGenerator.getPageXOffset(); auto yOffset = m_pageGenerator.getPageYOffset(); diff --git a/src/application/core/metadata_extractor.cpp b/src/application/core/metadata_extractor.cpp index 76851aa63..3871a3366 100644 --- a/src/application/core/metadata_extractor.cpp +++ b/src/application/core/metadata_extractor.cpp @@ -156,7 +156,7 @@ QImage MetadataExtractor::getCover() try { core::PageGenerator page(m_document.get(), 0); - return utils::qImageFromPixmap(page.renderPage(1.0)); + return utils::qImageFromPixmap(page.renderPage(1.0, "#FFFFFF")); } catch(...) { diff --git a/src/application/core/page_generator.cpp b/src/application/core/page_generator.cpp index f9d0d450b..3356f2cb4 100644 --- a/src/application/core/page_generator.cpp +++ b/src/application/core/page_generator.cpp @@ -71,7 +71,12 @@ void PageGenerator::setupLinks() } } -mupdf::FzPixmap PageGenerator::renderPage(float zoom) +// mupdf::FzPixmap PageGenerator::renderPage(float zoom) +// { +// renderPage(zoom, "#000000"); +// } + +mupdf::FzPixmap PageGenerator::renderPage(float zoom, const std::string& hexColor) { // Create matrix with zoom mupdf::FzMatrix matrix; @@ -79,6 +84,13 @@ mupdf::FzPixmap PageGenerator::renderPage(float zoom) matrix.d = zoom; auto pixmap = getEmptyPixmap(matrix); + + // Set the color of the pixmap to rgb #124455 + // float color[3] = {0.0705882, 0.270588, 0.333333}; + mupdf::FzColorspace fz_colorspace = mupdf::FzColorspace::Fixed_RGB; + mupdf::FzColorParams fz_color_params = mupdf::FzColorParams(); + pixmap.fz_fill_pixmap_with_color(mupdf::FzColorspace::Fixed_RGB, convertHexToRGB(hexColor).data(), fz_color_params); + auto drawDevice = mupdf::fz_new_draw_device(mupdf::FzMatrix(), pixmap); // Determine the page offset the first time we render the page @@ -118,9 +130,34 @@ mupdf::FzPixmap PageGenerator::renderPage(float zoom) if(m_invertColor) pixmap.fz_invert_pixmap(); + + // Debugging and to understand mupdf API + printf("Color isRGB: %d\n", pixmap.colorspace().fz_colorspace_is_rgb()); + printf("Color name: %s\n", pixmap.colorspace().fz_colorspace_name()); + printf("Color n value: %d\n", pixmap.colorspace().fz_colorspace_n()); + printf("Color in float array: %f\n", pixmap.colorspace().m_internal[0]); + printf("Color in float array: %f\n", pixmap.colorspace().m_internal[1]); + printf("Color in float array: %f\n", pixmap.colorspace().m_internal[2]); + + return pixmap; } +std::array PageGenerator::convertHexToRGB(const std::string& hex) +{ + std::array rgb = {0.0f, 0.0f, 0.0f}; + if (hex[0] == '#') { + std::string hexColor = hex.substr(1); + + // Convert hex to rgb + rgb[0] = std::stoi(hexColor.substr(0, 2), nullptr, 16) / 255.0f; + rgb[1] = std::stoi(hexColor.substr(2, 2), nullptr, 16) / 255.0f; + rgb[2] = std::stoi(hexColor.substr(4, 2), nullptr, 16) / 255.0f; + } + return rgb; +} + + mupdf::FzPixmap PageGenerator::getEmptyPixmap( const mupdf::FzMatrix& matrix) const { diff --git a/src/application/core/page_generator.hpp b/src/application/core/page_generator.hpp index 2bbdd5cd4..66943a15a 100644 --- a/src/application/core/page_generator.hpp +++ b/src/application/core/page_generator.hpp @@ -1,6 +1,7 @@ #pragma once #include #include +#include #include #include #include "application_export.hpp" @@ -29,7 +30,8 @@ class APPLICATION_EXPORT PageGenerator int getPageXOffset() const; int getPageYOffset() const; - mupdf::FzPixmap renderPage(float zoom); + // mupdf::FzPixmap renderPage(float zoom); + mupdf::FzPixmap renderPage(float zoom, const std::string& hexColor); void setInvertColor(bool newInvertColor); bool pointIsAboveText(mupdf::FzPoint point); @@ -43,6 +45,8 @@ class APPLICATION_EXPORT PageGenerator utils::FzPointPair getPositionsForLineSelection(mupdf::FzPoint point); std::string getTextFromSelection(mupdf::FzPoint start, mupdf::FzPoint end); + std::array convertHexToRGB(const std::string& hex); + private: void setupDisplayList(const mupdf::FzRect& boundPage); void setupTextPage(int pageNumber); From 31c0f5f3af908f6ae49b6a969afbfb87c44aff76 Mon Sep 17 00:00:00 2001 From: Jason Yang Date: Mon, 29 Jul 2024 04:05:22 -0700 Subject: [PATCH 2/3] Edit: concluded that mupdf is impossible to change text color. Finalized change on custommizable background only. Currently hardcoded color to #CECECE. --- src/adapters/controllers/page_controller.cpp | 2 +- src/application/core/page_generator.cpp | 21 ++++++-------------- 2 files changed, 7 insertions(+), 16 deletions(-) diff --git a/src/adapters/controllers/page_controller.cpp b/src/adapters/controllers/page_controller.cpp index 4acc81927..6d290bd31 100644 --- a/src/adapters/controllers/page_controller.cpp +++ b/src/adapters/controllers/page_controller.cpp @@ -60,7 +60,7 @@ QImage PageController::renderPage() return m_pageImage; auto zoom = m_matrix.a; - m_pageImage = utils::qImageFromPixmap(m_pageGenerator.renderPage(zoom, "#445577")); + m_pageImage = utils::qImageFromPixmap(m_pageGenerator.renderPage(zoom, "#CECECE")); auto xOffset = m_pageGenerator.getPageXOffset(); auto yOffset = m_pageGenerator.getPageYOffset(); diff --git a/src/application/core/page_generator.cpp b/src/application/core/page_generator.cpp index 3356f2cb4..3c21df193 100644 --- a/src/application/core/page_generator.cpp +++ b/src/application/core/page_generator.cpp @@ -86,13 +86,12 @@ mupdf::FzPixmap PageGenerator::renderPage(float zoom, const std::string& hexColo auto pixmap = getEmptyPixmap(matrix); // Set the color of the pixmap to rgb #124455 - // float color[3] = {0.0705882, 0.270588, 0.333333}; - mupdf::FzColorspace fz_colorspace = mupdf::FzColorspace::Fixed_RGB; - mupdf::FzColorParams fz_color_params = mupdf::FzColorParams(); - pixmap.fz_fill_pixmap_with_color(mupdf::FzColorspace::Fixed_RGB, convertHexToRGB(hexColor).data(), fz_color_params); + pixmap.fz_fill_pixmap_with_color(mupdf::FzColorspace::Fixed_RGB, convertHexToRGB(hexColor).data(), mupdf::FzColorParams()); + // Define options with text color auto drawDevice = mupdf::fz_new_draw_device(mupdf::FzMatrix(), pixmap); + // Determine the page offset the first time we render the page if(m_pageXOffset == 0 && m_pageYOffset == 0) { @@ -127,19 +126,12 @@ mupdf::FzPixmap PageGenerator::renderPage(float zoom, const std::string& hexColo m_displayList.fz_run_display_list(drawDevice, matrix, rect, cookie); drawDevice.fz_close_device(); + // A bad attempt to change text color.... + // pixmap.fz_tint_pixmap(0xF4F4F4, 0x000000); + if(m_invertColor) pixmap.fz_invert_pixmap(); - - // Debugging and to understand mupdf API - printf("Color isRGB: %d\n", pixmap.colorspace().fz_colorspace_is_rgb()); - printf("Color name: %s\n", pixmap.colorspace().fz_colorspace_name()); - printf("Color n value: %d\n", pixmap.colorspace().fz_colorspace_n()); - printf("Color in float array: %f\n", pixmap.colorspace().m_internal[0]); - printf("Color in float array: %f\n", pixmap.colorspace().m_internal[1]); - printf("Color in float array: %f\n", pixmap.colorspace().m_internal[2]); - - return pixmap; } @@ -157,7 +149,6 @@ std::array PageGenerator::convertHexToRGB(const std::string& hex) return rgb; } - mupdf::FzPixmap PageGenerator::getEmptyPixmap( const mupdf::FzMatrix& matrix) const { From cc2c9d502ae3fbb99cd46170d31dbf09cc5e1702 Mon Sep 17 00:00:00 2001 From: Jason Yang Date: Mon, 29 Jul 2024 04:27:25 -0700 Subject: [PATCH 3/3] Edit: better comments --- src/adapters/controllers/page_controller.cpp | 2 +- src/application/core/metadata_extractor.cpp | 2 +- src/application/core/page_generator.cpp | 10 ++-------- src/application/core/page_generator.hpp | 1 - 4 files changed, 4 insertions(+), 11 deletions(-) diff --git a/src/adapters/controllers/page_controller.cpp b/src/adapters/controllers/page_controller.cpp index 6d290bd31..1d1c64c3d 100644 --- a/src/adapters/controllers/page_controller.cpp +++ b/src/adapters/controllers/page_controller.cpp @@ -60,7 +60,7 @@ QImage PageController::renderPage() return m_pageImage; auto zoom = m_matrix.a; - m_pageImage = utils::qImageFromPixmap(m_pageGenerator.renderPage(zoom, "#CECECE")); + m_pageImage = utils::qImageFromPixmap(m_pageGenerator.renderPage(zoom, "#CECECE")); // Require custom color passed from qml auto xOffset = m_pageGenerator.getPageXOffset(); auto yOffset = m_pageGenerator.getPageYOffset(); diff --git a/src/application/core/metadata_extractor.cpp b/src/application/core/metadata_extractor.cpp index 3871a3366..d56cf3d96 100644 --- a/src/application/core/metadata_extractor.cpp +++ b/src/application/core/metadata_extractor.cpp @@ -156,7 +156,7 @@ QImage MetadataExtractor::getCover() try { core::PageGenerator page(m_document.get(), 0); - return utils::qImageFromPixmap(page.renderPage(1.0, "#FFFFFF")); + return utils::qImageFromPixmap(page.renderPage(1.0, "#FFFFFF")); // #FFFFFF is white color for default cover } catch(...) { diff --git a/src/application/core/page_generator.cpp b/src/application/core/page_generator.cpp index 3c21df193..c3d41da34 100644 --- a/src/application/core/page_generator.cpp +++ b/src/application/core/page_generator.cpp @@ -71,11 +71,6 @@ void PageGenerator::setupLinks() } } -// mupdf::FzPixmap PageGenerator::renderPage(float zoom) -// { -// renderPage(zoom, "#000000"); -// } - mupdf::FzPixmap PageGenerator::renderPage(float zoom, const std::string& hexColor) { // Create matrix with zoom @@ -85,13 +80,11 @@ mupdf::FzPixmap PageGenerator::renderPage(float zoom, const std::string& hexColo auto pixmap = getEmptyPixmap(matrix); - // Set the color of the pixmap to rgb #124455 + // Set initial color of pixmap to custom rgb hex code pixmap.fz_fill_pixmap_with_color(mupdf::FzColorspace::Fixed_RGB, convertHexToRGB(hexColor).data(), mupdf::FzColorParams()); - // Define options with text color auto drawDevice = mupdf::fz_new_draw_device(mupdf::FzMatrix(), pixmap); - // Determine the page offset the first time we render the page if(m_pageXOffset == 0 && m_pageYOffset == 0) { @@ -135,6 +128,7 @@ mupdf::FzPixmap PageGenerator::renderPage(float zoom, const std::string& hexColo return pixmap; } +// Convert hex color to acceptable rgb format for colorspace std::array PageGenerator::convertHexToRGB(const std::string& hex) { std::array rgb = {0.0f, 0.0f, 0.0f}; diff --git a/src/application/core/page_generator.hpp b/src/application/core/page_generator.hpp index 66943a15a..027a4d1fc 100644 --- a/src/application/core/page_generator.hpp +++ b/src/application/core/page_generator.hpp @@ -30,7 +30,6 @@ class APPLICATION_EXPORT PageGenerator int getPageXOffset() const; int getPageYOffset() const; - // mupdf::FzPixmap renderPage(float zoom); mupdf::FzPixmap renderPage(float zoom, const std::string& hexColor); void setInvertColor(bool newInvertColor);