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 "core/src/fpdfapi/fpdf_page/pageint.h"
8ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
9e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include <limits.h>
10ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
11ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "core/include/fpdfapi/fpdf_module.h"
12ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "core/include/fpdfapi/fpdf_page.h"
13ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "core/include/fxcodec/fx_codec.h"
14ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "core/include/fxcrt/fx_ext.h"
15ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "core/include/fxcrt/fx_safe_types.h"
16ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
17ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannnamespace {
18ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
19ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannconst char kPathOperatorSubpath = 'm';
20ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannconst char kPathOperatorLine = 'l';
21ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannconst char kPathOperatorCubicBezier1 = 'c';
22ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannconst char kPathOperatorCubicBezier2 = 'v';
23ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannconst char kPathOperatorCubicBezier3 = 'y';
24ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannconst char kPathOperatorClosePath = 'h';
25ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannconst char kPathOperatorRectangle[] = "re";
26ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
27ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}  // namespace
28ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
29e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovclass CPDF_StreamParserAutoClearer {
30ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann public:
31ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_StreamParserAutoClearer(CPDF_StreamParser** scoped_variable,
32ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                               CPDF_StreamParser* new_parser)
33ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      : scoped_variable_(scoped_variable) {
34ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    *scoped_variable_ = new_parser;
35ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
36ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  ~CPDF_StreamParserAutoClearer() { *scoped_variable_ = NULL; }
37ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
38ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann private:
39ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_StreamParser** scoped_variable_;
40e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov};
41ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_DWORD CPDF_StreamContentParser::Parse(const uint8_t* pData,
42ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                         FX_DWORD dwSize,
43ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                         FX_DWORD max_cost) {
44ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_Level > _FPDF_MAX_FORM_LEVEL_) {
45ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return dwSize;
46ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
47ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_DWORD InitObjCount = m_pObjectList->CountObjects();
48ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_StreamParser syntax(pData, dwSize);
49ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_StreamParserAutoClearer auto_clearer(&m_pSyntax, &syntax);
50ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_CompatCount = 0;
51ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  while (1) {
52ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FX_DWORD cost = m_pObjectList->CountObjects() - InitObjCount;
53ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (max_cost && cost >= max_cost) {
54ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
55ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
56ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    switch (syntax.ParseNextElement()) {
57ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      case CPDF_StreamParser::EndOfData:
58ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        return m_pSyntax->GetPos();
59ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      case CPDF_StreamParser::Keyword:
60ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        OnOperator((char*)syntax.GetWordBuf());
61ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        ClearAllParams();
62ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        break;
63ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      case CPDF_StreamParser::Number:
64ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        AddNumberParam((char*)syntax.GetWordBuf(), syntax.GetWordSize());
65ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        break;
66ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      case CPDF_StreamParser::Name:
67ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        AddNameParam((const FX_CHAR*)syntax.GetWordBuf() + 1,
68ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                     syntax.GetWordSize() - 1);
69ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        break;
70ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      default:
71ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        AddObjectParam(syntax.GetObject());
72ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
73ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
74ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_pSyntax->GetPos();
75e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
76ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
77ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_BeginImage() {
78ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_FILESIZE savePos = m_pSyntax->GetPos();
79ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Dictionary* pDict = new CPDF_Dictionary;
80ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  while (1) {
81ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CPDF_StreamParser::SyntaxType type = m_pSyntax->ParseNextElement();
82ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (type == CPDF_StreamParser::Keyword) {
83ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CFX_ByteString bsKeyword(m_pSyntax->GetWordBuf(),
84ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                               m_pSyntax->GetWordSize());
85ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (bsKeyword != "ID") {
86ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_pSyntax->SetPos(savePos);
87ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        pDict->Release();
88e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return;
89ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
90ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
91ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (type != CPDF_StreamParser::Name) {
92ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
93ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
94ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CFX_ByteString key((const FX_CHAR*)m_pSyntax->GetWordBuf() + 1,
95ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                       m_pSyntax->GetWordSize() - 1);
96ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    std::unique_ptr<CPDF_Object, ReleaseDeleter<CPDF_Object>> pObj(
97ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_pSyntax->ReadNextObject());
98ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!key.IsEmpty()) {
99ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      FX_DWORD dwObjNum = pObj ? pObj->GetObjNum() : 0;
100ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (dwObjNum)
101ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        pDict->SetAtReference(key, m_pDocument, dwObjNum);
102ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      else
103ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        pDict->SetAt(key, pObj.release());
104ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
105ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
106ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  PDF_ReplaceAbbr(pDict);
107ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Object* pCSObj = NULL;
108ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pDict->KeyExist("ColorSpace")) {
109ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pCSObj = pDict->GetElementValue("ColorSpace");
110ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (pCSObj->IsName()) {
111ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CFX_ByteString name = pCSObj->GetString();
112ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (name != "DeviceRGB" && name != "DeviceGray" && name != "DeviceCMYK") {
113ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        pCSObj = FindResourceObj("ColorSpace", name);
114ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (pCSObj && !pCSObj->GetObjNum()) {
115ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          pCSObj = pCSObj->Clone();
116ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          pDict->SetAt("ColorSpace", pCSObj);
117ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
118ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
119ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
120ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
121ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Stream* pStream = m_pSyntax->ReadInlineStream(
122ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pDocument, pDict, pCSObj, m_Options.m_bDecodeInlineImage);
123ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  while (1) {
124ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CPDF_StreamParser::SyntaxType type = m_pSyntax->ParseNextElement();
125ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (type == CPDF_StreamParser::EndOfData) {
126ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
127ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
128ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (type != CPDF_StreamParser::Keyword) {
129ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      continue;
130ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
131ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (m_pSyntax->GetWordSize() == 2 && m_pSyntax->GetWordBuf()[0] == 'E' &&
132ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_pSyntax->GetWordBuf()[1] == 'I') {
133ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
134ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
135ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
136ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_Options.m_bTextOnly) {
137ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (pStream) {
138ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pStream->Release();
139ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else {
140ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pDict->Release();
141ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
142ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
143ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
144ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pDict->SetAtName("Subtype", "Image");
145ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_ImageObject* pImgObj = AddImage(pStream, NULL, TRUE);
146ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pImgObj) {
147ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (pStream) {
148ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pStream->Release();
149ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else {
150ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pDict->Release();
151e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
152ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
153e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
154ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::ParsePathObject() {
155ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_FLOAT params[6] = {};
156ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int nParams = 0;
157ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int last_pos = m_pSyntax->GetPos();
158ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  while (1) {
159ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CPDF_StreamParser::SyntaxType type = m_pSyntax->ParseNextElement();
160ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FX_BOOL bProcessed = TRUE;
161ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    switch (type) {
162ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      case CPDF_StreamParser::EndOfData:
163ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        return;
164ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      case CPDF_StreamParser::Keyword: {
165ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        int len = m_pSyntax->GetWordSize();
166ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (len == 1) {
167ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          switch (m_pSyntax->GetWordBuf()[0]) {
168ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            case kPathOperatorSubpath:
169ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              AddPathPoint(params[0], params[1], FXPT_MOVETO);
170ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              nParams = 0;
171ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              break;
172ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            case kPathOperatorLine:
173ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              AddPathPoint(params[0], params[1], FXPT_LINETO);
174ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              nParams = 0;
175ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              break;
176ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            case kPathOperatorCubicBezier1:
177ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              AddPathPoint(params[0], params[1], FXPT_BEZIERTO);
178ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              AddPathPoint(params[2], params[3], FXPT_BEZIERTO);
179ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              AddPathPoint(params[4], params[5], FXPT_BEZIERTO);
180ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              nParams = 0;
181ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              break;
182ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            case kPathOperatorCubicBezier2:
183ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              AddPathPoint(m_PathCurrentX, m_PathCurrentY, FXPT_BEZIERTO);
184ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              AddPathPoint(params[0], params[1], FXPT_BEZIERTO);
185ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              AddPathPoint(params[2], params[3], FXPT_BEZIERTO);
186ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              nParams = 0;
187ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              break;
188ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            case kPathOperatorCubicBezier3:
189ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              AddPathPoint(params[0], params[1], FXPT_BEZIERTO);
190ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              AddPathPoint(params[2], params[3], FXPT_BEZIERTO);
191ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              AddPathPoint(params[2], params[3], FXPT_BEZIERTO);
192ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              nParams = 0;
193ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              break;
194ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            case kPathOperatorClosePath:
195ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              Handle_ClosePath();
196ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              nParams = 0;
197ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              break;
198e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            default:
199ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              bProcessed = FALSE;
200ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              break;
201ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          }
202ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        } else if (len == 2) {
203ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          if (m_pSyntax->GetWordBuf()[0] == kPathOperatorRectangle[0] &&
204ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              m_pSyntax->GetWordBuf()[1] == kPathOperatorRectangle[1]) {
205ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            AddPathRect(params[0], params[1], params[2], params[3]);
206ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            nParams = 0;
207ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          } else {
208ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            bProcessed = FALSE;
209ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          }
210ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        } else {
211ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          bProcessed = FALSE;
212ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
213ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (bProcessed) {
214ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          last_pos = m_pSyntax->GetPos();
215ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
216ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        break;
217ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
218ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      case CPDF_StreamParser::Number: {
219ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (nParams == 6) {
220ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          break;
221ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
222ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        FX_BOOL bInteger;
223ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        int value;
224ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        FX_atonum(
225ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            CFX_ByteStringC(m_pSyntax->GetWordBuf(), m_pSyntax->GetWordSize()),
226ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            bInteger, &value);
227ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        params[nParams++] = bInteger ? (FX_FLOAT)value : *(FX_FLOAT*)&value;
228ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        break;
229ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
230ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      default:
231ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        bProcessed = FALSE;
232ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
233ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!bProcessed) {
234ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pSyntax->SetPos(last_pos);
235ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return;
236ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
237ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
238e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
239ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_StreamParser::CPDF_StreamParser(const uint8_t* pData, FX_DWORD dwSize) {
240ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pBuf = pData;
241ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_Size = dwSize;
242ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_Pos = 0;
243ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pLastObj = NULL;
244e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
245ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_StreamParser::~CPDF_StreamParser() {
246ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pLastObj) {
247ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pLastObj->Release();
248ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
249e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
250ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_DWORD _DecodeAllScanlines(ICodec_ScanlineDecoder* pDecoder,
251ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                             uint8_t*& dest_buf,
252ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                             FX_DWORD& dest_size) {
253ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pDecoder) {
254ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return (FX_DWORD)-1;
255ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
256ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int ncomps = pDecoder->CountComps();
257ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int bpc = pDecoder->GetBPC();
258ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int width = pDecoder->GetWidth();
259ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int height = pDecoder->GetHeight();
260ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int pitch = (width * ncomps * bpc + 7) / 8;
261ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (height == 0 || pitch > (1 << 30) / height) {
262e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    delete pDecoder;
263ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return -1;
264ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
265ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  dest_buf = FX_Alloc2D(uint8_t, pitch, height);
266ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  dest_size = pitch * height;  // Safe since checked alloc returned.
267ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (int row = 0; row < height; row++) {
268ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    const uint8_t* pLine = pDecoder->GetScanline(row);
269ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!pLine)
270ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
271ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
272ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FXSYS_memcpy(dest_buf + row * pitch, pLine, pitch);
273ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
274ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_DWORD srcoff = pDecoder->GetSrcOffset();
275ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  delete pDecoder;
276ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return srcoff;
277e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
278ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannICodec_ScanlineDecoder* FPDFAPI_CreateFaxDecoder(
279ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    const uint8_t* src_buf,
280ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FX_DWORD src_size,
281ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int width,
282ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int height,
283ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    const CPDF_Dictionary* pParams);
284ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
285ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_DWORD PDF_DecodeInlineStream(const uint8_t* src_buf,
286ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                FX_DWORD limit,
287ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                int width,
288ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                int height,
289ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                CFX_ByteString& decoder,
290ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                CPDF_Dictionary* pParam,
291ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                uint8_t*& dest_buf,
292ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                FX_DWORD& dest_size) {
293ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (decoder == "CCITTFaxDecode" || decoder == "CCF") {
294ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    ICodec_ScanlineDecoder* pDecoder =
295ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        FPDFAPI_CreateFaxDecoder(src_buf, limit, width, height, pParam);
296ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return _DecodeAllScanlines(pDecoder, dest_buf, dest_size);
297ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
298ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (decoder == "ASCII85Decode" || decoder == "A85") {
299ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return A85Decode(src_buf, limit, dest_buf, dest_size);
300ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
301ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (decoder == "ASCIIHexDecode" || decoder == "AHx") {
302ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return HexDecode(src_buf, limit, dest_buf, dest_size);
303ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
304ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (decoder == "FlateDecode" || decoder == "Fl") {
305ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FPDFAPI_FlateOrLZWDecode(FALSE, src_buf, limit, pParam, dest_size,
306ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                    dest_buf, dest_size);
307ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
308ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (decoder == "LZWDecode" || decoder == "LZW") {
309ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FPDFAPI_FlateOrLZWDecode(TRUE, src_buf, limit, pParam, 0, dest_buf,
310ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                    dest_size);
311ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
312ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (decoder == "DCTDecode" || decoder == "DCT") {
313ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    ICodec_ScanlineDecoder* pDecoder =
314ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        CPDF_ModuleMgr::Get()->GetJpegModule()->CreateDecoder(
315ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            src_buf, limit, width, height, 0,
316ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            pParam ? pParam->GetInteger("ColorTransform", 1) : 1);
317ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return _DecodeAllScanlines(pDecoder, dest_buf, dest_size);
318ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
319ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (decoder == "RunLengthDecode" || decoder == "RL") {
320ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return RunLengthDecode(src_buf, limit, dest_buf, dest_size);
321ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
322ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  dest_size = 0;
323ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  dest_buf = 0;
324ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return (FX_DWORD)-1;
325e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
326ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Stream* CPDF_StreamParser::ReadInlineStream(CPDF_Document* pDoc,
327ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                                 CPDF_Dictionary* pDict,
328ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                                 CPDF_Object* pCSObj,
329ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                                 FX_BOOL bDecode) {
330ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_Pos == m_Size)
331ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return nullptr;
332ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
333ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (PDFCharIsWhitespace(m_pBuf[m_Pos]))
334ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_Pos++;
335ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
336ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_ByteString Decoder;
337ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Dictionary* pParam = nullptr;
338ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Object* pFilter = pDict->GetElementValue("Filter");
339ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pFilter) {
340ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (CPDF_Array* pArray = pFilter->AsArray()) {
341ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      Decoder = pArray->GetString(0);
342ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CPDF_Array* pParams = pDict->GetArray("DecodeParms");
343ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (pParams)
344ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        pParam = pParams->GetDict(0);
345e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    } else {
346ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      Decoder = pFilter->GetString();
347ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pParam = pDict->GetDict("DecodeParms");
348ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
349ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
350ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_DWORD width = pDict->GetInteger("Width");
351ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_DWORD height = pDict->GetInteger("Height");
352ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_DWORD OrigSize = 0;
353ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pCSObj) {
354ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FX_DWORD bpc = pDict->GetInteger("BitsPerComponent");
355ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FX_DWORD nComponents = 1;
356ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CPDF_ColorSpace* pCS = pDoc->LoadColorSpace(pCSObj);
357ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!pCS) {
358ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      nComponents = 3;
359e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    } else {
360ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      nComponents = pCS->CountComponents();
361ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pDoc->GetPageData()->ReleaseColorSpace(pCSObj);
362ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
363ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FX_DWORD pitch = width;
364ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (bpc && pitch > INT_MAX / bpc) {
365ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return NULL;
366ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
367ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pitch *= bpc;
368ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (nComponents && pitch > INT_MAX / nComponents) {
369ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return NULL;
370ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
371ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pitch *= nComponents;
372ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (pitch > INT_MAX - 7) {
373ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return NULL;
374ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
375ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pitch += 7;
376ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pitch /= 8;
377ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    OrigSize = pitch;
378ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else {
379ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (width > INT_MAX - 7) {
380ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return NULL;
381ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
382ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    OrigSize = ((width + 7) / 8);
383ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
384ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (height && OrigSize > INT_MAX / height) {
385ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return NULL;
386ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
387ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  OrigSize *= height;
388ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  uint8_t* pData = NULL;
389ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_DWORD dwStreamSize;
390ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (Decoder.IsEmpty()) {
391ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (OrigSize > m_Size - m_Pos) {
392ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      OrigSize = m_Size - m_Pos;
393ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
394ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pData = FX_Alloc(uint8_t, OrigSize);
395ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FXSYS_memcpy(pData, m_pBuf + m_Pos, OrigSize);
396ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    dwStreamSize = OrigSize;
397ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_Pos += OrigSize;
398ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else {
399ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FX_DWORD dwDestSize = OrigSize;
400ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    dwStreamSize =
401ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        PDF_DecodeInlineStream(m_pBuf + m_Pos, m_Size - m_Pos, width, height,
402ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                               Decoder, pParam, pData, dwDestSize);
403ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if ((int)dwStreamSize < 0) {
404ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      FX_Free(pData);
405ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return NULL;
406ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
407ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (bDecode) {
408ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_Pos += dwStreamSize;
409ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      dwStreamSize = dwDestSize;
410ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (CPDF_Array* pArray = pFilter->AsArray()) {
411ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        pArray->RemoveAt(0);
412ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        CPDF_Array* pParams = pDict->GetArray("DecodeParms");
413ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (pParams)
414ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          pParams->RemoveAt(0);
415ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      } else {
416ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        pDict->RemoveAt("Filter");
417ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        pDict->RemoveAt("DecodeParms");
418ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
419e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    } else {
420ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      FX_Free(pData);
421ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      FX_DWORD dwSavePos = m_Pos;
422ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_Pos += dwStreamSize;
423ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      while (1) {
424ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        FX_DWORD dwPrevPos = m_Pos;
425ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        CPDF_StreamParser::SyntaxType type = ParseNextElement();
426ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (type == CPDF_StreamParser::EndOfData) {
427ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          break;
428e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
429ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (type != CPDF_StreamParser::Keyword) {
430ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          dwStreamSize += m_Pos - dwPrevPos;
431ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          continue;
432ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
433ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (GetWordSize() == 2 && GetWordBuf()[0] == 'E' &&
434ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            GetWordBuf()[1] == 'I') {
435ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          m_Pos = dwPrevPos;
436ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          break;
437ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
438ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        dwStreamSize += m_Pos - dwPrevPos;
439ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
440ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_Pos = dwSavePos;
441ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pData = FX_Alloc(uint8_t, dwStreamSize);
442ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      FXSYS_memcpy(pData, m_pBuf + m_Pos, dwStreamSize);
443ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_Pos += dwStreamSize;
444ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
445ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
446ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pDict->SetAtInteger("Length", (int)dwStreamSize);
447ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return new CPDF_Stream(pData, dwStreamSize, pDict);
448e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
449ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
450e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define MAX_WORD_BUFFER 256
451ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define MAX_STRING_LENGTH 32767
452e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define FXDWORD_TRUE FXDWORD_FROM_LSBFIRST(0x65757274)
453e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define FXDWORD_NULL FXDWORD_FROM_LSBFIRST(0x6c6c756e)
454e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define FXDWORD_FALS FXDWORD_FROM_LSBFIRST(0x736c6166)
455ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_StreamParser::SyntaxType CPDF_StreamParser::ParseNextElement() {
456ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pLastObj) {
457ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pLastObj->Release();
458ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pLastObj = nullptr;
459ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
460ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
461ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_WordSize = 0;
462ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_BOOL bIsNumber = TRUE;
463ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!PositionIsInBounds())
464ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return EndOfData;
465ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
466ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int ch = m_pBuf[m_Pos++];
467ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  while (1) {
468ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    while (PDFCharIsWhitespace(ch)) {
469ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (!PositionIsInBounds())
470e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return EndOfData;
471ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
472ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      ch = m_pBuf[m_Pos++];
473e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
474ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
475ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (ch != '%')
476ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
477ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
478e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    while (1) {
479ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (!PositionIsInBounds())
480ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        return EndOfData;
481ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
482ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      ch = m_pBuf[m_Pos++];
483ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (PDFCharIsLineEnding(ch))
484ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        break;
485e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
486ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
487ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
488ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (PDFCharIsDelimiter(ch) && ch != '/') {
489ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_Pos--;
490ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pLastObj = ReadNextObject();
491ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return Others;
492ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
493ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
494ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  while (1) {
495ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (m_WordSize < MAX_WORD_BUFFER)
496ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_WordBuffer[m_WordSize++] = ch;
497ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
498ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!PDFCharIsNumeric(ch))
499ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      bIsNumber = FALSE;
500ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
501ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!PositionIsInBounds())
502ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
503ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
504ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    ch = m_pBuf[m_Pos++];
505ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
506ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (PDFCharIsDelimiter(ch) || PDFCharIsWhitespace(ch)) {
507ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_Pos--;
508ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
509e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
510ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
511ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
512ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_WordBuffer[m_WordSize] = 0;
513ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (bIsNumber)
514ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return Number;
515ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_WordBuffer[0] == '/')
516ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return Name;
517ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
518ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_WordSize == 4) {
519ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (*(FX_DWORD*)m_WordBuffer == FXDWORD_TRUE) {
520ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pLastObj = new CPDF_Boolean(TRUE);
521ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return Others;
522ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
523ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (*(FX_DWORD*)m_WordBuffer == FXDWORD_NULL) {
524ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pLastObj = new CPDF_Null;
525ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return Others;
526ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
527ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else if (m_WordSize == 5) {
528ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (*(FX_DWORD*)m_WordBuffer == FXDWORD_FALS && m_WordBuffer[4] == 'e') {
529ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pLastObj = new CPDF_Boolean(FALSE);
530ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return Others;
531ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
532ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
533ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return Keyword;
534e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
535ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
536ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamParser::SkipPathObject() {
537ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_DWORD command_startpos = m_Pos;
538ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!PositionIsInBounds())
539ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
540ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
541ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int ch = m_pBuf[m_Pos++];
542ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  while (1) {
543ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    while (PDFCharIsWhitespace(ch)) {
544ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (!PositionIsInBounds())
545e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return;
546ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      ch = m_pBuf[m_Pos++];
547e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
548ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
549ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!PDFCharIsNumeric(ch)) {
550ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_Pos = command_startpos;
551ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return;
552e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
553ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
554ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    while (1) {
555ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      while (!PDFCharIsWhitespace(ch)) {
556ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (!PositionIsInBounds())
557ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          return;
558ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        ch = m_pBuf[m_Pos++];
559ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
560ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
561ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      while (PDFCharIsWhitespace(ch)) {
562ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (!PositionIsInBounds())
563ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          return;
564ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        ch = m_pBuf[m_Pos++];
565ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
566ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
567ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (PDFCharIsNumeric(ch))
568ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        continue;
569ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
570ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      FX_DWORD op_startpos = m_Pos - 1;
571ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      while (!PDFCharIsWhitespace(ch) && !PDFCharIsDelimiter(ch)) {
572ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (!PositionIsInBounds())
573ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          return;
574ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        ch = m_pBuf[m_Pos++];
575ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
576ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
577ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (m_Pos - op_startpos == 2) {
578ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        int op = m_pBuf[op_startpos];
579ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (op == kPathOperatorSubpath || op == kPathOperatorLine ||
580ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            op == kPathOperatorCubicBezier1 ||
581ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            op == kPathOperatorCubicBezier2 ||
582ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            op == kPathOperatorCubicBezier3) {
583ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          command_startpos = m_Pos;
584ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          break;
585ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
586ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      } else if (m_Pos - op_startpos == 3) {
587ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (m_pBuf[op_startpos] == kPathOperatorRectangle[0] &&
588ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            m_pBuf[op_startpos + 1] == kPathOperatorRectangle[1]) {
589ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          command_startpos = m_Pos;
590ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          break;
591ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
592ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
593ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_Pos = command_startpos;
594ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return;
595ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
596ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
597e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
598ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Object* CPDF_StreamParser::ReadNextObject(FX_BOOL bAllowNestedArray,
599ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                               FX_BOOL bInArray) {
600ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_BOOL bIsNumber;
601ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  GetNextWord(bIsNumber);
602ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_WordSize == 0) {
603ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return NULL;
604ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
605ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (bIsNumber) {
606ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_WordBuffer[m_WordSize] = 0;
607ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return new CPDF_Number(CFX_ByteStringC(m_WordBuffer, m_WordSize));
608ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
609ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int first_char = m_WordBuffer[0];
610ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (first_char == '/') {
611ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return new CPDF_Name(
612ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        PDF_NameDecode(CFX_ByteStringC(m_WordBuffer + 1, m_WordSize - 1)));
613ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
614ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (first_char == '(') {
615ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return new CPDF_String(ReadString(), FALSE);
616ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
617ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (first_char == '<') {
618ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (m_WordSize == 1) {
619ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return new CPDF_String(ReadHexString(), TRUE);
620ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
621ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CPDF_Dictionary* pDict = new CPDF_Dictionary;
622ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    while (1) {
623ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      GetNextWord(bIsNumber);
624ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (m_WordSize == 0) {
625ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        pDict->Release();
626ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        return nullptr;
627ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
628ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (m_WordSize == 2 && m_WordBuffer[0] == '>') {
629ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        break;
630ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
631ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (m_WordBuffer[0] != '/') {
632ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        pDict->Release();
633ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        return nullptr;
634ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
635ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CFX_ByteString key =
636ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          PDF_NameDecode(CFX_ByteStringC(m_WordBuffer + 1, m_WordSize - 1));
637ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CPDF_Object* pObj = ReadNextObject(TRUE);
638ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (!pObj) {
639ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        pDict->Release();
640ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        return nullptr;
641ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
642ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (!key.IsEmpty()) {
643ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        pDict->SetAt(key, pObj);
644ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      } else {
645ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        pObj->Release();
646ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
647ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
648ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return pDict;
649ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
650ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (first_char == '[') {
651ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!bAllowNestedArray && bInArray) {
652ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return NULL;
653ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
654ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CPDF_Array* pArray = new CPDF_Array;
655ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    while (1) {
656ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CPDF_Object* pObj = ReadNextObject(bAllowNestedArray, TRUE);
657ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (pObj) {
658ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        pArray->Add(pObj);
659ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        continue;
660ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
661ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
662ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (m_WordSize == 0 || m_WordBuffer[0] == ']')
663ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        break;
664e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
665ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return pArray;
666ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
667ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_WordSize == 4) {
668ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (*(FX_DWORD*)m_WordBuffer == FXDWORD_TRUE) {
669ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return new CPDF_Boolean(TRUE);
670e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
671ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (*(FX_DWORD*)m_WordBuffer == FXDWORD_NULL) {
672ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return new CPDF_Null;
673e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
674ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else if (m_WordSize == 5) {
675ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (*(FX_DWORD*)m_WordBuffer == FXDWORD_FALS && m_WordBuffer[4] == 'e') {
676ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return new CPDF_Boolean(FALSE);
677e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
678ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
679ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return NULL;
680e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
681ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamParser::GetNextWord(FX_BOOL& bIsNumber) {
682ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_WordSize = 0;
683ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  bIsNumber = TRUE;
684ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!PositionIsInBounds())
685ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
686ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
687ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int ch = m_pBuf[m_Pos++];
688ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  while (1) {
689ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    while (PDFCharIsWhitespace(ch)) {
690ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (!PositionIsInBounds()) {
691e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return;
692ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
693ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      ch = m_pBuf[m_Pos++];
694e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
695ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
696ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (ch != '%')
697ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
698ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
699e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    while (1) {
700ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (!PositionIsInBounds())
701e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return;
702ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      ch = m_pBuf[m_Pos++];
703ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (PDFCharIsLineEnding(ch))
704ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        break;
705e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
706ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
707ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
708ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (PDFCharIsDelimiter(ch)) {
709ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    bIsNumber = FALSE;
710ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_WordBuffer[m_WordSize++] = ch;
711ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (ch == '/') {
712ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      while (1) {
713ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (!PositionIsInBounds())
714ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          return;
715e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        ch = m_pBuf[m_Pos++];
716ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (!PDFCharIsOther(ch) && !PDFCharIsNumeric(ch)) {
717ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          m_Pos--;
718ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          return;
719e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
720ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
721ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (m_WordSize < MAX_WORD_BUFFER)
722ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          m_WordBuffer[m_WordSize++] = ch;
723ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
724ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else if (ch == '<') {
725ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (!PositionIsInBounds())
726ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        return;
727ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      ch = m_pBuf[m_Pos++];
728ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (ch == '<')
729ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_WordBuffer[m_WordSize++] = ch;
730ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      else
731ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_Pos--;
732ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else if (ch == '>') {
733ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (!PositionIsInBounds())
734ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        return;
735ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      ch = m_pBuf[m_Pos++];
736ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (ch == '>')
737ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_WordBuffer[m_WordSize++] = ch;
738ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      else
739ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_Pos--;
740e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
741ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
742ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
743ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
744ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  while (1) {
745ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (m_WordSize < MAX_WORD_BUFFER)
746ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_WordBuffer[m_WordSize++] = ch;
747ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!PDFCharIsNumeric(ch))
748ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      bIsNumber = FALSE;
749ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
750ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!PositionIsInBounds())
751ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return;
752ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    ch = m_pBuf[m_Pos++];
753ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (PDFCharIsDelimiter(ch) || PDFCharIsWhitespace(ch)) {
754ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_Pos--;
755ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
756ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
757ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
758e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
759ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
760ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_ByteString CPDF_StreamParser::ReadString() {
761ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!PositionIsInBounds())
762ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return CFX_ByteString();
763ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
764ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int ch = m_pBuf[m_Pos++];
765ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_ByteTextBuf buf;
766ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int parlevel = 0;
767ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int status = 0, iEscCode = 0;
768ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  while (1) {
769ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    switch (status) {
770ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      case 0:
771ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (ch == ')') {
772ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          if (parlevel == 0) {
773ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            if (buf.GetLength() > MAX_STRING_LENGTH) {
774ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              return CFX_ByteString(buf.GetBuffer(), MAX_STRING_LENGTH);
775ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            }
776ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            return buf.GetByteString();
777ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          }
778ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          parlevel--;
779ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          buf.AppendChar(')');
780ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        } else if (ch == '(') {
781ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          parlevel++;
782ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          buf.AppendChar('(');
783ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        } else if (ch == '\\') {
784ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          status = 1;
785ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        } else {
786ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          buf.AppendChar((char)ch);
787ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
788ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        break;
789ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      case 1:
790ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (ch >= '0' && ch <= '7') {
791ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          iEscCode = FXSYS_toDecimalDigit(ch);
792ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          status = 2;
793ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          break;
794ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
795ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (ch == 'n') {
796ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          buf.AppendChar('\n');
797ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        } else if (ch == 'r') {
798ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          buf.AppendChar('\r');
799ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        } else if (ch == 't') {
800ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          buf.AppendChar('\t');
801ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        } else if (ch == 'b') {
802ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          buf.AppendChar('\b');
803ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        } else if (ch == 'f') {
804ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          buf.AppendChar('\f');
805ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        } else if (ch == '\r') {
806ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          status = 4;
807ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          break;
808ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        } else if (ch == '\n') {
809ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        } else {
810ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          buf.AppendChar(ch);
811ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
812ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        status = 0;
813ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        break;
814ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      case 2:
815ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (ch >= '0' && ch <= '7') {
816ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          iEscCode = iEscCode * 8 + FXSYS_toDecimalDigit(ch);
817ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          status = 3;
818ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        } else {
819ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          buf.AppendChar(iEscCode);
820ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          status = 0;
821ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          continue;
822ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
823ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        break;
824ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      case 3:
825ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (ch >= '0' && ch <= '7') {
826ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          iEscCode = iEscCode * 8 + FXSYS_toDecimalDigit(ch);
827ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          buf.AppendChar(iEscCode);
828ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          status = 0;
829ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        } else {
830ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          buf.AppendChar(iEscCode);
831ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          status = 0;
832ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          continue;
833e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
834ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        break;
835ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      case 4:
836ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        status = 0;
837ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (ch != '\n') {
838ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          continue;
839e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
840ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        break;
841e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
842ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!PositionIsInBounds())
843ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
844ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
845ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    ch = m_pBuf[m_Pos++];
846ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
847ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (PositionIsInBounds())
848ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    ch = m_pBuf[m_Pos++];
849ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
850ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (buf.GetLength() > MAX_STRING_LENGTH) {
851ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return CFX_ByteString(buf.GetBuffer(), MAX_STRING_LENGTH);
852ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
853ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return buf.GetByteString();
854e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
855ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_ByteString CPDF_StreamParser::ReadHexString() {
856ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!PositionIsInBounds())
857ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return CFX_ByteString();
858ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
859ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_ByteTextBuf buf;
860ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  bool bFirst = true;
861ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int code = 0;
862ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  while (PositionIsInBounds()) {
863e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    int ch = m_pBuf[m_Pos++];
864ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
865ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (ch == '>')
866ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
867ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
868ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!std::isxdigit(ch))
869ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      continue;
870ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
871ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int val = FXSYS_toHexDigit(ch);
872ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (bFirst) {
873ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      code = val * 16;
874ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else {
875ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      code += val;
876ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      buf.AppendByte((uint8_t)code);
877e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
878ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    bFirst = !bFirst;
879ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
880ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!bFirst)
881ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    buf.AppendChar((char)code);
882ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
883ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (buf.GetLength() > MAX_STRING_LENGTH)
884ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return CFX_ByteString(buf.GetBuffer(), MAX_STRING_LENGTH);
885ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
886ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return buf.GetByteString();
887e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
888ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
889ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannbool CPDF_StreamParser::PositionIsInBounds() const {
890ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_Pos < m_Size;
891e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
892ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
893ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_ContentParser::CPDF_ContentParser()
894ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    : m_Status(Ready),
895ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_InternalStage(STAGE_GETCONTENT),
896ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pObjects(nullptr),
897ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_bForm(false),
898ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pType3Char(nullptr),
899ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pData(nullptr),
900ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_Size(0),
901ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_CurrentOffset(0) {}
902ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_ContentParser::~CPDF_ContentParser() {
903ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!m_pSingleStream)
904ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FX_Free(m_pData);
905e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
906ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_ContentParser::Start(CPDF_Page* pPage, CPDF_ParseOptions* pOptions) {
907ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_Status != Ready || !pPage || !pPage->m_pDocument ||
908ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      !pPage->m_pFormDict) {
909ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_Status = Done;
910ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
911ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
912ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pObjects = pPage;
913ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_bForm = FALSE;
914ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pOptions) {
915ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_Options = *pOptions;
916ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
917ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_Status = ToBeContinued;
918ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_InternalStage = STAGE_GETCONTENT;
919ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_CurrentOffset = 0;
920ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
921ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Object* pContent = pPage->m_pFormDict->GetElementValue("Contents");
922ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pContent) {
923ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_Status = Done;
924ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
925ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
926ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (CPDF_Stream* pStream = pContent->AsStream()) {
927e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    m_nStreams = 0;
928ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pSingleStream.reset(new CPDF_StreamAcc);
929ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pSingleStream->LoadAllData(pStream, FALSE);
930ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else if (CPDF_Array* pArray = pContent->AsArray()) {
931ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_nStreams = pArray->GetCount();
932ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (m_nStreams)
933ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_StreamArray.resize(m_nStreams);
934ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    else
935ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_Status = Done;
936ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else {
937ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_Status = Done;
938ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
939e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
940ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_ContentParser::Start(CPDF_Form* pForm,
941ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                               CPDF_AllStates* pGraphicStates,
942ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                               CFX_Matrix* pParentMatrix,
943ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                               CPDF_Type3Char* pType3Char,
944ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                               CPDF_ParseOptions* pOptions,
945ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                               int level) {
946ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pType3Char = pType3Char;
947ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pObjects = pForm;
948ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_bForm = TRUE;
949ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_Matrix form_matrix = pForm->m_pFormDict->GetMatrix("Matrix");
950ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pGraphicStates) {
951ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    form_matrix.Concat(pGraphicStates->m_CTM);
952ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
953ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Array* pBBox = pForm->m_pFormDict->GetArray("BBox");
954ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_FloatRect form_bbox;
955ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Path ClipPath;
956ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pBBox) {
957ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    form_bbox = pBBox->GetRect();
958ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    ClipPath.New();
959ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    ClipPath.AppendRect(form_bbox.left, form_bbox.bottom, form_bbox.right,
960ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                        form_bbox.top);
961ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    ClipPath.Transform(&form_matrix);
962ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (pParentMatrix) {
963ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      ClipPath.Transform(pParentMatrix);
964ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
965ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    form_bbox.Transform(&form_matrix);
966ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (pParentMatrix) {
967ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      form_bbox.Transform(pParentMatrix);
968ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
969ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
970ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Dictionary* pResources = pForm->m_pFormDict->GetDict("Resources");
971ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pParser.reset(new CPDF_StreamContentParser(
972ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pForm->m_pDocument, pForm->m_pPageResources, pForm->m_pResources,
973ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pParentMatrix, pForm, pResources, &form_bbox, pOptions, pGraphicStates,
974ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      level));
975ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pParser->GetCurStates()->m_CTM = form_matrix;
976ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pParser->GetCurStates()->m_ParentMatrix = form_matrix;
977ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (ClipPath.NotNull()) {
978ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pParser->GetCurStates()->m_ClipPath.AppendPath(ClipPath, FXFILL_WINDING,
979ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                                     TRUE);
980ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
981ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pForm->m_Transparency & PDFTRANS_GROUP) {
982ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CPDF_GeneralStateData* pData =
983ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_pParser->GetCurStates()->m_GeneralState.GetModify();
984ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pData->m_BlendType = FXDIB_BLEND_NORMAL;
985ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pData->m_StrokeAlpha = 1.0f;
986ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pData->m_FillAlpha = 1.0f;
987ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pData->m_pSoftMask = NULL;
988ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
989ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_nStreams = 0;
990ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pSingleStream.reset(new CPDF_StreamAcc);
991ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pSingleStream->LoadAllData(pForm->m_pFormStream, FALSE);
992ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pData = (uint8_t*)m_pSingleStream->GetData();
993ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_Size = m_pSingleStream->GetSize();
994ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_Status = ToBeContinued;
995ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_InternalStage = STAGE_PARSE;
996ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_CurrentOffset = 0;
997ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
998ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_ContentParser::Continue(IFX_Pause* pPause) {
999ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int steps = 0;
1000ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  while (m_Status == ToBeContinued) {
1001ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (m_InternalStage == STAGE_GETCONTENT) {
1002ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (m_CurrentOffset == m_nStreams) {
1003ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (!m_StreamArray.empty()) {
1004ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          FX_SAFE_DWORD safeSize = 0;
1005ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          for (const auto& stream : m_StreamArray) {
1006ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            safeSize += stream->GetSize();
1007ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            safeSize += 1;
1008ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          }
1009ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          if (!safeSize.IsValid()) {
1010e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            m_Status = Done;
1011e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            return;
1012ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          }
1013ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          m_Size = safeSize.ValueOrDie();
1014ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          m_pData = FX_Alloc(uint8_t, m_Size);
1015ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          FX_DWORD pos = 0;
1016ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          for (const auto& stream : m_StreamArray) {
1017ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            FXSYS_memcpy(m_pData + pos, stream->GetData(), stream->GetSize());
1018ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            pos += stream->GetSize();
1019ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            m_pData[pos++] = ' ';
1020ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          }
1021ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          m_StreamArray.clear();
1022ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        } else {
1023ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          m_pData = (uint8_t*)m_pSingleStream->GetData();
1024ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          m_Size = m_pSingleStream->GetSize();
1025ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
1026ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_InternalStage = STAGE_PARSE;
1027ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_CurrentOffset = 0;
1028ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      } else {
1029ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        CPDF_Array* pContent = m_pObjects->m_pFormDict->GetArray("Contents");
1030ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_StreamArray[m_CurrentOffset].reset(new CPDF_StreamAcc);
1031ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        CPDF_Stream* pStreamObj = ToStream(
1032ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            pContent ? pContent->GetElementValue(m_CurrentOffset) : nullptr);
1033ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_StreamArray[m_CurrentOffset]->LoadAllData(pStreamObj, FALSE);
1034ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_CurrentOffset++;
1035ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
1036ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1037ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (m_InternalStage == STAGE_PARSE) {
1038ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (!m_pParser) {
1039ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_pParser.reset(new CPDF_StreamContentParser(
1040ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            m_pObjects->m_pDocument, m_pObjects->m_pPageResources, nullptr,
1041ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            nullptr, m_pObjects, m_pObjects->m_pResources, &m_pObjects->m_BBox,
1042ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            &m_Options, nullptr, 0));
1043ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_pParser->GetCurStates()->m_ColorState.GetModify()->Default();
1044ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
1045ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (m_CurrentOffset >= m_Size) {
1046ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_InternalStage = STAGE_CHECKCLIP;
1047ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      } else {
1048ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_CurrentOffset +=
1049ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            m_pParser->Parse(m_pData + m_CurrentOffset,
1050ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                             m_Size - m_CurrentOffset, PARSE_STEP_LIMIT);
1051ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
1052ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1053ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (m_InternalStage == STAGE_CHECKCLIP) {
1054ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (m_pType3Char) {
1055ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_pType3Char->m_bColored = m_pParser->IsColored();
1056ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_pType3Char->m_Width =
1057ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            FXSYS_round(m_pParser->GetType3Data()[0] * 1000);
1058ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_pType3Char->m_BBox.left =
1059ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            FXSYS_round(m_pParser->GetType3Data()[2] * 1000);
1060ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_pType3Char->m_BBox.bottom =
1061ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            FXSYS_round(m_pParser->GetType3Data()[3] * 1000);
1062ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_pType3Char->m_BBox.right =
1063ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            FXSYS_round(m_pParser->GetType3Data()[4] * 1000);
1064ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_pType3Char->m_BBox.top =
1065ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            FXSYS_round(m_pParser->GetType3Data()[5] * 1000);
1066ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
1067ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      FX_POSITION pos = m_pObjects->m_ObjectList.GetHeadPosition();
1068ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      while (pos) {
1069ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        CPDF_PageObject* pObj =
1070ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            (CPDF_PageObject*)m_pObjects->m_ObjectList.GetNext(pos);
1071ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (pObj->m_ClipPath.IsNull()) {
1072ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          continue;
1073ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
1074ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (pObj->m_ClipPath.GetPathCount() != 1) {
1075ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          continue;
1076ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
1077ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (pObj->m_ClipPath.GetTextCount()) {
1078ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          continue;
1079ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
1080ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        CPDF_Path ClipPath = pObj->m_ClipPath.GetPath(0);
1081ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (!ClipPath.IsRect() || pObj->m_Type == PDFPAGE_SHADING) {
1082ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          continue;
1083ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
1084ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        CFX_FloatRect old_rect(ClipPath.GetPointX(0), ClipPath.GetPointY(0),
1085ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                               ClipPath.GetPointX(2), ClipPath.GetPointY(2));
1086ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        CFX_FloatRect obj_rect(pObj->m_Left, pObj->m_Bottom, pObj->m_Right,
1087ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                               pObj->m_Top);
1088ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (old_rect.Contains(obj_rect)) {
1089ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          pObj->m_ClipPath.SetNull();
1090ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
1091ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
1092ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_Status = Done;
1093ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return;
1094ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1095ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    steps++;
1096ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (pPause && pPause->NeedToPauseNow()) {
1097ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
1098ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1099ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1100e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1101