7#ifndef PDF_FUNCTION_DEFINITION_H
8#define PDF_FUNCTION_DEFINITION_H
10#include "PdfEncodingCommon.h"
15 class PdfIndirectObjectList;
18 enum class PdfFunctionType : uint8_t
24 PostScriptCalculator = 4
27 class PODOFO_API PdfFunctionDefinition
29 friend class PdfFunction;
30 friend class PdfSampledFunctionDefinition;
31 friend class PdfExponentialFunctionDefinition;
32 friend class PdfStitchingFunctionDefinition;
33 friend class PdfPostScriptCalculatorFunctionDefinition;
35 virtual ~PdfFunctionDefinition();
37 PdfFunctionDefinition(PdfFunctionType type, std::vector<double>&& domain, std::vector<double>&& range);
39 unsigned GetInputCount()
const;
40 virtual unsigned GetOutputCount()
const;
41 const std::vector<double>& GetDomain()
const {
return m_Domain; }
42 const std::vector<double>& GetRange()
const {
return m_Range; }
43 PdfFunctionType GetType()
const {
return m_Type; }
45 PdfFunctionDefinition(
const PdfFunctionDefinition&) =
default;
46 virtual void fillExportDictionary(PdfDictionary& dict)
const = 0;
48 const PdfFunctionDefinition& operator=(
const PdfFunctionDefinition&) =
delete;
49 void FillExportDictionary(PdfDictionary& dict)
const;
51 std::vector<double> m_Domain;
52 std::vector<double> m_Range;
53 PdfFunctionType m_Type;
60 class PODOFO_API PdfFunctionListInitializer
final
62 friend class PdfStitchingFunctionDefinition;
63 friend class PdfShadingDefinition;
66 PdfFunctionListInitializer();
68 PdfFunctionListInitializer(
const PdfFunction&
func);
70 PdfFunctionListInitializer(
cspan<std::reference_wrapper<const PdfFunction>>
funcs);
72 template <
typename...
Args>
73 PdfFunctionListInitializer(
const PdfFunction&
func,
const Args& ...
more);
78 void pushBack(
const PdfFunction&
func);
80 PdfFunctionListInitializer(
const PdfFunctionListInitializer&) =
delete;
81 PdfFunctionListInitializer& operator=(
const PdfFunctionListInitializer&) =
delete;
87 std::vector<PdfFunctionDefinitionPtr> m_Definitions;
91 enum class PdfSampledFunctionOrder : uint8_t
97 class PODOFO_API PdfSampledFunctionDefinition final :
public PdfFunctionDefinition
100 PdfSampledFunctionDefinition(std::vector<unsigned> size,
unsigned char bitsPerSample, std::vector<unsigned> samples,
101 std::vector<double> domain, std::vector<double> range,
102 PdfSampledFunctionOrder order = PdfSampledFunctionOrder::Linear,
103 std::vector<double> encode = { }, std::vector<double> decode = { });
105 PdfSampledFunctionDefinition(
const PdfSampledFunctionDefinition&) =
default;
107 unsigned GetSampleCount()
const;
108 unsigned char GetBitsPerSample()
const {
return m_BitsPerSample; }
109 PdfSampledFunctionOrder GetOrder()
const {
return m_Order; }
110 const std::vector<unsigned>& GetSize()
const {
return m_Size; }
111 const std::vector<unsigned>& GetSamples()
const {
return m_Samples; }
112 const std::vector<double>& GetEncode()
const {
return m_Encode; }
113 const std::vector<double>& GetDecode()
const {
return m_Decode; }
115 void fillExportDictionary(PdfDictionary& dict)
const override;
117 unsigned char m_BitsPerSample;
118 PdfSampledFunctionOrder m_Order;
119 std::vector<unsigned> m_Size;
120 std::vector<unsigned> m_Samples;
121 std::vector<double> m_Encode;
122 std::vector<double> m_Decode;
125 class PODOFO_API PdfExponentialFunctionDefinition final :
public PdfFunctionDefinition
132 PdfExponentialFunctionDefinition(
double interpolationExponent, std::vector<double> domain,
133 std::vector<double> c0 = { },
134 std::vector<double> c1 = { },
135 std::vector<double> range = { });
137 PdfExponentialFunctionDefinition(
const PdfExponentialFunctionDefinition&) =
default;
139 unsigned GetOutputCount()
const override;
140 double GetInterpolationExponent()
const {
return m_InterpolationExponent; }
141 const std::vector<double>& GetC0()
const {
return m_C0; }
142 const std::vector<double>& GetC1()
const {
return m_C1; }
144 void fillExportDictionary(PdfDictionary& dict)
const override;
146 double m_InterpolationExponent;
147 std::vector<double> m_C0;
148 std::vector<double> m_C1;
151 class PODOFO_API PdfStitchingFunctionDefinition final :
public PdfFunctionDefinition
154 PdfStitchingFunctionDefinition(PdfFunctionListInitializer&& functions,
155 std::vector<double> bounds, std::vector<double> encode,
156 std::vector<double> domain, std::vector<double> range = { });
161 PdfStitchingFunctionDefinition(std::vector<PdfFunctionDefinitionPtr>&& functions,
162 std::vector<double>&& bounds, std::vector<double>&& encode,
163 std::vector<double>&& domain, std::vector<double>&& range);
165 PdfStitchingFunctionDefinition(
const PdfStitchingFunctionDefinition&) =
default;
168 const std::vector<std::shared_ptr<const PdfFunctionDefinition>>& GetFunctions()
const {
return m_Functions; }
169 const std::vector<double>& GetBounds()
const {
return m_Bounds; }
170 const std::vector<double>& GetEncode()
const {
return m_Encode; }
172 void fillExportDictionary(PdfDictionary& dict)
const override;
174 std::vector<std::shared_ptr<const PdfFunctionDefinition>> m_Functions;
175 PdfVariant m_functionsExpVar;
176 std::vector<double> m_Bounds;
177 std::vector<double> m_Encode;
180 class PODOFO_API PdfPostScriptCalculatorFunctionDefinition final :
public PdfFunctionDefinition
183 PdfPostScriptCalculatorFunctionDefinition(std::vector<double> domain, std::vector<double> range);
185 PdfPostScriptCalculatorFunctionDefinition(
const PdfPostScriptCalculatorFunctionDefinition&) =
default;
187 void fillExportDictionary(PdfDictionary& dict)
const override;
190 template<
typename ...Args>
191 PdfFunctionListInitializer::PdfFunctionListInitializer(
const PdfFunction& func,
const Args& ...more)
192 : PdfFunctionListInitializer(1 + sizeof...(more))
195 (pushBack(more), ...);
A variant data type which supports all data types supported by the PDF standard.
Definition PdfVariant.h:33
Convenient type for char array storage and/or buffer with std::string compatibility.
Definition basetypes.h:38
SPDX-FileCopyrightText: (C) 2022 Francesco Pretto ceztko@gmail.com SPDX-License-Identifier: LGPL-2....
Definition basetypes.h:16
tcb::span< const T, Extent > cspan
Constant span.
Definition span.h:13
std::shared_ptr< const PdfFunctionDefinition > PdfFunctionDefinitionPtr
Convenience alias for a constant PdfFunction shared ptr.
Definition PdfFunctionDefinition.h:58