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
37 PdfPatternDefinition(const Matrix& matrix);
38 public:
39 virtual PdfPatternType GetType() const = 0;
40 const Matrix& GetMatrix() { return m_Matrix; }
41 protected:
42 virtual void fillExportDictionary(PdfDictionary& dict) const = 0;
43 PdfPatternDefinition(const PdfPatternDefinition&) = delete;
44 PdfPatternDefinition& operator=(const PdfPatternDefinition&) = delete;
45 private:
46 virtual void FillExportDictionary(PdfDictionary& dict) const;
47 private:
48 Matrix m_Matrix;
49 };
50
51 enum class PdfTilingPaintType : uint8_t
52 {
53 Unknown = 0,
54 Coloured,
55 Uncoloured
56 };
57
58 enum class PdfTilingSpacingType : uint8_t
59 {
60 Unknown = 0,
61 ConstantSpacing,
62 NoDistortion,
63 ConstantSpacingFasterTiling,
64 };
65
66 class PODOFO_API PdfTilingPatternDefinition : public PdfPatternDefinition
67 {
68 friend class PdfColouredTilingPatternDefinition;
69 friend class PdfUncolouredTilingPatternDefinition;
70
71 private:
72 PdfTilingPatternDefinition(PdfTilingSpacingType spacingType, const Rect& bbox,
73 double xStep, double yStep, nullable<const Matrix&> matrix);
74
75 protected:
77 PdfTilingPatternDefinition(const PdfDictionary& dict);
78
79 public:
80 PdfPatternType GetType() const override;
81
82 virtual PdfTilingPaintType GetPaintType() const = 0;
83 PdfTilingSpacingType GetSpacingType() const { return m_SpacingType; }
84 const Rect& GetBBox() const { return m_BBox; }
85 double GetXStep() const { return m_XStep; }
86 double GetYStep() const { return m_YStep; }
87
88 protected:
89 void fillExportDictionary(PdfDictionary& dict) const override;
90
91 private:
92 PdfTilingSpacingType m_SpacingType;
93 Rect m_BBox;
94 double m_XStep;
95 double m_YStep;
96 };
97
98 class PODOFO_API PdfColouredTilingPatternDefinition final : public PdfTilingPatternDefinition
99 {
100 friend class PdfColouredTilingPattern;
101 public:
102 PdfColouredTilingPatternDefinition(PdfTilingSpacingType spacingType,
103 const Rect& bbox, double xStep, double yStep, nullable<const Matrix&> matrix = { });
104
105 private:
107 PdfColouredTilingPatternDefinition(const PdfDictionary& dict);
108 public:
109 PdfTilingPaintType GetPaintType() const override;
110 };
111
112 class PODOFO_API PdfUncolouredTilingPatternDefinition final : public PdfTilingPatternDefinition
113 {
114 friend class PdfUncolouredTilingPattern;
115 public:
116 PdfUncolouredTilingPatternDefinition(PdfTilingSpacingType spacingType,
117 const Rect& bbox, double xStep, double yStep, nullable<const Matrix&> matrix = { });
118
119 private:
121 PdfUncolouredTilingPatternDefinition(const PdfDictionary& dict);
122 public:
123 PdfTilingPaintType GetPaintType() const override;
124 };
125
126 enum class PdfShadingType : uint8_t
127 {
128 FunctionBased = 1,
129 Axial = 2,
130 Radial = 3,
131 FreeFormMesh = 4,
132 LatticeFormMesh = 5,
133 CoonsPatchMesh = 6,
134 TensorProductMesh = 7
135 };
136
137 class PODOFO_API PdfShadingDefinition
138 {
139 friend class PdfShadingDictionary;
140 friend class PdfFunctionBasedShadingDefinition;
141 friend class PdfAxialShadingDefinition;
142 friend class PdfRadialShadingDefinition;
143 friend class PdfFreeFormMeshShadingDefinition;
144 friend class PdfLatticeFormMeshShadingDefinition;
145 friend class PdfCoonsPatchMeshShadingDefinition;
146 friend class PdfTensorProductMeshShadingDefinition;
147
148 private:
149 PdfShadingDefinition(PdfColorSpaceInitializer&& colorSpace, PdfFunctionListInitializer&& functions,
150 nullable<const PdfColorRaw&> background, nullable<const Rect&> bbox, bool antiAlias);
151
152 PdfShadingDefinition(PdfColorSpaceFilterPtr&& colorSpace, std::vector<PdfFunctionDefinitionPtr>&& functions,
153 nullable<const PdfColorRaw&> background, const Rect& bbox, bool antiAlias);
154 public:
155 virtual ~PdfShadingDefinition();
156 virtual PdfShadingType GetShadingType() const = 0;
157 protected:
158 virtual void fillExportDictionary(PdfDictionary& dict) const = 0;
159 public:
160 const PdfColorSpaceFilter& GetColorSpace() const { return *m_ColorSpace; }
161 const std::vector<PdfFunctionDefinitionPtr>& GetFunctions() const { return m_Functions; }
162 bool GetAntiAlias() const { return m_AntiAlias; }
163 const nullable<PdfColorRaw>& GetBackground() const { return m_Background; }
164 const Rect& GetBBox() const { return m_BBox; }
165 private:
166 PdfShadingDefinition(const PdfShadingDefinition&) = delete;
167 PdfShadingDefinition& operator=(const PdfShadingDefinition&) = delete;
168 virtual void FillExportDictionary(PdfDictionary& dict) const;
169 private:
170 PdfColorSpaceFilterPtr m_ColorSpace;
171 PdfVariant m_colorSpaceExpVar;
172 std::vector<PdfFunctionDefinitionPtr> m_Functions;
173 PdfVariant m_functionsExpVar;
174 nullable<PdfColorRaw> m_Background;
175 Rect m_BBox;
176 bool m_AntiAlias;
177 };
178
180 using PdfShadingDefinitionPtr = std::shared_ptr<const PdfShadingDefinition>;
181
182 class PODOFO_API PdfShadingPatternDefinition final : public PdfPatternDefinition
183 {
184 friend class PdfShadingPattern;
185 public:
186 PdfShadingPatternDefinition(const PdfShadingDictionary& shading, nullable<const Matrix&> matrix = { },
188
189 private:
191 PdfShadingPatternDefinition(const PdfDictionary& dict);
192
193 public:
194 PdfPatternType GetType() const override;
195 const PdfShadingDefinition& GetShading() const { return *m_Shading; }
196 PdfShadingDefinitionPtr GetShadingPtr() const { return m_Shading; }
197 const Matrix& GetMatrix() const { return m_Matrix; }
198 const PdfExtGStateDefinition* GetExtGState() const { return m_ExtGState.get(); }
199 PdfExtGStateDefinitionPtr GetExtGStatePtr() const { return m_ExtGState; }
200
201 protected:
202 void fillExportDictionary(PdfDictionary& dict) const override;
203
204 private:
205 PdfShadingDefinitionPtr m_Shading;
206 PdfReference m_shadingExpRef;
207 Matrix m_Matrix;
208 PdfExtGStateDefinitionPtr m_ExtGState;
209 PdfReference m_extGStateExpRef;
210 };
211
212 class PODOFO_API PdfFunctionBasedShadingDefinition final : public PdfShadingDefinition
213 {
214 public:
215 PdfFunctionBasedShadingDefinition(PdfColorSpaceInitializer&& colorSpace, PdfFunctionListInitializer&& functions,
216 nullable<const std::array<double, 4>&> domain = { }, nullable<const Matrix&> matrix = { },
217 nullable<const PdfColorRaw&> background = { }, nullable<const Rect&> bbox = { },
218 bool antiAlias = false);
219
221 PdfFunctionBasedShadingDefinition(PdfColorSpaceFilterPtr&& colorSpace, std::vector<PdfFunctionDefinitionPtr>&& functions,
222 const std::array<double, 4>& domain, const Matrix& matrix,
223 const PdfColorRaw& background, const Rect& bbox, bool antiAlias);
224
225 public:
226 void fillExportDictionary(PdfDictionary& dict) const override;
227 PdfShadingType GetShadingType() const override;
228 const std::array<double, 4>& GetDomain() const { return m_Domain; }
229 const Matrix& GetMatrix() const { return m_Matrix; }
230 private:
231 std::array<double, 4> m_Domain;
232 Matrix m_Matrix;
233 };
234
235 class PODOFO_API PdfAxialShadingDefinition final : public PdfShadingDefinition
236 {
237 public:
238 PdfAxialShadingDefinition(PdfColorSpaceInitializer&& colorSpace, PdfFunctionListInitializer&& functions,
239 const std::array<double, 4>& coords, nullable<const std::array<bool, 2>&> extend = { },
240 nullable<const std::array<double, 2>&> domain = { }, nullable<const PdfColorRaw&> background = { },
241 nullable<const Rect&> bbox = { }, bool antiAlias = false);
242
244 PdfAxialShadingDefinition(PdfColorSpaceFilterPtr&& colorSpace, std::vector<PdfFunctionDefinitionPtr>&& functions,
245 const std::array<double, 4>& coords, const std::array<bool, 2>& extend,
246 const std::array<double, 2> domain, const PdfColorRaw& background,
247 const Rect& bbox, bool antiAlias);
248 public:
249 void fillExportDictionary(PdfDictionary& dict) const override;
250 PdfShadingType GetShadingType() const override;
251 const std::vector<PdfFunctionDefinitionPtr>& GetFunctions() const { return m_Functions; }
252 const std::array<double, 4>& GetCoords() const { return m_Coords; }
253 const std::array<bool, 2>& GetExtend() const { return m_Extend; }
254 const std::array<double, 2>& GetDomain() const { return m_Domain; }
255
256 private:
257 std::array<double, 4> m_Coords;
258 std::array<bool, 2> m_Extend;
259 std::array<double, 2> m_Domain;
260 };
261
262 class PODOFO_API PdfRadialShadingDefinition final : public PdfShadingDefinition
263 {
264 public:
265 PdfRadialShadingDefinition(PdfColorSpaceInitializer&& colorSpace, PdfFunctionListInitializer&& functions,
266 const std::array<double, 6>& coords, nullable<const std::array<bool, 2>&> extend = { },
267 nullable<const std::array<double, 2>&> domain = { }, nullable<const PdfColorRaw&> background = { },
268 nullable<const Rect&> bbox = { }, bool antiAlias = false);
269
271 PdfRadialShadingDefinition(PdfColorSpaceFilterPtr&& colorSpace, std::vector<PdfFunctionDefinitionPtr>&& functions,
272 const std::array<double, 6>& coords, const std::array<bool, 2>& extend,
273 const std::array<double, 2>& domain, const PdfColorRaw& background,
274 const Rect& bbox, bool antiAlias);
275 public:
276 void fillExportDictionary(PdfDictionary& dict) const override;
277 PdfShadingType GetShadingType() const override;
278 const std::vector<PdfFunctionDefinitionPtr>& GetFunctions() const { return m_Functions; }
279 const std::array<double, 6>& GetCoords() const { return m_Coords; }
280 const std::array<bool, 2>& GetExtend() const { return m_Extend; }
281 const std::array<double, 2>& GetDomain() const { return m_Domain; }
282 private:
283 std::array<double, 6> m_Coords;
284 std::array<bool, 2> m_Extend;
285 std::array<double, 2> m_Domain;
286 };
287
288 class PODOFO_API PdfFreeFormMeshShadingDefinition final : public PdfShadingDefinition
289 {
290 public:
291 PdfFreeFormMeshShadingDefinition(PdfColorSpaceInitializer&& colorSpace, std::vector<double> decode,
292 unsigned bitsPerCoordinate, unsigned bitsPerComponent, unsigned bitsPerFlag,
293 PdfFunctionListInitializer&& functions = { }, nullable<const PdfColorRaw&> background = { },
294 nullable<const Rect&> bbox = { }, bool antiAlias = false);
295
297 PdfFreeFormMeshShadingDefinition(PdfColorSpaceFilterPtr&& colorSpace, std::vector<double>&& decode,
298 unsigned bitsPerCoordinate, unsigned bitsPerComponent, unsigned bitsPerFlag,
299 std::vector<PdfFunctionDefinitionPtr>&& functions, const PdfColorRaw& background,
300 const Rect& bbox, bool antiAlias);
301 public:
302 void fillExportDictionary(PdfDictionary& dict) const override;
303 PdfShadingType GetShadingType() const override;
304 unsigned GetBitsPerCoordinate() const { return m_BitsPerCoordinate; }
305 unsigned GetBitsPerComponent() const { return m_BitsPerComponent; }
306 unsigned GetBitsPerFlag() const { return m_BitsPerFlag; }
307 const std::vector<double>& GetDecode() const { return m_Decode; }
308 const std::vector<PdfFunctionDefinitionPtr>& GetFunctions() const { return m_Functions; }
309 private:
310 std::vector<double> m_Decode;
311 unsigned m_BitsPerCoordinate;
312 unsigned m_BitsPerComponent;
313 unsigned m_BitsPerFlag;
314 };
315
316 class PODOFO_API PdfLatticeFormMeshShadingDefinition final : public PdfShadingDefinition
317 {
318 public:
319 PdfLatticeFormMeshShadingDefinition(PdfColorSpaceInitializer&& colorSpace, std::vector<double> decode,
320 unsigned bitsPerCoordinate, unsigned bitsPerComponent, unsigned verticesPerRow,
321 PdfFunctionListInitializer&& functions = { }, nullable<const PdfColorRaw&> background = { },
322 nullable<const Rect&> bbox = { }, bool antiAlias = false);
323
325 PdfLatticeFormMeshShadingDefinition(PdfColorSpaceFilterPtr&& colorSpace, std::vector<double>&& decode,
326 unsigned bitsPerCoordinate, unsigned bitsPerComponent, unsigned verticesPerRow,
327 std::vector<PdfFunctionDefinitionPtr>&& functions, const PdfColorRaw& background,
328 const Rect& bbox, bool antiAlias);
329
330 public:
331 void fillExportDictionary(PdfDictionary& dict) const override;
332 PdfShadingType GetShadingType() const override;
333 unsigned GetBitsPerCoordinate() const { return m_BitsPerCoordinate; }
334 unsigned GetBitsPerComponent() const { return m_BitsPerComponent; }
335 unsigned GetVerticesPerRow() const { return m_VerticesPerRow; }
336 const std::vector<double>& GetDecode() const { return m_Decode; }
337 const std::vector<PdfFunctionDefinitionPtr>& GetFunctions() const { return m_Functions; }
338 private:
339 std::vector<double> m_Decode;
340 unsigned m_BitsPerCoordinate;
341 unsigned m_BitsPerComponent;
342 unsigned m_VerticesPerRow;
343 };
344
345 class PODOFO_API PdfCoonsPatchMeshShadingDefinition final : public PdfShadingDefinition
346 {
347 public:
348 PdfCoonsPatchMeshShadingDefinition(PdfColorSpaceInitializer&& colorSpace, std::vector<double> decode,
349 unsigned bitsPerCoordinate, unsigned bitsPerComponent, unsigned bitsPerFlag,
350 PdfFunctionListInitializer&& functions = { }, nullable<const PdfColorRaw&> background = { },
351 nullable<const Rect&> bbox = { }, bool antiAlias = false);
352
354 PdfCoonsPatchMeshShadingDefinition(PdfColorSpaceFilterPtr&& colorSpace, std::vector<double>&& decode,
355 unsigned bitsPerCoordinate, unsigned bitsPerComponent, unsigned bitsPerFlag,
356 std::vector<PdfFunctionDefinitionPtr>&& functions, const PdfColorRaw& background,
357 const Rect& bbox, bool antiAlias);
358 public:
359 void fillExportDictionary(PdfDictionary& dict) const override;
360 PdfShadingType GetShadingType() const override;
361 unsigned GetBitsPerCoordinate() const { return m_BitsPerCoordinate; }
362 unsigned GetBitsPerComponent() const { return m_BitsPerComponent; }
363 unsigned GetBitsPerFlag() const { return m_BitsPerFlag; }
364 const std::vector<double>& GetDecode() const { return m_Decode; }
365 const std::vector<PdfFunctionDefinitionPtr>& GetFunctions() const { return m_Functions; }
366 private:
367 std::vector<double> m_Decode;
368 unsigned m_BitsPerCoordinate;
369 unsigned m_BitsPerComponent;
370 unsigned m_BitsPerFlag;
371 };
372
373 class PODOFO_API PdfTensorProductMeshShadingDefinition final : public PdfShadingDefinition
374 {
375 public:
376 PdfTensorProductMeshShadingDefinition(PdfColorSpaceInitializer&& colorSpace, std::vector<double> decode,
377 unsigned bitsPerCoordinate, unsigned bitsPerComponent, unsigned bitsPerFlag,
378 PdfFunctionListInitializer&& functions = { }, nullable<const PdfColorRaw&> background = { },
379 nullable<const Rect&> bbox = { }, bool antiAlias = false);
380
382 PdfTensorProductMeshShadingDefinition(PdfColorSpaceFilterPtr&& colorSpace, std::vector<double>&& decode,
383 unsigned bitsPerCoordinate, unsigned bitsPerComponent, unsigned bitsPerFlag,
384 std::vector<PdfFunctionDefinitionPtr>&& functions, const PdfColorRaw& background,
385 const Rect& bbox, bool antiAlias);
386
387 public:
388 void fillExportDictionary(PdfDictionary& dict) const override;
389 PdfShadingType GetShadingType() const override;
390 unsigned GetBitsPerCoordinate() const { return m_BitsPerCoordinate; }
391 unsigned GetBitsPerComponent() const { return m_BitsPerComponent; }
392 unsigned GetBitsPerFlag() const { return m_BitsPerFlag; }
393 const std::vector<double>& GetDecode() const { return m_Decode; }
394 const std::vector<PdfFunctionDefinitionPtr>& GetFunctions() const { return m_Functions; }
395 private:
396 std::vector<double> m_Decode;
397 unsigned m_BitsPerCoordinate;
398 unsigned m_BitsPerComponent;
399 unsigned m_BitsPerFlag;
400 };
401
403 using PdfPatternDefinitionPtr = std::shared_ptr<const PdfPatternDefinition>;
404
406 using PdfTilingPatternDefinitionPtr = std::shared_ptr<const PdfTilingPatternDefinition>;
407
409 using PdfShadingPatternDefinitionPtr = std::shared_ptr<const PdfShadingPatternDefinition>;
410}
411
412#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:403
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:180
std::shared_ptr< const PdfTilingPatternDefinition > PdfTilingPatternDefinitionPtr
Convenience alias for a constant PdfTilingPatternDefinition shared ptr.
Definition PdfPatternDefinition.h:406
std::shared_ptr< const PdfShadingPatternDefinition > PdfShadingPatternDefinitionPtr
Convenience alias for a constant PdfShadingPatternDefinition shared ptr.
Definition PdfPatternDefinition.h:409
std::shared_ptr< const PdfExtGStateDefinition > PdfExtGStateDefinitionPtr
Convenience alias for a constant PdfExtGStateDefinition shared ptr.
Definition PdfExtGStateDefinition.h:30