Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
cpdf_generalstate.cpp
Go to the documentation of this file.
1// Copyright 2016 The PDFium Authors
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
7#include "core/fpdfapi/page/cpdf_generalstate.h"
8
9#include <utility>
10
11#include "core/fpdfapi/page/cpdf_transferfunc.h"
12#include "core/fpdfapi/parser/cpdf_dictionary.h"
13#include "core/fpdfapi/parser/cpdf_object.h"
14
15namespace {
16
17int RI_StringToId(const ByteString& ri) {
18 uint32_t id = ri.GetID();
19 if (id == FXBSTR_ID('A', 'b', 's', 'o'))
20 return 1;
21
22 if (id == FXBSTR_ID('S', 'a', 't', 'u'))
23 return 2;
24
25 if (id == FXBSTR_ID('P', 'e', 'r', 'c'))
26 return 3;
27
28 return 0;
29}
30
31BlendMode GetBlendTypeInternal(const ByteString& mode) {
32 switch (mode.GetID()) {
33 case FXBSTR_ID('N', 'o', 'r', 'm'):
34 case FXBSTR_ID('C', 'o', 'm', 'p'):
35 return BlendMode::kNormal;
36 case FXBSTR_ID('M', 'u', 'l', 't'):
38 case FXBSTR_ID('S', 'c', 'r', 'e'):
39 return BlendMode::kScreen;
40 case FXBSTR_ID('O', 'v', 'e', 'r'):
42 case FXBSTR_ID('D', 'a', 'r', 'k'):
43 return BlendMode::kDarken;
44 case FXBSTR_ID('L', 'i', 'g', 'h'):
46 case FXBSTR_ID('C', 'o', 'l', 'o'):
47 if (mode.GetLength() == 10)
49 if (mode.GetLength() == 9)
51 return BlendMode::kColor;
52 case FXBSTR_ID('H', 'a', 'r', 'd'):
54 case FXBSTR_ID('S', 'o', 'f', 't'):
56 case FXBSTR_ID('D', 'i', 'f', 'f'):
58 case FXBSTR_ID('E', 'x', 'c', 'l'):
60 case FXBSTR_ID('H', 'u', 'e', 0):
61 return BlendMode::kHue;
62 case FXBSTR_ID('S', 'a', 't', 'u'):
64 case FXBSTR_ID('L', 'u', 'm', 'i'):
66 }
67 return BlendMode::kNormal;
68}
69
70} // namespace
71
73
75
77
78void CPDF_GeneralState::SetRenderIntent(const ByteString& ri) {
79 m_Ref.GetPrivateCopy()->m_RenderIntent = RI_StringToId(ri);
80}
81
82ByteString CPDF_GeneralState::GetBlendMode() const {
83 switch (GetBlendType()) {
85 return ByteString(pdfium::transparency::kNormal);
87 return ByteString(pdfium::transparency::kMultiply);
89 return ByteString(pdfium::transparency::kScreen);
91 return ByteString(pdfium::transparency::kOverlay);
93 return ByteString(pdfium::transparency::kDarken);
95 return ByteString(pdfium::transparency::kLighten);
97 return ByteString(pdfium::transparency::kColorDodge);
99 return ByteString(pdfium::transparency::kColorBurn);
101 return ByteString(pdfium::transparency::kHardLight);
103 return ByteString(pdfium::transparency::kSoftLight);
105 return ByteString(pdfium::transparency::kDifference);
107 return ByteString(pdfium::transparency::kExclusion);
108 case BlendMode::kHue:
109 return ByteString(pdfium::transparency::kHue);
111 return ByteString(pdfium::transparency::kSaturation);
113 return ByteString(pdfium::transparency::kColor);
115 return ByteString(pdfium::transparency::kLuminosity);
116 }
117 return ByteString(pdfium::transparency::kNormal);
118}
119
121 const StateData* pData = m_Ref.GetObject();
122 return pData ? pData->m_BlendType : BlendMode::kNormal;
123}
124
126 if (GetBlendType() != type) {
127 m_Ref.GetPrivateCopy()->m_BlendType = type;
128 }
129}
130
132 const StateData* pData = m_Ref.GetObject();
133 return pData ? pData->m_FillAlpha : 1.0f;
134}
135
136void CPDF_GeneralState::SetFillAlpha(float alpha) {
137 if (GetFillAlpha() != alpha) {
138 m_Ref.GetPrivateCopy()->m_FillAlpha = alpha;
139 }
140}
141
143 const StateData* pData = m_Ref.GetObject();
144 return pData ? pData->m_StrokeAlpha : 1.0f;
145}
146
148 if (GetStrokeAlpha() != alpha) {
149 m_Ref.GetPrivateCopy()->m_StrokeAlpha = alpha;
150 }
151}
152
153RetainPtr<const CPDF_Dictionary> CPDF_GeneralState::GetSoftMask() const {
154 const StateData* pData = m_Ref.GetObject();
155 return pData ? pData->m_pSoftMask : nullptr;
156}
157
159 const StateData* pData = m_Ref.GetObject();
160 return pData ? pData->m_pSoftMask : nullptr;
161}
162
163void CPDF_GeneralState::SetSoftMask(RetainPtr<CPDF_Dictionary> pDict) {
164 m_Ref.GetPrivateCopy()->m_pSoftMask = std::move(pDict);
165}
166
168 const StateData* pData = m_Ref.GetObject();
169 return pData ? pData->m_pTR : nullptr;
170}
171
173 m_Ref.GetPrivateCopy()->m_pTR = std::move(pObject);
174}
175
176RetainPtr<CPDF_TransferFunc> CPDF_GeneralState::GetTransferFunc() const {
177 const StateData* pData = m_Ref.GetObject();
178 return pData ? pData->m_pTransferFunc : nullptr;
179}
180
181void CPDF_GeneralState::SetTransferFunc(RetainPtr<CPDF_TransferFunc> pFunc) {
182 m_Ref.GetPrivateCopy()->m_pTransferFunc = std::move(pFunc);
183}
184
185void CPDF_GeneralState::SetBlendMode(const ByteString& mode) {
186 StateData* pData = m_Ref.GetPrivateCopy();
187 pData->m_BlendMode = mode;
188 pData->m_BlendType = GetBlendTypeInternal(mode);
189}
190
192 const StateData* pData = m_Ref.GetObject();
193 return pData ? &pData->m_SMaskMatrix : nullptr;
194}
195
197 m_Ref.GetPrivateCopy()->m_SMaskMatrix = matrix;
198}
199
201 const StateData* pData = m_Ref.GetObject();
202 return pData && pData->m_FillOP;
203}
204
206 m_Ref.GetPrivateCopy()->m_FillOP = op;
207}
208
210 m_Ref.GetPrivateCopy()->m_StrokeOP = op;
211}
212
214 const StateData* pData = m_Ref.GetObject();
215 return pData && pData->m_StrokeOP;
216}
217
219 return m_Ref.GetObject()->m_OPMode;
220}
221
223 m_Ref.GetPrivateCopy()->m_OPMode = mode;
224}
225
227 m_Ref.GetPrivateCopy()->m_pBG = std::move(pObject);
228}
229
231 m_Ref.GetPrivateCopy()->m_pUCR = std::move(pObject);
232}
233
235 m_Ref.GetPrivateCopy()->m_pHT = std::move(pObject);
236}
237
238void CPDF_GeneralState::SetFlatness(float flatness) {
239 m_Ref.GetPrivateCopy()->m_Flatness = flatness;
240}
241
242void CPDF_GeneralState::SetSmoothness(float smoothness) {
243 m_Ref.GetPrivateCopy()->m_Smoothness = smoothness;
244}
245
247 const StateData* pData = m_Ref.GetObject();
248 return pData && pData->m_StrokeAdjust;
249}
250
252 m_Ref.GetPrivateCopy()->m_StrokeAdjust = adjust;
253}
254
256 m_Ref.GetPrivateCopy()->m_AlphaSource = source;
257}
258
259void CPDF_GeneralState::SetTextKnockout(bool knockout) {
260 m_Ref.GetPrivateCopy()->m_TextKnockout = knockout;
261}
262
264 m_Ref.GetPrivateCopy()->m_Matrix = matrix;
265}
266
268 return &m_Ref.GetPrivateCopy()->m_Matrix;
269}
270
272 std::vector<ByteString> names) {
273 m_Ref.GetPrivateCopy()->m_GraphicsResourceNames = std::move(names);
274}
275
277 m_Ref.GetPrivateCopy()->m_GraphicsResourceNames.push_back(std::move(name));
278}
279
280pdfium::span<const ByteString> CPDF_GeneralState::GetGraphicsResourceNames()
281 const {
282 const StateData* data = m_Ref.GetObject();
283 if (!data) {
284 return {};
285 }
286 return data->m_GraphicsResourceNames;
287}
288
289CPDF_GeneralState::StateData::StateData() = default;
290
291CPDF_GeneralState::StateData::StateData(const StateData& that)
292 : m_BlendMode(that.m_BlendMode),
293 m_BlendType(that.m_BlendType),
294 m_pSoftMask(that.m_pSoftMask),
295 m_SMaskMatrix(that.m_SMaskMatrix),
296 m_StrokeAlpha(that.m_StrokeAlpha),
297 m_FillAlpha(that.m_FillAlpha),
298 m_pTR(that.m_pTR),
299 m_pTransferFunc(that.m_pTransferFunc),
300 m_Matrix(that.m_Matrix),
301 m_RenderIntent(that.m_RenderIntent),
302 m_StrokeAdjust(that.m_StrokeAdjust),
303 m_AlphaSource(that.m_AlphaSource),
304 m_TextKnockout(that.m_TextKnockout),
305 m_StrokeOP(that.m_StrokeOP),
306 m_FillOP(that.m_FillOP),
307 m_OPMode(that.m_OPMode),
308 m_pBG(that.m_pBG),
309 m_pUCR(that.m_pUCR),
310 m_pHT(that.m_pHT),
311 m_Flatness(that.m_Flatness),
312 m_Smoothness(that.m_Smoothness) {}
313
314CPDF_GeneralState::StateData::~StateData() = default;
315
316RetainPtr<CPDF_GeneralState::StateData> CPDF_GeneralState::StateData::Clone()
317 const {
318 return pdfium::MakeRetain<CPDF_GeneralState::StateData>(*this);
319}
CFX_Matrix(const CFX_Matrix &other)=default
void AppendGraphicsResourceName(ByteString name)
void SetRenderIntent(const ByteString &ri)
void SetHT(RetainPtr< const CPDF_Object > pObject)
void SetBlendType(BlendMode type)
void SetUCR(RetainPtr< const CPDF_Object > pObject)
float GetStrokeAlpha() const
CPDF_GeneralState(const CPDF_GeneralState &that)
void SetTransferFunc(RetainPtr< CPDF_TransferFunc > pFunc)
RetainPtr< CPDF_TransferFunc > GetTransferFunc() const
void SetFillAlpha(float alpha)
void SetStrokeAlpha(float alpha)
void SetSmoothness(float smoothness)
void SetTR(RetainPtr< const CPDF_Object > pObject)
BlendMode GetBlendType() const
void SetStrokeAdjust(bool adjust)
RetainPtr< const CPDF_Object > GetTR() const
void SetBlendMode(const ByteString &mode)
pdfium::span< const ByteString > GetGraphicsResourceNames() const
void SetSMaskMatrix(const CFX_Matrix &matrix)
void SetGraphicsResourceNames(std::vector< ByteString > names)
const CFX_Matrix * GetSMaskMatrix() const
void SetSoftMask(RetainPtr< CPDF_Dictionary > pDict)
void SetBG(RetainPtr< const CPDF_Object > pObject)
ByteString GetBlendMode() const
CFX_Matrix * GetMutableMatrix()
void SetAlphaSource(bool source)
void SetTextKnockout(bool knockout)
RetainPtr< CPDF_Dictionary > GetMutableSoftMask()
RetainPtr< const CPDF_Dictionary > GetSoftMask() const
void SetFlatness(float flatness)
void SetMatrix(const CFX_Matrix &matrix)
uint32_t GetID() const
Definition bytestring.h:213
ByteString(const char *ptr)
BlendMode
Definition fx_dib.h:49
constexpr uint32_t FXBSTR_ID(uint8_t c1, uint8_t c2, uint8_t c3, uint8_t c4)
Definition fx_string.h:19
const char kColorDodge[]
const char kHardLight[]
const char kDifference[]
const char kExclusion[]
const char kSaturation[]
const char kLuminosity[]
const char kSoftLight[]
const char kColorBurn[]