From a9ef65e64aa6d294ba94f2caf63fd07099c188bb Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Fri, 10 Nov 2023 22:00:36 +0100 Subject: [PATCH] LibPDF: For multi-output SampledFunctions, fix output colors For N outputs, the outputs aren't stored in N independent planes. Instead, N output values are stored right next to each other in the stream data. --- Tests/LibPDF/TestPDF.cpp | 2 +- Userland/Libraries/LibPDF/Function.cpp | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Tests/LibPDF/TestPDF.cpp b/Tests/LibPDF/TestPDF.cpp index ae8e4b315f..5045320b89 100644 --- a/Tests/LibPDF/TestPDF.cpp +++ b/Tests/LibPDF/TestPDF.cpp @@ -131,7 +131,7 @@ TEST_CASE(sampled) EXPECT_EQ(MUST(f1->evaluate(Vector { 0.75f })), Vector { 5.0f }); EXPECT_EQ(MUST(f1->evaluate(Vector { 1.0f })), Vector { 0.0f }); - auto f2 = MUST(make_sampled_function(Vector { { 0, 255, 0, 255, 0, 255 } }, { 0.0f, 1.0f }, { 0.0f, 10.0f, 0.0f, 8.0f }, { 3 })); + auto f2 = MUST(make_sampled_function(Vector { { 0, 255, 255, 0, 0, 255 } }, { 0.0f, 1.0f }, { 0.0f, 10.0f, 0.0f, 8.0f }, { 3 })); EXPECT_EQ(MUST(f2->evaluate(Vector { 0.0f })), (Vector { 0.0f, 8.0f })); EXPECT_EQ(MUST(f2->evaluate(Vector { 0.25f })), (Vector { 5.0f, 4.0f })); EXPECT_EQ(MUST(f2->evaluate(Vector { 0.5f })), (Vector { 10.0f, 0.0f })); diff --git a/Userland/Libraries/LibPDF/Function.cpp b/Userland/Libraries/LibPDF/Function.cpp index d09bba0472..246b1ca33a 100644 --- a/Userland/Libraries/LibPDF/Function.cpp +++ b/Userland/Libraries/LibPDF/Function.cpp @@ -178,10 +178,10 @@ PDFErrorOr> SampledFunction::evaluate(ReadonlySpan x) else e0 = e1 - 1.0f; } - size_t plane_size = m_sizes[0]; + size_t plane_size = m_range.size(); for (size_t i = 0; i < m_range.size(); ++i) { - float s0 = m_sample_data[(size_t)e0 + i * plane_size]; - float s1 = m_sample_data[(size_t)e1 + i * plane_size]; + float s0 = m_sample_data[(size_t)e0 * plane_size + i]; + float s1 = m_sample_data[(size_t)e1 * plane_size + i]; float r0 = interpolate(ec, e0, e1, s0, s1); r0 = interpolate(r0, 0.0f, 255.0f, m_decode[i].lower, m_decode[i].upper); m_outputs[i] = clamp(r0, m_range[i].lower, m_range[i].upper);