PoDoFo 1.2.0
Loading...
Searching...
No Matches
PdfPatternDefinition.h
1// SPDX-FileCopyrightText: 2022 Francesco Pretto <ceztko@gmail.com>
2// SPDX-License-Identifier: LGPL-2.0-or-later OR MPL-2.0
3
4#ifndef PDF_PATTERN_DEFINITION_H
5#define PDF_PATTERN_DEFINITION_H
6
7#include "PdfFunctionDefinition.h"
8#include "PdfVariant.h"
9#include "PdfExtGState.h"
10#include "PdfColorSpace.h"
11#include "podofo/auxiliary/Rect.h"
12#include <podofo/auxiliary/Matrix.h>
13
14namespace PoDoFo
15{
16 class PdfIndirectObjectList;
17 class PdfShadingDictionary;
18
19 enum class PdfPatternType : uint8_t
20 {
21 Unknown = 0,
22 Tiling,
23 Shading
24 };
25
26 class PODOFO_API PdfPatternDefinition
27 {
28 friend class PdfTilingPatternDefinition;
29 friend class PdfShadingPatternDefinition;
30 friend class PdfPattern;
31 public:
32 virtual ~PdfPatternDefinition();
33 private:
34 PdfPatternDefinition(nullable<const Matrix&> matrix);
35 public:
36 virtual PdfPatternType GetType() const = 0;
37 const Matrix& GetMatrix() { return m_Matrix; }
38 protected:
39 virtual void fillExportDictionary(PdfDictionary& dict) const = 0;
40 PdfPatternDefinition(const PdfPatternDefinition&) = delete;
41 PdfPatternDefinition& operator=(const PdfPatternDefinition&) = delete;
42 private:
43 virtual void FillExportDictionary(PdfDictionary& dict) const;
44 private:
45 Matrix m_Matrix;
46 };
47
48 enum class PdfTilingPaintType : uint8_t
49 {
50 Unknown = 0,
51 Coloured,
52 Uncoloured
53 };
54
55 enum class PdfTilingSpacingType : uint8_t
56 {
57 Unknown = 0,
58 ConstantSpacing,
59 NoDistortion,
60 ConstantSpacingFasterTiling,
61 };
62
63 class PODOFO_API PdfTilingPatternDefinition : public PdfPatternDefinition
64 {
65 friend class PdfColouredTilingPatternDefinition;
66 friend class PdfUncolouredTilingPatternDefinition;
67
68 private:
69 PdfTilingPatternDefinition(PdfTilingSpacingType spacingType, const Rect& bbox,
70 double xStep, double yStep, nullable<const Matrix&> matrix);
71
72 public:
73 PdfPatternType GetType() const override;
74
75 virtual PdfTilingPaintType GetPaintType() const = 0;
76 PdfTilingSpacingType GetSpacingType() const { return m_SpacingType; }
77 const Rect& GetBBox() const { return m_BBox; }
78 double GetXStep() const { return m_XStep; }
79 double GetYStep() const { return m_YStep; }
80
81 protected:
82 void fillExportDictionary(PdfDictionary& dict) const override;
83
84 private:
85 PdfTilingSpacingType m_SpacingType;
86 Rect m_BBox;
87 double m_XStep;
88 double m_YStep;
89 };
90
91 class PODOFO_API PdfColouredTilingPatternDefinition final : public PdfTilingPatternDefinition
92 {
93 public:
94 PdfColouredTilingPatternDefinition(PdfTilingSpacingType spacingType,
95 const Rect& bbox, double xStep, double yStep, nullable<const Matrix&> matrix = { });
96 public:
97 PdfTilingPaintType GetPaintType() const override;
98 };
99
100 class PODOFO_API PdfUncolouredTilingPatternDefinition final : public PdfTilingPatternDefinition
101 {
102 public:
103 PdfUncolouredTilingPatternDefinition(PdfTilingSpacingType spacingType,
104 const Rect& bbox, double xStep, double yStep, nullable<const Matrix&> matrix = { });
105 public:
106 PdfTilingPaintType GetPaintType() const override;
107 };
108
109 enum class PdfShadingType : uint8_t
110 {
111 FunctionBased = 1,
112 Axial = 2,
113 Radial = 3,
114 FreeFormMesh = 4,
115 LatticeFormMesh = 5,
116 CoonsPatchMesh = 6,
117 TensorProductMesh = 7
118 };
119
120 class PODOFO_API PdfShadingDefinition
121 {
122 friend class PdfShadingDictionary;
123 friend class PdfFunctionBasedShadingDefinition;
124 friend class PdfAxialShadingDefinition;
125 friend class PdfRadialShadingDefinition;
126 friend class PdfFreeFormMeshShadingDefinition;
127 friend class PdfLatticeFormMeshShadingDefinition;
128 friend class PdfCoonsPatchMeshShadingDefinition;
129 friend class PdfTensorProductMeshShadingDefinition;
130
131 private:
132 PdfShadingDefinition(PdfColorSpaceInitializer&& colorSpace, PdfFunctionListInitializer&& functions,
133 nullable<const PdfColorRaw&> background, nullable<const Rect&> bbox, bool antiAlias);
134
135 PdfShadingDefinition(PdfColorSpaceFilterPtr&& colorSpace, std::vector<PdfFunctionDefinitionPtr>&& functions,
136 nullable<const PdfColorRaw&> background, const Rect& bbox, bool antiAlias);
137 public:
138 virtual ~PdfShadingDefinition();
139 virtual PdfShadingType GetShadingType() const = 0;
140 protected:
141 virtual void fillExportDictionary(PdfDictionary& dict) const = 0;
142 public:
143 const PdfColorSpaceFilter& GetColorSpace() const { return *m_ColorSpace; }
144 const std::vector<PdfFunctionDefinitionPtr>& GetFunctions() const { return m_Functions; }
145 bool GetAntiAlias() const { return m_AntiAlias; }
146 const nullable<PdfColorRaw>& GetBackground() const { return m_Background; }
147 const Rect& GetBBox() const { return m_BBox; }
148 private:
149 PdfShadingDefinition(const PdfShadingDefinition&) = delete;
150 PdfShadingDefinition& operator=(const PdfShadingDefinition&) = delete;
151 virtual void FillExportDictionary(PdfDictionary& dict) const;
152 private:
153 PdfColorSpaceFilterPtr m_ColorSpace;
154 PdfVariant m_colorSpaceExpVar;
155 std::vector<PdfFunctionDefinitionPtr> m_Functions;
156 PdfVariant m_functionsExpVar;
157 nullable<PdfColorRaw> m_Background;
158 Rect m_BBox;
159 bool m_AntiAlias;
160 };
161
163 using PdfShadingDefinitionPtr = std::shared_ptr<const PdfShadingDefinition>;
164
165 class PODOFO_API PdfShadingPatternDefinition final : public PdfPatternDefinition
166 {
167 public:
168 PdfShadingPatternDefinition(const PdfShadingDictionary& shading, nullable<const Matrix&> matrix = { },
170
172 PdfShadingPatternDefinition(PdfShadingDefinitionPtr&& shading, const Matrix& matrix,
174
175 public:
176 PdfPatternType GetType() const override;
177 const PdfShadingDefinition& GetShading() const { return *m_Shading; }
178 PdfShadingDefinitionPtr GetShadingPtr() const { return m_Shading; }
179 const Matrix& GetMatrix() const { return m_Matrix; }
180 const PdfExtGStateDefinition* GetExtGState() const { return m_ExtGState.get(); }
181 PdfExtGStateDefinitionPtr GetExtGStatePtr() const { return m_ExtGState; }
182
183 protected:
184 void fillExportDictionary(PdfDictionary& dict) const override;
185
186 private:
187 PdfShadingDefinitionPtr m_Shading;
188 PdfReference m_shadingExpRef;
189 Matrix m_Matrix;
190 PdfExtGStateDefinitionPtr m_ExtGState;
191 PdfReference m_extGStateExpRef;
192 };
193
194 class PODOFO_API PdfFunctionBasedShadingDefinition final : public PdfShadingDefinition
195 {
196 public:
197 PdfFunctionBasedShadingDefinition(PdfColorSpaceInitializer&& colorSpace, PdfFunctionListInitializer&& functions,
198 nullable<const std::array<double, 4>&> domain = { }, nullable<const Matrix&> matrix = { },
199 nullable<const PdfColorRaw&> background = { }, nullable<const Rect&> bbox = { },
200 bool antiAlias = false);
201
203 PdfFunctionBasedShadingDefinition(PdfColorSpaceFilterPtr&& colorSpace, std::vector<PdfFunctionDefinitionPtr>&& functions,
204 const std::array<double, 4>& domain, const Matrix& matrix,
205 const PdfColorRaw& background, const Rect& bbox, bool antiAlias);
206
207 public:
208 void fillExportDictionary(PdfDictionary& dict) const override;
209 PdfShadingType GetShadingType() const override;
210 const std::array<double, 4>& GetDomain() const { return m_Domain; }
211 const Matrix& GetMatrix() const { return m_Matrix; }
212 private:
213 std::array<double, 4> m_Domain;
214 Matrix m_Matrix;
215 };
216
217 class PODOFO_API PdfAxialShadingDefinition final : public PdfShadingDefinition
218 {
219 public:
220 PdfAxialShadingDefinition(PdfColorSpaceInitializer&& colorSpace, PdfFunctionListInitializer&& functions,
221 const std::array<double, 4>& coords, nullable<const std::array<bool, 2>&> extend = { },
222 nullable<const std::array<double, 2>&> domain = { }, nullable<const PdfColorRaw&> background = { },
223 nullable<const Rect&> bbox = { }, bool antiAlias = false);
224
226 PdfAxialShadingDefinition(PdfColorSpaceFilterPtr&& colorSpace, std::vector<PdfFunctionDefinitionPtr>&& functions,
227 const std::array<double, 4>& coords, const std::array<bool, 2>& extend,
228 const std::array<double, 2> domain, const PdfColorRaw& background,
229 const Rect& bbox, bool antiAlias);
230 public:
231 void fillExportDictionary(PdfDictionary& dict) const override;
232 PdfShadingType GetShadingType() const override;
233 const std::vector<PdfFunctionDefinitionPtr>& GetFunctions() const { return m_Functions; }
234 const std::array<double, 4>& GetCoords() const { return m_Coords; }
235 const std::array<bool, 2>& GetExtend() const { return m_Extend; }
236 const std::array<double, 2>& GetDomain() const { return m_Domain; }
237
238 private:
239 std::array<double, 4> m_Coords;
240 std::array<bool, 2> m_Extend;
241 std::array<double, 2> m_Domain;
242 };
243
244 class PODOFO_API PdfRadialShadingDefinition final : public PdfShadingDefinition
245 {
246 public:
247 PdfRadialShadingDefinition(PdfColorSpaceInitializer&& colorSpace, PdfFunctionListInitializer&& functions,
248 const std::array<double, 6>& coords, nullable<const std::array<bool, 2>&> extend = { },
249 nullable<const std::array<double, 2>&> domain = { }, nullable<const PdfColorRaw&> background = { },
250 nullable<const Rect&> bbox = { }, bool antiAlias = false);
251
253 PdfRadialShadingDefinition(PdfColorSpaceFilterPtr&& colorSpace, std::vector<PdfFunctionDefinitionPtr>&& functions,
254 const std::array<double, 6>& coords, const std::array<bool, 2>& extend,
255 const std::array<double, 2>& domain, const PdfColorRaw& background,
256 const Rect& bbox, bool antiAlias);
257 public:
258 void fillExportDictionary(PdfDictionary& dict) const override;
259 PdfShadingType GetShadingType() const override;
260 const std::vector<PdfFunctionDefinitionPtr>& GetFunctions() const { return m_Functions; }
261 const std::array<double, 6>& GetCoords() const { return m_Coords; }
262 const std::array<bool, 2>& GetExtend() const { return m_Extend; }
263 const std::array<double, 2>& GetDomain() const { return m_Domain; }
264 private:
265 std::array<double, 6> m_Coords;
266 std::array<bool, 2> m_Extend;
267 std::array<double, 2> m_Domain;
268 };
269
270 class PODOFO_API PdfFreeFormMeshShadingDefinition final : public PdfShadingDefinition
271 {
272 public:
273 PdfFreeFormMeshShadingDefinition(PdfColorSpaceInitializer&& colorSpace, std::vector<double> decode,
274 unsigned bitsPerCoordinate, unsigned bitsPerComponent, unsigned bitsPerFlag,
275 PdfFunctionListInitializer&& functions = { }, nullable<const PdfColorRaw&> background = { },
276 nullable<const Rect&> bbox = { }, bool antiAlias = false);
277
279 PdfFreeFormMeshShadingDefinition(PdfColorSpaceFilterPtr&& colorSpace, std::vector<double>&& decode,
280 unsigned bitsPerCoordinate, unsigned bitsPerComponent, unsigned bitsPerFlag,
281 std::vector<PdfFunctionDefinitionPtr>&& functions, const PdfColorRaw& background,
282 const Rect& bbox, bool antiAlias);
283 public:
284 void fillExportDictionary(PdfDictionary& dict) const override;
285 PdfShadingType GetShadingType() const override;
286 unsigned GetBitsPerCoordinate() const { return m_BitsPerCoordinate; }
287 unsigned GetBitsPerComponent() const { return m_BitsPerComponent; }
288 unsigned GetBitsPerFlag() const { return m_BitsPerFlag; }
289 const std::vector<double>& GetDecode() const { return m_Decode; }
290 const std::vector<PdfFunctionDefinitionPtr>& GetFunctions() const { return m_Functions; }
291 private:
292 std::vector<double> m_Decode;
293 unsigned m_BitsPerCoordinate;
294 unsigned m_BitsPerComponent;
295 unsigned m_BitsPerFlag;
296 };
297
298 class PODOFO_API PdfLatticeFormMeshShadingDefinition final : public PdfShadingDefinition
299 {
300 public:
301 PdfLatticeFormMeshShadingDefinition(PdfColorSpaceInitializer&& colorSpace, std::vector<double> decode,
302 unsigned bitsPerCoordinate, unsigned bitsPerComponent, unsigned verticesPerRow,
303 PdfFunctionListInitializer&& functions = { }, nullable<const PdfColorRaw&> background = { },
304 nullable<const Rect&> bbox = { }, bool antiAlias = false);
305
307 PdfLatticeFormMeshShadingDefinition(PdfColorSpaceFilterPtr&& colorSpace, std::vector<double>&& decode,
308 unsigned bitsPerCoordinate, unsigned bitsPerComponent, unsigned verticesPerRow,
309 std::vector<PdfFunctionDefinitionPtr>&& functions, const PdfColorRaw& background,
310 const Rect& bbox, bool antiAlias);
311
312 public:
313 void fillExportDictionary(PdfDictionary& dict) const override;
314 PdfShadingType GetShadingType() const override;
315 unsigned GetBitsPerCoordinate() const { return m_BitsPerCoordinate; }
316 unsigned GetBitsPerComponent() const { return m_BitsPerComponent; }
317 unsigned GetVerticesPerRow() const { return m_VerticesPerRow; }
318 const std::vector<double>& GetDecode() const { return m_Decode; }
319 const std::vector<PdfFunctionDefinitionPtr>& GetFunctions() const { return m_Functions; }
320 private:
321 std::vector<double> m_Decode;
322 unsigned m_BitsPerCoordinate;
323 unsigned m_BitsPerComponent;
324 unsigned m_VerticesPerRow;
325 };
326
327 class PODOFO_API PdfCoonsPatchMeshShadingDefinition final : public PdfShadingDefinition
328 {
329 public:
330 PdfCoonsPatchMeshShadingDefinition(PdfColorSpaceInitializer&& colorSpace, std::vector<double> decode,
331 unsigned bitsPerCoordinate, unsigned bitsPerComponent, unsigned bitsPerFlag,
332 PdfFunctionListInitializer&& functions = { }, nullable<const PdfColorRaw&> background = { },
333 nullable<const Rect&> bbox = { }, bool antiAlias = false);
334
336 PdfCoonsPatchMeshShadingDefinition(PdfColorSpaceFilterPtr&& colorSpace, std::vector<double>&& decode,
337 unsigned bitsPerCoordinate, unsigned bitsPerComponent, unsigned bitsPerFlag,
338 std::vector<PdfFunctionDefinitionPtr>&& functions, const PdfColorRaw& background,
339 const Rect& bbox, bool antiAlias);
340 public:
341 void fillExportDictionary(PdfDictionary& dict) const override;
342 PdfShadingType GetShadingType() const override;
343 unsigned GetBitsPerCoordinate() const { return m_BitsPerCoordinate; }
344 unsigned GetBitsPerComponent() const { return m_BitsPerComponent; }
345 unsigned GetBitsPerFlag() const { return m_BitsPerFlag; }
346 const std::vector<double>& GetDecode() const { return m_Decode; }
347 const std::vector<PdfFunctionDefinitionPtr>& GetFunctions() const { return m_Functions; }
348 private:
349 std::vector<double> m_Decode;
350 unsigned m_BitsPerCoordinate;
351 unsigned m_BitsPerComponent;
352 unsigned m_BitsPerFlag;
353 };
354
355 class PODOFO_API PdfTensorProductMeshShadingDefinition final : public PdfShadingDefinition
356 {
357 public:
358 PdfTensorProductMeshShadingDefinition(PdfColorSpaceInitializer&& colorSpace, std::vector<double> decode,
359 unsigned bitsPerCoordinate, unsigned bitsPerComponent, unsigned bitsPerFlag,
360 PdfFunctionListInitializer&& functions = { }, nullable<const PdfColorRaw&> background = { },
361 nullable<const Rect&> bbox = { }, bool antiAlias = false);
362
364 PdfTensorProductMeshShadingDefinition(PdfColorSpaceFilterPtr&& colorSpace, std::vector<double>&& decode,
365 unsigned bitsPerCoordinate, unsigned bitsPerComponent, unsigned bitsPerFlag,
366 std::vector<PdfFunctionDefinitionPtr>&& functions, const PdfColorRaw& background,
367 const Rect& bbox, bool antiAlias);
368
369 public:
370 void fillExportDictionary(PdfDictionary& dict) const override;
371 PdfShadingType GetShadingType() const override;
372 unsigned GetBitsPerCoordinate() const { return m_BitsPerCoordinate; }
373 unsigned GetBitsPerComponent() const { return m_BitsPerComponent; }
374 unsigned GetBitsPerFlag() const { return m_BitsPerFlag; }
375 const std::vector<double>& GetDecode() const { return m_Decode; }
376 const std::vector<PdfFunctionDefinitionPtr>& GetFunctions() const { return m_Functions; }
377 private:
378 std::vector<double> m_Decode;
379 unsigned m_BitsPerCoordinate;
380 unsigned m_BitsPerComponent;
381 unsigned m_BitsPerFlag;
382 };
383
385 using PdfPatternDefinitionPtr = std::shared_ptr<const PdfPatternDefinition>;
386
388 using PdfTilingPatternDefinitionPtr = std::shared_ptr<const PdfTilingPatternDefinition>;
389
391 using PdfShadingPatternDefinitionPtr = std::shared_ptr<const PdfShadingPatternDefinition>;
392}
393
394#endif // PDF_PATTERN_DEFINITION_H
The PDF dictionary data type of PoDoFo (inherits from PdfDataContainer, the base class for such repre...
Definition PdfDictionary.h:77
A reference is a pointer to a object in the PDF file of the form "4 0 R", where 4 is the object numbe...
Definition PdfReference.h:20
Convenient type for char array storage and/or buffer with std::string compatibility.
Definition basetypes.h:30
All classes, functions, types and enums of PoDoFo are members of these namespace.
Definition basetypes.h:13
std::shared_ptr< const PdfPatternDefinition > PdfPatternDefinitionPtr
Convenience alias for a constant PdfTilingPatternDefinition shared ptr.
Definition PdfPatternDefinition.h:385
std::shared_ptr< const PdfColorSpaceFilter > PdfColorSpaceFilterPtr
Convenience alias for a constant PdfColorSpaceFilter shared ptr.
Definition PdfColorSpaceFilter.h:71
std::shared_ptr< const PdfShadingDefinition > PdfShadingDefinitionPtr
Convenience alias for a constant PdfShadingDefinition shared ptr.
Definition PdfPatternDefinition.h:163
std::shared_ptr< const PdfTilingPatternDefinition > PdfTilingPatternDefinitionPtr
Convenience alias for a constant PdfTilingPatternDefinition shared ptr.
Definition PdfPatternDefinition.h:388
std::shared_ptr< const PdfShadingPatternDefinition > PdfShadingPatternDefinitionPtr
Convenience alias for a constant PdfShadingPatternDefinition shared ptr.
Definition PdfPatternDefinition.h:391
std::shared_ptr< const PdfExtGStateDefinition > PdfExtGStateDefinitionPtr
Convenience alias for a constant PdfExtGStateDefinition shared ptr.
Definition PdfExtGStateDefinition.h:30