OLD | NEW |
| (Empty) |
1 // Copyright 2016 PDFium Authors. All rights reserved. | |
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/fpdf_page/cpdf_generalstate.h" | |
8 | |
9 #include "core/fpdfapi/fpdf_parser/cpdf_document.h" | |
10 #include "core/fpdfapi/fpdf_render/render_int.h" | |
11 | |
12 namespace { | |
13 | |
14 int RI_StringToId(const CFX_ByteString& ri) { | |
15 uint32_t id = ri.GetID(); | |
16 if (id == FXBSTR_ID('A', 'b', 's', 'o')) | |
17 return 1; | |
18 | |
19 if (id == FXBSTR_ID('S', 'a', 't', 'u')) | |
20 return 2; | |
21 | |
22 if (id == FXBSTR_ID('P', 'e', 'r', 'c')) | |
23 return 3; | |
24 | |
25 return 0; | |
26 } | |
27 | |
28 int GetBlendTypeInternal(const CFX_ByteString& mode) { | |
29 switch (mode.GetID()) { | |
30 case FXBSTR_ID('N', 'o', 'r', 'm'): | |
31 case FXBSTR_ID('C', 'o', 'm', 'p'): | |
32 return FXDIB_BLEND_NORMAL; | |
33 case FXBSTR_ID('M', 'u', 'l', 't'): | |
34 return FXDIB_BLEND_MULTIPLY; | |
35 case FXBSTR_ID('S', 'c', 'r', 'e'): | |
36 return FXDIB_BLEND_SCREEN; | |
37 case FXBSTR_ID('O', 'v', 'e', 'r'): | |
38 return FXDIB_BLEND_OVERLAY; | |
39 case FXBSTR_ID('D', 'a', 'r', 'k'): | |
40 return FXDIB_BLEND_DARKEN; | |
41 case FXBSTR_ID('L', 'i', 'g', 'h'): | |
42 return FXDIB_BLEND_LIGHTEN; | |
43 case FXBSTR_ID('C', 'o', 'l', 'o'): | |
44 if (mode.GetLength() == 10) | |
45 return FXDIB_BLEND_COLORDODGE; | |
46 if (mode.GetLength() == 9) | |
47 return FXDIB_BLEND_COLORBURN; | |
48 return FXDIB_BLEND_COLOR; | |
49 case FXBSTR_ID('H', 'a', 'r', 'd'): | |
50 return FXDIB_BLEND_HARDLIGHT; | |
51 case FXBSTR_ID('S', 'o', 'f', 't'): | |
52 return FXDIB_BLEND_SOFTLIGHT; | |
53 case FXBSTR_ID('D', 'i', 'f', 'f'): | |
54 return FXDIB_BLEND_DIFFERENCE; | |
55 case FXBSTR_ID('E', 'x', 'c', 'l'): | |
56 return FXDIB_BLEND_EXCLUSION; | |
57 case FXBSTR_ID('H', 'u', 'e', 0): | |
58 return FXDIB_BLEND_HUE; | |
59 case FXBSTR_ID('S', 'a', 't', 'u'): | |
60 return FXDIB_BLEND_SATURATION; | |
61 case FXBSTR_ID('L', 'u', 'm', 'i'): | |
62 return FXDIB_BLEND_LUMINOSITY; | |
63 } | |
64 return FXDIB_BLEND_NORMAL; | |
65 } | |
66 | |
67 } // namespace | |
68 | |
69 CPDF_GeneralState::CPDF_GeneralState() {} | |
70 | |
71 CPDF_GeneralState::CPDF_GeneralState(const CPDF_GeneralState& that) | |
72 : m_Ref(that.m_Ref) {} | |
73 | |
74 CPDF_GeneralState::~CPDF_GeneralState() {} | |
75 | |
76 void CPDF_GeneralState::SetRenderIntent(const CFX_ByteString& ri) { | |
77 m_Ref.GetPrivateCopy()->m_RenderIntent = RI_StringToId(ri); | |
78 } | |
79 | |
80 int CPDF_GeneralState::GetBlendType() const { | |
81 const StateData* pData = m_Ref.GetObject(); | |
82 return pData ? pData->m_BlendType : FXDIB_BLEND_NORMAL; | |
83 } | |
84 | |
85 void CPDF_GeneralState::SetBlendType(int type) { | |
86 m_Ref.GetPrivateCopy()->m_BlendType = type; | |
87 } | |
88 | |
89 FX_FLOAT CPDF_GeneralState::GetFillAlpha() const { | |
90 const StateData* pData = m_Ref.GetObject(); | |
91 return pData ? pData->m_FillAlpha : 1.0f; | |
92 } | |
93 | |
94 void CPDF_GeneralState::SetFillAlpha(FX_FLOAT alpha) { | |
95 m_Ref.GetPrivateCopy()->m_FillAlpha = alpha; | |
96 } | |
97 | |
98 FX_FLOAT CPDF_GeneralState::GetStrokeAlpha() const { | |
99 const StateData* pData = m_Ref.GetObject(); | |
100 return pData ? pData->m_StrokeAlpha : 1.0f; | |
101 } | |
102 | |
103 void CPDF_GeneralState::SetStrokeAlpha(FX_FLOAT alpha) { | |
104 m_Ref.GetPrivateCopy()->m_StrokeAlpha = alpha; | |
105 } | |
106 | |
107 CPDF_Object* CPDF_GeneralState::GetSoftMask() const { | |
108 const StateData* pData = m_Ref.GetObject(); | |
109 return pData ? pData->m_pSoftMask : nullptr; | |
110 } | |
111 | |
112 void CPDF_GeneralState::SetSoftMask(CPDF_Object* pObject) { | |
113 m_Ref.GetPrivateCopy()->m_pSoftMask = pObject; | |
114 } | |
115 | |
116 CPDF_Object* CPDF_GeneralState::GetTR() const { | |
117 const StateData* pData = m_Ref.GetObject(); | |
118 return pData ? pData->m_pTR : nullptr; | |
119 } | |
120 | |
121 void CPDF_GeneralState::SetTR(CPDF_Object* pObject) { | |
122 m_Ref.GetPrivateCopy()->m_pTR = pObject; | |
123 } | |
124 | |
125 CPDF_TransferFunc* CPDF_GeneralState::GetTransferFunc() const { | |
126 const StateData* pData = m_Ref.GetObject(); | |
127 return pData ? pData->m_pTransferFunc : nullptr; | |
128 } | |
129 | |
130 void CPDF_GeneralState::SetTransferFunc(CPDF_TransferFunc* pFunc) { | |
131 m_Ref.GetPrivateCopy()->m_pTransferFunc = pFunc; | |
132 } | |
133 | |
134 void CPDF_GeneralState::SetBlendMode(const CFX_ByteString& mode) { | |
135 StateData* pData = m_Ref.GetPrivateCopy(); | |
136 pData->m_BlendMode = mode; | |
137 pData->m_BlendType = GetBlendTypeInternal(mode); | |
138 } | |
139 | |
140 const CFX_Matrix* CPDF_GeneralState::GetSMaskMatrix() const { | |
141 const StateData* pData = m_Ref.GetObject(); | |
142 return pData ? &pData->m_SMaskMatrix : nullptr; | |
143 } | |
144 | |
145 void CPDF_GeneralState::SetSMaskMatrix(const CFX_Matrix& matrix) { | |
146 m_Ref.GetPrivateCopy()->m_SMaskMatrix = matrix; | |
147 } | |
148 | |
149 bool CPDF_GeneralState::GetFillOP() const { | |
150 const StateData* pData = m_Ref.GetObject(); | |
151 return pData && pData->m_FillOP; | |
152 } | |
153 | |
154 void CPDF_GeneralState::SetFillOP(bool op) { | |
155 m_Ref.GetPrivateCopy()->m_FillOP = op; | |
156 } | |
157 | |
158 void CPDF_GeneralState::SetStrokeOP(bool op) { | |
159 m_Ref.GetPrivateCopy()->m_StrokeOP = op; | |
160 } | |
161 | |
162 bool CPDF_GeneralState::GetStrokeOP() const { | |
163 const StateData* pData = m_Ref.GetObject(); | |
164 return pData && pData->m_StrokeOP; | |
165 } | |
166 | |
167 int CPDF_GeneralState::GetOPMode() const { | |
168 return m_Ref.GetObject()->m_OPMode; | |
169 } | |
170 | |
171 void CPDF_GeneralState::SetOPMode(int mode) { | |
172 m_Ref.GetPrivateCopy()->m_OPMode = mode; | |
173 } | |
174 | |
175 void CPDF_GeneralState::SetBG(CPDF_Object* pObject) { | |
176 m_Ref.GetPrivateCopy()->m_pBG = pObject; | |
177 } | |
178 | |
179 void CPDF_GeneralState::SetUCR(CPDF_Object* pObject) { | |
180 m_Ref.GetPrivateCopy()->m_pUCR = pObject; | |
181 } | |
182 | |
183 void CPDF_GeneralState::SetHT(CPDF_Object* pObject) { | |
184 m_Ref.GetPrivateCopy()->m_pHT = pObject; | |
185 } | |
186 | |
187 void CPDF_GeneralState::SetFlatness(FX_FLOAT flatness) { | |
188 m_Ref.GetPrivateCopy()->m_Flatness = flatness; | |
189 } | |
190 | |
191 void CPDF_GeneralState::SetSmoothness(FX_FLOAT smoothness) { | |
192 m_Ref.GetPrivateCopy()->m_Smoothness = smoothness; | |
193 } | |
194 | |
195 bool CPDF_GeneralState::GetStrokeAdjust() const { | |
196 const StateData* pData = m_Ref.GetObject(); | |
197 return pData && pData->m_StrokeAdjust; | |
198 } | |
199 | |
200 void CPDF_GeneralState::SetStrokeAdjust(bool adjust) { | |
201 m_Ref.GetPrivateCopy()->m_StrokeAdjust = adjust; | |
202 } | |
203 | |
204 void CPDF_GeneralState::SetAlphaSource(bool source) { | |
205 m_Ref.GetPrivateCopy()->m_AlphaSource = source; | |
206 } | |
207 | |
208 void CPDF_GeneralState::SetTextKnockout(bool knockout) { | |
209 m_Ref.GetPrivateCopy()->m_TextKnockout = knockout; | |
210 } | |
211 | |
212 void CPDF_GeneralState::SetMatrix(const CFX_Matrix& matrix) { | |
213 m_Ref.GetPrivateCopy()->m_Matrix = matrix; | |
214 } | |
215 | |
216 CFX_Matrix* CPDF_GeneralState::GetMutableMatrix() { | |
217 return &m_Ref.GetPrivateCopy()->m_Matrix; | |
218 } | |
219 | |
220 CPDF_GeneralState::StateData::StateData() | |
221 : m_BlendMode("Normal"), | |
222 m_BlendType(0), | |
223 m_pSoftMask(nullptr), | |
224 m_StrokeAlpha(1.0), | |
225 m_FillAlpha(1.0f), | |
226 m_pTR(nullptr), | |
227 m_pTransferFunc(nullptr), | |
228 m_RenderIntent(0), | |
229 m_StrokeAdjust(false), | |
230 m_AlphaSource(false), | |
231 m_TextKnockout(false), | |
232 m_StrokeOP(false), | |
233 m_FillOP(false), | |
234 m_OPMode(0), | |
235 m_pBG(nullptr), | |
236 m_pUCR(nullptr), | |
237 m_pHT(nullptr), | |
238 m_Flatness(1.0f), | |
239 m_Smoothness(0.0f) { | |
240 m_SMaskMatrix.SetIdentity(); | |
241 m_Matrix.SetIdentity(); | |
242 } | |
243 | |
244 CPDF_GeneralState::StateData::StateData(const StateData& that) | |
245 : m_BlendMode(that.m_BlendMode), | |
246 m_BlendType(that.m_BlendType), | |
247 m_pSoftMask(that.m_pSoftMask), | |
248 m_StrokeAlpha(that.m_StrokeAlpha), | |
249 m_FillAlpha(that.m_FillAlpha), | |
250 m_pTR(that.m_pTR), | |
251 m_pTransferFunc(that.m_pTransferFunc), | |
252 m_RenderIntent(that.m_RenderIntent), | |
253 m_StrokeAdjust(that.m_StrokeAdjust), | |
254 m_AlphaSource(that.m_AlphaSource), | |
255 m_TextKnockout(that.m_TextKnockout), | |
256 m_StrokeOP(that.m_StrokeOP), | |
257 m_FillOP(that.m_FillOP), | |
258 m_OPMode(that.m_OPMode), | |
259 m_pBG(that.m_pBG), | |
260 m_pUCR(that.m_pUCR), | |
261 m_pHT(that.m_pHT), | |
262 m_Flatness(that.m_Flatness), | |
263 m_Smoothness(that.m_Smoothness) { | |
264 m_Matrix = that.m_Matrix; | |
265 m_SMaskMatrix = that.m_SMaskMatrix; | |
266 | |
267 if (that.m_pTransferFunc && that.m_pTransferFunc->m_pPDFDoc) { | |
268 CPDF_DocRenderData* pDocCache = | |
269 that.m_pTransferFunc->m_pPDFDoc->GetRenderData(); | |
270 if (pDocCache) | |
271 m_pTransferFunc = pDocCache->GetTransferFunc(m_pTR); | |
272 } | |
273 } | |
274 | |
275 CPDF_GeneralState::StateData::~StateData() { | |
276 if (m_pTransferFunc && m_pTransferFunc->m_pPDFDoc) { | |
277 CPDF_DocRenderData* pDocCache = m_pTransferFunc->m_pPDFDoc->GetRenderData(); | |
278 if (pDocCache) | |
279 pDocCache->ReleaseTransferFunc(m_pTR); | |
280 } | |
281 } | |
OLD | NEW |