diff options
Diffstat (limited to 'core/src/fpdfapi/fpdf_page/pageint.h')
-rw-r--r-- | core/src/fpdfapi/fpdf_page/pageint.h | 1010 |
1 files changed, 505 insertions, 505 deletions
diff --git a/core/src/fpdfapi/fpdf_page/pageint.h b/core/src/fpdfapi/fpdf_page/pageint.h index b1a83ec236..4e097ca49e 100644 --- a/core/src/fpdfapi/fpdf_page/pageint.h +++ b/core/src/fpdfapi/fpdf_page/pageint.h @@ -1,505 +1,505 @@ -// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fpdfapi/fpdf_pageobj.h"
-#define PARSE_STEP_LIMIT 100
-#define STREAM_PARSE_BUFSIZE 20480
-class CPDF_QuickFontCache;
-#ifndef _FPDFAPI_MINI_
-class CPDF_StreamParser : public CFX_Object
-{
-public:
-
- CPDF_StreamParser(const FX_BYTE* pData, FX_DWORD dwSize);
- ~CPDF_StreamParser();
-
- CPDF_Stream* ReadInlineStream(CPDF_Document* pDoc, CPDF_Dictionary* pDict, CPDF_Object* pCSObj, FX_BOOL bDecode);
- typedef enum { EndOfData, Number, Keyword, Name, Others } SyntaxType;
-
- SyntaxType ParseNextElement();
- FX_LPBYTE GetWordBuf()
- {
- return m_WordBuffer;
- }
- FX_DWORD GetWordSize()
- {
- return m_WordSize;
- }
- CPDF_Object* GetObject()
- {
- CPDF_Object* pObj = m_pLastObj;
- m_pLastObj = NULL;
- return pObj;
- }
- FX_DWORD GetPos()
- {
- return m_Pos;
- }
- void SetPos(FX_DWORD pos)
- {
- m_Pos = pos;
- }
-
- CPDF_Object* ReadNextObject(FX_BOOL bAllowNestedArray = FALSE, FX_BOOL bInArray = FALSE);
- void SkipPathObject();
-protected:
- void GetNextWord(FX_BOOL& bIsNumber);
- CFX_ByteString ReadString();
- CFX_ByteString ReadHexString();
- const FX_BYTE* m_pBuf;
- FX_DWORD m_Size;
- FX_DWORD m_Pos;
- FX_BYTE m_WordBuffer[256];
- FX_DWORD m_WordSize;
- CPDF_Object* m_pLastObj;
-};
-#endif
-typedef enum {
- PDFOP_CloseFillStrokePath = 0, PDFOP_FillStrokePath,
- PDFOP_CloseEOFillStrokePath, PDFOP_EOFillStrokePath,
- PDFOP_BeginMarkedContent_Dictionary, PDFOP_BeginImage,
- PDFOP_BeginMarkedContent, PDFOP_BeginText,
- PDFOP_BeginSectionUndefined, PDFOP_CurveTo_123,
- PDFOP_ConcatMatrix, PDFOP_SetColorSpace_Fill,
- PDFOP_SetColorSpace_Stroke, PDFOP_SetDash,
- PDFOP_SetCharWidth, PDFOP_SetCachedDevice,
- PDFOP_ExecuteXObject, PDFOP_MarkPlace_Dictionary,
- PDFOP_EndImage, PDFOP_EndMarkedContent,
- PDFOP_EndText, PDFOP_EndSectionUndefined,
- PDFOP_FillPath, PDFOP_FillPathOld,
- PDFOP_EOFillPath, PDFOP_SetGray_Fill,
- PDFOP_SetGray_Stroke, PDFOP_SetExtendGraphState,
- PDFOP_ClosePath, PDFOP_SetFlat,
- PDFOP_BeginImageData, PDFOP_SetLineJoin,
- PDFOP_SetLineCap, PDFOP_SetCMYKColor_Fill,
- PDFOP_SetCMYKColor_Stroke, PDFOP_LineTo,
- PDFOP_MoveTo, PDFOP_SetMiterLimit,
- PDFOP_MarkPlace, PDFOP_EndPath,
- PDFOP_SaveGraphState, PDFOP_RestoreGraphState,
- PDFOP_Rectangle, PDFOP_SetRGBColor_Fill,
- PDFOP_SetRGBColor_Stroke, PDFOP_SetRenderIntent,
- PDFOP_CloseStrokePath, PDFOP_StrokePath,
- PDFOP_SetColor_Fill, PDFOP_SetColor_Stroke,
- PDFOP_SetColorPS_Fill, PDFOP_SetColorPS_Stroke,
- PDFOP_ShadeFill, PDFOP_SetCharSpace,
- PDFOP_MoveTextPoint, PDFOP_MoveTextPoint_SetLeading,
- PDFOP_SetFont, PDFOP_ShowText,
- PDFOP_ShowText_Positioning, PDFOP_SetTextLeading,
- PDFOP_SetTextMatrix, PDFOP_SetTextRenderMode,
- PDFOP_SetTextRise, PDFOP_SetWordSpace,
- PDFOP_SetHorzScale, PDFOP_MoveToNextLine,
- PDFOP_CurveTo_23, PDFOP_SetLineWidth,
- PDFOP_Clip, PDFOP_EOClip,
- PDFOP_CurveTo_13, PDFOP_NextLineShowText,
- PDFOP_NextLineShowText_Space, PDFOP_Invalid
-} PDFOP;
-#define PARAM_BUF_SIZE 16
-typedef struct {
- int m_Type;
- union {
- struct {
- FX_BOOL m_bInteger;
- union {
- int m_Integer;
- FX_FLOAT m_Float;
- };
- } m_Number;
- CPDF_Object* m_pObject;
- struct {
- int m_Len;
- char m_Buffer[32];
- } m_Name;
- };
-} _ContentParam;
-#if defined(_FPDFAPI_MINI_)
-#define _FPDF_MAX_FORM_LEVEL_ 17
-#else
-#define _FPDF_MAX_FORM_LEVEL_ 30
-#endif
-#define _FPDF_MAX_TYPE3_FORM_LEVEL_ 4
-#define _FPDF_MAX_OBJECT_STACK_SIZE_ 512
-class CPDF_StreamContentParser : public CFX_Object
-{
-public:
- CPDF_StreamContentParser();
- ~CPDF_StreamContentParser();
- FX_BOOL Initialize();
- void PrepareParse(CPDF_Document* pDoc, CPDF_Dictionary* pPageResources, CPDF_Dictionary* pParentResources,
- CFX_AffineMatrix* pmtContentToUser,
- CPDF_PageObjects* pObjList, CPDF_Dictionary* pResources,
- CFX_FloatRect* pBBox, CPDF_ParseOptions* pOptions,
- CPDF_AllStates* pAllStates, int level);
- CPDF_Document* m_pDocument;
- CPDF_Dictionary* m_pPageResources;
- CPDF_Dictionary* m_pParentResources;
- CPDF_PageObjects* m_pObjectList;
- CPDF_Dictionary* m_pResources;
- int m_Level;
- CFX_AffineMatrix m_mtContentToUser;
- CFX_FloatRect m_BBox;
- CPDF_ParseOptions m_Options;
- _ContentParam m_ParamBuf1[PARAM_BUF_SIZE];
- FX_DWORD m_ParamStartPos;
- FX_DWORD m_ParamCount;
- void AddNumberParam(FX_LPCSTR str, int len);
- void AddObjectParam(CPDF_Object* pObj);
- void AddNameParam(FX_LPCSTR name, int size);
- int GetNextParamPos();
- void ClearAllParams();
- CPDF_Object* GetObject(FX_DWORD index);
- CFX_ByteString GetString(FX_DWORD index);
- FX_FLOAT GetNumber(FX_DWORD index);
- FX_FLOAT GetNumber16(FX_DWORD index);
- int GetInteger(FX_DWORD index)
- {
- return (FX_INT32)(GetNumber(index));
- }
- FX_BOOL OnOperator(FX_LPCSTR op);
- void BigCaseCaller(int index);
- FX_BOOL m_bAbort;
-#ifndef _FPDFAPI_MINI_
- CPDF_StreamParser* m_pSyntax;
- FX_DWORD GetParsePos()
- {
- return m_pSyntax->GetPos();
- }
-#else
- int m_WordState;
- void InputData(FX_LPCBYTE src_buf, FX_DWORD src_size);
- void Finish();
- void StartArray();
- void EndArray();
- void StartDict();
- void EndDict();
- void EndName();
- void EndNumber();
- void EndKeyword();
- void EndHexString();
- void EndString();
- void EndImageDict();
- void EndInlineImage();
- FX_LPBYTE m_pWordBuf;
- FX_DWORD m_WordSize;
- CFX_BinaryBuf m_StringBuf;
- int m_StringLevel, m_StringState, m_EscCode;
- void AddContainer(CPDF_Object* pObject);
- FX_BOOL SetToCurObj(CPDF_Object* pObject);
- FX_LPBYTE m_pDictName;
- FX_BOOL m_bDictName;
- CPDF_Object** m_pObjectStack;
- FX_BOOL* m_pObjectState;
- FX_DWORD m_ObjectSize;
- int m_InlineImageState;
- FX_BYTE m_InlineWhiteChar;
- CFX_BinaryBuf m_ImageSrcBuf;
- FX_LPBYTE m_pStreamBuf;
-#endif
- CPDF_AllStates* m_pCurStates;
- CPDF_ContentMark m_CurContentMark;
- CFX_PtrArray m_ClipTextList;
- CPDF_TextObject* m_pLastTextObject;
- FX_FLOAT m_DefFontSize;
- void AddTextObject(CFX_ByteString* pText, FX_FLOAT fInitKerning, FX_FLOAT* pKerning, int count);
-
- void ConvertUserSpace(FX_FLOAT& x, FX_FLOAT& y);
- void ConvertTextSpace(FX_FLOAT& x, FX_FLOAT& y);
- void OnChangeTextMatrix();
-#ifndef _FPDFAPI_MINI_
- FX_DWORD Parse(FX_LPCBYTE pData, FX_DWORD dwSize, FX_DWORD max_cost);
- void ParsePathObject();
-#endif
- int m_CompatCount;
- FX_PATHPOINT* m_pPathPoints;
- int m_PathPointCount;
- int m_PathAllocSize;
- FX_FLOAT m_PathStartX, m_PathStartY;
- FX_FLOAT m_PathCurrentX, m_PathCurrentY;
- int m_PathClipType;
- void AddPathPoint(FX_FLOAT x, FX_FLOAT y, int flag);
- void AddPathRect(FX_FLOAT x, FX_FLOAT y, FX_FLOAT w, FX_FLOAT h);
- void AddPathObject(int FillType, FX_BOOL bStroke);
- CPDF_ImageObject* AddImage(CPDF_Stream* pStream, CPDF_Image* pImage, FX_BOOL bInline);
- void AddDuplicateImage();
- void AddForm(CPDF_Stream*);
- CFX_ByteString m_LastImageName;
- CPDF_Image* m_pLastImage;
- CFX_BinaryBuf m_LastImageDict, m_LastImageData;
- CPDF_Dictionary* m_pLastImageDict;
- CPDF_Dictionary* m_pLastCloneImageDict;
- FX_BOOL m_bReleaseLastDict;
- FX_BOOL m_bSameLastDict;
- void SetGraphicStates(CPDF_PageObject* pObj, FX_BOOL bColor, FX_BOOL bText, FX_BOOL bGraph);
- FX_BOOL m_bColored;
- FX_FLOAT m_Type3Data[6];
- FX_BOOL m_bResourceMissing;
- CFX_PtrArray m_StateStack;
- void SaveStates(CPDF_AllStates*);
- void RestoreStates(CPDF_AllStates*);
- CPDF_Font* FindFont(const CFX_ByteString& name);
- CPDF_ColorSpace* FindColorSpace(const CFX_ByteString& name);
- CPDF_Pattern* FindPattern(const CFX_ByteString& name, FX_BOOL bShading);
- CPDF_Object* FindResourceObj(FX_BSTR type, const CFX_ByteString& name);
- void Handle_CloseFillStrokePath();
- void Handle_FillStrokePath();
- void Handle_CloseEOFillStrokePath();
- void Handle_EOFillStrokePath();
- void Handle_BeginMarkedContent_Dictionary();
- void Handle_BeginImage();
- void Handle_BeginMarkedContent();
- void Handle_BeginText();
- void Handle_BeginSectionUndefined();
- void Handle_CurveTo_123();
- void Handle_ConcatMatrix();
- void Handle_SetColorSpace_Fill();
- void Handle_SetColorSpace_Stroke();
- void Handle_SetDash();
- void Handle_SetCharWidth();
- void Handle_SetCachedDevice();
- void Handle_ExecuteXObject();
- void Handle_MarkPlace_Dictionary();
- void Handle_EndImage();
- void Handle_EndMarkedContent();
- void Handle_EndText();
- void Handle_EndSectionUndefined();
- void Handle_FillPath();
- void Handle_FillPathOld();
- void Handle_EOFillPath();
- void Handle_SetGray_Fill();
- void Handle_SetGray_Stroke();
- void Handle_SetExtendGraphState();
- void Handle_ClosePath();
- void Handle_SetFlat();
- void Handle_BeginImageData();
- void Handle_SetLineJoin();
- void Handle_SetLineCap();
- void Handle_SetCMYKColor_Fill();
- void Handle_SetCMYKColor_Stroke();
- void Handle_LineTo();
- void Handle_MoveTo();
- void Handle_SetMiterLimit();
- void Handle_MarkPlace();
- void Handle_EndPath();
- void Handle_SaveGraphState();
- void Handle_RestoreGraphState();
- void Handle_Rectangle();
- void Handle_SetRGBColor_Fill();
- void Handle_SetRGBColor_Stroke();
- void Handle_SetRenderIntent();
- void Handle_CloseStrokePath();
- void Handle_StrokePath();
- void Handle_SetColor_Fill();
- void Handle_SetColor_Stroke();
- void Handle_SetColorPS_Fill();
- void Handle_SetColorPS_Stroke();
- void Handle_ShadeFill();
- void Handle_SetCharSpace();
- void Handle_MoveTextPoint();
- void Handle_MoveTextPoint_SetLeading();
- void Handle_SetFont();
- void Handle_ShowText();
- void Handle_ShowText_Positioning();
- void Handle_SetTextLeading();
- void Handle_SetTextMatrix();
- void Handle_SetTextRenderMode();
- void Handle_SetTextRise();
- void Handle_SetWordSpace();
- void Handle_SetHorzScale();
- void Handle_MoveToNextLine();
- void Handle_CurveTo_23();
- void Handle_SetLineWidth();
- void Handle_Clip();
- void Handle_EOClip();
- void Handle_CurveTo_13();
- void Handle_NextLineShowText();
- void Handle_NextLineShowText_Space();
- void Handle_Invalid();
-};
-class CPDF_ContentParser : public CFX_Object
-{
-public:
- CPDF_ContentParser();
- ~CPDF_ContentParser();
- typedef enum { Ready, ToBeContinued, Done } ParseStatus;
- ParseStatus GetStatus()
- {
- return m_Status;
- }
- void Start(CPDF_Page* pPage, CPDF_ParseOptions* pOptions);
- void Start(CPDF_Form* pForm, CPDF_AllStates* pGraphicStates, CFX_AffineMatrix* pParentMatrix,
- CPDF_Type3Char* pType3Char, CPDF_ParseOptions* pOptions, int level);
- void Continue(IFX_Pause* pPause);
- int EstimateProgress();
-protected:
- void Clear();
- ParseStatus m_Status;
- CPDF_PageObjects* m_pObjects;
- FX_BOOL m_bForm;
- CPDF_ParseOptions m_Options;
- CPDF_Type3Char* m_pType3Char;
- int m_InternalStage;
- CPDF_StreamAcc* m_pSingleStream;
- CPDF_StreamAcc** m_pStreamArray;
- FX_DWORD m_nStreams;
- FX_LPBYTE m_pData;
- FX_DWORD m_Size;
- class CPDF_StreamContentParser* m_pParser;
- FX_DWORD m_CurrentOffset;
- CPDF_StreamFilter* m_pStreamFilter;
-};
-class CPDF_AllStates : public CPDF_GraphicStates
-{
-public:
- CPDF_AllStates();
- ~CPDF_AllStates();
- void Copy(const CPDF_AllStates& src);
- void ProcessExtGS(CPDF_Dictionary* pGS, CPDF_StreamContentParser* pParser);
- void SetLineDash(CPDF_Array*, FX_FLOAT, FX_FLOAT scale);
- CFX_AffineMatrix m_TextMatrix, m_CTM, m_ParentMatrix;
- FX_FLOAT m_TextX, m_TextY, m_TextLineX, m_TextLineY;
- FX_FLOAT m_TextLeading, m_TextRise, m_TextHorzScale;
-};
-template <class ObjClass> class CPDF_CountedObject : public CFX_Object
-{
-public:
- ObjClass m_Obj;
- FX_DWORD m_nCount;
-};
-typedef CFX_MapPtrTemplate<CPDF_Dictionary*, CPDF_CountedObject<CPDF_Font*>*> CPDF_FontMap;
-typedef CFX_MapPtrTemplate<CPDF_Object*, CPDF_CountedObject<CPDF_ColorSpace*>*> CPDF_ColorSpaceMap;
-typedef CFX_MapPtrTemplate<CPDF_Object*, CPDF_CountedObject<CPDF_Pattern*>*> CPDF_PatternMap;
-typedef CFX_MapPtrTemplate<FX_DWORD, CPDF_CountedObject<CPDF_Image*>*> CPDF_ImageMap;
-typedef CFX_MapPtrTemplate<CPDF_Stream*, CPDF_CountedObject<CPDF_IccProfile*>*> CPDF_IccProfileMap;
-typedef CFX_MapPtrTemplate<CPDF_Stream*, CPDF_CountedObject<CPDF_StreamAcc*>*> CPDF_FontFileMap;
-template <class KeyType, class ValueType>
-KeyType PDF_DocPageData_FindValue(const CFX_MapPtrTemplate<KeyType, CPDF_CountedObject<ValueType>*> &map, ValueType findValue, CPDF_CountedObject<ValueType>*& findData)
-{
- FX_POSITION pos = map.GetStartPosition();
- while (pos) {
- KeyType findKey;
- map.GetNextAssoc(pos, findKey, findData);
- if (findData->m_Obj == findValue) {
- return findKey;
- }
- }
- findData = NULL;
- return (KeyType)(FX_UINTPTR)NULL;
-}
-template <class KeyType, class ValueType>
-FX_BOOL PDF_DocPageData_Release(CFX_MapPtrTemplate<KeyType, CPDF_CountedObject<ValueType>*> &map, KeyType findKey, ValueType findValue, FX_BOOL bForce = FALSE)
-{
- if (!findKey && !findValue) {
- return FALSE;
- }
- CPDF_CountedObject<ValueType>* findData = NULL;
- if (!findKey) {
- findKey = PDF_DocPageData_FindValue<KeyType, ValueType>(map, findValue, findData);
- } else if (!map.Lookup(findKey, findData)) {
- return FALSE;
- }
- if (findData && ((-- findData->m_nCount) == 0 || bForce)) {
- delete findData->m_Obj;
- delete findData;
- map.RemoveKey(findKey);
- return TRUE;
- }
- return FALSE;
-}
-class CPDF_DocPageData : public CFX_Object
-{
-public:
- CPDF_DocPageData(CPDF_Document *pPDFDoc);
- ~CPDF_DocPageData();
- void Clear(FX_BOOL bRelease = FALSE);
- CPDF_Font* GetFont(CPDF_Dictionary* pFontDict, FX_BOOL findOnly);
- CPDF_Font* GetStandardFont(FX_BSTR fontName, CPDF_FontEncoding* pEncoding);
- void ReleaseFont(CPDF_Dictionary* pFontDict);
- CPDF_ColorSpace* GetColorSpace(CPDF_Object* pCSObj, CPDF_Dictionary* pResources);
- CPDF_ColorSpace* GetCopiedColorSpace(CPDF_Object* pCSObj);
- void ReleaseColorSpace(CPDF_Object* pColorSpace);
- CPDF_Pattern* GetPattern(CPDF_Object* pPatternObj, FX_BOOL bShading, const CFX_AffineMatrix* matrix);
- void ReleasePattern(CPDF_Object* pPatternObj);
- CPDF_Image* GetImage(CPDF_Object* pImageStream);
- void ReleaseImage(CPDF_Object* pImageStream);
- CPDF_IccProfile* GetIccProfile(CPDF_Stream* pIccProfileStream, FX_INT32 nComponents);
- void ReleaseIccProfile(CPDF_Stream* pIccProfileStream, CPDF_IccProfile* pIccProfile);
- CPDF_StreamAcc* GetFontFileStreamAcc(CPDF_Stream* pFontStream);
- void ReleaseFontFileStreamAcc(CPDF_Stream* pFontStream, FX_BOOL bForce = FALSE);
- CPDF_Document* m_pPDFDoc;
- CPDF_FontMap m_FontMap;
- CPDF_ColorSpaceMap m_ColorSpaceMap;
- CPDF_PatternMap m_PatternMap;
- CPDF_ImageMap m_ImageMap;
- CPDF_IccProfileMap m_IccProfileMap;
- CFX_MapByteStringToPtr m_HashProfileMap;
- CPDF_FontFileMap m_FontFileMap;
-};
-class CPDF_Function : public CFX_Object
-{
-public:
- static CPDF_Function* Load(CPDF_Object* pFuncObj);
- virtual ~CPDF_Function();
- FX_BOOL Call(FX_FLOAT* inputs, int ninputs, FX_FLOAT* results, int& nresults) const;
- int CountInputs()
- {
- return m_nInputs;
- }
- int CountOutputs()
- {
- return m_nOutputs;
- }
-protected:
- CPDF_Function();
- int m_nInputs, m_nOutputs;
- FX_FLOAT* m_pDomains;
- FX_FLOAT* m_pRanges;
- FX_BOOL Init(CPDF_Object* pObj);
- virtual FX_BOOL v_Init(CPDF_Object* pObj) = 0;
- virtual FX_BOOL v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const = 0;
-};
-class CPDF_IccProfile : public CFX_Object
-{
-public:
- CPDF_IccProfile(FX_LPCBYTE pData, FX_DWORD dwSize, int nComponents);
- ~CPDF_IccProfile();
- FX_BOOL m_bsRGB;
- FX_LPVOID m_pTransform;
-};
-class CPDF_DeviceCS : public CPDF_ColorSpace
-{
-public:
- CPDF_DeviceCS(int family);
- virtual FX_BOOL GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const;
- FX_BOOL SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const;
- FX_BOOL v_GetCMYK(FX_FLOAT* pBuf, FX_FLOAT& c, FX_FLOAT& m, FX_FLOAT& y, FX_FLOAT& k) const;
- FX_BOOL v_SetCMYK(FX_FLOAT* pBuf, FX_FLOAT c, FX_FLOAT m, FX_FLOAT y, FX_FLOAT k) const;
- virtual void TranslateImageLine(FX_LPBYTE pDestBuf, FX_LPCBYTE pSrcBuf, int pixels, int image_width, int image_height, FX_BOOL bTransMask = FALSE) const;
-};
-class CPDF_PatternCS : public CPDF_ColorSpace
-{
-public:
- CPDF_PatternCS();
- ~CPDF_PatternCS();
- virtual FX_BOOL v_Load(CPDF_Document* pDoc, CPDF_Array* pArray);
- virtual FX_BOOL GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const;
- virtual CPDF_ColorSpace* GetBaseCS() const
- {
- return m_pBaseCS;
- }
- CPDF_ColorSpace* m_pBaseCS;
-};
-#define MAX_PAGE_OBJECTS_UNIFY_NAMING 4096
-class CPDF_ResourceNaming : public CFX_Object
-{
-public:
- struct _NamingState : public CFX_Object {
- CFX_ByteString m_Prefix;
- int m_nIndex;
- };
- ~CPDF_ResourceNaming();
- CFX_ByteString GetName(const CPDF_Dictionary* pResList, FX_LPCSTR szType);
-protected:
- CFX_MapByteStringToPtr m_NamingCache;
-};
+// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../include/fpdfapi/fpdf_pageobj.h" +#define PARSE_STEP_LIMIT 100 +#define STREAM_PARSE_BUFSIZE 20480 +class CPDF_QuickFontCache; +#ifndef _FPDFAPI_MINI_ +class CPDF_StreamParser : public CFX_Object +{ +public: + + CPDF_StreamParser(const FX_BYTE* pData, FX_DWORD dwSize); + ~CPDF_StreamParser(); + + CPDF_Stream* ReadInlineStream(CPDF_Document* pDoc, CPDF_Dictionary* pDict, CPDF_Object* pCSObj, FX_BOOL bDecode); + typedef enum { EndOfData, Number, Keyword, Name, Others } SyntaxType; + + SyntaxType ParseNextElement(); + FX_LPBYTE GetWordBuf() + { + return m_WordBuffer; + } + FX_DWORD GetWordSize() + { + return m_WordSize; + } + CPDF_Object* GetObject() + { + CPDF_Object* pObj = m_pLastObj; + m_pLastObj = NULL; + return pObj; + } + FX_DWORD GetPos() + { + return m_Pos; + } + void SetPos(FX_DWORD pos) + { + m_Pos = pos; + } + + CPDF_Object* ReadNextObject(FX_BOOL bAllowNestedArray = FALSE, FX_BOOL bInArray = FALSE); + void SkipPathObject(); +protected: + void GetNextWord(FX_BOOL& bIsNumber); + CFX_ByteString ReadString(); + CFX_ByteString ReadHexString(); + const FX_BYTE* m_pBuf; + FX_DWORD m_Size; + FX_DWORD m_Pos; + FX_BYTE m_WordBuffer[256]; + FX_DWORD m_WordSize; + CPDF_Object* m_pLastObj; +}; +#endif +typedef enum { + PDFOP_CloseFillStrokePath = 0, PDFOP_FillStrokePath, + PDFOP_CloseEOFillStrokePath, PDFOP_EOFillStrokePath, + PDFOP_BeginMarkedContent_Dictionary, PDFOP_BeginImage, + PDFOP_BeginMarkedContent, PDFOP_BeginText, + PDFOP_BeginSectionUndefined, PDFOP_CurveTo_123, + PDFOP_ConcatMatrix, PDFOP_SetColorSpace_Fill, + PDFOP_SetColorSpace_Stroke, PDFOP_SetDash, + PDFOP_SetCharWidth, PDFOP_SetCachedDevice, + PDFOP_ExecuteXObject, PDFOP_MarkPlace_Dictionary, + PDFOP_EndImage, PDFOP_EndMarkedContent, + PDFOP_EndText, PDFOP_EndSectionUndefined, + PDFOP_FillPath, PDFOP_FillPathOld, + PDFOP_EOFillPath, PDFOP_SetGray_Fill, + PDFOP_SetGray_Stroke, PDFOP_SetExtendGraphState, + PDFOP_ClosePath, PDFOP_SetFlat, + PDFOP_BeginImageData, PDFOP_SetLineJoin, + PDFOP_SetLineCap, PDFOP_SetCMYKColor_Fill, + PDFOP_SetCMYKColor_Stroke, PDFOP_LineTo, + PDFOP_MoveTo, PDFOP_SetMiterLimit, + PDFOP_MarkPlace, PDFOP_EndPath, + PDFOP_SaveGraphState, PDFOP_RestoreGraphState, + PDFOP_Rectangle, PDFOP_SetRGBColor_Fill, + PDFOP_SetRGBColor_Stroke, PDFOP_SetRenderIntent, + PDFOP_CloseStrokePath, PDFOP_StrokePath, + PDFOP_SetColor_Fill, PDFOP_SetColor_Stroke, + PDFOP_SetColorPS_Fill, PDFOP_SetColorPS_Stroke, + PDFOP_ShadeFill, PDFOP_SetCharSpace, + PDFOP_MoveTextPoint, PDFOP_MoveTextPoint_SetLeading, + PDFOP_SetFont, PDFOP_ShowText, + PDFOP_ShowText_Positioning, PDFOP_SetTextLeading, + PDFOP_SetTextMatrix, PDFOP_SetTextRenderMode, + PDFOP_SetTextRise, PDFOP_SetWordSpace, + PDFOP_SetHorzScale, PDFOP_MoveToNextLine, + PDFOP_CurveTo_23, PDFOP_SetLineWidth, + PDFOP_Clip, PDFOP_EOClip, + PDFOP_CurveTo_13, PDFOP_NextLineShowText, + PDFOP_NextLineShowText_Space, PDFOP_Invalid +} PDFOP; +#define PARAM_BUF_SIZE 16 +typedef struct { + int m_Type; + union { + struct { + FX_BOOL m_bInteger; + union { + int m_Integer; + FX_FLOAT m_Float; + }; + } m_Number; + CPDF_Object* m_pObject; + struct { + int m_Len; + char m_Buffer[32]; + } m_Name; + }; +} _ContentParam; +#if defined(_FPDFAPI_MINI_) +#define _FPDF_MAX_FORM_LEVEL_ 17 +#else +#define _FPDF_MAX_FORM_LEVEL_ 30 +#endif +#define _FPDF_MAX_TYPE3_FORM_LEVEL_ 4 +#define _FPDF_MAX_OBJECT_STACK_SIZE_ 512 +class CPDF_StreamContentParser : public CFX_Object +{ +public: + CPDF_StreamContentParser(); + ~CPDF_StreamContentParser(); + FX_BOOL Initialize(); + void PrepareParse(CPDF_Document* pDoc, CPDF_Dictionary* pPageResources, CPDF_Dictionary* pParentResources, + CFX_AffineMatrix* pmtContentToUser, + CPDF_PageObjects* pObjList, CPDF_Dictionary* pResources, + CFX_FloatRect* pBBox, CPDF_ParseOptions* pOptions, + CPDF_AllStates* pAllStates, int level); + CPDF_Document* m_pDocument; + CPDF_Dictionary* m_pPageResources; + CPDF_Dictionary* m_pParentResources; + CPDF_PageObjects* m_pObjectList; + CPDF_Dictionary* m_pResources; + int m_Level; + CFX_AffineMatrix m_mtContentToUser; + CFX_FloatRect m_BBox; + CPDF_ParseOptions m_Options; + _ContentParam m_ParamBuf1[PARAM_BUF_SIZE]; + FX_DWORD m_ParamStartPos; + FX_DWORD m_ParamCount; + void AddNumberParam(FX_LPCSTR str, int len); + void AddObjectParam(CPDF_Object* pObj); + void AddNameParam(FX_LPCSTR name, int size); + int GetNextParamPos(); + void ClearAllParams(); + CPDF_Object* GetObject(FX_DWORD index); + CFX_ByteString GetString(FX_DWORD index); + FX_FLOAT GetNumber(FX_DWORD index); + FX_FLOAT GetNumber16(FX_DWORD index); + int GetInteger(FX_DWORD index) + { + return (FX_INT32)(GetNumber(index)); + } + FX_BOOL OnOperator(FX_LPCSTR op); + void BigCaseCaller(int index); + FX_BOOL m_bAbort; +#ifndef _FPDFAPI_MINI_ + CPDF_StreamParser* m_pSyntax; + FX_DWORD GetParsePos() + { + return m_pSyntax->GetPos(); + } +#else + int m_WordState; + void InputData(FX_LPCBYTE src_buf, FX_DWORD src_size); + void Finish(); + void StartArray(); + void EndArray(); + void StartDict(); + void EndDict(); + void EndName(); + void EndNumber(); + void EndKeyword(); + void EndHexString(); + void EndString(); + void EndImageDict(); + void EndInlineImage(); + FX_LPBYTE m_pWordBuf; + FX_DWORD m_WordSize; + CFX_BinaryBuf m_StringBuf; + int m_StringLevel, m_StringState, m_EscCode; + void AddContainer(CPDF_Object* pObject); + FX_BOOL SetToCurObj(CPDF_Object* pObject); + FX_LPBYTE m_pDictName; + FX_BOOL m_bDictName; + CPDF_Object** m_pObjectStack; + FX_BOOL* m_pObjectState; + FX_DWORD m_ObjectSize; + int m_InlineImageState; + FX_BYTE m_InlineWhiteChar; + CFX_BinaryBuf m_ImageSrcBuf; + FX_LPBYTE m_pStreamBuf; +#endif + CPDF_AllStates* m_pCurStates; + CPDF_ContentMark m_CurContentMark; + CFX_PtrArray m_ClipTextList; + CPDF_TextObject* m_pLastTextObject; + FX_FLOAT m_DefFontSize; + void AddTextObject(CFX_ByteString* pText, FX_FLOAT fInitKerning, FX_FLOAT* pKerning, int count); + + void ConvertUserSpace(FX_FLOAT& x, FX_FLOAT& y); + void ConvertTextSpace(FX_FLOAT& x, FX_FLOAT& y); + void OnChangeTextMatrix(); +#ifndef _FPDFAPI_MINI_ + FX_DWORD Parse(FX_LPCBYTE pData, FX_DWORD dwSize, FX_DWORD max_cost); + void ParsePathObject(); +#endif + int m_CompatCount; + FX_PATHPOINT* m_pPathPoints; + int m_PathPointCount; + int m_PathAllocSize; + FX_FLOAT m_PathStartX, m_PathStartY; + FX_FLOAT m_PathCurrentX, m_PathCurrentY; + int m_PathClipType; + void AddPathPoint(FX_FLOAT x, FX_FLOAT y, int flag); + void AddPathRect(FX_FLOAT x, FX_FLOAT y, FX_FLOAT w, FX_FLOAT h); + void AddPathObject(int FillType, FX_BOOL bStroke); + CPDF_ImageObject* AddImage(CPDF_Stream* pStream, CPDF_Image* pImage, FX_BOOL bInline); + void AddDuplicateImage(); + void AddForm(CPDF_Stream*); + CFX_ByteString m_LastImageName; + CPDF_Image* m_pLastImage; + CFX_BinaryBuf m_LastImageDict, m_LastImageData; + CPDF_Dictionary* m_pLastImageDict; + CPDF_Dictionary* m_pLastCloneImageDict; + FX_BOOL m_bReleaseLastDict; + FX_BOOL m_bSameLastDict; + void SetGraphicStates(CPDF_PageObject* pObj, FX_BOOL bColor, FX_BOOL bText, FX_BOOL bGraph); + FX_BOOL m_bColored; + FX_FLOAT m_Type3Data[6]; + FX_BOOL m_bResourceMissing; + CFX_PtrArray m_StateStack; + void SaveStates(CPDF_AllStates*); + void RestoreStates(CPDF_AllStates*); + CPDF_Font* FindFont(const CFX_ByteString& name); + CPDF_ColorSpace* FindColorSpace(const CFX_ByteString& name); + CPDF_Pattern* FindPattern(const CFX_ByteString& name, FX_BOOL bShading); + CPDF_Object* FindResourceObj(FX_BSTR type, const CFX_ByteString& name); + void Handle_CloseFillStrokePath(); + void Handle_FillStrokePath(); + void Handle_CloseEOFillStrokePath(); + void Handle_EOFillStrokePath(); + void Handle_BeginMarkedContent_Dictionary(); + void Handle_BeginImage(); + void Handle_BeginMarkedContent(); + void Handle_BeginText(); + void Handle_BeginSectionUndefined(); + void Handle_CurveTo_123(); + void Handle_ConcatMatrix(); + void Handle_SetColorSpace_Fill(); + void Handle_SetColorSpace_Stroke(); + void Handle_SetDash(); + void Handle_SetCharWidth(); + void Handle_SetCachedDevice(); + void Handle_ExecuteXObject(); + void Handle_MarkPlace_Dictionary(); + void Handle_EndImage(); + void Handle_EndMarkedContent(); + void Handle_EndText(); + void Handle_EndSectionUndefined(); + void Handle_FillPath(); + void Handle_FillPathOld(); + void Handle_EOFillPath(); + void Handle_SetGray_Fill(); + void Handle_SetGray_Stroke(); + void Handle_SetExtendGraphState(); + void Handle_ClosePath(); + void Handle_SetFlat(); + void Handle_BeginImageData(); + void Handle_SetLineJoin(); + void Handle_SetLineCap(); + void Handle_SetCMYKColor_Fill(); + void Handle_SetCMYKColor_Stroke(); + void Handle_LineTo(); + void Handle_MoveTo(); + void Handle_SetMiterLimit(); + void Handle_MarkPlace(); + void Handle_EndPath(); + void Handle_SaveGraphState(); + void Handle_RestoreGraphState(); + void Handle_Rectangle(); + void Handle_SetRGBColor_Fill(); + void Handle_SetRGBColor_Stroke(); + void Handle_SetRenderIntent(); + void Handle_CloseStrokePath(); + void Handle_StrokePath(); + void Handle_SetColor_Fill(); + void Handle_SetColor_Stroke(); + void Handle_SetColorPS_Fill(); + void Handle_SetColorPS_Stroke(); + void Handle_ShadeFill(); + void Handle_SetCharSpace(); + void Handle_MoveTextPoint(); + void Handle_MoveTextPoint_SetLeading(); + void Handle_SetFont(); + void Handle_ShowText(); + void Handle_ShowText_Positioning(); + void Handle_SetTextLeading(); + void Handle_SetTextMatrix(); + void Handle_SetTextRenderMode(); + void Handle_SetTextRise(); + void Handle_SetWordSpace(); + void Handle_SetHorzScale(); + void Handle_MoveToNextLine(); + void Handle_CurveTo_23(); + void Handle_SetLineWidth(); + void Handle_Clip(); + void Handle_EOClip(); + void Handle_CurveTo_13(); + void Handle_NextLineShowText(); + void Handle_NextLineShowText_Space(); + void Handle_Invalid(); +}; +class CPDF_ContentParser : public CFX_Object +{ +public: + CPDF_ContentParser(); + ~CPDF_ContentParser(); + typedef enum { Ready, ToBeContinued, Done } ParseStatus; + ParseStatus GetStatus() + { + return m_Status; + } + void Start(CPDF_Page* pPage, CPDF_ParseOptions* pOptions); + void Start(CPDF_Form* pForm, CPDF_AllStates* pGraphicStates, CFX_AffineMatrix* pParentMatrix, + CPDF_Type3Char* pType3Char, CPDF_ParseOptions* pOptions, int level); + void Continue(IFX_Pause* pPause); + int EstimateProgress(); +protected: + void Clear(); + ParseStatus m_Status; + CPDF_PageObjects* m_pObjects; + FX_BOOL m_bForm; + CPDF_ParseOptions m_Options; + CPDF_Type3Char* m_pType3Char; + int m_InternalStage; + CPDF_StreamAcc* m_pSingleStream; + CPDF_StreamAcc** m_pStreamArray; + FX_DWORD m_nStreams; + FX_LPBYTE m_pData; + FX_DWORD m_Size; + class CPDF_StreamContentParser* m_pParser; + FX_DWORD m_CurrentOffset; + CPDF_StreamFilter* m_pStreamFilter; +}; +class CPDF_AllStates : public CPDF_GraphicStates +{ +public: + CPDF_AllStates(); + ~CPDF_AllStates(); + void Copy(const CPDF_AllStates& src); + void ProcessExtGS(CPDF_Dictionary* pGS, CPDF_StreamContentParser* pParser); + void SetLineDash(CPDF_Array*, FX_FLOAT, FX_FLOAT scale); + CFX_AffineMatrix m_TextMatrix, m_CTM, m_ParentMatrix; + FX_FLOAT m_TextX, m_TextY, m_TextLineX, m_TextLineY; + FX_FLOAT m_TextLeading, m_TextRise, m_TextHorzScale; +}; +template <class ObjClass> class CPDF_CountedObject : public CFX_Object +{ +public: + ObjClass m_Obj; + FX_DWORD m_nCount; +}; +typedef CFX_MapPtrTemplate<CPDF_Dictionary*, CPDF_CountedObject<CPDF_Font*>*> CPDF_FontMap; +typedef CFX_MapPtrTemplate<CPDF_Object*, CPDF_CountedObject<CPDF_ColorSpace*>*> CPDF_ColorSpaceMap; +typedef CFX_MapPtrTemplate<CPDF_Object*, CPDF_CountedObject<CPDF_Pattern*>*> CPDF_PatternMap; +typedef CFX_MapPtrTemplate<FX_DWORD, CPDF_CountedObject<CPDF_Image*>*> CPDF_ImageMap; +typedef CFX_MapPtrTemplate<CPDF_Stream*, CPDF_CountedObject<CPDF_IccProfile*>*> CPDF_IccProfileMap; +typedef CFX_MapPtrTemplate<CPDF_Stream*, CPDF_CountedObject<CPDF_StreamAcc*>*> CPDF_FontFileMap; +template <class KeyType, class ValueType> +KeyType PDF_DocPageData_FindValue(const CFX_MapPtrTemplate<KeyType, CPDF_CountedObject<ValueType>*> &map, ValueType findValue, CPDF_CountedObject<ValueType>*& findData) +{ + FX_POSITION pos = map.GetStartPosition(); + while (pos) { + KeyType findKey; + map.GetNextAssoc(pos, findKey, findData); + if (findData->m_Obj == findValue) { + return findKey; + } + } + findData = NULL; + return (KeyType)(FX_UINTPTR)NULL; +} +template <class KeyType, class ValueType> +FX_BOOL PDF_DocPageData_Release(CFX_MapPtrTemplate<KeyType, CPDF_CountedObject<ValueType>*> &map, KeyType findKey, ValueType findValue, FX_BOOL bForce = FALSE) +{ + if (!findKey && !findValue) { + return FALSE; + } + CPDF_CountedObject<ValueType>* findData = NULL; + if (!findKey) { + findKey = PDF_DocPageData_FindValue<KeyType, ValueType>(map, findValue, findData); + } else if (!map.Lookup(findKey, findData)) { + return FALSE; + } + if (findData && ((-- findData->m_nCount) == 0 || bForce)) { + delete findData->m_Obj; + delete findData; + map.RemoveKey(findKey); + return TRUE; + } + return FALSE; +} +class CPDF_DocPageData : public CFX_Object +{ +public: + CPDF_DocPageData(CPDF_Document *pPDFDoc); + ~CPDF_DocPageData(); + void Clear(FX_BOOL bRelease = FALSE); + CPDF_Font* GetFont(CPDF_Dictionary* pFontDict, FX_BOOL findOnly); + CPDF_Font* GetStandardFont(FX_BSTR fontName, CPDF_FontEncoding* pEncoding); + void ReleaseFont(CPDF_Dictionary* pFontDict); + CPDF_ColorSpace* GetColorSpace(CPDF_Object* pCSObj, CPDF_Dictionary* pResources); + CPDF_ColorSpace* GetCopiedColorSpace(CPDF_Object* pCSObj); + void ReleaseColorSpace(CPDF_Object* pColorSpace); + CPDF_Pattern* GetPattern(CPDF_Object* pPatternObj, FX_BOOL bShading, const CFX_AffineMatrix* matrix); + void ReleasePattern(CPDF_Object* pPatternObj); + CPDF_Image* GetImage(CPDF_Object* pImageStream); + void ReleaseImage(CPDF_Object* pImageStream); + CPDF_IccProfile* GetIccProfile(CPDF_Stream* pIccProfileStream, FX_INT32 nComponents); + void ReleaseIccProfile(CPDF_Stream* pIccProfileStream, CPDF_IccProfile* pIccProfile); + CPDF_StreamAcc* GetFontFileStreamAcc(CPDF_Stream* pFontStream); + void ReleaseFontFileStreamAcc(CPDF_Stream* pFontStream, FX_BOOL bForce = FALSE); + CPDF_Document* m_pPDFDoc; + CPDF_FontMap m_FontMap; + CPDF_ColorSpaceMap m_ColorSpaceMap; + CPDF_PatternMap m_PatternMap; + CPDF_ImageMap m_ImageMap; + CPDF_IccProfileMap m_IccProfileMap; + CFX_MapByteStringToPtr m_HashProfileMap; + CPDF_FontFileMap m_FontFileMap; +}; +class CPDF_Function : public CFX_Object +{ +public: + static CPDF_Function* Load(CPDF_Object* pFuncObj); + virtual ~CPDF_Function(); + FX_BOOL Call(FX_FLOAT* inputs, int ninputs, FX_FLOAT* results, int& nresults) const; + int CountInputs() + { + return m_nInputs; + } + int CountOutputs() + { + return m_nOutputs; + } +protected: + CPDF_Function(); + int m_nInputs, m_nOutputs; + FX_FLOAT* m_pDomains; + FX_FLOAT* m_pRanges; + FX_BOOL Init(CPDF_Object* pObj); + virtual FX_BOOL v_Init(CPDF_Object* pObj) = 0; + virtual FX_BOOL v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const = 0; +}; +class CPDF_IccProfile : public CFX_Object +{ +public: + CPDF_IccProfile(FX_LPCBYTE pData, FX_DWORD dwSize, int nComponents); + ~CPDF_IccProfile(); + FX_BOOL m_bsRGB; + FX_LPVOID m_pTransform; +}; +class CPDF_DeviceCS : public CPDF_ColorSpace +{ +public: + CPDF_DeviceCS(int family); + virtual FX_BOOL GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const; + FX_BOOL SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const; + FX_BOOL v_GetCMYK(FX_FLOAT* pBuf, FX_FLOAT& c, FX_FLOAT& m, FX_FLOAT& y, FX_FLOAT& k) const; + FX_BOOL v_SetCMYK(FX_FLOAT* pBuf, FX_FLOAT c, FX_FLOAT m, FX_FLOAT y, FX_FLOAT k) const; + virtual void TranslateImageLine(FX_LPBYTE pDestBuf, FX_LPCBYTE pSrcBuf, int pixels, int image_width, int image_height, FX_BOOL bTransMask = FALSE) const; +}; +class CPDF_PatternCS : public CPDF_ColorSpace +{ +public: + CPDF_PatternCS(); + ~CPDF_PatternCS(); + virtual FX_BOOL v_Load(CPDF_Document* pDoc, CPDF_Array* pArray); + virtual FX_BOOL GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const; + virtual CPDF_ColorSpace* GetBaseCS() const + { + return m_pBaseCS; + } + CPDF_ColorSpace* m_pBaseCS; +}; +#define MAX_PAGE_OBJECTS_UNIFY_NAMING 4096 +class CPDF_ResourceNaming : public CFX_Object +{ +public: + struct _NamingState : public CFX_Object { + CFX_ByteString m_Prefix; + int m_nIndex; + }; + ~CPDF_ResourceNaming(); + CFX_ByteString GetName(const CPDF_Dictionary* pResList, FX_LPCSTR szType); +protected: + CFX_MapByteStringToPtr m_NamingCache; +}; |