From cfd05b1a55ff2f097cc8ccb53dfc6e053b0a0828 Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Mon, 8 Jan 2024 19:52:14 -0500 Subject: [PATCH] LibPDF: Use MatrixMatrixConversion when possible Reduces time spent rendering page 3 of 0000849.pdf from 1.32s to 1.13s on my machine. Also reduces the time to run Meta/test_pdf.py on 0000.zip (without 0000849.pdf) from 56s to 54s. --- Userland/Libraries/LibPDF/ColorSpace.cpp | 12 ++++++++++-- Userland/Libraries/LibPDF/ColorSpace.h | 1 + 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/Userland/Libraries/LibPDF/ColorSpace.cpp b/Userland/Libraries/LibPDF/ColorSpace.cpp index 74d4a91d5e..b4c1e44759 100644 --- a/Userland/Libraries/LibPDF/ColorSpace.cpp +++ b/Userland/Libraries/LibPDF/ColorSpace.cpp @@ -495,11 +495,12 @@ PDFErrorOr> ICCBasedColorSpace::create(Document* docum ICCBasedColorSpace::ICCBasedColorSpace(NonnullRefPtr profile) : m_profile(profile) { + m_map = sRGB()->matrix_matrix_conversion(profile); } PDFErrorOr ICCBasedColorSpace::style(ReadonlySpan arguments) const { - Vector bytes; + Vector components; for (size_t i = 0; i < arguments.size(); ++i) { auto const& arg = arguments[i]; VERIFY(arg.has_number()); @@ -514,9 +515,16 @@ PDFErrorOr ICCBasedColorSpace::style(ReadonlySpan arguments number = (number + 128.0f) / 255.0f; } - bytes.append(static_cast(number * 255.0f)); + components.append(number); } + if (m_map.has_value()) + return m_map->map(FloatVector3 { components[0], components[1], components[2] }); + + Vector bytes; + for (auto component : components) + bytes.append(static_cast(component * 255.0f)); + auto pcs = TRY(m_profile->to_pcs(bytes)); Array output; TRY(sRGB()->from_pcs(m_profile, pcs, output.span())); diff --git a/Userland/Libraries/LibPDF/ColorSpace.h b/Userland/Libraries/LibPDF/ColorSpace.h index 70beac13a8..dfbca3dee1 100644 --- a/Userland/Libraries/LibPDF/ColorSpace.h +++ b/Userland/Libraries/LibPDF/ColorSpace.h @@ -195,6 +195,7 @@ private: static RefPtr s_srgb_profile; NonnullRefPtr m_profile; + Optional m_map; }; class LabColorSpace final : public ColorSpace {