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