From 4cb0593daf02f350aaae837b03ba0be1f116bebe Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Sat, 25 Nov 2023 22:06:44 -0500 Subject: [PATCH] LibPDF: Convert LAB values to bytes differently Gfx::ICC::Profile's current API takes bytes, so we need to do some contortions for LAB values to go through. This will probably become nicer once we implement all the backward transforms in Gfx::ICC::Profile, but for now let's hack it in on the LibPDF side. Makes colors in 0000651.pdf looks good, especially on pages 1 and 7-12. --- Userland/Libraries/LibPDF/ColorSpace.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/Userland/Libraries/LibPDF/ColorSpace.cpp b/Userland/Libraries/LibPDF/ColorSpace.cpp index 435d4963d1..766ecb25a1 100644 --- a/Userland/Libraries/LibPDF/ColorSpace.cpp +++ b/Userland/Libraries/LibPDF/ColorSpace.cpp @@ -499,9 +499,21 @@ PDFErrorOr ICCBasedColorSpace::color(ReadonlySpan arguments) const s_srgb_profile = TRY(Gfx::ICC::sRGB()); Vector bytes; - for (auto const& arg : arguments) { + for (size_t i = 0; i < arguments.size(); ++i) { + auto const& arg = arguments[i]; VERIFY(arg.has_number()); - bytes.append(static_cast(arg.to_float() * 255.0f)); + float number = arg.to_float(); + + if (m_profile->data_color_space() == Gfx::ICC::ColorSpace::CIELAB) { + // CIELAB channels go from 0..100 and -128..127 instead of from 0..1. + // FIXME: We should probably have an API on Gfx::ICC::Profile that takes floats instead of bytes and that does this internally instead. + if (i == 0) + number /= 100.0f; + else + number = (number + 128.0f) / 255.0f; + } + + bytes.append(static_cast(number * 255.0f)); } auto pcs = TRY(m_profile->to_pcs(bytes));