| Index: core/src/fpdfapi/fpdf_page/fpdf_page_parser_new.cpp
|
| diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_parser_new.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_parser_new.cpp
|
| deleted file mode 100644
|
| index 24ec7436aa81ee3291a56c10df1bd176a60f5101..0000000000000000000000000000000000000000
|
| --- a/core/src/fpdfapi/fpdf_page/fpdf_page_parser_new.cpp
|
| +++ /dev/null
|
| @@ -1,822 +0,0 @@
|
| -// Copyright 2014 PDFium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
|
| -
|
| -#include "../../../include/fpdfapi/fpdf_page.h"
|
| -#include "../../../include/fpdfapi/fpdf_module.h"
|
| -#include "pageint.h"
|
| -#if defined(_FPDFAPI_MINI_)
|
| -extern const FX_LPCSTR _PDF_CharType;
|
| -void CPDF_StreamContentParser::InputData(FX_LPCBYTE src_buf, FX_DWORD src_size)
|
| -{
|
| - if (m_Level > _FPDF_MAX_FORM_LEVEL_) {
|
| - return;
|
| - }
|
| - for (FX_DWORD i = 0; i < src_size; i ++) {
|
| - int ch = src_buf[i];
|
| - int type = _PDF_CharType[ch];
|
| -start:
|
| - switch (m_WordState) {
|
| - case 0:
|
| - if (type == 'W') {
|
| - } else if (type == 'N') {
|
| - m_WordState = 5;
|
| - m_pWordBuf[0] = ch;
|
| - m_WordSize = 1;
|
| - } else if (type == 'R') {
|
| - m_WordState = 4;
|
| - m_pWordBuf[0] = ch;
|
| - m_WordSize = 1;
|
| - } else switch (ch) {
|
| - case '/':
|
| - m_WordState = 2;
|
| - m_WordSize = 0;
|
| - break;
|
| - case '[':
|
| - StartArray();
|
| - break;
|
| - case ']':
|
| - EndArray();
|
| - break;
|
| - case '(':
|
| - m_WordState = 7;
|
| - m_StringLevel = 1;
|
| - m_StringState = 0;
|
| - m_StringBuf.Clear();
|
| - break;
|
| - case '<':
|
| - m_WordState = 3;
|
| - break;
|
| - case '>':
|
| - m_WordState = 8;
|
| - break;
|
| - case '%':
|
| - m_WordState = 1;
|
| - break;
|
| - }
|
| - break;
|
| - case 1:
|
| - if (ch == '\n' || ch == '\r') {
|
| - m_WordState = 0;
|
| - }
|
| - break;
|
| - case 2:
|
| - if (type != 'R' && type != 'N') {
|
| - EndName();
|
| - m_WordState = 0;
|
| - goto start;
|
| - }
|
| - if (m_WordSize < 256) {
|
| - m_pWordBuf[m_WordSize++] = ch;
|
| - }
|
| - break;
|
| - case 3:
|
| - if (ch == '<') {
|
| - StartDict();
|
| - m_WordState = 0;
|
| - } else {
|
| - m_StringBuf.Clear();
|
| - m_WordState = 6;
|
| - goto start;
|
| - }
|
| - break;
|
| - case 4:
|
| - if (type != 'R' && type != 'N') {
|
| - m_WordState = 0;
|
| - EndKeyword();
|
| - if (m_bAbort) {
|
| - return;
|
| - }
|
| - goto start;
|
| - }
|
| - if (m_WordSize < 256) {
|
| - m_pWordBuf[m_WordSize++] = ch;
|
| - }
|
| - break;
|
| - case 5:
|
| - if (type != 'N') {
|
| - EndNumber();
|
| - m_WordState = 0;
|
| - goto start;
|
| - }
|
| - if (m_WordSize < 256) {
|
| - m_pWordBuf[m_WordSize++] = ch;
|
| - }
|
| - break;
|
| - case 6:
|
| - if (ch == '>') {
|
| - EndHexString();
|
| - m_WordState = 0;
|
| - } else {
|
| - m_StringBuf.AppendByte(ch);
|
| - }
|
| - break;
|
| - case 7:
|
| - switch (m_StringState) {
|
| - case 0:
|
| - if (ch == ')') {
|
| - m_StringLevel --;
|
| - if (m_StringLevel == 0) {
|
| - EndString();
|
| - m_WordState = 0;
|
| - break;
|
| - }
|
| - m_StringBuf.AppendByte(')');
|
| - } else if (ch == '(') {
|
| - m_StringLevel ++;
|
| - m_StringBuf.AppendByte('(');
|
| - } else if (ch == '\\') {
|
| - m_StringState = 1;
|
| - } else {
|
| - m_StringBuf.AppendByte((char)ch);
|
| - }
|
| - break;
|
| - case 1:
|
| - if (ch >= '0' && ch <= '7') {
|
| - m_EscCode = ch - '0';
|
| - m_StringState = 2;
|
| - break;
|
| - }
|
| - if (ch == 'n') {
|
| - m_StringBuf.AppendByte('\n');
|
| - } else if (ch == 'r') {
|
| - m_StringBuf.AppendByte('\r');
|
| - } else if (ch == 't') {
|
| - m_StringBuf.AppendByte('\t');
|
| - } else if (ch == 'b') {
|
| - m_StringBuf.AppendByte('\b');
|
| - } else if (ch == 'f') {
|
| - m_StringBuf.AppendByte('\f');
|
| - } else if (ch == '\\') {
|
| - m_StringBuf.AppendByte('\\');
|
| - } else if (ch == '(') {
|
| - m_StringBuf.AppendByte('(');
|
| - } else if (ch == ')') {
|
| - m_StringBuf.AppendByte(')');
|
| - } else if (ch == '\r') {
|
| - m_StringState = 4;
|
| - break;
|
| - } else if (ch == '\n') {
|
| - } else {
|
| - m_StringBuf.AppendByte(ch);
|
| - }
|
| - m_StringState = 0;
|
| - break;
|
| - case 2:
|
| - if (ch >= '0' && ch <= '7') {
|
| - m_EscCode = m_EscCode * 8 + ch - '0';
|
| - m_StringState = 3;
|
| - } else {
|
| - m_StringBuf.AppendByte(m_EscCode);
|
| - m_StringState = 0;
|
| - goto start;
|
| - }
|
| - break;
|
| - case 3:
|
| - if (ch >= '0' && ch <= '7') {
|
| - m_EscCode = m_EscCode * 8 + ch - '0';
|
| - m_StringBuf.AppendByte(m_EscCode);
|
| - m_StringState = 0;
|
| - } else {
|
| - m_StringBuf.AppendByte(m_EscCode);
|
| - m_StringState = 0;
|
| - goto start;
|
| - }
|
| - break;
|
| - case 4:
|
| - m_StringState = 0;
|
| - if (ch != '\n') {
|
| - goto start;
|
| - }
|
| - break;
|
| - }
|
| - break;
|
| - case 8:
|
| - m_WordState = 0;
|
| - if (ch == '>') {
|
| - EndDict();
|
| - } else {
|
| - goto start;
|
| - }
|
| - break;
|
| - case 9:
|
| - switch (m_InlineImageState) {
|
| - case 0:
|
| - if (type == 'W' || type == 'D') {
|
| - m_InlineImageState = 1;
|
| - m_InlineWhiteChar = ch;
|
| - } else {
|
| - m_StringBuf.AppendByte(ch);
|
| - }
|
| - break;
|
| - case 1:
|
| - m_StringBuf.AppendByte(m_InlineWhiteChar);
|
| - if (ch == 'I') {
|
| - m_InlineImageState = 2;
|
| - } else {
|
| - m_InlineImageState = 0;
|
| - goto start;
|
| - }
|
| - break;
|
| - case 2:
|
| - if (ch == 'D') {
|
| - m_InlineImageState = 3;
|
| - } else {
|
| - m_StringBuf.AppendByte('I');
|
| - m_InlineImageState = 0;
|
| - goto start;
|
| - }
|
| - break;
|
| - case 3:
|
| - EndImageDict();
|
| - break;
|
| - }
|
| - break;
|
| - case 10:
|
| - switch (m_InlineImageState) {
|
| - case 0:
|
| - if (type == 'W') {
|
| - m_InlineImageState = 1;
|
| - m_InlineWhiteChar = ch;
|
| - } else {
|
| - m_ImageSrcBuf.AppendByte(ch);
|
| - }
|
| - break;
|
| - case 1:
|
| - if (ch == 'E') {
|
| - m_InlineImageState = 2;
|
| - } else {
|
| - m_ImageSrcBuf.AppendByte(m_InlineWhiteChar);
|
| - m_InlineImageState = 0;
|
| - goto start;
|
| - }
|
| - break;
|
| - case 2:
|
| - if (ch == 'I') {
|
| - m_InlineImageState = 3;
|
| - } else {
|
| - m_ImageSrcBuf.AppendByte(m_InlineWhiteChar);
|
| - m_ImageSrcBuf.AppendByte('E');
|
| - m_InlineImageState = 0;
|
| - goto start;
|
| - }
|
| - break;
|
| - case 3:
|
| - if (type == 'W') {
|
| - EndInlineImage();
|
| - } else {
|
| - m_ImageSrcBuf.AppendByte(m_InlineWhiteChar);
|
| - m_ImageSrcBuf.AppendByte('E');
|
| - m_ImageSrcBuf.AppendByte('I');
|
| - m_InlineImageState = 0;
|
| - goto start;
|
| - }
|
| - break;
|
| - }
|
| - break;
|
| - case 11:
|
| - if (m_InlineImageState < m_ImageSrcBuf.GetSize()) {
|
| - m_ImageSrcBuf.GetBuffer()[m_InlineImageState ++] = ch;
|
| - } else {
|
| - if (ch == 'I') {
|
| - EndInlineImage();
|
| - }
|
| - }
|
| - break;
|
| - }
|
| - }
|
| -}
|
| -void CPDF_StreamContentParser::Finish()
|
| -{
|
| - switch (m_WordState) {
|
| - case 0:
|
| - break;
|
| - case 1:
|
| - break;
|
| - case 2:
|
| - EndName();
|
| - break;
|
| - case 3:
|
| - break;
|
| - case 4:
|
| - EndKeyword();
|
| - break;
|
| - case 5:
|
| - EndNumber();
|
| - break;
|
| - case 6:
|
| - EndHexString();
|
| - break;
|
| - case 7:
|
| - EndString();
|
| - break;
|
| - case 8:
|
| - break;
|
| - case 9:
|
| - break;
|
| - case 10:
|
| - EndInlineImage();
|
| - break;
|
| - }
|
| - m_WordState = 0;
|
| -}
|
| -void CPDF_StreamContentParser::AddContainer(CPDF_Object* pObject)
|
| -{
|
| - if (m_ObjectSize) {
|
| - m_pObjectState[m_ObjectSize] = SetToCurObj(pObject);
|
| - }
|
| - FXSYS_assert(m_ObjectSize < _FPDF_MAX_OBJECT_STACK_SIZE_);
|
| - m_pObjectStack[m_ObjectSize++] = pObject;
|
| -}
|
| -FX_BOOL CPDF_StreamContentParser::SetToCurObj(CPDF_Object* pObject)
|
| -{
|
| - if (m_ObjectSize == 0) {
|
| - AddObjectParam(pObject);
|
| - return TRUE;
|
| - }
|
| - FX_BOOL bInArrayOrDict = TRUE;
|
| - CPDF_Object* pCurObj = m_pObjectStack[m_ObjectSize - 1];
|
| - if (pCurObj->GetType() == PDFOBJ_ARRAY) {
|
| - ((CPDF_Array*)pCurObj)->Add(pObject, m_pDocument);
|
| - } else {
|
| - if (!m_bDictName && m_pDictName[0]) {
|
| - ((CPDF_Dictionary*)pCurObj)->SetAt((FX_LPCSTR)m_pDictName, pObject, m_pDocument);
|
| - } else {
|
| - bInArrayOrDict = FALSE;
|
| - }
|
| - m_bDictName = TRUE;
|
| - }
|
| - return bInArrayOrDict;
|
| -}
|
| -void CPDF_StreamContentParser::StartArray()
|
| -{
|
| - if (m_ObjectSize)
|
| - if (m_pObjectStack[0]->GetType() != PDFOBJ_DICTIONARY && m_pObjectStack[m_ObjectSize - 1]->GetType() == PDFOBJ_ARRAY) {
|
| - return;
|
| - }
|
| - CPDF_Array* pArray = FX_NEW CPDF_Array;
|
| - AddContainer(pArray);
|
| -}
|
| -void CPDF_StreamContentParser::EndArray()
|
| -{
|
| - if (m_ObjectSize == 0) {
|
| - return;
|
| - }
|
| - CPDF_Object* pCurObj = m_pObjectStack[m_ObjectSize - 1];
|
| - if (pCurObj->GetType() != PDFOBJ_ARRAY) {
|
| - return;
|
| - }
|
| - m_ObjectSize --;
|
| - if (m_ObjectSize == 0) {
|
| - AddObjectParam(pCurObj);
|
| - } else {
|
| - if (!m_pObjectState[m_ObjectSize]) {
|
| - pCurObj->Release();
|
| - }
|
| - }
|
| - m_pObjectState[m_ObjectSize] = FALSE;
|
| -}
|
| -void CPDF_StreamContentParser::StartDict()
|
| -{
|
| - CPDF_Dictionary* pDict = FX_NEW CPDF_Dictionary;
|
| - AddContainer(pDict);
|
| - m_bDictName = TRUE;
|
| -}
|
| -void CPDF_StreamContentParser::EndDict()
|
| -{
|
| - if (m_ObjectSize == 0) {
|
| - return;
|
| - }
|
| - CPDF_Object* pCurObj = m_pObjectStack[m_ObjectSize - 1];
|
| - if (pCurObj->GetType() != PDFOBJ_DICTIONARY) {
|
| - return;
|
| - }
|
| - m_ObjectSize --;
|
| - if (m_ObjectSize == 0) {
|
| - AddObjectParam(pCurObj);
|
| - } else {
|
| - if (!m_pObjectState[m_ObjectSize]) {
|
| - pCurObj->Release();
|
| - }
|
| - }
|
| - m_pObjectState[m_ObjectSize] = FALSE;
|
| -}
|
| -void CPDF_StreamContentParser::EndName()
|
| -{
|
| - if (m_ObjectSize == 0) {
|
| - AddNameParam((FX_LPCSTR)m_pWordBuf, m_WordSize);
|
| - return;
|
| - }
|
| - CPDF_Object* pCurObj = m_pObjectStack[m_ObjectSize - 1];
|
| - if (pCurObj->GetType() == PDFOBJ_ARRAY) {
|
| - ((CPDF_Array*)pCurObj)->AddName(CFX_ByteString(m_pWordBuf, m_WordSize));
|
| - } else {
|
| - if (m_bDictName) {
|
| - FXSYS_memcpy32(m_pDictName, m_pWordBuf, m_WordSize);
|
| - m_pDictName[m_WordSize] = 0;
|
| - } else {
|
| - if (m_pDictName[0] != 0) {
|
| - ((CPDF_Dictionary*)pCurObj)->SetAtName((FX_LPCSTR)m_pDictName, CFX_ByteString(m_pWordBuf, m_WordSize));
|
| - }
|
| - }
|
| - m_bDictName = !m_bDictName;
|
| - }
|
| -}
|
| -void CPDF_StreamContentParser::EndNumber()
|
| -{
|
| - if (m_ObjectSize == 0) {
|
| - AddNumberParam((FX_LPCSTR)m_pWordBuf, m_WordSize);
|
| - return;
|
| - }
|
| - CPDF_Number *pObj = FX_NEW CPDF_Number(CFX_ByteStringC(m_pWordBuf, m_WordSize));
|
| - if (!SetToCurObj(pObj)) {
|
| - pObj->Release();
|
| - }
|
| -}
|
| -extern CFX_ByteString _FPDF_ByteStringFromHex(CFX_BinaryBuf& src_buf);
|
| -void CPDF_StreamContentParser::EndHexString()
|
| -{
|
| - CPDF_String *pObj = FX_NEW CPDF_String(_FPDF_ByteStringFromHex(m_StringBuf), TRUE);
|
| - if (!SetToCurObj(pObj)) {
|
| - pObj->Release();
|
| - }
|
| -}
|
| -void CPDF_StreamContentParser::EndString()
|
| -{
|
| - CPDF_String *pObj = FX_NEW CPDF_String(m_StringBuf.GetByteString());
|
| - if (!SetToCurObj(pObj)) {
|
| - pObj->Release();
|
| - }
|
| -}
|
| -void CPDF_StreamContentParser::Handle_BeginImage(void)
|
| -{
|
| - m_WordState = 9;
|
| - m_InlineImageState = 0;
|
| - m_StringBuf.Clear();
|
| -}
|
| -void _PDF_ReplaceAbbr(CPDF_Object* pObj);
|
| -void CPDF_StreamContentParser::EndImageDict()
|
| -{
|
| - if (m_StringBuf.GetSize() != m_LastImageDict.GetSize() ||
|
| - FXSYS_memcmp32(m_StringBuf.GetBuffer(), m_LastImageDict.GetBuffer(), m_StringBuf.GetSize())) {
|
| - m_WordState = 0;
|
| - StartDict();
|
| - InputData(m_StringBuf.GetBuffer(), m_StringBuf.GetSize());
|
| - Finish();
|
| - m_bSameLastDict = FALSE;
|
| - if (m_pLastImageDict && m_bReleaseLastDict) {
|
| - m_pLastImageDict->Release();
|
| - m_pLastImageDict = NULL;
|
| - }
|
| - if (!m_ObjectSize) {
|
| - m_InlineImageState = 0;
|
| - return;
|
| - }
|
| - m_pLastImageDict = (CPDF_Dictionary*)m_pObjectStack[--m_ObjectSize];
|
| - m_bReleaseLastDict = !m_pObjectState[m_ObjectSize];
|
| - m_pObjectState[m_ObjectSize] = FALSE;
|
| - _PDF_ReplaceAbbr(m_pLastImageDict);
|
| - m_LastImageDict.TakeOver(m_StringBuf);
|
| - if (m_pLastImageDict->KeyExist(FX_BSTRC("ColorSpace"))) {
|
| - CPDF_Object* pCSObj = m_pLastImageDict->GetElementValue(FX_BSTRC("ColorSpace"));
|
| - if (pCSObj->GetType() == PDFOBJ_NAME) {
|
| - CFX_ByteString name = pCSObj->GetString();
|
| - if (name != FX_BSTRC("DeviceRGB") && name != FX_BSTRC("DeviceGray") && name != FX_BSTRC("DeviceCMYK")) {
|
| - pCSObj = FindResourceObj(FX_BSTRC("ColorSpace"), name);
|
| - if (pCSObj) {
|
| - if (!pCSObj->GetObjNum()) {
|
| - pCSObj = pCSObj->Clone();
|
| - }
|
| - m_pLastImageDict->SetAt(FX_BSTRC("ColorSpace"), pCSObj, m_pDocument);
|
| - }
|
| - }
|
| - }
|
| - }
|
| - } else {
|
| - m_bSameLastDict = TRUE;
|
| - }
|
| - m_ImageSrcBuf.Clear();
|
| - if (m_pLastCloneImageDict)
|
| - m_pLastCloneImageDict->Release();
|
| -
|
| - m_pLastCloneImageDict = (CPDF_Dictionary*)m_pLastImageDict->Clone();
|
| - if (m_pLastCloneImageDict->KeyExist(FX_BSTRC("Filter"))) {
|
| - m_WordState = 10;
|
| - m_InlineImageState = 0;
|
| - } else {
|
| - int width = m_pLastCloneImageDict->GetInteger(FX_BSTRC("Width"));
|
| - int height = m_pLastCloneImageDict->GetInteger(FX_BSTRC("Height"));
|
| - int OrigSize = 0;
|
| - CPDF_Object* pCSObj = m_pLastCloneImageDict->GetElementValue(FX_BSTRC("ColorSpace"));
|
| - if (pCSObj != NULL) {
|
| - int bpc = m_pLastCloneImageDict->GetInteger(FX_BSTRC("BitsPerComponent"));
|
| - int nComponents = 1;
|
| - CPDF_ColorSpace* pCS = m_pDocument->LoadColorSpace(pCSObj);
|
| - if (pCS == NULL) {
|
| - nComponents = 3;
|
| - } else {
|
| - nComponents = pCS->CountComponents();
|
| - m_pDocument->GetPageData()->ReleaseColorSpace(pCSObj);
|
| - }
|
| - int pitch = (width * bpc * nComponents + 7) / 8;
|
| - OrigSize = pitch * height;
|
| - } else {
|
| - OrigSize = ((width + 7) / 8) * height;
|
| - }
|
| - m_ImageSrcBuf.AppendBlock(NULL, OrigSize);
|
| - m_WordState = 11;
|
| - m_InlineImageState = 0;
|
| - }
|
| -}
|
| -void CPDF_StreamContentParser::EndInlineImage()
|
| -{
|
| - CFX_AffineMatrix ImageMatrix;
|
| - ImageMatrix.Copy(m_pCurStates->m_CTM);
|
| - ImageMatrix.Concat(m_mtContentToUser);
|
| - m_LastImageData.CopyData(m_ImageSrcBuf.GetBuffer(), m_ImageSrcBuf.GetSize());
|
| - CPDF_Stream* pStream = CPDF_Stream::Create(m_ImageSrcBuf.GetBuffer(), m_ImageSrcBuf.GetSize(),
|
| - m_pLastCloneImageDict);
|
| - m_ImageSrcBuf.DetachBuffer();
|
| - m_pLastCloneImageDict = NULL;
|
| - CPDF_InlineImages* pImages = FX_NEW CPDF_InlineImages;
|
| - pImages->m_pStream = pStream;
|
| - SetGraphicStates(pImages, !m_pLastCloneImageDict->KeyExist(FX_BSTRC("ColorSpace")), FALSE, FALSE);
|
| - pImages->AddMatrix(ImageMatrix);
|
| - m_pObjectList->m_ObjectList.AddTail(pImages);
|
| - m_WordState = 0;
|
| -}
|
| -#define FXDWORD_TRUE FXDWORD_FROM_LSBFIRST(0x65757274)
|
| -#define FXDWORD_NULL FXDWORD_FROM_LSBFIRST(0x6c6c756e)
|
| -#define FXDWORD_FALS FXDWORD_FROM_LSBFIRST(0x736c6166)
|
| -void CPDF_StreamContentParser::EndKeyword()
|
| -{
|
| - CPDF_Object *pObj = NULL;
|
| - if (m_WordSize == 4) {
|
| - if (*(FX_DWORD*)m_pWordBuf == FXDWORD_TRUE) {
|
| - pObj = CPDF_Boolean::Create(TRUE);
|
| - if (!SetToCurObj(pObj)) {
|
| - pObj->Release();
|
| - }
|
| - return;
|
| - } else if (*(FX_DWORD*)m_pWordBuf == FXDWORD_NULL) {
|
| - pObj = CPDF_Null::Create();
|
| - if (!SetToCurObj(pObj)) {
|
| - pObj->Release();
|
| - }
|
| - return;
|
| - }
|
| - } else if (m_WordSize == 5) {
|
| - if (*(FX_DWORD*)m_pWordBuf == FXDWORD_FALS && m_pWordBuf[4] == 'e') {
|
| - pObj = CPDF_Boolean::Create(FALSE);
|
| - if (!SetToCurObj(pObj)) {
|
| - pObj->Release();
|
| - }
|
| - return;
|
| - }
|
| - }
|
| - m_pWordBuf[m_WordSize] = 0;
|
| - OnOperator((char*)m_pWordBuf);
|
| - ClearAllParams();
|
| -}
|
| -#define PAGEPARSE_STAGE_PARSE 2
|
| -#define PAGEPARSE_STAGE_CHECKCLIP 3
|
| -CPDF_ContentParser::CPDF_ContentParser()
|
| -{
|
| - m_pParser = NULL;
|
| - m_Status = Ready;
|
| - m_pStreamFilter = NULL;
|
| - m_pType3Char = NULL;
|
| -}
|
| -CPDF_ContentParser::~CPDF_ContentParser()
|
| -{
|
| - Clear();
|
| -}
|
| -void CPDF_ContentParser::Clear()
|
| -{
|
| - if (m_pParser) {
|
| - delete m_pParser;
|
| - }
|
| - if (m_pStreamFilter) {
|
| - delete m_pStreamFilter;
|
| - }
|
| - m_pParser = NULL;
|
| - m_Status = Ready;
|
| -}
|
| -void CPDF_ContentParser::Start(CPDF_Page* pPage, CPDF_ParseOptions* pOptions)
|
| -{
|
| - if (m_Status != Ready || pPage == NULL || pPage->m_pDocument == NULL || pPage->m_pFormDict == NULL) {
|
| - m_Status = Done;
|
| - return;
|
| - }
|
| - m_pObjects = pPage;
|
| - m_bForm = FALSE;
|
| - if (pOptions) {
|
| - m_Options = *pOptions;
|
| - }
|
| - CPDF_Object* pContent = pPage->m_pFormDict->GetElementValue(FX_BSTRC("Contents"));
|
| - if (pContent == NULL) {
|
| - m_Status = Done;
|
| - return;
|
| - }
|
| - if (pContent->GetType() == PDFOBJ_STREAM) {
|
| - m_nStreams = 1;
|
| - } else if (pContent->GetType() == PDFOBJ_ARRAY) {
|
| - m_nStreams = ((CPDF_Array*)pContent)->GetCount();
|
| - } else {
|
| - m_Status = Done;
|
| - return;
|
| - }
|
| - m_Status = ToBeContinued;
|
| - m_InternalStage = PAGEPARSE_STAGE_PARSE;
|
| - m_CurrentOffset = 0;
|
| - m_pParser = FX_NEW CPDF_StreamContentParser;
|
| - m_pParser->Initialize();
|
| - m_pParser->PrepareParse(pPage->m_pDocument, pPage->m_pResources, NULL, NULL, pPage,
|
| - pPage->m_pResources, &pPage->m_BBox, &m_Options, NULL, 0);
|
| - m_pParser->m_pCurStates->m_ColorState.GetModify()->Default();
|
| -}
|
| -void CPDF_ContentParser::Start(CPDF_Form* pForm, CPDF_AllStates* pGraphicStates, CFX_AffineMatrix* pParentMatrix,
|
| - CPDF_Type3Char* pType3Char, CPDF_ParseOptions* pOptions, int level)
|
| -{
|
| - m_pType3Char = pType3Char;
|
| - m_pObjects = pForm;
|
| - m_bForm = TRUE;
|
| - CFX_AffineMatrix form_matrix = pForm->m_pFormDict->GetMatrix(FX_BSTRC("Matrix"));
|
| - if (pGraphicStates) {
|
| - form_matrix.Concat(pGraphicStates->m_CTM);
|
| - }
|
| - CPDF_Array* pBBox = pForm->m_pFormDict->GetArray(FX_BSTRC("BBox"));
|
| - CFX_FloatRect form_bbox;
|
| - CPDF_Path ClipPath;
|
| - if (pBBox) {
|
| - form_bbox = pBBox->GetRect();
|
| - ClipPath.New();
|
| - ClipPath.AppendRect(form_bbox.left, form_bbox.bottom, form_bbox.right, form_bbox.top);
|
| - ClipPath.Transform(&form_matrix);
|
| - if (pParentMatrix) {
|
| - ClipPath.Transform(pParentMatrix);
|
| - }
|
| - form_bbox.Transform(&form_matrix);
|
| - }
|
| - CPDF_Dictionary* pResources = pForm->m_pFormDict->GetDict(FX_BSTRC("Resources"));
|
| - m_pParser = FX_NEW CPDF_StreamContentParser;
|
| - m_pParser->Initialize();
|
| - m_pParser->PrepareParse(pForm->m_pDocument, pForm->m_pPageResources, pForm->m_pResources, pParentMatrix, pForm,
|
| - pResources, &form_bbox, pOptions, pGraphicStates, level);
|
| - m_pParser->m_pCurStates->m_CTM = form_matrix;
|
| - if (ClipPath.NotNull()) {
|
| - m_pParser->m_pCurStates->m_ClipPath.AppendPath(ClipPath, FXFILL_WINDING, TRUE);
|
| - }
|
| - if (pForm->m_Transparency & PDFTRANS_GROUP) {
|
| - CPDF_GeneralStateData* pData = m_pParser->m_pCurStates->m_GeneralState.GetModify();
|
| - pData->m_BlendType = FXDIB_BLEND_NORMAL;
|
| - pData->m_StrokeAlpha = 1.0f;
|
| - pData->m_FillAlpha = 1.0f;
|
| - pData->m_pSoftMask = NULL;
|
| - }
|
| - m_pStreamFilter = pForm->m_pFormStream->GetStreamFilter();
|
| - m_nStreams = 1;
|
| - m_Status = ToBeContinued;
|
| - m_InternalStage = PAGEPARSE_STAGE_PARSE;
|
| - m_CurrentOffset = 0;
|
| -}
|
| -void CPDF_ContentParser::Continue(IFX_Pause* pPause)
|
| -{
|
| - while (m_Status == ToBeContinued) {
|
| - if (m_InternalStage == PAGEPARSE_STAGE_PARSE) {
|
| - if (m_pStreamFilter == NULL) {
|
| - if (m_CurrentOffset == m_nStreams) {
|
| - m_InternalStage = PAGEPARSE_STAGE_CHECKCLIP;
|
| - if (m_pType3Char) {
|
| - m_pType3Char->m_bColored = m_pParser->m_bColored;
|
| - m_pType3Char->m_Width = FXSYS_round(m_pParser->m_Type3Data[0] * 1000);
|
| - m_pType3Char->m_BBox.left = FXSYS_round(m_pParser->m_Type3Data[2] * 1000);
|
| - m_pType3Char->m_BBox.bottom = FXSYS_round(m_pParser->m_Type3Data[3] * 1000);
|
| - m_pType3Char->m_BBox.right = FXSYS_round(m_pParser->m_Type3Data[4] * 1000);
|
| - m_pType3Char->m_BBox.top = FXSYS_round(m_pParser->m_Type3Data[5] * 1000);
|
| - m_pType3Char->m_bPageRequired = m_pParser->m_bResourceMissing;
|
| - }
|
| - delete m_pParser;
|
| - m_pParser = NULL;
|
| - continue;
|
| - }
|
| - CPDF_Object* pContent = m_pObjects->m_pFormDict->GetElementValue(FX_BSTRC("Contents"));
|
| - if (pContent->GetType() == PDFOBJ_STREAM) {
|
| - m_pStreamFilter = ((CPDF_Stream*)pContent)->GetStreamFilter();
|
| - } else {
|
| - CPDF_Stream* pStream = ((CPDF_Array*)pContent)->GetStream(m_CurrentOffset);
|
| - if (pStream == NULL) {
|
| - m_CurrentOffset ++;
|
| - continue;
|
| - }
|
| - m_pStreamFilter = pStream->GetStreamFilter();
|
| - }
|
| - }
|
| - FX_DWORD len = m_pStreamFilter->ReadBlock(m_pParser->m_pStreamBuf, STREAM_PARSE_BUFSIZE);
|
| - m_pParser->InputData(m_pParser->m_pStreamBuf, len);
|
| - if (m_pParser->m_bAbort) {
|
| - delete m_pStreamFilter;
|
| - m_pStreamFilter = NULL;
|
| - m_Status = Done;
|
| - delete m_pParser;
|
| - m_pParser = NULL;
|
| - return;
|
| - }
|
| - if (len < STREAM_PARSE_BUFSIZE) {
|
| - m_pParser->Finish();
|
| - m_CurrentOffset ++;
|
| - delete m_pStreamFilter;
|
| - m_pStreamFilter = NULL;
|
| - }
|
| - if (pPause && pPause->NeedToPauseNow()) {
|
| - return;
|
| - }
|
| - }
|
| - if (m_InternalStage == PAGEPARSE_STAGE_CHECKCLIP) {
|
| - FX_POSITION pos = m_pObjects->m_ObjectList.GetHeadPosition();
|
| - while (pos) {
|
| - CPDF_PageObject* pObj = (CPDF_PageObject*)m_pObjects->m_ObjectList.GetNext(pos);
|
| - if (pObj == NULL) {
|
| - continue;
|
| - }
|
| - if (pObj->m_ClipPath.IsNull()) {
|
| - continue;
|
| - }
|
| - if (pObj->m_ClipPath.GetPathCount() != 1) {
|
| - continue;
|
| - }
|
| - if (pObj->m_ClipPath.GetTextCount()) {
|
| - continue;
|
| - }
|
| - CPDF_Path ClipPath = pObj->m_ClipPath.GetPath(0);
|
| - if (!ClipPath.IsRect() || pObj->m_Type == PDFPAGE_SHADING) {
|
| - continue;
|
| - }
|
| - CFX_FloatRect old_rect(ClipPath.GetPointX(0), ClipPath.GetPointY(0),
|
| - ClipPath.GetPointX(2), ClipPath.GetPointY(2));
|
| - CFX_FloatRect obj_rect(pObj->m_Left, pObj->m_Bottom, pObj->m_Right, pObj->m_Top);
|
| - if (old_rect.Contains(obj_rect)) {
|
| - pObj->m_ClipPath.SetNull();
|
| - }
|
| - }
|
| - if (m_pObjects->m_ObjectList.GetCount() == 1) {
|
| - CPDF_PageObject* pObj = (CPDF_PageObject*)m_pObjects->m_ObjectList.GetAt(m_pObjects->m_ObjectList.GetHeadPosition());
|
| - if (pObj && pObj->m_Type == PDFPAGE_TEXT) {
|
| - CPDF_TextObject* pText = (CPDF_TextObject*)pObj;
|
| - }
|
| - }
|
| - m_Status = Done;
|
| - return;
|
| - }
|
| - }
|
| -}
|
| -int CPDF_ContentParser::EstimateProgress()
|
| -{
|
| - if (m_Status == Ready) {
|
| - return 0;
|
| - }
|
| - if (m_Status == Done) {
|
| - return 100;
|
| - }
|
| - if (m_InternalStage == PAGEPARSE_STAGE_CHECKCLIP) {
|
| - return 90;
|
| - }
|
| - if (m_pStreamFilter == NULL) {
|
| - return 90 * m_CurrentOffset / m_nStreams;
|
| - }
|
| - int total_raw_size = m_pStreamFilter->GetStream()->GetRawSize() * m_nStreams;
|
| - int parsed_raw_size = m_pStreamFilter->GetStream()->GetRawSize() * m_CurrentOffset +
|
| - m_pStreamFilter->GetSrcPos();
|
| - return 90 * parsed_raw_size / total_raw_size;
|
| -}
|
| -CPDF_InlineImages::CPDF_InlineImages()
|
| -{
|
| - m_Type = PDFPAGE_INLINES;
|
| - m_pStream = NULL;
|
| - m_pBitmap = NULL;
|
| -}
|
| -CPDF_InlineImages::~CPDF_InlineImages()
|
| -{
|
| - if (m_pStream) {
|
| - m_pStream->Release();
|
| - }
|
| - if (m_pBitmap) {
|
| - delete m_pBitmap;
|
| - }
|
| -}
|
| -void CPDF_InlineImages::AddMatrix(CFX_AffineMatrix& matrix)
|
| -{
|
| - m_Matrices.Add(matrix);
|
| - CFX_FloatRect rect = matrix.GetUnitRect();
|
| - if (m_Matrices.GetSize() > 1) {
|
| - CFX_FloatRect rect1(m_Left, m_Bottom, m_Right, m_Top);
|
| - rect.Union(rect1);
|
| - }
|
| - m_Left = rect.left;
|
| - m_Right = rect.right;
|
| - m_Top = rect.top;
|
| - m_Bottom = rect.bottom;
|
| -}
|
| -#endif
|
|
|