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
10 class CPDF_QuickFontCache;
11 #ifndef _FPDFAPI_MINI_
12 class CPDF_StreamParser : public CFX_Object
13 {
14 public:
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();
GetWordBuf()23 FX_LPBYTE GetWordBuf()
24 {
25 return m_WordBuffer;
26 }
GetWordSize()27 FX_DWORD GetWordSize()
28 {
29 return m_WordSize;
30 }
GetObject()31 CPDF_Object* GetObject()
32 {
33 CPDF_Object* pObj = m_pLastObj;
34 m_pLastObj = NULL;
35 return pObj;
36 }
GetPos()37 FX_DWORD GetPos()
38 {
39 return m_Pos;
40 }
SetPos(FX_DWORD pos)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();
48 protected:
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
60 typedef 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
100 typedef 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
124 class CPDF_StreamContentParser : public CFX_Object
125 {
126 public:
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);
GetInteger(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;
GetParsePos()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 };
320 class CPDF_ContentParser : public CFX_Object
321 {
322 public:
323 CPDF_ContentParser();
324 ~CPDF_ContentParser();
325 typedef enum { Ready, ToBeContinued, Done } ParseStatus;
GetStatus()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();
335 protected:
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 };
352 class CPDF_AllStates : public CPDF_GraphicStates
353 {
354 public:
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 };
364 template <class ObjClass> class CPDF_CountedObject : public CFX_Object
365 {
366 public:
367 ObjClass m_Obj;
368 FX_DWORD m_nCount;
369 };
370 typedef CFX_MapPtrTemplate<CPDF_Dictionary*, CPDF_CountedObject<CPDF_Font*>*> CPDF_FontMap;
371 typedef CFX_MapPtrTemplate<CPDF_Object*, CPDF_CountedObject<CPDF_ColorSpace*>*> CPDF_ColorSpaceMap;
372 typedef CFX_MapPtrTemplate<CPDF_Object*, CPDF_CountedObject<CPDF_Pattern*>*> CPDF_PatternMap;
373 typedef CFX_MapPtrTemplate<FX_DWORD, CPDF_CountedObject<CPDF_Image*>*> CPDF_ImageMap;
374 typedef CFX_MapPtrTemplate<CPDF_Stream*, CPDF_CountedObject<CPDF_IccProfile*>*> CPDF_IccProfileMap;
375 typedef CFX_MapPtrTemplate<CPDF_Stream*, CPDF_CountedObject<CPDF_StreamAcc*>*> CPDF_FontFileMap;
376 template <class KeyType, class ValueType>
PDF_DocPageData_FindValue(const CFX_MapPtrTemplate<KeyType,CPDF_CountedObject<ValueType> * > & map,ValueType findValue,CPDF_CountedObject<ValueType> * & findData)377 KeyType 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 }
390 template <class KeyType, class ValueType>
391 FX_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 }
410 class CPDF_DocPageData : public CFX_Object
411 {
412 public:
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 };
439 class CPDF_Function : public CFX_Object
440 {
441 public:
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;
CountInputs()445 int CountInputs()
446 {
447 return m_nInputs;
448 }
CountOutputs()449 int CountOutputs()
450 {
451 return m_nOutputs;
452 }
453 protected:
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 };
462 class CPDF_IccProfile : public CFX_Object
463 {
464 public:
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 };
470 class CPDF_DeviceCS : public CPDF_ColorSpace
471 {
472 public:
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 };
480 class CPDF_PatternCS : public CPDF_ColorSpace
481 {
482 public:
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;
GetBaseCS()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
494 class CPDF_ResourceNaming : public CFX_Object
495 {
496 public:
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);
503 protected:
504 CFX_MapByteStringToPtr m_NamingCache;
505 };
506