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_pageobj.h"
8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define PARSE_STEP_LIMIT		100
9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define STREAM_PARSE_BUFSIZE	20480
10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CPDF_QuickFontCache;
11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef _FPDFAPI_MINI_
12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CPDF_StreamParser : public CFX_Object
13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_StreamParser(const FX_BYTE* pData, FX_DWORD dwSize);
17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ~CPDF_StreamParser();
18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Stream*		ReadInlineStream(CPDF_Document* pDoc, CPDF_Dictionary* pDict, CPDF_Object* pCSObj, FX_BOOL bDecode);
20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    typedef enum { EndOfData, Number, Keyword, Name, Others } SyntaxType;
21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    SyntaxType			ParseNextElement();
23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_LPBYTE			GetWordBuf()
24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return m_WordBuffer;
26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD			GetWordSize()
28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return m_WordSize;
30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Object*		GetObject()
32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Object* pObj = m_pLastObj;
34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_pLastObj = NULL;
35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return pObj;
36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD			GetPos()
38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return m_Pos;
40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void				SetPos(FX_DWORD pos)
42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Pos = pos;
44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Object*		ReadNextObject(FX_BOOL bAllowNestedArray = FALSE, FX_BOOL bInArray = FALSE);
47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void				SkipPathObject();
48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovprotected:
49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void				GetNextWord(FX_BOOL& bIsNumber);
50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteString		ReadString();
51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteString		ReadHexString();
52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    const FX_BYTE*		m_pBuf;
53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD			m_Size;
54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD			m_Pos;
55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BYTE				m_WordBuffer[256];
56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD			m_WordSize;
57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Object*		m_pLastObj;
58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovtypedef enum {
61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PDFOP_CloseFillStrokePath = 0, PDFOP_FillStrokePath,
62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PDFOP_CloseEOFillStrokePath, PDFOP_EOFillStrokePath,
63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PDFOP_BeginMarkedContent_Dictionary, PDFOP_BeginImage,
64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PDFOP_BeginMarkedContent, PDFOP_BeginText,
65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PDFOP_BeginSectionUndefined, PDFOP_CurveTo_123,
66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PDFOP_ConcatMatrix, PDFOP_SetColorSpace_Fill,
67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PDFOP_SetColorSpace_Stroke, PDFOP_SetDash,
68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PDFOP_SetCharWidth, PDFOP_SetCachedDevice,
69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PDFOP_ExecuteXObject, PDFOP_MarkPlace_Dictionary,
70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PDFOP_EndImage, PDFOP_EndMarkedContent,
71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PDFOP_EndText, PDFOP_EndSectionUndefined,
72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PDFOP_FillPath, PDFOP_FillPathOld,
73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PDFOP_EOFillPath, PDFOP_SetGray_Fill,
74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PDFOP_SetGray_Stroke, PDFOP_SetExtendGraphState,
75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PDFOP_ClosePath, PDFOP_SetFlat,
76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PDFOP_BeginImageData, PDFOP_SetLineJoin,
77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PDFOP_SetLineCap, PDFOP_SetCMYKColor_Fill,
78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PDFOP_SetCMYKColor_Stroke, PDFOP_LineTo,
79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PDFOP_MoveTo, PDFOP_SetMiterLimit,
80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PDFOP_MarkPlace, PDFOP_EndPath,
81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PDFOP_SaveGraphState, PDFOP_RestoreGraphState,
82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PDFOP_Rectangle, PDFOP_SetRGBColor_Fill,
83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PDFOP_SetRGBColor_Stroke, PDFOP_SetRenderIntent,
84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PDFOP_CloseStrokePath, PDFOP_StrokePath,
85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PDFOP_SetColor_Fill, PDFOP_SetColor_Stroke,
86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PDFOP_SetColorPS_Fill, PDFOP_SetColorPS_Stroke,
87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PDFOP_ShadeFill, PDFOP_SetCharSpace,
88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PDFOP_MoveTextPoint, PDFOP_MoveTextPoint_SetLeading,
89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PDFOP_SetFont, PDFOP_ShowText,
90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PDFOP_ShowText_Positioning, PDFOP_SetTextLeading,
91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PDFOP_SetTextMatrix, PDFOP_SetTextRenderMode,
92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PDFOP_SetTextRise, PDFOP_SetWordSpace,
93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PDFOP_SetHorzScale, PDFOP_MoveToNextLine,
94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PDFOP_CurveTo_23, PDFOP_SetLineWidth,
95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PDFOP_Clip, PDFOP_EOClip,
96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PDFOP_CurveTo_13, PDFOP_NextLineShowText,
97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PDFOP_NextLineShowText_Space, PDFOP_Invalid
98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} PDFOP;
99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define PARAM_BUF_SIZE	16
100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovtypedef struct {
101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int			m_Type;
102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    union {
103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        struct {
104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            FX_BOOL		m_bInteger;
105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            union {
106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                int		m_Integer;
107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                FX_FLOAT m_Float;
108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            };
109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } m_Number;
110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Object*	m_pObject;
111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        struct {
112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            int			m_Len;
113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            char		m_Buffer[32];
114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } m_Name;
115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    };
116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} _ContentParam;
117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if defined(_FPDFAPI_MINI_)
118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define _FPDF_MAX_FORM_LEVEL_		17
119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else
120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define _FPDF_MAX_FORM_LEVEL_		30
121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define _FPDF_MAX_TYPE3_FORM_LEVEL_	4
123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define _FPDF_MAX_OBJECT_STACK_SIZE_ 512
124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CPDF_StreamContentParser : public CFX_Object
125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_StreamContentParser();
128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ~CPDF_StreamContentParser();
129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL Initialize();
130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void	PrepareParse(CPDF_Document* pDoc, CPDF_Dictionary* pPageResources, CPDF_Dictionary* pParentResources,
131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                         CFX_AffineMatrix* pmtContentToUser,
132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                         CPDF_PageObjects* pObjList, CPDF_Dictionary* pResources,
133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                         CFX_FloatRect* pBBox, CPDF_ParseOptions* pOptions,
134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                         CPDF_AllStates* pAllStates, int level);
135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Document*		m_pDocument;
136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Dictionary*	m_pPageResources;
137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Dictionary*	m_pParentResources;
138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_PageObjects*	m_pObjectList;
139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Dictionary*	m_pResources;
140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int					m_Level;
141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_AffineMatrix	m_mtContentToUser;
142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_FloatRect		m_BBox;
143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_ParseOptions	m_Options;
144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    _ContentParam		m_ParamBuf1[PARAM_BUF_SIZE];
145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD			m_ParamStartPos;
146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD			m_ParamCount;
147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void				AddNumberParam(FX_LPCSTR str, int len);
148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void				AddObjectParam(CPDF_Object* pObj);
149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void				AddNameParam(FX_LPCSTR name, int size);
150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int					GetNextParamPos();
151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void				ClearAllParams();
152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Object*		GetObject(FX_DWORD index);
153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteString		GetString(FX_DWORD index);
154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FLOAT			GetNumber(FX_DWORD index);
155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FLOAT		GetNumber16(FX_DWORD index);
156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int					GetInteger(FX_DWORD index)
157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return (FX_INT32)(GetNumber(index));
159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL				OnOperator(FX_LPCSTR op);
161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void				BigCaseCaller(int index);
162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL				m_bAbort;
163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef _FPDFAPI_MINI_
164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_StreamParser*	m_pSyntax;
165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD			GetParsePos()
166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return m_pSyntax->GetPos();
168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else
170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int					m_WordState;
171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void				InputData(FX_LPCBYTE src_buf, FX_DWORD src_size);
172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void				Finish();
173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void				StartArray();
174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void				EndArray();
175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void				StartDict();
176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void				EndDict();
177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void				EndName();
178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void				EndNumber();
179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void				EndKeyword();
180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void				EndHexString();
181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void				EndString();
182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void				EndImageDict();
183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void				EndInlineImage();
184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_LPBYTE			m_pWordBuf;
185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD			m_WordSize;
186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_BinaryBuf		m_StringBuf;
187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int					m_StringLevel, m_StringState, m_EscCode;
188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void				AddContainer(CPDF_Object* pObject);
189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL				SetToCurObj(CPDF_Object* pObject);
190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_LPBYTE			m_pDictName;
191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL				m_bDictName;
192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Object**		m_pObjectStack;
193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL*			m_pObjectState;
194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD			m_ObjectSize;
195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int					m_InlineImageState;
196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BYTE				m_InlineWhiteChar;
197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_BinaryBuf		m_ImageSrcBuf;
198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_LPBYTE			m_pStreamBuf;
199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_AllStates*		m_pCurStates;
201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_ContentMark	m_CurContentMark;
202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_PtrArray		m_ClipTextList;
203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_TextObject*	m_pLastTextObject;
204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FLOAT			m_DefFontSize;
205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void				AddTextObject(CFX_ByteString* pText, FX_FLOAT fInitKerning, FX_FLOAT* pKerning, int count);
206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void				ConvertUserSpace(FX_FLOAT& x, FX_FLOAT& y);
208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void				ConvertTextSpace(FX_FLOAT& x, FX_FLOAT& y);
209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void				OnChangeTextMatrix();
210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef _FPDFAPI_MINI_
211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD			Parse(FX_LPCBYTE pData, FX_DWORD dwSize, FX_DWORD max_cost);
212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void				ParsePathObject();
213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int					m_CompatCount;
215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_PATHPOINT*		m_pPathPoints;
216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int					m_PathPointCount;
217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int					m_PathAllocSize;
218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FLOAT			m_PathStartX, m_PathStartY;
219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FLOAT			m_PathCurrentX, m_PathCurrentY;
220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int					m_PathClipType;
221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void				AddPathPoint(FX_FLOAT x, FX_FLOAT y, int flag);
222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void				AddPathRect(FX_FLOAT x, FX_FLOAT y, FX_FLOAT w, FX_FLOAT h);
223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void				AddPathObject(int FillType, FX_BOOL bStroke);
224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_ImageObject*	AddImage(CPDF_Stream* pStream, CPDF_Image* pImage, FX_BOOL bInline);
225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void				AddDuplicateImage();
226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void				AddForm(CPDF_Stream*);
227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteString		m_LastImageName;
228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Image*			m_pLastImage;
229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_BinaryBuf		m_LastImageDict, m_LastImageData;
230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Dictionary*	m_pLastImageDict;
231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Dictionary*    m_pLastCloneImageDict;
232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL				m_bReleaseLastDict;
233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL				m_bSameLastDict;
234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void				SetGraphicStates(CPDF_PageObject* pObj, FX_BOOL bColor, FX_BOOL bText, FX_BOOL bGraph);
235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL				m_bColored;
236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FLOAT			m_Type3Data[6];
237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL				m_bResourceMissing;
238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_PtrArray		m_StateStack;
239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void				SaveStates(CPDF_AllStates*);
240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void				RestoreStates(CPDF_AllStates*);
241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Font*			FindFont(const CFX_ByteString& name);
242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_ColorSpace*	FindColorSpace(const CFX_ByteString& name);
243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Pattern*		FindPattern(const CFX_ByteString& name, FX_BOOL bShading);
244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Object*		FindResourceObj(FX_BSTR type, const CFX_ByteString& name);
245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_CloseFillStrokePath();
246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_FillStrokePath();
247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_CloseEOFillStrokePath();
248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_EOFillStrokePath();
249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_BeginMarkedContent_Dictionary();
250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_BeginImage();
251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_BeginMarkedContent();
252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_BeginText();
253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_BeginSectionUndefined();
254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_CurveTo_123();
255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_ConcatMatrix();
256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_SetColorSpace_Fill();
257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_SetColorSpace_Stroke();
258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_SetDash();
259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_SetCharWidth();
260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_SetCachedDevice();
261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_ExecuteXObject();
262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_MarkPlace_Dictionary();
263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_EndImage();
264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_EndMarkedContent();
265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_EndText();
266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_EndSectionUndefined();
267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_FillPath();
268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_FillPathOld();
269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_EOFillPath();
270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_SetGray_Fill();
271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_SetGray_Stroke();
272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_SetExtendGraphState();
273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_ClosePath();
274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_SetFlat();
275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_BeginImageData();
276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_SetLineJoin();
277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_SetLineCap();
278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_SetCMYKColor_Fill();
279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_SetCMYKColor_Stroke();
280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_LineTo();
281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_MoveTo();
282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_SetMiterLimit();
283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_MarkPlace();
284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_EndPath();
285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_SaveGraphState();
286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_RestoreGraphState();
287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_Rectangle();
288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_SetRGBColor_Fill();
289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_SetRGBColor_Stroke();
290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_SetRenderIntent();
291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_CloseStrokePath();
292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_StrokePath();
293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_SetColor_Fill();
294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_SetColor_Stroke();
295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_SetColorPS_Fill();
296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_SetColorPS_Stroke();
297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_ShadeFill();
298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_SetCharSpace();
299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_MoveTextPoint();
300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_MoveTextPoint_SetLeading();
301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_SetFont();
302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_ShowText();
303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_ShowText_Positioning();
304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_SetTextLeading();
305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_SetTextMatrix();
306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_SetTextRenderMode();
307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_SetTextRise();
308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_SetWordSpace();
309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_SetHorzScale();
310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_MoveToNextLine();
311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_CurveTo_23();
312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_SetLineWidth();
313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_Clip();
314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_EOClip();
315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_CurveTo_13();
316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_NextLineShowText();
317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_NextLineShowText_Space();
318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Handle_Invalid();
319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CPDF_ContentParser : public CFX_Object
321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_ContentParser();
324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ~CPDF_ContentParser();
325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    typedef enum { Ready, ToBeContinued, Done } ParseStatus;
326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ParseStatus			GetStatus()
327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return m_Status;
329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void				Start(CPDF_Page* pPage, CPDF_ParseOptions* pOptions);
331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void				Start(CPDF_Form* pForm, CPDF_AllStates* pGraphicStates, CFX_AffineMatrix* pParentMatrix,
332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                              CPDF_Type3Char* pType3Char, CPDF_ParseOptions* pOptions, int level);
333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void				Continue(IFX_Pause* pPause);
334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int					EstimateProgress();
335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovprotected:
336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void				Clear();
337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ParseStatus			m_Status;
338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_PageObjects*	m_pObjects;
339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL				m_bForm;
340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_ParseOptions	m_Options;
341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Type3Char*		m_pType3Char;
342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int					m_InternalStage;
343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_StreamAcc*		m_pSingleStream;
344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_StreamAcc**	m_pStreamArray;
345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD			m_nStreams;
346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_LPBYTE			m_pData;
347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD			m_Size;
348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    class CPDF_StreamContentParser*	m_pParser;
349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD			m_CurrentOffset;
350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_StreamFilter*	m_pStreamFilter;
351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CPDF_AllStates : public CPDF_GraphicStates
353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_AllStates();
356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ~CPDF_AllStates();
357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void	Copy(const CPDF_AllStates& src);
358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void	ProcessExtGS(CPDF_Dictionary* pGS, CPDF_StreamContentParser* pParser);
359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void	SetLineDash(CPDF_Array*, FX_FLOAT, FX_FLOAT scale);
360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_AffineMatrix		m_TextMatrix, m_CTM, m_ParentMatrix;
361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FLOAT				m_TextX, m_TextY, m_TextLineX, m_TextLineY;
362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FLOAT				m_TextLeading, m_TextRise, m_TextHorzScale;
363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovtemplate <class ObjClass> class CPDF_CountedObject : public CFX_Object
365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ObjClass	m_Obj;
368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD	m_nCount;
369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovtypedef CFX_MapPtrTemplate<CPDF_Dictionary*, CPDF_CountedObject<CPDF_Font*>*>		CPDF_FontMap;
371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovtypedef CFX_MapPtrTemplate<CPDF_Object*, CPDF_CountedObject<CPDF_ColorSpace*>*>		CPDF_ColorSpaceMap;
372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovtypedef CFX_MapPtrTemplate<CPDF_Object*, CPDF_CountedObject<CPDF_Pattern*>*>		CPDF_PatternMap;
373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovtypedef CFX_MapPtrTemplate<FX_DWORD, CPDF_CountedObject<CPDF_Image*>*>				CPDF_ImageMap;
374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovtypedef CFX_MapPtrTemplate<CPDF_Stream*, CPDF_CountedObject<CPDF_IccProfile*>*>		CPDF_IccProfileMap;
375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovtypedef CFX_MapPtrTemplate<CPDF_Stream*, CPDF_CountedObject<CPDF_StreamAcc*>*>		CPDF_FontFileMap;
376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovtemplate <class KeyType, class ValueType>
377ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovKeyType PDF_DocPageData_FindValue(const CFX_MapPtrTemplate<KeyType, CPDF_CountedObject<ValueType>*> &map, ValueType findValue, CPDF_CountedObject<ValueType>*& findData)
378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_POSITION pos = map.GetStartPosition();
380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    while (pos) {
381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        KeyType findKey;
382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        map.GetNextAssoc(pos, findKey, findData);
383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (findData->m_Obj == findValue) {
384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return findKey;
385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    findData = NULL;
388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return (KeyType)(FX_UINTPTR)NULL;
389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovtemplate <class KeyType, class ValueType>
391ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL PDF_DocPageData_Release(CFX_MapPtrTemplate<KeyType, CPDF_CountedObject<ValueType>*> &map, KeyType findKey, ValueType findValue, FX_BOOL bForce = FALSE)
392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!findKey && !findValue) {
394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_CountedObject<ValueType>* findData = NULL;
397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!findKey) {
398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        findKey = PDF_DocPageData_FindValue<KeyType, ValueType>(map, findValue, findData);
399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else if (!map.Lookup(findKey, findData)) {
400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (findData && ((-- findData->m_nCount) == 0 || bForce)) {
403ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        delete findData->m_Obj;
404ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        delete findData;
405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        map.RemoveKey(findKey);
406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return TRUE;
407ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
408ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return FALSE;
409ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CPDF_DocPageData : public CFX_Object
411ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
412ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_DocPageData(CPDF_Document *pPDFDoc);
414ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ~CPDF_DocPageData();
415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void					Clear(FX_BOOL bRelease = FALSE);
416ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Font*				GetFont(CPDF_Dictionary* pFontDict, FX_BOOL findOnly);
417ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Font*				GetStandardFont(FX_BSTR fontName, CPDF_FontEncoding* pEncoding);
418ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void					ReleaseFont(CPDF_Dictionary* pFontDict);
419ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_ColorSpace*		GetColorSpace(CPDF_Object* pCSObj, CPDF_Dictionary* pResources);
420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_ColorSpace*		GetCopiedColorSpace(CPDF_Object* pCSObj);
421ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void					ReleaseColorSpace(CPDF_Object* pColorSpace);
422ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Pattern*			GetPattern(CPDF_Object* pPatternObj, FX_BOOL bShading, const CFX_AffineMatrix* matrix);
423ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void					ReleasePattern(CPDF_Object* pPatternObj);
424ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Image*				GetImage(CPDF_Object* pImageStream);
425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void					ReleaseImage(CPDF_Object* pImageStream);
426ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_IccProfile*		GetIccProfile(CPDF_Stream* pIccProfileStream, FX_INT32 nComponents);
427ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void					ReleaseIccProfile(CPDF_Stream* pIccProfileStream, CPDF_IccProfile* pIccProfile);
428ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_StreamAcc*			GetFontFileStreamAcc(CPDF_Stream* pFontStream);
429ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void					ReleaseFontFileStreamAcc(CPDF_Stream* pFontStream, FX_BOOL bForce = FALSE);
430ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Document*			m_pPDFDoc;
431ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_FontMap			m_FontMap;
432ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_ColorSpaceMap		m_ColorSpaceMap;
433ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_PatternMap			m_PatternMap;
434ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_ImageMap			m_ImageMap;
435ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_IccProfileMap		m_IccProfileMap;
436ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_MapByteStringToPtr	m_HashProfileMap;
437ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_FontFileMap		m_FontFileMap;
438ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
439ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CPDF_Function : public CFX_Object
440ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
441ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
442ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    static CPDF_Function*	Load(CPDF_Object* pFuncObj);
443ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    virtual ~CPDF_Function();
444ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL		Call(FX_FLOAT* inputs, int ninputs, FX_FLOAT* results, int& nresults) const;
445ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int			CountInputs()
446ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
447ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return m_nInputs;
448ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
449ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int			CountOutputs()
450ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
451ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return m_nOutputs;
452ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
453ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovprotected:
454ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Function();
455ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int			m_nInputs, m_nOutputs;
456ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FLOAT*	m_pDomains;
457ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FLOAT*	m_pRanges;
458ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL		Init(CPDF_Object* pObj);
459ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    virtual FX_BOOL	v_Init(CPDF_Object* pObj) = 0;
460ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    virtual FX_BOOL	v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const = 0;
461ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
462ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CPDF_IccProfile : public CFX_Object
463ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
464ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
465ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_IccProfile(FX_LPCBYTE pData, FX_DWORD dwSize, int nComponents);
466ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ~CPDF_IccProfile();
467ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL					m_bsRGB;
468ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_LPVOID				m_pTransform;
469ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
470ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CPDF_DeviceCS : public CPDF_ColorSpace
471ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_DeviceCS(int family);
474ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    virtual FX_BOOL	GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const;
475ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL	SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const;
476ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL	v_GetCMYK(FX_FLOAT* pBuf, FX_FLOAT& c, FX_FLOAT& m, FX_FLOAT& y, FX_FLOAT& k) const;
477ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL	v_SetCMYK(FX_FLOAT* pBuf, FX_FLOAT c, FX_FLOAT m, FX_FLOAT y, FX_FLOAT k) const;
478ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    virtual void	TranslateImageLine(FX_LPBYTE pDestBuf, FX_LPCBYTE pSrcBuf, int pixels, int image_width, int image_height, FX_BOOL bTransMask = FALSE) const;
479ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
480ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CPDF_PatternCS : public CPDF_ColorSpace
481ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
482ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
483ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_PatternCS();
484ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ~CPDF_PatternCS();
485ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    virtual FX_BOOL		v_Load(CPDF_Document* pDoc, CPDF_Array* pArray);
486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    virtual FX_BOOL		GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const;
487ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    virtual CPDF_ColorSpace*	GetBaseCS() const
488ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
489ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return m_pBaseCS;
490ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
491ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_ColorSpace*	m_pBaseCS;
492ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
493ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define	MAX_PAGE_OBJECTS_UNIFY_NAMING				4096
494ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CPDF_ResourceNaming : public CFX_Object
495ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
496ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
497ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    struct _NamingState : public CFX_Object {
498ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_ByteString	m_Prefix;
499ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        int				m_nIndex;
500ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    };
501ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ~CPDF_ResourceNaming();
502ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteString		GetName(const CPDF_Dictionary* pResList, FX_LPCSTR szType);
503ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovprotected:
504ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_MapByteStringToPtr	m_NamingCache;
505ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
506