mirror of
https://github.com/RGBCube/serenity
synced 2025-05-21 12:35:08 +00:00

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.
143 lines
4.5 KiB
C++
143 lines
4.5 KiB
C++
/*
|
|
* Copyright (c) 2021-2022, Matthew Olsson <mattco@serenityos.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include "AK/Forward.h"
|
|
#include <AK/FlyString.h>
|
|
#include <LibGfx/Color.h>
|
|
#include <LibPDF/Value.h>
|
|
|
|
#define ENUMERATE_COLOR_SPACE_FAMILIES(V) \
|
|
V(DeviceGray, true) \
|
|
V(DeviceRGB, true) \
|
|
V(DeviceCMYK, true) \
|
|
V(CalGray, false) \
|
|
V(CalRGB, false) \
|
|
V(Lab, false) \
|
|
V(ICCBased, false) \
|
|
V(Indexed, false) \
|
|
V(Pattern, false) \
|
|
V(Separation, false) \
|
|
V(DeviceN, false)
|
|
|
|
namespace PDF {
|
|
|
|
class ColorSpaceFamily {
|
|
public:
|
|
ColorSpaceFamily(FlyString name, bool never_needs_paramaters_p)
|
|
: m_name(move(name))
|
|
, m_never_needs_parameters(never_needs_paramaters_p)
|
|
{
|
|
}
|
|
|
|
FlyString name() const { return m_name; };
|
|
bool never_needs_parameters() const { return m_never_needs_parameters; };
|
|
static PDFErrorOr<ColorSpaceFamily> get(FlyString const&);
|
|
|
|
#define ENUMERATE(name, ever_needs_parameters) static ColorSpaceFamily name;
|
|
ENUMERATE_COLOR_SPACE_FAMILIES(ENUMERATE)
|
|
#undef ENUMERATE
|
|
|
|
private:
|
|
FlyString m_name;
|
|
bool m_never_needs_parameters;
|
|
};
|
|
|
|
class ColorSpace : public RefCounted<ColorSpace> {
|
|
public:
|
|
static PDFErrorOr<NonnullRefPtr<ColorSpace>> create(FlyString const&);
|
|
static PDFErrorOr<NonnullRefPtr<ColorSpace>> create(Document*, NonnullRefPtr<ArrayObject>);
|
|
|
|
virtual ~ColorSpace() = default;
|
|
|
|
virtual Color color(Vector<Value> const& arguments) const = 0;
|
|
virtual int number_of_components() const = 0;
|
|
virtual Vector<float> default_decode() const = 0;
|
|
virtual ColorSpaceFamily const& family() const = 0;
|
|
};
|
|
|
|
class DeviceGrayColorSpace final : public ColorSpace {
|
|
public:
|
|
static NonnullRefPtr<DeviceGrayColorSpace> the();
|
|
|
|
~DeviceGrayColorSpace() override = default;
|
|
|
|
Color color(Vector<Value> const& arguments) const override;
|
|
int number_of_components() const override { return 1; }
|
|
Vector<float> default_decode() const override;
|
|
ColorSpaceFamily const& family() const override { return ColorSpaceFamily::DeviceGray; }
|
|
|
|
private:
|
|
DeviceGrayColorSpace() = default;
|
|
};
|
|
|
|
class DeviceRGBColorSpace final : public ColorSpace {
|
|
public:
|
|
static NonnullRefPtr<DeviceRGBColorSpace> the();
|
|
|
|
~DeviceRGBColorSpace() override = default;
|
|
|
|
Color color(Vector<Value> const& arguments) const override;
|
|
int number_of_components() const override { return 3; }
|
|
Vector<float> default_decode() const override;
|
|
ColorSpaceFamily const& family() const override { return ColorSpaceFamily::DeviceRGB; }
|
|
|
|
private:
|
|
DeviceRGBColorSpace() = default;
|
|
};
|
|
|
|
class DeviceCMYKColorSpace final : public ColorSpace {
|
|
public:
|
|
static NonnullRefPtr<DeviceCMYKColorSpace> the();
|
|
|
|
~DeviceCMYKColorSpace() override = default;
|
|
|
|
Color color(Vector<Value> const& arguments) const override;
|
|
int number_of_components() const override { return 4; }
|
|
Vector<float> default_decode() const override;
|
|
ColorSpaceFamily const& family() const override { return ColorSpaceFamily::DeviceCMYK; }
|
|
|
|
private:
|
|
DeviceCMYKColorSpace() = default;
|
|
};
|
|
|
|
class CalRGBColorSpace final : public ColorSpace {
|
|
public:
|
|
static PDFErrorOr<NonnullRefPtr<CalRGBColorSpace>> create(Document*, Vector<Value>&& parameters);
|
|
|
|
~CalRGBColorSpace() override = default;
|
|
|
|
Color color(Vector<Value> const& arguments) const override;
|
|
int number_of_components() const override { return 3; }
|
|
Vector<float> default_decode() const override;
|
|
ColorSpaceFamily const& family() const override { return ColorSpaceFamily::CalRGB; }
|
|
|
|
private:
|
|
CalRGBColorSpace() = default;
|
|
|
|
Array<float, 3> m_whitepoint { 0, 0, 0 };
|
|
Array<float, 3> m_blackpoint { 0, 0, 0 };
|
|
Array<float, 3> m_gamma { 1, 1, 1 };
|
|
Array<float, 9> m_matrix { 1, 0, 0, 0, 1, 0, 0, 0, 1 };
|
|
};
|
|
|
|
class ICCBasedColorSpace final : public ColorSpace {
|
|
public:
|
|
static PDFErrorOr<NonnullRefPtr<ColorSpace>> create(Document*, Vector<Value>&& parameters);
|
|
|
|
~ICCBasedColorSpace() override = default;
|
|
|
|
Color color(Vector<Value> const& arguments) const override;
|
|
int number_of_components() const override { VERIFY_NOT_REACHED(); }
|
|
Vector<float> default_decode() const override;
|
|
ColorSpaceFamily const& family() const override { return ColorSpaceFamily::ICCBased; }
|
|
|
|
private:
|
|
ICCBasedColorSpace() = delete;
|
|
};
|
|
|
|
}
|