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