PoDoFo 1.2.0
Loading...
Searching...
No Matches
PdfPattern.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_H
5#define PDF_PATTERN_H
6
7#include "PdfCanvas.h"
8#include "PdfPatternDefinition.h"
9
10namespace PoDoFo
11{
12 class PODOFO_API PdfPattern : public PdfDictionaryElement
13 {
14 friend class PdfTilingPattern;
15 friend class PdfShadingPattern;
16 private:
17 PdfPattern(PdfDocument& doc, PdfPatternDefinitionPtr&& definition);
18 PdfPattern(PdfObject& obj, PdfPatternDefinitionPtr&& definition);
19
20 public:
21 static bool TryCreateFromObject(PdfObject& obj, std::unique_ptr<PdfPattern>& pattern);
22
23 static bool TryCreateFromObject(const PdfObject& obj, std::unique_ptr<const PdfPattern>& pattern);
24
25 template <typename PatternT>
26 static bool TryCreateFromObject(PdfObject& obj, std::unique_ptr<PatternT>& pattern);
27
28 template <typename PatternT>
29 static bool TryCreateFromObject(const PdfObject& obj, std::unique_ptr<const PatternT>& pattern);
30
31 PdfPatternType GetType() const { return m_Definition->GetType(); }
32 const PdfPatternDefinition& GetDefinition() const { return *m_Definition; }
33 PdfPatternDefinitionPtr GetDefinitionPtr() const { return m_Definition; }
34
35 private:
36 static PdfPattern* createFromObject(const PdfObject& obj, PdfPatternType reqType, PdfPatternType& detectedType);
37 template <typename TPattern>
38 static constexpr PdfPatternType GetPatternType();
39
40 protected:
41 PdfPatternDefinitionPtr m_Definition;
42 };
43
44 class PODOFO_API PdfTilingPattern : public PdfPattern, public PdfCanvas
45 {
46 friend class PdfColouredTilingPattern;
47 friend class PdfUncolouredTilingPattern;
48
49 private:
50 PdfTilingPattern(PdfDocument& doc, std::shared_ptr<PdfTilingPatternDefinition>&& definition);
51 PdfTilingPattern(PdfObject& obj, PdfPatternDefinitionPtr&& definition);
52
53 public:
54 const PdfTilingPatternDefinition& GetDefinition() const;
55 std::shared_ptr<const PdfTilingPatternDefinition> GetDefinitionPtr() const;
56 inline PdfResources* GetResources() { return m_Resources.get(); }
57 inline const PdfResources* GetResources() const { return m_Resources.get(); }
58
59 private:
60 PdfObjectStream& GetOrCreateContentsStream(PdfStreamAppendFlags flags) override;
61 PdfResources& GetOrCreateResources() override;
62 PdfObjectStream& ResetContentsStream() override;
63 void CopyContentsTo(OutputStream& stream) const override;
64 Corners GetRectRaw() const override;
65 bool TryGetRotationRadians(double& teta) const override;
66 PdfObject* getContentsObject() override;
67 PdfResources* getResources() override;
68 PdfDictionaryElement& getElement() override;
69
70 private:
71 // Remove some PdfCanvas methods to maintain the class API surface clean
72 PdfElement& GetElement() = delete;
73 const PdfElement& GetElement() const = delete;
74 PdfObject* GetContentsObject() = delete;
75 const PdfObject* GetContentsObject() const = delete;
76
77 private:
78 std::unique_ptr<PdfResources> m_Resources;
79 };
80
81 class PODOFO_API PdfColouredTilingPattern final : public PdfTilingPattern
82 {
83 friend class PdfDocument;
84 friend class PdfPattern;
85
86 private:
87 PdfColouredTilingPattern(PdfDocument& doc, std::shared_ptr<PdfColouredTilingPatternDefinition>&& definition);
88 PdfColouredTilingPattern(PdfObject& obj);
89
90 public:
91 const PdfColouredTilingPatternDefinition& GetDefinition() const;
92 std::shared_ptr<const PdfColouredTilingPatternDefinition> GetDefinitionPtr() const;
93 };
94
95 class PODOFO_API PdfUncolouredTilingPattern final : public PdfTilingPattern
96 {
97 friend class PdfDocument;
98 friend class PdfPattern;
99
100 private:
101 PdfUncolouredTilingPattern(PdfDocument& doc, std::shared_ptr<PdfUncolouredTilingPatternDefinition>&& definition);
102 PdfUncolouredTilingPattern(PdfObject& obj);
103
104 public:
105 const PdfUncolouredTilingPatternDefinition& GetDefinition() const;
106 std::shared_ptr<const PdfUncolouredTilingPatternDefinition> GetDefinitionPtr() const;
107 };
108
109 class PODOFO_API PdfShadingPattern final : public PdfPattern
110 {
111 friend class PdfDocument;
112 friend class PdfPattern;
113
114 private:
115 PdfShadingPattern(PdfDocument& doc, PdfShadingPatternDefinitionPtr&& definition);
116 PdfShadingPattern(PdfObject& obj);
117
118 public:
119 const PdfShadingPatternDefinition& GetDefinition() const;
120 PdfShadingPatternDefinitionPtr GetDefinitionPtr() const;
121 };
122
123 class PODOFO_API PdfShadingDictionary final : public PdfDictionaryElement
124 {
125 friend class PdfDocument;
126
127 private:
128 PdfShadingDictionary(PdfDocument& doc, PdfShadingDefinitionPtr&& definition);
129
130 public:
131 const PdfShadingDefinition& GetDefinition() const { return *m_Definition; }
132 PdfShadingDefinitionPtr GetDefinitionPtr() const { return m_Definition; }
133
134 private:
135 PdfShadingDefinitionPtr m_Definition;
136 };
137
138 template<typename PatternT>
139 inline bool PdfPattern::TryCreateFromObject(PdfObject& obj, std::unique_ptr<PatternT>& pattern)
140 {
141 PdfPatternType detectedType;
142 pattern.reset((PatternT*)createFromObject(obj, GetPatternType<PatternT>(), detectedType));
143 return pattern != nullptr;
144 }
145
146 template<typename PatternT>
147 inline bool PdfPattern::TryCreateFromObject(const PdfObject& obj, std::unique_ptr<const PatternT>& pattern)
148 {
149 PdfPatternType detectedType;
150 pattern.reset((const PatternT*)createFromObject(obj, GetPatternType<PatternT>(), detectedType));
151 return pattern != nullptr;
152 }
153
154 template<typename TPattern>
155 constexpr PdfPatternType PdfPattern::GetPatternType()
156 {
157 if (std::is_same_v<TPattern, PdfColouredTilingPattern>)
158 return PdfPatternType::Tiling;
159 else if (std::is_same_v<TPattern, PdfUncolouredTilingPattern>)
160 return PdfPatternType::Tiling;
161 else if (std::is_same_v<TPattern, PdfShadingPattern>)
162 return PdfPatternType::Shading;
163 else
164 return PdfPatternType::Unknown;
165 }
166}
167
168#endif // PDF_PATTERN_H
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 PdfShadingDefinition > PdfShadingDefinitionPtr
Convenience alias for a constant PdfShadingDefinition shared ptr.
Definition PdfPatternDefinition.h:180
std::shared_ptr< const PdfShadingPatternDefinition > PdfShadingPatternDefinitionPtr
Convenience alias for a constant PdfShadingPatternDefinition shared ptr.
Definition PdfPatternDefinition.h:409