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