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