1e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Copyright 2014 PDFium Authors. All rights reserved. 2e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Use of this source code is governed by a BSD-style license that can be 3e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// found in the LICENSE file. 4ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 5e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 7ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "pageint.h" 8ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 9e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include <limits.h> 10e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 11ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include <memory> 12ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include <vector> 13ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 14ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "core/include/fpdfapi/fpdf_module.h" 15ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "core/include/fpdfapi/fpdf_page.h" 16ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "core/include/fxcrt/fx_safe_types.h" 17ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "third_party/base/numerics/safe_conversions_impl.h" 18e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 19e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovclass CPDF_PSEngine; 20ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmanntypedef enum { 21ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann PSOP_ADD, 22ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann PSOP_SUB, 23ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann PSOP_MUL, 24ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann PSOP_DIV, 25ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann PSOP_IDIV, 26ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann PSOP_MOD, 27ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann PSOP_NEG, 28ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann PSOP_ABS, 29ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann PSOP_CEILING, 30ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann PSOP_FLOOR, 31ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann PSOP_ROUND, 32ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann PSOP_TRUNCATE, 33ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann PSOP_SQRT, 34ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann PSOP_SIN, 35ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann PSOP_COS, 36ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann PSOP_ATAN, 37ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann PSOP_EXP, 38ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann PSOP_LN, 39ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann PSOP_LOG, 40ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann PSOP_CVI, 41ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann PSOP_CVR, 42ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann PSOP_EQ, 43ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann PSOP_NE, 44ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann PSOP_GT, 45ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann PSOP_GE, 46ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann PSOP_LT, 47ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann PSOP_LE, 48ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann PSOP_AND, 49ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann PSOP_OR, 50ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann PSOP_XOR, 51ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann PSOP_NOT, 52ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann PSOP_BITSHIFT, 53ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann PSOP_TRUE, 54ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann PSOP_FALSE, 55ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann PSOP_IF, 56ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann PSOP_IFELSE, 57ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann PSOP_POP, 58ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann PSOP_EXCH, 59ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann PSOP_DUP, 60ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann PSOP_COPY, 61ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann PSOP_INDEX, 62ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann PSOP_ROLL, 63ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann PSOP_PROC, 64ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann PSOP_CONST 65ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} PDF_PSOP; 66ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannclass CPDF_PSProc { 67ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann public: 68ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ~CPDF_PSProc(); 69ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL Parse(CPDF_SimpleParser& parser); 70ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL Execute(CPDF_PSEngine* pEngine); 71ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_PtrArray m_Operators; 72e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}; 73e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define PSENGINE_STACKSIZE 100 74ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannclass CPDF_PSEngine { 75ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann public: 76ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_PSEngine(); 77ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ~CPDF_PSEngine(); 78ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL Parse(const FX_CHAR* string, int size); 79ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL Execute() { return m_MainProc.Execute(this); } 80ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL DoOperator(PDF_PSOP op); 81ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann void Reset() { m_StackCount = 0; } 82ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann void Push(FX_FLOAT value); 83ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann void Push(int value) { Push((FX_FLOAT)value); } 84ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FLOAT Pop(); 85ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int GetStackSize() { return m_StackCount; } 86ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 87ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann private: 88ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FLOAT m_Stack[PSENGINE_STACKSIZE]; 89ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int m_StackCount; 90ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_PSProc m_MainProc; 91e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}; 92ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_PSProc::~CPDF_PSProc() { 93ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int size = m_Operators.GetSize(); 94ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int i = 0; i < size; i++) { 95ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_Operators[i] == (void*)PSOP_PROC) { 96ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann delete (CPDF_PSProc*)m_Operators[i + 1]; 97ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann i++; 98ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (m_Operators[i] == (void*)PSOP_CONST) { 99ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_Free((FX_FLOAT*)m_Operators[i + 1]); 100ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann i++; 101ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 102ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 103e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 104ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_PSProc::Execute(CPDF_PSEngine* pEngine) { 105ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int size = m_Operators.GetSize(); 106ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int i = 0; i < size; i++) { 107ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann PDF_PSOP op = (PDF_PSOP)(uintptr_t)m_Operators[i]; 108ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (op == PSOP_PROC) { 109ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann i++; 110ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (op == PSOP_CONST) { 111ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pEngine->Push(*(FX_FLOAT*)m_Operators[i + 1]); 112ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann i++; 113ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (op == PSOP_IF) { 114ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (i < 2 || m_Operators[i - 2] != (void*)PSOP_PROC) { 115ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 116ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 117ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ((int)pEngine->Pop()) { 118ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ((CPDF_PSProc*)m_Operators[i - 1])->Execute(pEngine); 119ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 120ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (op == PSOP_IFELSE) { 121ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (i < 4 || m_Operators[i - 2] != (void*)PSOP_PROC || 122ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Operators[i - 4] != (void*)PSOP_PROC) { 123ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 124ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 125ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ((int)pEngine->Pop()) { 126ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ((CPDF_PSProc*)m_Operators[i - 3])->Execute(pEngine); 127ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 128ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ((CPDF_PSProc*)m_Operators[i - 1])->Execute(pEngine); 129ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 130ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 131ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pEngine->DoOperator(op); 132e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 133ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 134ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 135e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 136ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_PSEngine::CPDF_PSEngine() { 137ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_StackCount = 0; 138e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 139ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_PSEngine::~CPDF_PSEngine() {} 140ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_PSEngine::Push(FX_FLOAT v) { 141ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_StackCount == 100) { 142ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 143ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 144ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Stack[m_StackCount++] = v; 145e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 146ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_FLOAT CPDF_PSEngine::Pop() { 147ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_StackCount == 0) { 148ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 149ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 150ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_Stack[--m_StackCount]; 151e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 152e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovconst struct _PDF_PSOpName { 153ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const FX_CHAR* name; 154ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann PDF_PSOP op; 155ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} _PDF_PSOpNames[] = {{"add", PSOP_ADD}, {"sub", PSOP_SUB}, 156ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann {"mul", PSOP_MUL}, {"div", PSOP_DIV}, 157ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann {"idiv", PSOP_IDIV}, {"mod", PSOP_MOD}, 158ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann {"neg", PSOP_NEG}, {"abs", PSOP_ABS}, 159ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann {"ceiling", PSOP_CEILING}, {"floor", PSOP_FLOOR}, 160ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann {"round", PSOP_ROUND}, {"truncate", PSOP_TRUNCATE}, 161ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann {"sqrt", PSOP_SQRT}, {"sin", PSOP_SIN}, 162ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann {"cos", PSOP_COS}, {"atan", PSOP_ATAN}, 163ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann {"exp", PSOP_EXP}, {"ln", PSOP_LN}, 164ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann {"log", PSOP_LOG}, {"cvi", PSOP_CVI}, 165ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann {"cvr", PSOP_CVR}, {"eq", PSOP_EQ}, 166ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann {"ne", PSOP_NE}, {"gt", PSOP_GT}, 167ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann {"ge", PSOP_GE}, {"lt", PSOP_LT}, 168ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann {"le", PSOP_LE}, {"and", PSOP_AND}, 169ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann {"or", PSOP_OR}, {"xor", PSOP_XOR}, 170ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann {"not", PSOP_NOT}, {"bitshift", PSOP_BITSHIFT}, 171ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann {"true", PSOP_TRUE}, {"false", PSOP_FALSE}, 172ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann {"if", PSOP_IF}, {"ifelse", PSOP_IFELSE}, 173ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann {"pop", PSOP_POP}, {"exch", PSOP_EXCH}, 174ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann {"dup", PSOP_DUP}, {"copy", PSOP_COPY}, 175ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann {"index", PSOP_INDEX}, {"roll", PSOP_ROLL}, 176ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann {NULL, PSOP_PROC}}; 177ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_PSEngine::Parse(const FX_CHAR* string, int size) { 178ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_SimpleParser parser((uint8_t*)string, size); 179ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteStringC word = parser.GetWord(); 180ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (word != "{") { 181ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 182ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 183ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_MainProc.Parse(parser); 184ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 185ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_PSProc::Parse(CPDF_SimpleParser& parser) { 186ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann while (1) { 187e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CFX_ByteStringC word = parser.GetWord(); 188ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (word.IsEmpty()) { 189ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 190e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 191ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (word == "}") { 192ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 193e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 194ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (word == "{") { 195ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_PSProc* pProc = new CPDF_PSProc; 196ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Operators.Add((void*)PSOP_PROC); 197ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Operators.Add(pProc); 198ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pProc->Parse(parser)) { 199ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 200ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 201ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 202ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int i = 0; 203ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann while (_PDF_PSOpNames[i].name) { 204ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (word == CFX_ByteStringC(_PDF_PSOpNames[i].name)) { 205ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Operators.Add((void*)_PDF_PSOpNames[i].op); 206ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 207ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 208ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann i++; 209ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 210ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!_PDF_PSOpNames[i].name) { 211ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FLOAT* pd = FX_Alloc(FX_FLOAT, 1); 212ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *pd = FX_atof(word); 213ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Operators.Add((void*)PSOP_CONST); 214ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Operators.Add(pd); 215ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 216ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 217ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 218e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 219e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define PI 3.1415926535897932384626433832795f 220ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_PSEngine::DoOperator(PDF_PSOP op) { 221ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int i1, i2; 222ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FLOAT d1, d2; 223ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann switch (op) { 224ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PSOP_ADD: 225ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann d1 = Pop(); 226ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann d2 = Pop(); 227ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann Push(d1 + d2); 228ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 229ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PSOP_SUB: 230ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann d2 = Pop(); 231ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann d1 = Pop(); 232ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann Push(d1 - d2); 233ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 234ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PSOP_MUL: 235ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann d1 = Pop(); 236ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann d2 = Pop(); 237ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann Push(d1 * d2); 238ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 239ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PSOP_DIV: 240ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann d2 = Pop(); 241ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann d1 = Pop(); 242ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann Push(d1 / d2); 243ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 244ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PSOP_IDIV: 245ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann i2 = (int)Pop(); 246ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann i1 = (int)Pop(); 247ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann Push(i1 / i2); 248ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 249ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PSOP_MOD: 250ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann i2 = (int)Pop(); 251ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann i1 = (int)Pop(); 252ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann Push(i1 % i2); 253ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 254ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PSOP_NEG: 255ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann d1 = Pop(); 256ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann Push(-d1); 257ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 258ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PSOP_ABS: 259ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann d1 = Pop(); 260ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann Push((FX_FLOAT)FXSYS_fabs(d1)); 261ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 262ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PSOP_CEILING: 263ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann d1 = Pop(); 264ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann Push((FX_FLOAT)FXSYS_ceil(d1)); 265ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 266ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PSOP_FLOOR: 267ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann d1 = Pop(); 268ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann Push((FX_FLOAT)FXSYS_floor(d1)); 269ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 270ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PSOP_ROUND: 271ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann d1 = Pop(); 272ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann Push(FXSYS_round(d1)); 273ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 274ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PSOP_TRUNCATE: 275ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann i1 = (int)Pop(); 276ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann Push(i1); 277ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 278ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PSOP_SQRT: 279ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann d1 = Pop(); 280ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann Push((FX_FLOAT)FXSYS_sqrt(d1)); 281ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 282ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PSOP_SIN: 283ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann d1 = Pop(); 284ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann Push((FX_FLOAT)FXSYS_sin(d1 * PI / 180.0f)); 285ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 286ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PSOP_COS: 287ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann d1 = Pop(); 288ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann Push((FX_FLOAT)FXSYS_cos(d1 * PI / 180.0f)); 289ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 290ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PSOP_ATAN: 291ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann d2 = Pop(); 292ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann d1 = Pop(); 293ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann d1 = (FX_FLOAT)(FXSYS_atan2(d1, d2) * 180.0 / PI); 294ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (d1 < 0) { 295ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann d1 += 360; 296ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 297ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann Push(d1); 298ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 299ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PSOP_EXP: 300ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann d2 = Pop(); 301ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann d1 = Pop(); 302ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann Push((FX_FLOAT)FXSYS_pow(d1, d2)); 303ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 304ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PSOP_LN: 305ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann d1 = Pop(); 306ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann Push((FX_FLOAT)FXSYS_log(d1)); 307ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 308ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PSOP_LOG: 309ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann d1 = Pop(); 310ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann Push((FX_FLOAT)FXSYS_log10(d1)); 311ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 312ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PSOP_CVI: 313ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann i1 = (int)Pop(); 314ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann Push(i1); 315ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 316ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PSOP_CVR: 317ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 318ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PSOP_EQ: 319ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann d2 = Pop(); 320ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann d1 = Pop(); 321ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann Push((int)(d1 == d2)); 322ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 323ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PSOP_NE: 324ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann d2 = Pop(); 325ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann d1 = Pop(); 326ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann Push((int)(d1 != d2)); 327ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 328ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PSOP_GT: 329ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann d2 = Pop(); 330ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann d1 = Pop(); 331ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann Push((int)(d1 > d2)); 332ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 333ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PSOP_GE: 334ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann d2 = Pop(); 335ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann d1 = Pop(); 336ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann Push((int)(d1 >= d2)); 337ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 338ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PSOP_LT: 339ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann d2 = Pop(); 340ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann d1 = Pop(); 341ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann Push((int)(d1 < d2)); 342ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 343ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PSOP_LE: 344ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann d2 = Pop(); 345ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann d1 = Pop(); 346ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann Push((int)(d1 <= d2)); 347ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 348ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PSOP_AND: 349ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann i1 = (int)Pop(); 350ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann i2 = (int)Pop(); 351ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann Push(i1 & i2); 352ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 353ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PSOP_OR: 354ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann i1 = (int)Pop(); 355ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann i2 = (int)Pop(); 356ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann Push(i1 | i2); 357ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 358ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PSOP_XOR: 359ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann i1 = (int)Pop(); 360ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann i2 = (int)Pop(); 361ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann Push(i1 ^ i2); 362ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 363ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PSOP_NOT: 364ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann i1 = (int)Pop(); 365ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann Push((int)!i1); 366ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 367ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PSOP_BITSHIFT: { 368ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int shift = (int)Pop(); 369ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int i = (int)Pop(); 370ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (shift > 0) { 371ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann Push(i << shift); 372ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 373ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann Push(i >> -shift); 374ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 375ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 376ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 377ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PSOP_TRUE: 378ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann Push(1); 379ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 380ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PSOP_FALSE: 381ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann Push(0); 382ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 383ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PSOP_POP: 384ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann Pop(); 385ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 386ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PSOP_EXCH: 387ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann d2 = Pop(); 388ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann d1 = Pop(); 389ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann Push(d2); 390ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann Push(d1); 391ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 392ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PSOP_DUP: 393ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann d1 = Pop(); 394ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann Push(d1); 395ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann Push(d1); 396ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 397ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PSOP_COPY: { 398ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int n = (int)Pop(); 399ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (n < 0 || n > PSENGINE_STACKSIZE || 400ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_StackCount + n > PSENGINE_STACKSIZE || n > m_StackCount) { 401ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 402ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 403ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int i = 0; i < n; i++) { 404ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Stack[m_StackCount + i] = m_Stack[m_StackCount + i - n]; 405ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 406ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_StackCount += n; 407ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 408ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 409ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PSOP_INDEX: { 410ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int n = (int)Pop(); 411ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (n < 0 || n >= m_StackCount) { 412ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 413ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 414ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann Push(m_Stack[m_StackCount - n - 1]); 415ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 416ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 417ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PSOP_ROLL: { 418ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int j = (int)Pop(); 419ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int n = (int)Pop(); 420ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_StackCount == 0) { 421ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 422ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 423ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (n < 0 || n > m_StackCount) { 424ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 425ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 426ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (j < 0) 427ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int i = 0; i < -j; i++) { 428ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FLOAT first = m_Stack[m_StackCount - n]; 429ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int ii = 0; ii < n - 1; ii++) { 430ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Stack[m_StackCount - n + ii] = m_Stack[m_StackCount - n + ii + 1]; 431ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 432ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Stack[m_StackCount - 1] = first; 433ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 434ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann else 435ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int i = 0; i < j; i++) { 436ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FLOAT last = m_Stack[m_StackCount - 1]; 437ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int ii; 438ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (ii = 0; ii < n - 1; ii++) { 439ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Stack[m_StackCount - ii - 1] = m_Stack[m_StackCount - ii - 2]; 440ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 441ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Stack[m_StackCount - ii - 1] = last; 442ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 443ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 444e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 445ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann default: 446ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 447ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 448ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 449e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 450ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic FX_FLOAT PDF_Interpolate(FX_FLOAT x, 451ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FLOAT xmin, 452ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FLOAT xmax, 453ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FLOAT ymin, 454ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FLOAT ymax) { 455ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return ((x - xmin) * (ymax - ymin) / (xmax - xmin)) + ymin; 456e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 457ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic FX_DWORD _GetBits32(const uint8_t* pData, int bitpos, int nbits) { 458ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int result = 0; 459ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int i = 0; i < nbits; i++) 460ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pData[(bitpos + i) / 8] & (1 << (7 - (bitpos + i) % 8))) { 461ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann result |= 1 << (nbits - i - 1); 462ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 463ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return result; 464e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 465e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovtypedef struct { 466ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FLOAT encode_max, encode_min; 467ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int sizes; 468e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} SampleEncodeInfo; 469ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmanntypedef struct { FX_FLOAT decode_max, decode_min; } SampleDecodeInfo; 470ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 471ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannclass CPDF_SampledFunc : public CPDF_Function { 472ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann public: 473ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_SampledFunc(); 474ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ~CPDF_SampledFunc() override; 475ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 476ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann // CPDF_Function 477ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL v_Init(CPDF_Object* pObj) override; 478ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const override; 479ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 480ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann SampleEncodeInfo* m_pEncodeInfo; 481ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann SampleDecodeInfo* m_pDecodeInfo; 482ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD m_nBitsPerSample; 483ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD m_SampleMax; 484ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_StreamAcc* m_pSampleStream; 485e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}; 486ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 487ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_SampledFunc::CPDF_SampledFunc() { 488ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pSampleStream = NULL; 489ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pEncodeInfo = NULL; 490ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pDecodeInfo = NULL; 491e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 492ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_SampledFunc::~CPDF_SampledFunc() { 493ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann delete m_pSampleStream; 494ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_Free(m_pEncodeInfo); 495ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_Free(m_pDecodeInfo); 496e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 497ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_SampledFunc::v_Init(CPDF_Object* pObj) { 498ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Stream* pStream = pObj->AsStream(); 499ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pStream) 500ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return false; 501ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 502ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pDict = pStream->GetDict(); 503ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Array* pSize = pDict->GetArray("Size"); 504ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Array* pEncode = pDict->GetArray("Encode"); 505ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Array* pDecode = pDict->GetArray("Decode"); 506ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_nBitsPerSample = pDict->GetInteger("BitsPerSample"); 507ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_nBitsPerSample > 32) { 508ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 509ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 510ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_SampleMax = 0xffffffff >> (32 - m_nBitsPerSample); 511ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pSampleStream = new CPDF_StreamAcc; 512ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pSampleStream->LoadAllData(pStream, FALSE); 513ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pEncodeInfo = FX_Alloc(SampleEncodeInfo, m_nInputs); 514ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_SAFE_DWORD nTotalSampleBits = 1; 515ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int i = 0; i < m_nInputs; i++) { 516ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pEncodeInfo[i].sizes = pSize ? pSize->GetInteger(i) : 0; 517ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pSize && i == 0) { 518ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pEncodeInfo[i].sizes = pDict->GetInteger("Size"); 519ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 520ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann nTotalSampleBits *= m_pEncodeInfo[i].sizes; 521ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pEncode) { 522ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pEncodeInfo[i].encode_min = pEncode->GetFloat(i * 2); 523ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pEncodeInfo[i].encode_max = pEncode->GetFloat(i * 2 + 1); 524ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 525ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pEncodeInfo[i].encode_min = 0; 526ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pEncodeInfo[i].sizes == 1) { 527ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pEncodeInfo[i].encode_max = 1; 528ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 529ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pEncodeInfo[i].encode_max = (FX_FLOAT)m_pEncodeInfo[i].sizes - 1; 530ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 531ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 532ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 533ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann nTotalSampleBits *= m_nBitsPerSample; 534ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann nTotalSampleBits *= m_nOutputs; 535ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_SAFE_DWORD nTotalSampleBytes = nTotalSampleBits; 536ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann nTotalSampleBytes += 7; 537ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann nTotalSampleBytes /= 8; 538ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!nTotalSampleBytes.IsValid() || nTotalSampleBytes.ValueOrDie() == 0 || 539ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann nTotalSampleBytes.ValueOrDie() > m_pSampleStream->GetSize()) { 540ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 541ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 542ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pDecodeInfo = FX_Alloc(SampleDecodeInfo, m_nOutputs); 543ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int i = 0; i < m_nOutputs; i++) { 544ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pDecode) { 545ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pDecodeInfo[i].decode_min = pDecode->GetFloat(2 * i); 546ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pDecodeInfo[i].decode_max = pDecode->GetFloat(2 * i + 1); 547ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 548ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pDecodeInfo[i].decode_min = m_pRanges[i * 2]; 549ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pDecodeInfo[i].decode_max = m_pRanges[i * 2 + 1]; 550e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 551ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 552ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 553e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 554ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_SampledFunc::v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const { 555ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int pos = 0; 556ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_FixedBufGrow<FX_FLOAT, 16> encoded_input_buf(m_nInputs); 557ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FLOAT* encoded_input = encoded_input_buf; 558ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_FixedBufGrow<int, 32> int_buf(m_nInputs * 2); 559ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int* index = int_buf; 560ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int* blocksize = index + m_nInputs; 561ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int i = 0; i < m_nInputs; i++) { 562ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (i == 0) { 563ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann blocksize[i] = 1; 564ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 565ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann blocksize[i] = blocksize[i - 1] * m_pEncodeInfo[i - 1].sizes; 566ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 567ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann encoded_input[i] = PDF_Interpolate( 568ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann inputs[i], m_pDomains[i * 2], m_pDomains[i * 2 + 1], 569ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pEncodeInfo[i].encode_min, m_pEncodeInfo[i].encode_max); 570ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann index[i] = (int)encoded_input[i]; 571ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (index[i] < 0) { 572ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann index[i] = 0; 573ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (index[i] > m_pEncodeInfo[i].sizes - 1) { 574ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann index[i] = m_pEncodeInfo[i].sizes - 1; 575ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 576ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pos += index[i] * blocksize[i]; 577ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 578ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_SAFE_INT32 bits_to_output = m_nOutputs; 579ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bits_to_output *= m_nBitsPerSample; 580ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!bits_to_output.IsValid()) { 581ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 582ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 583ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_SAFE_INT32 bitpos = pos; 584ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bitpos *= bits_to_output.ValueOrDie(); 585ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!bitpos.IsValid()) { 586ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 587ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 588ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_SAFE_INT32 range_check = bitpos; 589ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann range_check += bits_to_output.ValueOrDie(); 590ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!range_check.IsValid()) { 591ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 592ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 593ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const uint8_t* pSampleData = m_pSampleStream->GetData(); 594ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pSampleData) { 595ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 596ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 597ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int j = 0; j < m_nOutputs; j++) { 598ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD sample = 599ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann _GetBits32(pSampleData, bitpos.ValueOrDie() + j * m_nBitsPerSample, 600ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_nBitsPerSample); 601ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FLOAT encoded = (FX_FLOAT)sample; 602ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int i = 0; i < m_nInputs; i++) { 603ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (index[i] == m_pEncodeInfo[i].sizes - 1) { 604ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (index[i] == 0) { 605ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann encoded = encoded_input[i] * (FX_FLOAT)sample; 606e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 607ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 608ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_SAFE_INT32 bitpos2 = blocksize[i]; 609ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bitpos2 += pos; 610ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bitpos2 *= m_nOutputs; 611ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bitpos2 += j; 612ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bitpos2 *= m_nBitsPerSample; 613ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!bitpos2.IsValid()) { 614ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 615e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 616ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD sample1 = 617ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann _GetBits32(pSampleData, bitpos2.ValueOrDie(), m_nBitsPerSample); 618ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann encoded += (encoded_input[i] - index[i]) * 619ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ((FX_FLOAT)sample1 - (FX_FLOAT)sample); 620ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 621ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 622ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann results[j] = PDF_Interpolate(encoded, 0, (FX_FLOAT)m_SampleMax, 623ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pDecodeInfo[j].decode_min, 624ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pDecodeInfo[j].decode_max); 625ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 626ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 627e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 628ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 629ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannclass CPDF_PSFunc : public CPDF_Function { 630ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann public: 631ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann // CPDF_Function 632ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL v_Init(CPDF_Object* pObj) override; 633ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const override; 634ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 635ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_PSEngine m_PS; 636e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}; 637ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 638ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_PSFunc::v_Init(CPDF_Object* pObj) { 639ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Stream* pStream = pObj->AsStream(); 640ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_StreamAcc acc; 641ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann acc.LoadAllData(pStream, FALSE); 642ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_PS.Parse((const FX_CHAR*)acc.GetData(), acc.GetSize()); 643e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 644ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_PSFunc::v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const { 645ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_PSEngine& PS = (CPDF_PSEngine&)m_PS; 646ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann PS.Reset(); 647ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int i; 648ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (i = 0; i < m_nInputs; i++) { 649ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann PS.Push(inputs[i]); 650ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 651ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann PS.Execute(); 652ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (PS.GetStackSize() < m_nOutputs) { 653ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 654ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 655ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (i = 0; i < m_nOutputs; i++) { 656ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann results[m_nOutputs - i - 1] = PS.Pop(); 657ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 658ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 659e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 660ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 661ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannclass CPDF_ExpIntFunc : public CPDF_Function { 662ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann public: 663ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_ExpIntFunc(); 664ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ~CPDF_ExpIntFunc() override; 665ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 666ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann // CPDF_Function 667ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL v_Init(CPDF_Object* pObj) override; 668ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const override; 669ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 670ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FLOAT m_Exponent; 671ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FLOAT* m_pBeginValues; 672ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FLOAT* m_pEndValues; 673ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int m_nOrigOutputs; 674e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}; 675ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 676ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_ExpIntFunc::CPDF_ExpIntFunc() { 677ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pBeginValues = NULL; 678ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pEndValues = NULL; 679e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 680ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_ExpIntFunc::~CPDF_ExpIntFunc() { 681ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_Free(m_pBeginValues); 682ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_Free(m_pEndValues); 683e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 684ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_ExpIntFunc::v_Init(CPDF_Object* pObj) { 685ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pDict = pObj->GetDict(); 686ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pDict) { 687ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 688ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 689ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Array* pArray0 = pDict->GetArray("C0"); 690ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_nOutputs == 0) { 691ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_nOutputs = 1; 692ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pArray0) { 693ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_nOutputs = pArray0->GetCount(); 694ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 695ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 696ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Array* pArray1 = pDict->GetArray("C1"); 697ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pBeginValues = FX_Alloc2D(FX_FLOAT, m_nOutputs, 2); 698ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pEndValues = FX_Alloc2D(FX_FLOAT, m_nOutputs, 2); 699ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int i = 0; i < m_nOutputs; i++) { 700ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pBeginValues[i] = pArray0 ? pArray0->GetFloat(i) : 0.0f; 701ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pEndValues[i] = pArray1 ? pArray1->GetFloat(i) : 1.0f; 702ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 703ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Exponent = pDict->GetFloat("N"); 704ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_nOrigOutputs = m_nOutputs; 705ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_nOutputs && m_nInputs > INT_MAX / m_nOutputs) { 706ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 707ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 708ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_nOutputs *= m_nInputs; 709ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 710e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 711ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_ExpIntFunc::v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const { 712ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int i = 0; i < m_nInputs; i++) 713ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int j = 0; j < m_nOrigOutputs; j++) { 714ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann results[i * m_nOrigOutputs + j] = 715ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pBeginValues[j] + 716ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann (FX_FLOAT)FXSYS_pow(inputs[i], m_Exponent) * 717ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann (m_pEndValues[j] - m_pBeginValues[j]); 718ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 719ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 720e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 721ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 722ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannclass CPDF_StitchFunc : public CPDF_Function { 723ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann public: 724ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_StitchFunc(); 725ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ~CPDF_StitchFunc() override; 726ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 727ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann // CPDF_Function 728ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL v_Init(CPDF_Object* pObj) override; 729ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const override; 730ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 731ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann std::vector<CPDF_Function*> m_pSubFunctions; 732ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FLOAT* m_pBounds; 733ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FLOAT* m_pEncode; 734ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 735ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann static const int kRequiredNumInputs = 1; 736e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}; 737ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 738ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_StitchFunc::CPDF_StitchFunc() { 739ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pBounds = NULL; 740ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pEncode = NULL; 741e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 742ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_StitchFunc::~CPDF_StitchFunc() { 743ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (auto& sub : m_pSubFunctions) { 744ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann delete sub; 745ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 746ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_Free(m_pBounds); 747ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_Free(m_pEncode); 748e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 749ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_StitchFunc::v_Init(CPDF_Object* pObj) { 750ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pDict = pObj->GetDict(); 751ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pDict) { 752ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 753ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 754ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_nInputs != kRequiredNumInputs) { 755ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 756ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 757ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Array* pArray = pDict->GetArray("Functions"); 758ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pArray) { 759ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 760ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 761ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD nSubs = pArray->GetCount(); 762ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (nSubs == 0) { 763ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 764ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 765ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_nOutputs = 0; 766ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (FX_DWORD i = 0; i < nSubs; i++) { 767ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Object* pSub = pArray->GetElementValue(i); 768ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pSub == pObj) { 769ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 770ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 771ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann std::unique_ptr<CPDF_Function> pFunc(CPDF_Function::Load(pSub)); 772ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pFunc) { 773ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 774ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 775ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann // Check that the input dimensionality is 1, and that all output 776ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann // dimensionalities are the same. 777ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pFunc->CountInputs() != kRequiredNumInputs) { 778ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 779ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 780ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pFunc->CountOutputs() != m_nOutputs) { 781ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_nOutputs) 782e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 783ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 784ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_nOutputs = pFunc->CountOutputs(); 785e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 786ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 787ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pSubFunctions.push_back(pFunc.release()); 788ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 789ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pBounds = FX_Alloc(FX_FLOAT, nSubs + 1); 790ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pBounds[0] = m_pDomains[0]; 791ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pArray = pDict->GetArray("Bounds"); 792ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pArray) { 793ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 794ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 795ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (FX_DWORD i = 0; i < nSubs - 1; i++) { 796ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pBounds[i + 1] = pArray->GetFloat(i); 797ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 798ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pBounds[nSubs] = m_pDomains[1]; 799ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pEncode = FX_Alloc2D(FX_FLOAT, nSubs, 2); 800ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pArray = pDict->GetArray("Encode"); 801ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pArray) { 802ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 803ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 804ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (FX_DWORD i = 0; i < nSubs * 2; i++) { 805ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pEncode[i] = pArray->GetFloat(i); 806ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 807ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 808e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 809ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_StitchFunc::v_Call(FX_FLOAT* inputs, FX_FLOAT* outputs) const { 810ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FLOAT input = inputs[0]; 811ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann size_t i; 812ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (i = 0; i < m_pSubFunctions.size() - 1; i++) 813ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (input < m_pBounds[i + 1]) { 814ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 815ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 816ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!m_pSubFunctions[i]) { 817ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 818ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 819ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann input = PDF_Interpolate(input, m_pBounds[i], m_pBounds[i + 1], 820ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pEncode[i * 2], m_pEncode[i * 2 + 1]); 821ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int nresults; 822ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pSubFunctions[i]->Call(&input, kRequiredNumInputs, outputs, nresults); 823ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 824e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 825ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Function* CPDF_Function::Load(CPDF_Object* pFuncObj) { 826ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pFuncObj) { 827ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return NULL; 828ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 829ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Function* pFunc = NULL; 830ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int type; 831ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (CPDF_Stream* pStream = pFuncObj->AsStream()) { 832ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann type = pStream->GetDict()->GetInteger("FunctionType"); 833ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (CPDF_Dictionary* pDict = pFuncObj->AsDictionary()) { 834ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann type = pDict->GetInteger("FunctionType"); 835ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 836ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return NULL; 837ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 838ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (type == 0) { 839ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pFunc = new CPDF_SampledFunc; 840ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (type == 2) { 841ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pFunc = new CPDF_ExpIntFunc; 842ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (type == 3) { 843ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pFunc = new CPDF_StitchFunc; 844ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (type == 4) { 845ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pFunc = new CPDF_PSFunc; 846ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 847ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return NULL; 848ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 849ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pFunc->Init(pFuncObj)) { 850ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann delete pFunc; 851ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return NULL; 852ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 853ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pFunc; 854e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 855ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Function::CPDF_Function() { 856ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pDomains = NULL; 857ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pRanges = NULL; 858e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 859ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Function::~CPDF_Function() { 860ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_Free(m_pDomains); 861ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_Free(m_pRanges); 862e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 863ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_Function::Init(CPDF_Object* pObj) { 864ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Stream* pStream = pObj->AsStream(); 865ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pDict = pStream ? pStream->GetDict() : pObj->AsDictionary(); 866ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 867ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Array* pDomains = pDict->GetArray("Domain"); 868ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pDomains) 869ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 870ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 871ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_nInputs = pDomains->GetCount() / 2; 872ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_nInputs == 0) 873ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 874ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 875ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pDomains = FX_Alloc2D(FX_FLOAT, m_nInputs, 2); 876ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int i = 0; i < m_nInputs * 2; i++) { 877ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pDomains[i] = pDomains->GetFloat(i); 878ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 879ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Array* pRanges = pDict->GetArray("Range"); 880ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_nOutputs = 0; 881ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pRanges) { 882ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_nOutputs = pRanges->GetCount() / 2; 883ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pRanges = FX_Alloc2D(FX_FLOAT, m_nOutputs, 2); 884ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int i = 0; i < m_nOutputs * 2; i++) { 885ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pRanges[i] = pRanges->GetFloat(i); 886ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 887ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 888ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD old_outputs = m_nOutputs; 889ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!v_Init(pObj)) { 890ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 891ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 892ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pRanges && m_nOutputs > (int)old_outputs) { 893ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pRanges = FX_Realloc(FX_FLOAT, m_pRanges, m_nOutputs * 2); 894e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (m_pRanges) { 895ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_memset(m_pRanges + (old_outputs * 2), 0, 896ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann sizeof(FX_FLOAT) * (m_nOutputs - old_outputs) * 2); 897e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 898ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 899ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 900ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 901ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_Function::Call(FX_FLOAT* inputs, 902ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int ninputs, 903ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FLOAT* results, 904ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int& nresults) const { 905ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_nInputs != ninputs) { 906ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 907ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 908ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann nresults = m_nOutputs; 909ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int i = 0; i < m_nInputs; i++) { 910ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (inputs[i] < m_pDomains[i * 2]) { 911ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann inputs[i] = m_pDomains[i * 2]; 912ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (inputs[i] > m_pDomains[i * 2 + 1]) { 913ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann inputs[i] = m_pDomains[i * 2] + 1; 914ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 915ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 916ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann v_Call(inputs, results); 917ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pRanges) { 918ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int i = 0; i < m_nOutputs; i++) { 919ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (results[i] < m_pRanges[i * 2]) { 920ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann results[i] = m_pRanges[i * 2]; 921ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (results[i] > m_pRanges[i * 2 + 1]) { 922ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann results[i] = m_pRanges[i * 2 + 1]; 923ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 924ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 925ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 926ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 927e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 928