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