OLD | NEW |
1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
6 | 6 |
7 #include "core/fpdfapi/page/pageint.h" | 7 #include "core/fpdfapi/page/pageint.h" |
8 | 8 |
9 #include <limits.h> | 9 #include <limits.h> |
10 | 10 |
11 #include <algorithm> | 11 #include <algorithm> |
12 #include <memory> | 12 #include <memory> |
13 #include <utility> | 13 #include <utility> |
14 #include <vector> | 14 #include <vector> |
15 | 15 |
16 #include "core/fpdfapi/page/cpdf_psengine.h" | 16 #include "core/fpdfapi/page/cpdf_psengine.h" |
17 #include "core/fpdfapi/parser/cpdf_array.h" | 17 #include "core/fpdfapi/parser/cpdf_array.h" |
18 #include "core/fpdfapi/parser/cpdf_dictionary.h" | 18 #include "core/fpdfapi/parser/cpdf_dictionary.h" |
19 #include "core/fpdfapi/parser/cpdf_simple_parser.h" | 19 #include "core/fpdfapi/parser/cpdf_simple_parser.h" |
20 #include "core/fpdfapi/parser/cpdf_stream.h" | 20 #include "core/fpdfapi/parser/cpdf_stream.h" |
21 #include "core/fpdfapi/parser/cpdf_stream_acc.h" | 21 #include "core/fpdfapi/parser/cpdf_stream_acc.h" |
22 #include "core/fxcrt/fx_safe_types.h" | 22 #include "core/fxcrt/fx_safe_types.h" |
23 #include "third_party/base/numerics/safe_conversions_impl.h" | |
24 | 23 |
25 class CPDF_PSOP { | 24 class CPDF_PSOP { |
26 public: | 25 public: |
27 explicit CPDF_PSOP(PDF_PSOP op) : m_op(op), m_value(0) { | 26 explicit CPDF_PSOP(PDF_PSOP op) : m_op(op), m_value(0) { |
28 ASSERT(m_op != PSOP_CONST); | 27 ASSERT(m_op != PSOP_CONST); |
29 ASSERT(m_op != PSOP_PROC); | 28 ASSERT(m_op != PSOP_PROC); |
30 } | 29 } |
31 explicit CPDF_PSOP(FX_FLOAT value) : m_op(PSOP_CONST), m_value(value) {} | 30 explicit CPDF_PSOP(FX_FLOAT value) : m_op(PSOP_CONST), m_value(value) {} |
32 explicit CPDF_PSOP(std::unique_ptr<CPDF_PSProc> proc) | 31 explicit CPDF_PSOP(std::unique_ptr<CPDF_PSProc> proc) |
33 : m_op(PSOP_PROC), m_value(0), m_proc(std::move(proc)) {} | 32 : m_op(PSOP_PROC), m_value(0), m_proc(std::move(proc)) {} |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
173 } | 172 } |
174 if (!found) { | 173 if (!found) { |
175 std::unique_ptr<CPDF_PSOP> op(new CPDF_PSOP(FX_atof(word))); | 174 std::unique_ptr<CPDF_PSOP> op(new CPDF_PSOP(FX_atof(word))); |
176 m_Operators.push_back(std::move(op)); | 175 m_Operators.push_back(std::move(op)); |
177 } | 176 } |
178 } | 177 } |
179 } | 178 } |
180 } | 179 } |
181 | 180 |
182 FX_BOOL CPDF_PSEngine::DoOperator(PDF_PSOP op) { | 181 FX_BOOL CPDF_PSEngine::DoOperator(PDF_PSOP op) { |
183 int i1, i2; | 182 int i1; |
184 FX_FLOAT d1, d2; | 183 int i2; |
| 184 FX_FLOAT d1; |
| 185 FX_FLOAT d2; |
| 186 FX_SAFE_INT32 result; |
185 switch (op) { | 187 switch (op) { |
186 case PSOP_ADD: | 188 case PSOP_ADD: |
187 d1 = Pop(); | 189 d1 = Pop(); |
188 d2 = Pop(); | 190 d2 = Pop(); |
189 Push(d1 + d2); | 191 Push(d1 + d2); |
190 break; | 192 break; |
191 case PSOP_SUB: | 193 case PSOP_SUB: |
192 d2 = Pop(); | 194 d2 = Pop(); |
193 d1 = Pop(); | 195 d1 = Pop(); |
194 Push(d1 - d2); | 196 Push(d1 - d2); |
195 break; | 197 break; |
196 case PSOP_MUL: | 198 case PSOP_MUL: |
197 d1 = Pop(); | 199 d1 = Pop(); |
198 d2 = Pop(); | 200 d2 = Pop(); |
199 Push(d1 * d2); | 201 Push(d1 * d2); |
200 break; | 202 break; |
201 case PSOP_DIV: | 203 case PSOP_DIV: |
202 d2 = Pop(); | 204 d2 = Pop(); |
203 d1 = Pop(); | 205 d1 = Pop(); |
204 Push(d1 / d2); | 206 Push(d1 / d2); |
205 break; | 207 break; |
206 case PSOP_IDIV: | 208 case PSOP_IDIV: |
207 i2 = (int)Pop(); | 209 i2 = static_cast<int>(Pop()); |
208 i1 = (int)Pop(); | 210 i1 = static_cast<int>(Pop()); |
209 Push(i2 ? i1 / i2 : 0); | 211 if (i2) { |
| 212 result = i1; |
| 213 result /= i2; |
| 214 Push(result.ValueOrDefault(0)); |
| 215 } else { |
| 216 Push(0); |
| 217 } |
210 break; | 218 break; |
211 case PSOP_MOD: | 219 case PSOP_MOD: |
212 i2 = (int)Pop(); | 220 i2 = static_cast<int>(Pop()); |
213 i1 = (int)Pop(); | 221 i1 = static_cast<int>(Pop()); |
214 Push(i2 ? i1 % i2 : 0); | 222 if (i2) { |
| 223 result = i1; |
| 224 result %= i2; |
| 225 Push(result.ValueOrDefault(0)); |
| 226 } else { |
| 227 Push(0); |
| 228 } |
215 break; | 229 break; |
216 case PSOP_NEG: | 230 case PSOP_NEG: |
217 d1 = Pop(); | 231 d1 = Pop(); |
218 Push(-d1); | 232 Push(-d1); |
219 break; | 233 break; |
220 case PSOP_ABS: | 234 case PSOP_ABS: |
221 d1 = Pop(); | 235 d1 = Pop(); |
222 Push((FX_FLOAT)FXSYS_fabs(d1)); | 236 Push((FX_FLOAT)FXSYS_fabs(d1)); |
223 break; | 237 break; |
224 case PSOP_CEILING: | 238 case PSOP_CEILING: |
(...skipping 613 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
838 return m_Type == Type::kType2ExpotentialInterpolation | 852 return m_Type == Type::kType2ExpotentialInterpolation |
839 ? static_cast<const CPDF_ExpIntFunc*>(this) | 853 ? static_cast<const CPDF_ExpIntFunc*>(this) |
840 : nullptr; | 854 : nullptr; |
841 } | 855 } |
842 | 856 |
843 const CPDF_StitchFunc* CPDF_Function::ToStitchFunc() const { | 857 const CPDF_StitchFunc* CPDF_Function::ToStitchFunc() const { |
844 return m_Type == Type::kType3Stitching | 858 return m_Type == Type::kType3Stitching |
845 ? static_cast<const CPDF_StitchFunc*>(this) | 859 ? static_cast<const CPDF_StitchFunc*>(this) |
846 : nullptr; | 860 : nullptr; |
847 } | 861 } |
OLD | NEW |