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