From 26f8c0b76cabb483f1a1cf2e4ee031f034b9684c Mon Sep 17 00:00:00 2001 From: Rodrigo Tobar Date: Fri, 25 Nov 2022 01:43:31 +0800 Subject: [PATCH] LibPDF: Add more knowledge to ColorSpaces classes ColorSpaces now can tell users how many components they expect, and the default decode array that should be used when converting unit bit sequences into color space component input values during image rendering. --- Userland/Libraries/LibPDF/ColorSpace.cpp | 25 ++++++++++++++++++++++++ Userland/Libraries/LibPDF/ColorSpace.h | 13 ++++++++++++ 2 files changed, 38 insertions(+) diff --git a/Userland/Libraries/LibPDF/ColorSpace.cpp b/Userland/Libraries/LibPDF/ColorSpace.cpp index 943f9b96fb..47ffbf181c 100644 --- a/Userland/Libraries/LibPDF/ColorSpace.cpp +++ b/Userland/Libraries/LibPDF/ColorSpace.cpp @@ -73,6 +73,11 @@ Color DeviceGrayColorSpace::color(Vector const& arguments) const return Color(gray, gray, gray); } +Vector DeviceGrayColorSpace::default_decode() const +{ + return { 0.0f, 1.0f }; +} + NonnullRefPtr DeviceRGBColorSpace::the() { static auto instance = adopt_ref(*new DeviceRGBColorSpace()); @@ -88,6 +93,11 @@ Color DeviceRGBColorSpace::color(Vector const& arguments) const return Color(r, g, b); } +Vector DeviceRGBColorSpace::default_decode() const +{ + return { 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f }; +} + NonnullRefPtr DeviceCMYKColorSpace::the() { static auto instance = adopt_ref(*new DeviceCMYKColorSpace()); @@ -104,6 +114,11 @@ Color DeviceCMYKColorSpace::color(Vector const& arguments) const return Color::from_cmyk(c, m, y, k); } +Vector DeviceCMYKColorSpace::default_decode() const +{ + return { 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f }; +} + PDFErrorOr> CalRGBColorSpace::create(Document* document, Vector&& parameters) { if (parameters.size() != 1) @@ -274,6 +289,11 @@ Color CalRGBColorSpace::color(Vector const& arguments) const return Color(red, green, blue); } +Vector CalRGBColorSpace::default_decode() const +{ + return { 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f }; +} + PDFErrorOr> ICCBasedColorSpace::create(Document* document, Vector&& parameters) { if (parameters.is_empty()) @@ -313,4 +333,9 @@ Color ICCBasedColorSpace::color(Vector const&) const VERIFY_NOT_REACHED(); } +Vector ICCBasedColorSpace::default_decode() const +{ + VERIFY_NOT_REACHED(); +} + } diff --git a/Userland/Libraries/LibPDF/ColorSpace.h b/Userland/Libraries/LibPDF/ColorSpace.h index ab1e8c4da5..08bc660e7d 100644 --- a/Userland/Libraries/LibPDF/ColorSpace.h +++ b/Userland/Libraries/LibPDF/ColorSpace.h @@ -6,6 +6,7 @@ #pragma once +#include "AK/Forward.h" #include #include #include @@ -54,6 +55,8 @@ public: virtual ~ColorSpace() = default; virtual Color color(Vector const& arguments) const = 0; + virtual int number_of_components() const = 0; + virtual Vector default_decode() const = 0; virtual ColorSpaceFamily const& family() const = 0; }; @@ -64,6 +67,8 @@ public: ~DeviceGrayColorSpace() override = default; Color color(Vector const& arguments) const override; + int number_of_components() const override { return 1; } + Vector default_decode() const override; ColorSpaceFamily const& family() const override { return ColorSpaceFamily::DeviceGray; } private: @@ -77,6 +82,8 @@ public: ~DeviceRGBColorSpace() override = default; Color color(Vector const& arguments) const override; + int number_of_components() const override { return 3; } + Vector default_decode() const override; ColorSpaceFamily const& family() const override { return ColorSpaceFamily::DeviceRGB; } private: @@ -90,6 +97,8 @@ public: ~DeviceCMYKColorSpace() override = default; Color color(Vector const& arguments) const override; + int number_of_components() const override { return 4; } + Vector default_decode() const override; ColorSpaceFamily const& family() const override { return ColorSpaceFamily::DeviceCMYK; } private: @@ -103,6 +112,8 @@ public: ~CalRGBColorSpace() override = default; Color color(Vector const& arguments) const override; + int number_of_components() const override { return 3; } + Vector default_decode() const override; ColorSpaceFamily const& family() const override { return ColorSpaceFamily::CalRGB; } private: @@ -121,6 +132,8 @@ public: ~ICCBasedColorSpace() override = default; Color color(Vector const& arguments) const override; + int number_of_components() const override { VERIFY_NOT_REACHED(); } + Vector default_decode() const override; ColorSpaceFamily const& family() const override { return ColorSpaceFamily::ICCBased; } private: