// 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;
};
