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 std::unique_ptr<PdfPattern> created(createFromObject(obj, GetPatternType<PatternT>(), detectedType));
143 // NOTE: Both tiling patterns map to PdfPatternType::Tiling, so the class created is checked
144 if (dynamic_cast<PatternT*>(created.get()) == nullptr)
145 {
146 pattern.reset();
147 return false;
148 }
149
150 pattern.reset(static_cast<PatternT*>(created.release()));
151 return true;
152 }
153
154 template<typename PatternT>
155 inline bool PdfPattern::TryCreateFromObject(const PdfObject& obj, std::unique_ptr<const PatternT>& pattern)
156 {
157 PdfPatternType detectedType;
158 std::unique_ptr<const PdfPattern> created(createFromObject(obj, GetPatternType<PatternT>(), detectedType));
159 if (dynamic_cast<const PatternT*>(created.get()) == nullptr)
160 {
161 pattern.reset();
162 return false;
163 }
164
165 pattern.reset(static_cast<const PatternT*>(created.release()));
166 return true;
167 }
168
169 template<typename TPattern>
170 constexpr PdfPatternType PdfPattern::GetPatternType()
171 {
172 if (std::is_same_v<TPattern, PdfColouredTilingPattern>)
173 return PdfPatternType::Tiling;
174 else if (std::is_same_v<TPattern, PdfUncolouredTilingPattern>)
175 return PdfPatternType::Tiling;
176 else if (std::is_same_v<TPattern, PdfShadingPattern>)
177 return PdfPatternType::Shading;
178 else
179 return PdfPatternType::Unknown;
180 }
181}
182
183#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