1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
10 #include "fpdf_page.h"
12 #ifndef _FPDF_PAGEOBJ_H_
13 #include "fpdf_pageobj.h"
15 class CPDF_ObjectStream;
16 class CPDF_XRefStream;
17 CFX_ByteTextBuf& operator << (CFX_ByteTextBuf& buf, const CPDF_Object* pObj);
18 class CPDF_ObjArchiveSaver : public CFX_ArchiveSaver
22 friend CPDF_ObjArchiveSaver& operator << (CPDF_ObjArchiveSaver& ar, const CPDF_Object* pObj);
25 CFX_MapPtrToPtr m_ObjectMap;
27 class CPDF_ObjArchiveLoader : public CFX_ArchiveLoader
31 CPDF_ObjArchiveLoader(FX_LPCBYTE pData, FX_DWORD dwSize) : CFX_ArchiveLoader(pData, dwSize),
32 m_IndirectObjects(NULL) {}
34 friend CPDF_ObjArchiveLoader& operator >> (CPDF_ObjArchiveLoader& ar, CPDF_Object*& pObj);
37 CPDF_IndirectObjects m_IndirectObjects;
39 class CPDF_PageArchiveSaver : public CPDF_ObjArchiveSaver
43 CPDF_PageArchiveSaver(CPDF_PageObjects* pPageObjs);
45 friend CPDF_PageArchiveSaver& operator << (CPDF_PageArchiveSaver& ar, CPDF_PageObject* pObj);
49 friend CPDF_PageArchiveSaver& operator << (CPDF_PageArchiveSaver& ar, CPDF_ClipPath clip_path);
51 friend CPDF_PageArchiveSaver& operator << (CPDF_PageArchiveSaver& ar, CPDF_GraphState graph_state);
53 friend CPDF_PageArchiveSaver& operator << (CPDF_PageArchiveSaver& ar, CPDF_TextState text_state);
55 friend CPDF_PageArchiveSaver& operator << (CPDF_PageArchiveSaver& ar, CPDF_ColorState color_state);
57 friend CPDF_PageArchiveSaver& operator << (CPDF_PageArchiveSaver& ar, CPDF_GeneralState general_state);
61 CPDF_ClipPath m_LastClipPath;
63 CPDF_GraphState m_LastGraphState;
65 CPDF_ColorState m_LastColorState;
67 CPDF_TextState m_LastTextState;
69 CPDF_GeneralState m_LastGeneralState;
71 CPDF_PageObjects* m_pCurPage;
73 class CPDF_PageArchiveLoader : public CPDF_ObjArchiveLoader
77 CPDF_PageArchiveLoader(CPDF_PageObjects* pPageObjs, FX_LPCBYTE pData, FX_DWORD dwSize);
79 friend CPDF_PageArchiveLoader& operator >> (CPDF_PageArchiveLoader& ar, CPDF_PageObject*& pObj);
83 friend CPDF_PageArchiveLoader& operator >> (CPDF_PageArchiveLoader& ar, CPDF_ClipPath& clip_path);
85 friend CPDF_PageArchiveLoader& operator >> (CPDF_PageArchiveLoader& ar, CPDF_GraphState& graph_state);
87 friend CPDF_PageArchiveLoader& operator >> (CPDF_PageArchiveLoader& ar, CPDF_TextState& text_state);
89 friend CPDF_PageArchiveLoader& operator >> (CPDF_PageArchiveLoader& ar, CPDF_ColorState& color_state);
91 friend CPDF_PageArchiveLoader& operator >> (CPDF_PageArchiveLoader& ar, CPDF_GeneralState& general_state);
94 void PostProcColor(CPDF_Color& color);
96 CPDF_Object* AddResource(CPDF_Object* pSrcObj, FX_LPCSTR type);
98 CPDF_ClipPath m_LastClipPath;
100 CPDF_GraphState m_LastGraphState;
102 CPDF_ColorState m_LastColorState;
104 CPDF_TextState m_LastTextState;
106 CPDF_GeneralState m_LastGeneralState;
108 CPDF_PageObjects* m_pCurPage;
110 CFX_MapPtrToPtr m_ObjectMap;
112 #define FPDFCREATE_INCREMENTAL 1
113 #define FPDFCREATE_NO_ORIGINAL 2
114 #define FPDFCREATE_PROGRESSIVE 4
115 #define FPDFCREATE_OBJECTSTREAM 8
116 class CPDF_Creator : public CFX_Object
120 CPDF_Creator(CPDF_Document* pDoc);
124 void RemoveSecurity();
126 FX_BOOL Create(FX_LPCWSTR filename, FX_DWORD flags = 0);
128 FX_BOOL Create(FX_LPCSTR filename, FX_DWORD flags = 0);
130 FX_BOOL Create(IFX_StreamWrite* pFile, FX_DWORD flags = 0);
132 FX_INT32 Continue(IFX_Pause *pPause = NULL);
134 FX_BOOL SetFileVersion(FX_INT32 fileVersion = 17);
137 CPDF_Document* m_pDocument;
139 CPDF_Parser* m_pParser;
143 FX_BOOL m_bSecurityChanged;
145 CPDF_Dictionary* m_pEncryptDict;
146 FX_DWORD m_dwEnryptObjNum;
147 FX_BOOL m_bEncryptCloned;
149 FX_BOOL m_bStandardSecurity;
151 CPDF_CryptoHandler* m_pCryptoHandler;
152 FX_BOOL m_bNewCrypto;
154 FX_BOOL m_bEncryptMetadata;
156 CPDF_Object* m_pMetadata;
158 CPDF_XRefStream* m_pXRefStream;
160 FX_INT32 m_ObjectStreamSize;
162 FX_DWORD m_dwLastObjNum;
163 FX_BOOL Create(FX_DWORD flags);
164 void ResetStandardSecurity();
166 FX_INT32 WriteDoc_Stage1(IFX_Pause *pPause);
167 FX_INT32 WriteDoc_Stage2(IFX_Pause *pPause);
168 FX_INT32 WriteDoc_Stage3(IFX_Pause *pPause);
169 FX_INT32 WriteDoc_Stage4(IFX_Pause *pPause);
171 CFX_FileBufferArchive m_File;
173 FX_FILESIZE m_Offset;
174 void InitOldObjNumOffsets();
175 void InitNewObjNumOffsets();
176 void AppendNewObjNum(FX_DWORD objbum);
177 FX_INT32 WriteOldIndirectObject(FX_DWORD objnum);
178 FX_INT32 WriteOldObjs(IFX_Pause *pPause);
179 FX_INT32 WriteNewObjs(FX_BOOL bIncremental, IFX_Pause *pPause);
180 FX_INT32 WriteIndirectObj(const CPDF_Object* pObj);
181 FX_INT32 WriteDirectObj(FX_DWORD objnum, const CPDF_Object* pObj, FX_BOOL bEncrypt = TRUE);
182 FX_INT32 WriteIndirectObjectToStream(const CPDF_Object* pObj);
183 FX_INT32 WriteIndirectObj(FX_DWORD objnum, const CPDF_Object* pObj);
184 FX_INT32 WriteIndirectObjectToStream(FX_DWORD objnum, FX_LPCBYTE pBuffer, FX_DWORD dwSize);
185 FX_INT32 AppendObjectNumberToXRef(FX_DWORD objnum);
186 void InitID(FX_BOOL bDefault = TRUE);
187 FX_INT32 WriteStream(const CPDF_Object* pStream, FX_DWORD objnum, CPDF_CryptoHandler* pCrypto);
192 FX_FILESIZE m_XrefStart;
194 CFX_FileSizeListArray m_ObjectOffset;
196 CFX_DWordListArray m_ObjectSize;
197 CFX_DWordArray m_NewObjNumArray;
199 CPDF_Array* m_pIDArray;
201 FX_INT32 m_FileVersion;
202 friend class CPDF_ObjectStream;
203 friend class CPDF_XRefStream;