Index: core/fpdfapi/fpdf_page/fpdf_page_func.cpp |
diff --git a/core/fpdfapi/fpdf_page/fpdf_page_func.cpp b/core/fpdfapi/fpdf_page/fpdf_page_func.cpp |
index ed8e6093d58787879df230a0dd8c27e81427b51d..6a5bbacda52d3071ba95c886dc5084b3a32106b0 100644 |
--- a/core/fpdfapi/fpdf_page/fpdf_page_func.cpp |
+++ b/core/fpdfapi/fpdf_page/fpdf_page_func.cpp |
@@ -13,6 +13,7 @@ |
#include <utility> |
#include <vector> |
+#include "core/fpdfapi/fpdf_page/cpdf_psengine.h" |
#include "core/fpdfapi/fpdf_parser/include/cpdf_array.h" |
#include "core/fpdfapi/fpdf_parser/include/cpdf_dictionary.h" |
#include "core/fpdfapi/fpdf_parser/include/cpdf_simple_parser.h" |
@@ -21,58 +22,6 @@ |
#include "core/fxcrt/include/fx_safe_types.h" |
#include "third_party/base/numerics/safe_conversions_impl.h" |
-namespace { |
- |
-enum PDF_PSOP { |
- PSOP_ADD, |
- PSOP_SUB, |
- PSOP_MUL, |
- PSOP_DIV, |
- PSOP_IDIV, |
- PSOP_MOD, |
- PSOP_NEG, |
- PSOP_ABS, |
- PSOP_CEILING, |
- PSOP_FLOOR, |
- PSOP_ROUND, |
- PSOP_TRUNCATE, |
- PSOP_SQRT, |
- PSOP_SIN, |
- PSOP_COS, |
- PSOP_ATAN, |
- PSOP_EXP, |
- PSOP_LN, |
- PSOP_LOG, |
- PSOP_CVI, |
- PSOP_CVR, |
- PSOP_EQ, |
- PSOP_NE, |
- PSOP_GT, |
- PSOP_GE, |
- PSOP_LT, |
- PSOP_LE, |
- PSOP_AND, |
- PSOP_OR, |
- PSOP_XOR, |
- PSOP_NOT, |
- PSOP_BITSHIFT, |
- PSOP_TRUE, |
- PSOP_FALSE, |
- PSOP_IF, |
- PSOP_IFELSE, |
- PSOP_POP, |
- PSOP_EXCH, |
- PSOP_DUP, |
- PSOP_COPY, |
- PSOP_INDEX, |
- PSOP_ROLL, |
- PSOP_PROC, |
- PSOP_CONST |
-}; |
- |
-class CPDF_PSEngine; |
-class CPDF_PSProc; |
- |
class CPDF_PSOP { |
public: |
explicit CPDF_PSOP(PDF_PSOP op) : m_op(op), m_value(0) { |
@@ -105,39 +54,12 @@ class CPDF_PSOP { |
std::unique_ptr<CPDF_PSProc> m_proc; |
}; |
-class CPDF_PSProc { |
- public: |
- CPDF_PSProc() {} |
- ~CPDF_PSProc() {} |
- |
- FX_BOOL Parse(CPDF_SimpleParser* parser); |
- FX_BOOL Execute(CPDF_PSEngine* pEngine); |
- |
- private: |
- std::vector<std::unique_ptr<CPDF_PSOP>> m_Operators; |
-}; |
- |
-const uint32_t PSENGINE_STACKSIZE = 100; |
- |
-class CPDF_PSEngine { |
- public: |
- CPDF_PSEngine(); |
- ~CPDF_PSEngine(); |
- |
- FX_BOOL Parse(const FX_CHAR* str, int size); |
- FX_BOOL Execute() { return m_MainProc.Execute(this); } |
- FX_BOOL DoOperator(PDF_PSOP op); |
- void Reset() { m_StackCount = 0; } |
- void Push(FX_FLOAT value); |
- void Push(int value) { Push((FX_FLOAT)value); } |
- FX_FLOAT Pop(); |
- uint32_t GetStackSize() const { return m_StackCount; } |
+FX_BOOL CPDF_PSEngine::Execute() { |
+ return m_MainProc.Execute(this); |
+} |
- private: |
- FX_FLOAT m_Stack[PSENGINE_STACKSIZE]; |
- uint32_t m_StackCount; |
- CPDF_PSProc m_MainProc; |
-}; |
+CPDF_PSProc::CPDF_PSProc() {} |
+CPDF_PSProc::~CPDF_PSProc() {} |
FX_BOOL CPDF_PSProc::Execute(CPDF_PSEngine* pEngine) { |
for (size_t i = 0; i < m_Operators.size(); ++i) { |
@@ -280,12 +202,12 @@ FX_BOOL CPDF_PSEngine::DoOperator(PDF_PSOP op) { |
case PSOP_IDIV: |
i2 = (int)Pop(); |
i1 = (int)Pop(); |
- Push(i1 / i2); |
+ Push(i2 ? i1 / i2 : 0); |
break; |
case PSOP_MOD: |
i2 = (int)Pop(); |
i1 = (int)Pop(); |
- Push(i1 % i2); |
+ Push(i2 ? i1 % i2 : 0); |
break; |
case PSOP_NEG: |
d1 = Pop(); |
@@ -538,7 +460,6 @@ FX_BOOL CPDF_PSFunc::v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const { |
return TRUE; |
} |
-} // namespace |
CPDF_SampledFunc::CPDF_SampledFunc() : CPDF_Function(Type::kType0Sampled) {} |