diff options
Diffstat (limited to 'core')
-rw-r--r-- | core/fpdfapi/page/cpdf_psengine.cpp | 84 | ||||
-rw-r--r-- | core/fpdfapi/page/cpdf_psengine.h | 8 |
2 files changed, 48 insertions, 44 deletions
diff --git a/core/fpdfapi/page/cpdf_psengine.cpp b/core/fpdfapi/page/cpdf_psengine.cpp index 63560fccc0..d879ead9c1 100644 --- a/core/fpdfapi/page/cpdf_psengine.cpp +++ b/core/fpdfapi/page/cpdf_psengine.cpp @@ -102,14 +102,14 @@ bool CPDF_PSProc::Execute(CPDF_PSEngine* pEngine) { if (i == 0 || m_Operators[i - 1]->GetOp() != PSOP_PROC) return false; - if (static_cast<int>(pEngine->Pop())) + if (pEngine->PopInt()) m_Operators[i - 1]->GetProc()->Execute(pEngine); } else if (op == PSOP_IFELSE) { if (i < 2 || m_Operators[i - 1]->GetOp() != PSOP_PROC || m_Operators[i - 2]->GetOp() != PSOP_PROC) { return false; } - size_t offset = static_cast<int>(pEngine->Pop()) ? 2 : 1; + size_t offset = pEngine->PopInt() ? 2 : 1; m_Operators[i - offset]->GetProc()->Execute(pEngine); } else { pEngine->DoOperator(op); @@ -123,7 +123,7 @@ CPDF_PSEngine::CPDF_PSEngine() : m_StackCount(0) {} CPDF_PSEngine::~CPDF_PSEngine() {} void CPDF_PSEngine::Push(float v) { - if (m_StackCount < PSENGINE_STACKSIZE) + if (m_StackCount < kPSEngineStackSize) m_Stack[m_StackCount++] = v; } @@ -131,6 +131,10 @@ float CPDF_PSEngine::Pop() { return m_StackCount > 0 ? m_Stack[--m_StackCount] : 0; } +int CPDF_PSEngine::PopInt() { + return static_cast<int>(Pop()); +} + bool CPDF_PSEngine::Parse(const char* str, int size) { CPDF_SimpleParser parser(reinterpret_cast<const uint8_t*>(str), size); ByteStringView word = parser.GetWord(); @@ -197,8 +201,8 @@ bool CPDF_PSEngine::DoOperator(PDF_PSOP op) { Push(d1 / d2); break; case PSOP_IDIV: - i2 = static_cast<int>(Pop()); - i1 = static_cast<int>(Pop()); + i2 = PopInt(); + i1 = PopInt(); if (i2) { result = i1; result /= i2; @@ -208,8 +212,8 @@ bool CPDF_PSEngine::DoOperator(PDF_PSOP op) { } break; case PSOP_MOD: - i2 = static_cast<int>(Pop()); - i1 = static_cast<int>(Pop()); + i2 = PopInt(); + i1 = PopInt(); if (i2) { result = i1; result %= i2; @@ -224,40 +228,40 @@ bool CPDF_PSEngine::DoOperator(PDF_PSOP op) { break; case PSOP_ABS: d1 = Pop(); - Push((float)fabs(d1)); + Push(fabs(d1)); break; case PSOP_CEILING: d1 = Pop(); - Push((float)ceil(d1)); + Push(ceil(d1)); break; case PSOP_FLOOR: d1 = Pop(); - Push((float)floor(d1)); + Push(floor(d1)); break; case PSOP_ROUND: d1 = Pop(); Push(FXSYS_round(d1)); break; case PSOP_TRUNCATE: - i1 = (int)Pop(); + i1 = PopInt(); Push(i1); break; case PSOP_SQRT: d1 = Pop(); - Push((float)sqrt(d1)); + Push(sqrt(d1)); break; case PSOP_SIN: d1 = Pop(); - Push((float)sin(d1 * FX_PI / 180.0f)); + Push(sin(d1 * FX_PI / 180.0f)); break; case PSOP_COS: d1 = Pop(); - Push((float)cos(d1 * FX_PI / 180.0f)); + Push(cos(d1 * FX_PI / 180.0f)); break; case PSOP_ATAN: d2 = Pop(); d1 = Pop(); - d1 = (float)(atan2(d1, d2) * 180.0 / FX_PI); + d1 = atan2(d1, d2) * 180.0 / FX_PI; if (d1 < 0) { d1 += 360; } @@ -266,18 +270,18 @@ bool CPDF_PSEngine::DoOperator(PDF_PSOP op) { case PSOP_EXP: d2 = Pop(); d1 = Pop(); - Push((float)FXSYS_pow(d1, d2)); + Push(FXSYS_pow(d1, d2)); break; case PSOP_LN: d1 = Pop(); - Push((float)log(d1)); + Push(log(d1)); break; case PSOP_LOG: d1 = Pop(); - Push((float)log10(d1)); + Push(log10(d1)); break; case PSOP_CVI: - i1 = (int)Pop(); + i1 = PopInt(); Push(i1); break; case PSOP_CVR: @@ -285,55 +289,55 @@ bool CPDF_PSEngine::DoOperator(PDF_PSOP op) { case PSOP_EQ: d2 = Pop(); d1 = Pop(); - Push((int)(d1 == d2)); + Push(d1 == d2); break; case PSOP_NE: d2 = Pop(); d1 = Pop(); - Push((int)(d1 != d2)); + Push(d1 != d2); break; case PSOP_GT: d2 = Pop(); d1 = Pop(); - Push((int)(d1 > d2)); + Push(d1 > d2); break; case PSOP_GE: d2 = Pop(); d1 = Pop(); - Push((int)(d1 >= d2)); + Push(d1 >= d2); break; case PSOP_LT: d2 = Pop(); d1 = Pop(); - Push((int)(d1 < d2)); + Push(d1 < d2); break; case PSOP_LE: d2 = Pop(); d1 = Pop(); - Push((int)(d1 <= d2)); + Push(d1 <= d2); break; case PSOP_AND: - i1 = (int)Pop(); - i2 = (int)Pop(); + i1 = PopInt(); + i2 = PopInt(); Push(i1 & i2); break; case PSOP_OR: - i1 = (int)Pop(); - i2 = (int)Pop(); + i1 = PopInt(); + i2 = PopInt(); Push(i1 | i2); break; case PSOP_XOR: - i1 = (int)Pop(); - i2 = (int)Pop(); + i1 = PopInt(); + i2 = PopInt(); Push(i1 ^ i2); break; case PSOP_NOT: - i1 = (int)Pop(); - Push((int)!i1); + i1 = PopInt(); + Push(!i1); break; case PSOP_BITSHIFT: { - int shift = (int)Pop(); - result = (int)Pop(); + int shift = PopInt(); + result = PopInt(); if (shift > 0) { result <<= shift; } else { @@ -365,8 +369,8 @@ bool CPDF_PSEngine::DoOperator(PDF_PSOP op) { Push(d1); break; case PSOP_COPY: { - int n = static_cast<int>(Pop()); - if (n < 0 || m_StackCount + n > PSENGINE_STACKSIZE || + int n = PopInt(); + if (n < 0 || m_StackCount + n > kPSEngineStackSize || n > static_cast<int>(m_StackCount)) break; for (int i = 0; i < n; i++) @@ -375,15 +379,15 @@ bool CPDF_PSEngine::DoOperator(PDF_PSOP op) { break; } case PSOP_INDEX: { - int n = static_cast<int>(Pop()); + int n = PopInt(); if (n < 0 || n >= static_cast<int>(m_StackCount)) break; Push(m_Stack[m_StackCount - n - 1]); break; } case PSOP_ROLL: { - int j = static_cast<int>(Pop()); - int n = static_cast<int>(Pop()); + int j = PopInt(); + int n = PopInt(); if (j == 0 || n == 0 || m_StackCount == 0) break; if (n < 0 || n > static_cast<int>(m_StackCount)) diff --git a/core/fpdfapi/page/cpdf_psengine.h b/core/fpdfapi/page/cpdf_psengine.h index 607d81065d..0d5eadd78e 100644 --- a/core/fpdfapi/page/cpdf_psengine.h +++ b/core/fpdfapi/page/cpdf_psengine.h @@ -16,7 +16,7 @@ class CPDF_PSEngine; class CPDF_PSOP; class CPDF_SimpleParser; -enum PDF_PSOP { +enum PDF_PSOP : uint8_t { PSOP_ADD, PSOP_SUB, PSOP_MUL, @@ -63,8 +63,6 @@ enum PDF_PSOP { PSOP_CONST }; -constexpr uint32_t PSENGINE_STACKSIZE = 100; - class CPDF_PSProc { public: CPDF_PSProc(); @@ -89,10 +87,12 @@ class CPDF_PSEngine { void Reset() { m_StackCount = 0; } void Push(float value); float Pop(); + int PopInt(); uint32_t GetStackSize() const { return m_StackCount; } private: - float m_Stack[PSENGINE_STACKSIZE]; + static constexpr uint32_t kPSEngineStackSize = 100; + float m_Stack[kPSEngineStackSize]; uint32_t m_StackCount; CPDF_PSProc m_MainProc; }; |