Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(184)

Side by Side Diff: core/include/fpdfapi/fpdf_objects.h

Issue 1634373003: Refactor CPDF_Object and its subclasses. (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: rebase Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | core/src/fpdfapi/fpdf_page/fpdf_page_image.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 PDFium Authors. All rights reserved. 1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 6
7 #ifndef CORE_INCLUDE_FPDFAPI_FPDF_OBJECTS_H_ 7 #ifndef CORE_INCLUDE_FPDFAPI_FPDF_OBJECTS_H_
8 #define CORE_INCLUDE_FPDFAPI_FPDF_OBJECTS_H_ 8 #define CORE_INCLUDE_FPDFAPI_FPDF_OBJECTS_H_
9 9
10 #include <map> 10 #include <map>
(...skipping 26 matching lines...) Expand all
37 NUMBER, 37 NUMBER,
38 STRING, 38 STRING,
39 NAME, 39 NAME,
40 ARRAY, 40 ARRAY,
41 DICTIONARY, 41 DICTIONARY,
42 STREAM, 42 STREAM,
43 NULLOBJ, 43 NULLOBJ,
44 REFERENCE 44 REFERENCE
45 }; 45 };
46 46
47 Type GetType() const { return m_Type; } 47 virtual Type GetType() const = 0;
48 FX_DWORD GetObjNum() const { return m_ObjNum; } 48 FX_DWORD GetObjNum() const { return m_ObjNum; }
49 FX_DWORD GetGenNum() const { return m_GenNum; } 49 FX_DWORD GetGenNum() const { return m_GenNum; }
50 50
51 FX_BOOL IsIdentical(CPDF_Object* pObj) const; 51 virtual CPDF_Object* Clone(FX_BOOL bDirect = FALSE) const = 0;
52 CPDF_Object* Clone(FX_BOOL bDirect = FALSE) const; 52 virtual CPDF_Object* GetDirect() const {
53 CPDF_Object* CloneRef(CPDF_IndirectObjectHolder* pObjs) const; 53 return const_cast<CPDF_Object*>(this);
54 }
54 55
55 CPDF_Object* GetDirect() const;
56 FX_BOOL IsModified() const { return FALSE; } 56 FX_BOOL IsModified() const { return FALSE; }
57
58 void Release(); 57 void Release();
59 58
60 CFX_ByteString GetString() const; 59 virtual CFX_ByteString GetString() const { return CFX_ByteString(); }
61 CFX_ByteStringC GetConstString() const; 60 virtual CFX_ByteStringC GetConstString() const { return CFX_ByteStringC(); }
62 CFX_WideString GetUnicodeText(CFX_CharMap* pCharMap = NULL) const; 61 virtual CFX_WideString GetUnicodeText(CFX_CharMap* pCharMap = nullptr) const {
63 FX_FLOAT GetNumber() const; 62 return CFX_WideString();
64 FX_FLOAT GetNumber16() const; 63 }
65 int GetInteger() const; 64 virtual FX_FLOAT GetNumber() const { return 0; }
66 CPDF_Dictionary* GetDict() const; 65 virtual int GetInteger() const { return 0; }
67 CPDF_Array* GetArray() const; 66 virtual CPDF_Dictionary* GetDict() const { return nullptr; }
67 virtual CPDF_Array* GetArray() const { return nullptr; }
68 68
69 void SetString(const CFX_ByteString& str); 69 virtual void SetString(const CFX_ByteString& str) { ASSERT(FALSE); }
70 void SetUnicodeText(const FX_WCHAR* pUnicodes, int len = -1);
71 70
72 bool IsArray() const { return m_Type == ARRAY; } 71 virtual bool IsArray() const { return false; }
73 bool IsBoolean() const { return m_Type == BOOLEAN; } 72 virtual bool IsBoolean() const { return false; }
74 bool IsDictionary() const { return m_Type == DICTIONARY; } 73 virtual bool IsDictionary() const { return false; }
75 bool IsName() const { return m_Type == NAME; } 74 virtual bool IsName() const { return false; }
76 bool IsNumber() const { return m_Type == NUMBER; } 75 virtual bool IsNumber() const { return false; }
77 bool IsReference() const { return m_Type == REFERENCE; } 76 virtual bool IsReference() const { return false; }
78 bool IsStream() const { return m_Type == STREAM; } 77 virtual bool IsStream() const { return false; }
79 bool IsString() const { return m_Type == STRING; } 78 virtual bool IsString() const { return false; }
80 79
81 CPDF_Array* AsArray(); 80 virtual CPDF_Array* AsArray() { return nullptr; }
82 const CPDF_Array* AsArray() const; 81 virtual const CPDF_Array* AsArray() const { return nullptr; }
83 CPDF_Boolean* AsBoolean(); 82 virtual CPDF_Boolean* AsBoolean() { return nullptr; }
84 const CPDF_Boolean* AsBoolean() const; 83 virtual const CPDF_Boolean* AsBoolean() const { return nullptr; }
85 CPDF_Dictionary* AsDictionary(); 84 virtual CPDF_Dictionary* AsDictionary() { return nullptr; }
86 const CPDF_Dictionary* AsDictionary() const; 85 virtual const CPDF_Dictionary* AsDictionary() const { return nullptr; }
87 CPDF_Name* AsName(); 86 virtual CPDF_Name* AsName() { return nullptr; }
88 const CPDF_Name* AsName() const; 87 virtual const CPDF_Name* AsName() const { return nullptr; }
89 CPDF_Number* AsNumber(); 88 virtual CPDF_Number* AsNumber() { return nullptr; }
90 const CPDF_Number* AsNumber() const; 89 virtual const CPDF_Number* AsNumber() const { return nullptr; }
91 CPDF_Reference* AsReference(); 90 virtual CPDF_Reference* AsReference() { return nullptr; }
92 const CPDF_Reference* AsReference() const; 91 virtual const CPDF_Reference* AsReference() const { return nullptr; }
93 CPDF_Stream* AsStream(); 92 virtual CPDF_Stream* AsStream() { return nullptr; }
94 const CPDF_Stream* AsStream() const; 93 virtual const CPDF_Stream* AsStream() const { return nullptr; }
95 CPDF_String* AsString(); 94 virtual CPDF_String* AsString() { return nullptr; }
96 const CPDF_String* AsString() const; 95 virtual const CPDF_String* AsString() const { return nullptr; }
97 96
98 protected: 97 protected:
99 explicit CPDF_Object(Type type) : m_Type(type), m_ObjNum(0), m_GenNum(0) {} 98 CPDF_Object() : m_ObjNum(0), m_GenNum(0) {}
100 ~CPDF_Object() {} 99 virtual ~CPDF_Object() {}
101 void Destroy(); 100 void Destroy() { delete this; }
102 101
103 const CPDF_Object* GetBasicObject() const;
104
105 const Type m_Type;
106 FX_DWORD m_ObjNum; 102 FX_DWORD m_ObjNum;
107 FX_DWORD m_GenNum; 103 FX_DWORD m_GenNum;
108 104
109 friend class CPDF_IndirectObjectHolder; 105 friend class CPDF_IndirectObjectHolder;
110 friend class CPDF_Parser; 106 friend class CPDF_Parser;
111 friend class CPDF_SyntaxParser; 107 friend class CPDF_SyntaxParser;
112 108
113 private: 109 private:
114 CPDF_Object* CloneInternal(FX_BOOL bDirect, 110 CPDF_Object(const CPDF_Object& src) {}
115 std::set<FX_DWORD>* visited) const;
116 }; 111 };
112
117 class CPDF_Boolean : public CPDF_Object { 113 class CPDF_Boolean : public CPDF_Object {
118 public: 114 public:
119 CPDF_Boolean() : CPDF_Object(BOOLEAN), m_bValue(false) {} 115 CPDF_Boolean() : m_bValue(false) {}
120 explicit CPDF_Boolean(FX_BOOL value) 116 explicit CPDF_Boolean(FX_BOOL value) : m_bValue(value) {}
121 : CPDF_Object(BOOLEAN), m_bValue(value) {}
122 117
123 FX_BOOL Identical(CPDF_Boolean* pOther) const { 118 // CPDF_Object.
124 return m_bValue == pOther->m_bValue; 119 Type GetType() const override { return BOOLEAN; }
120 CPDF_Object* Clone(FX_BOOL bDirect = FALSE) const override {
121 return new CPDF_Boolean(m_bValue);
125 } 122 }
126 123 CFX_ByteString GetString() const override {
127 CFX_ByteString GetString() const { return m_bValue ? "true" : "false"; } 124 return m_bValue ? "true" : "false";
128 FX_BOOL GetValue() const { return m_bValue; } 125 }
126 int GetInteger() const override { return m_bValue; }
127 void SetString(const CFX_ByteString& str) override {
128 m_bValue = (str == "true");
129 }
130 bool IsBoolean() const override { return true; }
131 CPDF_Boolean* AsBoolean() override { return this; }
132 const CPDF_Boolean* AsBoolean() const override { return this; }
129 133
130 protected: 134 protected:
135 ~CPDF_Boolean() {}
136
131 FX_BOOL m_bValue; 137 FX_BOOL m_bValue;
132 friend class CPDF_Object;
133 }; 138 };
139
134 inline CPDF_Boolean* ToBoolean(CPDF_Object* obj) { 140 inline CPDF_Boolean* ToBoolean(CPDF_Object* obj) {
135 return obj ? obj->AsBoolean() : nullptr; 141 return obj ? obj->AsBoolean() : nullptr;
136 } 142 }
143
137 inline const CPDF_Boolean* ToBoolean(const CPDF_Object* obj) { 144 inline const CPDF_Boolean* ToBoolean(const CPDF_Object* obj) {
138 return obj ? obj->AsBoolean() : nullptr; 145 return obj ? obj->AsBoolean() : nullptr;
139 } 146 }
140 147
141 class CPDF_Number : public CPDF_Object { 148 class CPDF_Number : public CPDF_Object {
142 public: 149 public:
143 CPDF_Number() : CPDF_Object(NUMBER), m_bInteger(TRUE), m_Integer(0) {} 150 CPDF_Number() : m_bInteger(TRUE), m_Integer(0) {}
144 151 explicit CPDF_Number(int value) : m_bInteger(TRUE), m_Integer(value) {}
145 explicit CPDF_Number(int value); 152 explicit CPDF_Number(FX_FLOAT value) : m_bInteger(FALSE), m_Float(value) {}
146
147 explicit CPDF_Number(FX_FLOAT value);
148
149 explicit CPDF_Number(const CFX_ByteStringC& str); 153 explicit CPDF_Number(const CFX_ByteStringC& str);
150 154
151 FX_BOOL Identical(CPDF_Number* pOther) const; 155 // CPDF_Object.
156 Type GetType() const override { return NUMBER; }
157 CPDF_Object* Clone(FX_BOOL bDirect = FALSE) const override {
158 return m_bInteger ? new CPDF_Number(m_Integer) : new CPDF_Number(m_Float);
159 }
160 CFX_ByteString GetString() const override;
161 FX_FLOAT GetNumber() const override {
162 return m_bInteger ? static_cast<FX_FLOAT>(m_Integer) : m_Float;
163 }
164 int GetInteger() const override {
165 return m_bInteger ? m_Integer : static_cast<int>(m_Float);
166 }
167 void SetString(const CFX_ByteString& str) override;
168 bool IsNumber() const override { return true; }
169 CPDF_Number* AsNumber() override { return this; }
170 const CPDF_Number* AsNumber() const override { return this; }
152 171
153 CFX_ByteString GetString() const; 172 FX_BOOL IsInteger() { return m_bInteger; }
154
155 void SetString(const CFX_ByteStringC& str);
156
157 FX_BOOL IsInteger() const { return m_bInteger; }
158
159 int GetInteger() const { return m_bInteger ? m_Integer : (int)m_Float; }
160
161 FX_FLOAT GetNumber() const {
162 return m_bInteger ? (FX_FLOAT)m_Integer : m_Float;
163 }
164
165 void SetNumber(FX_FLOAT value);
166
167 FX_FLOAT GetNumber16() const { return GetNumber(); }
168
169 FX_FLOAT GetFloat() const {
170 return m_bInteger ? (FX_FLOAT)m_Integer : m_Float;
171 }
172 173
173 protected: 174 protected:
175 ~CPDF_Number() {}
176
174 FX_BOOL m_bInteger; 177 FX_BOOL m_bInteger;
175 178
176 union { 179 union {
177 int m_Integer; 180 int m_Integer;
178 181
179 FX_FLOAT m_Float; 182 FX_FLOAT m_Float;
180 }; 183 };
181 friend class CPDF_Object;
182 }; 184 };
185
183 inline CPDF_Number* ToNumber(CPDF_Object* obj) { 186 inline CPDF_Number* ToNumber(CPDF_Object* obj) {
184 return obj ? obj->AsNumber() : nullptr; 187 return obj ? obj->AsNumber() : nullptr;
185 } 188 }
189
186 inline const CPDF_Number* ToNumber(const CPDF_Object* obj) { 190 inline const CPDF_Number* ToNumber(const CPDF_Object* obj) {
187 return obj ? obj->AsNumber() : nullptr; 191 return obj ? obj->AsNumber() : nullptr;
188 } 192 }
189 193
190 class CPDF_String : public CPDF_Object { 194 class CPDF_String : public CPDF_Object {
191 public: 195 public:
192 CPDF_String() : CPDF_Object(STRING), m_bHex(FALSE) {} 196 CPDF_String() : m_bHex(FALSE) {}
193
194 CPDF_String(const CFX_ByteString& str, FX_BOOL bHex) 197 CPDF_String(const CFX_ByteString& str, FX_BOOL bHex)
195 : CPDF_Object(STRING), m_String(str), m_bHex(bHex) {} 198 : m_String(str), m_bHex(bHex) {}
196
197 explicit CPDF_String(const CFX_WideString& str); 199 explicit CPDF_String(const CFX_WideString& str);
198 200
199 CFX_ByteString GetString() const { return m_String; } 201 // CPDF_Object.
200 202 Type GetType() const override { return STRING; }
201 FX_BOOL Identical(CPDF_String* pOther) const { 203 CPDF_Object* Clone(FX_BOOL bDirect = FALSE) const override {
202 return m_String == pOther->m_String; 204 return new CPDF_String(m_String, m_bHex);
203 } 205 }
206 CFX_ByteString GetString() const override { return m_String; }
207 CFX_ByteStringC GetConstString() const override {
208 return CFX_ByteStringC(m_String);
209 }
210 CFX_WideString GetUnicodeText(CFX_CharMap* pCharMap = nullptr) const override;
211 void SetString(const CFX_ByteString& str) override { m_String = str; }
212 bool IsString() const override { return true; }
213 CPDF_String* AsString() override { return this; }
214 const CPDF_String* AsString() const override { return this; }
204 215
205 FX_BOOL IsHex() const { return m_bHex; } 216 FX_BOOL IsHex() const { return m_bHex; }
206 217
207 protected: 218 protected:
219 ~CPDF_String() {}
220
208 CFX_ByteString m_String; 221 CFX_ByteString m_String;
222 FX_BOOL m_bHex;
223 };
209 224
210 FX_BOOL m_bHex;
211 friend class CPDF_Object;
212 };
213 inline CPDF_String* ToString(CPDF_Object* obj) { 225 inline CPDF_String* ToString(CPDF_Object* obj) {
214 return obj ? obj->AsString() : nullptr; 226 return obj ? obj->AsString() : nullptr;
215 } 227 }
228
216 inline const CPDF_String* ToString(const CPDF_Object* obj) { 229 inline const CPDF_String* ToString(const CPDF_Object* obj) {
217 return obj ? obj->AsString() : nullptr; 230 return obj ? obj->AsString() : nullptr;
218 } 231 }
219 232
220 class CPDF_Name : public CPDF_Object { 233 class CPDF_Name : public CPDF_Object {
221 public: 234 public:
222 explicit CPDF_Name(const CFX_ByteString& str) 235 explicit CPDF_Name(const CFX_ByteString& str) : m_Name(str) {}
223 : CPDF_Object(NAME), m_Name(str) {} 236 explicit CPDF_Name(const CFX_ByteStringC& str) : m_Name(str) {}
224 explicit CPDF_Name(const CFX_ByteStringC& str) 237 explicit CPDF_Name(const FX_CHAR* str) : m_Name(str) {}
225 : CPDF_Object(NAME), m_Name(str) {}
226 explicit CPDF_Name(const FX_CHAR* str) : CPDF_Object(NAME), m_Name(str) {}
227 238
228 CFX_ByteString GetString() const { return m_Name; } 239 // CPDF_Object.
229 240 Type GetType() const override { return NAME; }
230 FX_BOOL Identical(CPDF_Name* pOther) const { 241 CPDF_Object* Clone(FX_BOOL bDirect = FALSE) const override {
231 return m_Name == pOther->m_Name; 242 return new CPDF_Name(m_Name);
232 } 243 }
244 CFX_ByteString GetString() const override { return m_Name; }
245 CFX_ByteStringC GetConstString() const override {
246 return CFX_ByteStringC(m_Name);
247 }
248 CFX_WideString GetUnicodeText(CFX_CharMap* pCharMap = nullptr) const override;
249 void SetString(const CFX_ByteString& str) override { m_Name = str; }
250 bool IsName() const override { return true; }
251 CPDF_Name* AsName() override { return this; }
252 const CPDF_Name* AsName() const override { return this; }
233 253
234 protected: 254 protected:
255 ~CPDF_Name() {}
256
235 CFX_ByteString m_Name; 257 CFX_ByteString m_Name;
236 friend class CPDF_Object;
237 }; 258 };
259
238 inline CPDF_Name* ToName(CPDF_Object* obj) { 260 inline CPDF_Name* ToName(CPDF_Object* obj) {
239 return obj ? obj->AsName() : nullptr; 261 return obj ? obj->AsName() : nullptr;
240 } 262 }
263
241 inline const CPDF_Name* ToName(const CPDF_Object* obj) { 264 inline const CPDF_Name* ToName(const CPDF_Object* obj) {
242 return obj ? obj->AsName() : nullptr; 265 return obj ? obj->AsName() : nullptr;
243 } 266 }
244 267
245 class CPDF_Array : public CPDF_Object { 268 class CPDF_Array : public CPDF_Object {
246 public: 269 public:
247 CPDF_Array() : CPDF_Object(ARRAY) {} 270 CPDF_Array() {}
271
272 // CPDF_Object.
273 Type GetType() const override { return ARRAY; }
274 CPDF_Object* Clone(FX_BOOL bDirect = FALSE) const override;
275 CPDF_Array* GetArray() const override {
276 // The method should be made non-const if we want to not be const.
277 // See bug #234.
278 return const_cast<CPDF_Array*>(this);
279 }
280 bool IsArray() const override { return true; }
281 CPDF_Array* AsArray() override { return this; }
282 const CPDF_Array* AsArray() const override { return this; }
248 283
249 FX_DWORD GetCount() const { return m_Objects.GetSize(); } 284 FX_DWORD GetCount() const { return m_Objects.GetSize(); }
250
251 CPDF_Object* GetElement(FX_DWORD index) const; 285 CPDF_Object* GetElement(FX_DWORD index) const;
252
253 CPDF_Object* GetElementValue(FX_DWORD index) const; 286 CPDF_Object* GetElementValue(FX_DWORD index) const;
254
255 CFX_Matrix GetMatrix(); 287 CFX_Matrix GetMatrix();
256
257 CFX_FloatRect GetRect(); 288 CFX_FloatRect GetRect();
258
259 CFX_ByteString GetStringAt(FX_DWORD index) const; 289 CFX_ByteString GetStringAt(FX_DWORD index) const;
260
261 CFX_ByteStringC GetConstStringAt(FX_DWORD index) const; 290 CFX_ByteStringC GetConstStringAt(FX_DWORD index) const;
262
263 int GetIntegerAt(FX_DWORD index) const; 291 int GetIntegerAt(FX_DWORD index) const;
264
265 FX_FLOAT GetNumberAt(FX_DWORD index) const; 292 FX_FLOAT GetNumberAt(FX_DWORD index) const;
266
267 CPDF_Dictionary* GetDictAt(FX_DWORD index) const; 293 CPDF_Dictionary* GetDictAt(FX_DWORD index) const;
268
269 CPDF_Stream* GetStreamAt(FX_DWORD index) const; 294 CPDF_Stream* GetStreamAt(FX_DWORD index) const;
270
271 CPDF_Array* GetArrayAt(FX_DWORD index) const; 295 CPDF_Array* GetArrayAt(FX_DWORD index) const;
272
273 FX_FLOAT GetFloatAt(FX_DWORD index) const { return GetNumberAt(index); } 296 FX_FLOAT GetFloatAt(FX_DWORD index) const { return GetNumberAt(index); }
274 297
275 void SetAt(FX_DWORD index, 298 void SetAt(FX_DWORD index,
276 CPDF_Object* pObj, 299 CPDF_Object* pObj,
277 CPDF_IndirectObjectHolder* pObjs = NULL); 300 CPDF_IndirectObjectHolder* pObjs = nullptr);
278
279 void InsertAt(FX_DWORD index, 301 void InsertAt(FX_DWORD index,
280 CPDF_Object* pObj, 302 CPDF_Object* pObj,
281 CPDF_IndirectObjectHolder* pObjs = NULL); 303 CPDF_IndirectObjectHolder* pObjs = nullptr);
282
283 void RemoveAt(FX_DWORD index, int nCount = 1); 304 void RemoveAt(FX_DWORD index, int nCount = 1);
284 305
285 void Add(CPDF_Object* pObj, CPDF_IndirectObjectHolder* pObjs = NULL); 306 void Add(CPDF_Object* pObj, CPDF_IndirectObjectHolder* pObjs = nullptr);
286
287 void AddNumber(FX_FLOAT f); 307 void AddNumber(FX_FLOAT f);
288
289 void AddInteger(int i); 308 void AddInteger(int i);
290
291 void AddString(const CFX_ByteString& str); 309 void AddString(const CFX_ByteString& str);
292
293 void AddName(const CFX_ByteString& str); 310 void AddName(const CFX_ByteString& str);
294
295 void AddReference(CPDF_IndirectObjectHolder* pDoc, FX_DWORD objnum); 311 void AddReference(CPDF_IndirectObjectHolder* pDoc, FX_DWORD objnum);
296
297 void AddReference(CPDF_IndirectObjectHolder* pDoc, CPDF_Object* obj) { 312 void AddReference(CPDF_IndirectObjectHolder* pDoc, CPDF_Object* obj) {
298 AddReference(pDoc, obj->GetObjNum()); 313 AddReference(pDoc, obj->GetObjNum());
299 } 314 }
300
301 FX_FLOAT GetNumber16(FX_DWORD index) const { return GetNumberAt(index); }
302
303 void AddNumber16(FX_FLOAT value) { AddNumber(value); } 315 void AddNumber16(FX_FLOAT value) { AddNumber(value); }
304 316
305 FX_BOOL Identical(CPDF_Array* pOther) const;
306
307 protected: 317 protected:
308 ~CPDF_Array(); 318 ~CPDF_Array();
309 319
310 CFX_ArrayTemplate<CPDF_Object*> m_Objects; 320 CFX_ArrayTemplate<CPDF_Object*> m_Objects;
311 friend class CPDF_Object;
312 }; 321 };
322
313 inline CPDF_Array* ToArray(CPDF_Object* obj) { 323 inline CPDF_Array* ToArray(CPDF_Object* obj) {
314 return obj ? obj->AsArray() : nullptr; 324 return obj ? obj->AsArray() : nullptr;
315 } 325 }
326
316 inline const CPDF_Array* ToArray(const CPDF_Object* obj) { 327 inline const CPDF_Array* ToArray(const CPDF_Object* obj) {
317 return obj ? obj->AsArray() : nullptr; 328 return obj ? obj->AsArray() : nullptr;
318 } 329 }
319 330
320 class CPDF_Dictionary : public CPDF_Object { 331 class CPDF_Dictionary : public CPDF_Object {
321 public: 332 public:
322 using iterator = std::map<CFX_ByteString, CPDF_Object*>::iterator; 333 using iterator = std::map<CFX_ByteString, CPDF_Object*>::iterator;
323 using const_iterator = std::map<CFX_ByteString, CPDF_Object*>::const_iterator; 334 using const_iterator = std::map<CFX_ByteString, CPDF_Object*>::const_iterator;
324 335
325 CPDF_Dictionary() : CPDF_Object(DICTIONARY) {} 336 CPDF_Dictionary() {}
326 337
338 // CPDF_Object.
339 Type GetType() const override { return DICTIONARY; }
340 CPDF_Object* Clone(FX_BOOL bDirect = FALSE) const override;
341 CPDF_Dictionary* GetDict() const override {
342 // The method should be made non-const if we want to not be const.
343 // See bug #234.
344 return const_cast<CPDF_Dictionary*>(this);
345 }
346 bool IsDictionary() const override { return true; }
347 CPDF_Dictionary* AsDictionary() override { return this; }
348 const CPDF_Dictionary* AsDictionary() const override { return this; }
349
350 size_t GetCount() const { return m_Map.size(); }
327 CPDF_Object* GetElement(const CFX_ByteStringC& key) const; 351 CPDF_Object* GetElement(const CFX_ByteStringC& key) const;
328
329 CPDF_Object* GetElementValue(const CFX_ByteStringC& key) const; 352 CPDF_Object* GetElementValue(const CFX_ByteStringC& key) const;
330
331 CFX_ByteString GetStringBy(const CFX_ByteStringC& key) const; 353 CFX_ByteString GetStringBy(const CFX_ByteStringC& key) const;
332
333 CFX_ByteStringC GetConstStringBy(const CFX_ByteStringC& key) const; 354 CFX_ByteStringC GetConstStringBy(const CFX_ByteStringC& key) const;
334
335 CFX_ByteString GetStringBy(const CFX_ByteStringC& key, 355 CFX_ByteString GetStringBy(const CFX_ByteStringC& key,
336 const CFX_ByteStringC& default_str) const; 356 const CFX_ByteStringC& default_str) const;
337
338 CFX_ByteStringC GetConstStringBy(const CFX_ByteStringC& key, 357 CFX_ByteStringC GetConstStringBy(const CFX_ByteStringC& key,
339 const CFX_ByteStringC& default_str) const; 358 const CFX_ByteStringC& default_str) const;
340
341 CFX_WideString GetUnicodeTextBy(const CFX_ByteStringC& key, 359 CFX_WideString GetUnicodeTextBy(const CFX_ByteStringC& key,
342 CFX_CharMap* pCharMap = NULL) const; 360 CFX_CharMap* pCharMap = NULL) const;
343
344 int GetIntegerBy(const CFX_ByteStringC& key) const; 361 int GetIntegerBy(const CFX_ByteStringC& key) const;
345
346 int GetIntegerBy(const CFX_ByteStringC& key, int default_int) const; 362 int GetIntegerBy(const CFX_ByteStringC& key, int default_int) const;
347
348 FX_BOOL GetBooleanBy(const CFX_ByteStringC& key, 363 FX_BOOL GetBooleanBy(const CFX_ByteStringC& key,
349 FX_BOOL bDefault = FALSE) const; 364 FX_BOOL bDefault = FALSE) const;
350
351 FX_FLOAT GetNumberBy(const CFX_ByteStringC& key) const; 365 FX_FLOAT GetNumberBy(const CFX_ByteStringC& key) const;
352
353 CPDF_Dictionary* GetDictBy(const CFX_ByteStringC& key) const; 366 CPDF_Dictionary* GetDictBy(const CFX_ByteStringC& key) const;
354
355 CPDF_Stream* GetStreamBy(const CFX_ByteStringC& key) const; 367 CPDF_Stream* GetStreamBy(const CFX_ByteStringC& key) const;
356
357 CPDF_Array* GetArrayBy(const CFX_ByteStringC& key) const; 368 CPDF_Array* GetArrayBy(const CFX_ByteStringC& key) const;
358
359 CFX_FloatRect GetRectBy(const CFX_ByteStringC& key) const; 369 CFX_FloatRect GetRectBy(const CFX_ByteStringC& key) const;
360
361 CFX_Matrix GetMatrixBy(const CFX_ByteStringC& key) const; 370 CFX_Matrix GetMatrixBy(const CFX_ByteStringC& key) const;
362
363 FX_FLOAT GetFloatBy(const CFX_ByteStringC& key) const { 371 FX_FLOAT GetFloatBy(const CFX_ByteStringC& key) const {
364 return GetNumberBy(key); 372 return GetNumberBy(key);
365 } 373 }
366 374
367 FX_BOOL KeyExist(const CFX_ByteStringC& key) const; 375 FX_BOOL KeyExist(const CFX_ByteStringC& key) const;
368 376
369 // Set* functions invalidate iterators for the element with the key |key|. 377 // Set* functions invalidate iterators for the element with the key |key|.
370 void SetAt(const CFX_ByteStringC& key, CPDF_Object* pObj); 378 void SetAt(const CFX_ByteStringC& key, CPDF_Object* pObj);
371
372 void SetAtName(const CFX_ByteStringC& key, const CFX_ByteString& name); 379 void SetAtName(const CFX_ByteStringC& key, const CFX_ByteString& name);
373
374 void SetAtString(const CFX_ByteStringC& key, const CFX_ByteString& string); 380 void SetAtString(const CFX_ByteStringC& key, const CFX_ByteString& string);
375
376 void SetAtInteger(const CFX_ByteStringC& key, int i); 381 void SetAtInteger(const CFX_ByteStringC& key, int i);
377
378 void SetAtNumber(const CFX_ByteStringC& key, FX_FLOAT f); 382 void SetAtNumber(const CFX_ByteStringC& key, FX_FLOAT f);
379
380 void SetAtReference(const CFX_ByteStringC& key, 383 void SetAtReference(const CFX_ByteStringC& key,
381 CPDF_IndirectObjectHolder* pDoc, 384 CPDF_IndirectObjectHolder* pDoc,
382 FX_DWORD objnum); 385 FX_DWORD objnum);
383
384 void SetAtReference(const CFX_ByteStringC& key, 386 void SetAtReference(const CFX_ByteStringC& key,
385 CPDF_IndirectObjectHolder* pDoc, 387 CPDF_IndirectObjectHolder* pDoc,
386 CPDF_Object* obj) { 388 CPDF_Object* obj) {
387 SetAtReference(key, pDoc, obj->GetObjNum()); 389 SetAtReference(key, pDoc, obj->GetObjNum());
388 } 390 }
391 void SetAtRect(const CFX_ByteStringC& key, const CFX_FloatRect& rect);
392 void SetAtMatrix(const CFX_ByteStringC& key, const CFX_Matrix& matrix);
393 void SetAtBoolean(const CFX_ByteStringC& key, FX_BOOL bValue);
389 394
390 void AddReference(const CFX_ByteStringC& key, 395 void AddReference(const CFX_ByteStringC& key,
391 CPDF_IndirectObjectHolder* pDoc, 396 CPDF_IndirectObjectHolder* pDoc,
392 FX_DWORD objnum); 397 FX_DWORD objnum);
393 398
394 void SetAtRect(const CFX_ByteStringC& key, const CFX_FloatRect& rect);
395
396 void SetAtMatrix(const CFX_ByteStringC& key, const CFX_Matrix& matrix);
397
398 void SetAtBoolean(const CFX_ByteStringC& key, FX_BOOL bValue);
399
400 // Invalidates iterators for the element with the key |key|. 399 // Invalidates iterators for the element with the key |key|.
401 void RemoveAt(const CFX_ByteStringC& key); 400 void RemoveAt(const CFX_ByteStringC& key);
402 401
403 // Invalidates iterators for the element with the key |oldkey|. 402 // Invalidates iterators for the element with the key |oldkey|.
404 void ReplaceKey(const CFX_ByteStringC& oldkey, const CFX_ByteStringC& newkey); 403 void ReplaceKey(const CFX_ByteStringC& oldkey, const CFX_ByteStringC& newkey);
405 404
406 FX_BOOL Identical(CPDF_Dictionary* pDict) const;
407
408 size_t GetCount() const { return m_Map.size(); }
409
410 iterator begin() { return m_Map.begin(); } 405 iterator begin() { return m_Map.begin(); }
411
412 iterator end() { return m_Map.end(); } 406 iterator end() { return m_Map.end(); }
413
414 const_iterator begin() const { return m_Map.begin(); } 407 const_iterator begin() const { return m_Map.begin(); }
415
416 const_iterator end() const { return m_Map.end(); } 408 const_iterator end() const { return m_Map.end(); }
417 409
418 protected: 410 protected:
419 ~CPDF_Dictionary(); 411 ~CPDF_Dictionary();
420 412
421 std::map<CFX_ByteString, CPDF_Object*> m_Map; 413 std::map<CFX_ByteString, CPDF_Object*> m_Map;
414 };
422 415
423 friend class CPDF_Object;
424 };
425 inline CPDF_Dictionary* ToDictionary(CPDF_Object* obj) { 416 inline CPDF_Dictionary* ToDictionary(CPDF_Object* obj) {
426 return obj ? obj->AsDictionary() : nullptr; 417 return obj ? obj->AsDictionary() : nullptr;
427 } 418 }
419
428 inline const CPDF_Dictionary* ToDictionary(const CPDF_Object* obj) { 420 inline const CPDF_Dictionary* ToDictionary(const CPDF_Object* obj) {
429 return obj ? obj->AsDictionary() : nullptr; 421 return obj ? obj->AsDictionary() : nullptr;
430 } 422 }
431 423
432 class CPDF_Stream : public CPDF_Object { 424 class CPDF_Stream : public CPDF_Object {
433 public: 425 public:
434 CPDF_Stream(uint8_t* pData, FX_DWORD size, CPDF_Dictionary* pDict); 426 CPDF_Stream(uint8_t* pData, FX_DWORD size, CPDF_Dictionary* pDict);
435 427
436 CPDF_Dictionary* GetDict() const { return m_pDict; } 428 // CPDF_Object.
429 Type GetType() const override { return STREAM; }
430 CPDF_Object* Clone(FX_BOOL bDirect = FALSE) const override;
431 CPDF_Dictionary* GetDict() const override { return m_pDict; }
432 CFX_WideString GetUnicodeText(CFX_CharMap* pCharMap = nullptr) const override;
433 bool IsStream() const override { return true; }
434 CPDF_Stream* AsStream() override { return this; }
435 const CPDF_Stream* AsStream() const override { return this; }
436
437 FX_DWORD GetRawSize() const { return m_dwSize; }
438 uint8_t* GetRawData() const { return m_pDataBuf; }
437 439
438 void SetData(const uint8_t* pData, 440 void SetData(const uint8_t* pData,
439 FX_DWORD size, 441 FX_DWORD size,
440 FX_BOOL bCompressed, 442 FX_BOOL bCompressed,
441 FX_BOOL bKeepBuf); 443 FX_BOOL bKeepBuf);
442 444
443 void InitStream(uint8_t* pData, FX_DWORD size, CPDF_Dictionary* pDict); 445 void InitStream(uint8_t* pData, FX_DWORD size, CPDF_Dictionary* pDict);
444
445 void InitStreamFromFile(IFX_FileRead* pFile, CPDF_Dictionary* pDict); 446 void InitStreamFromFile(IFX_FileRead* pFile, CPDF_Dictionary* pDict);
446 447
447 FX_BOOL Identical(CPDF_Stream* pOther) const;
448
449 FX_DWORD GetRawSize() const { return m_dwSize; }
450
451 FX_BOOL ReadRawData(FX_FILESIZE start_pos, 448 FX_BOOL ReadRawData(FX_FILESIZE start_pos,
452 uint8_t* pBuf, 449 uint8_t* pBuf,
453 FX_DWORD buf_size) const; 450 FX_DWORD buf_size) const;
454 451
455 FX_BOOL IsMemoryBased() const { return m_GenNum == kMemoryBasedGenNum; } 452 FX_BOOL IsMemoryBased() const { return m_GenNum == kMemoryBasedGenNum; }
456 453
457 protected: 454 protected:
458 friend class CPDF_Object; 455 static const FX_DWORD kMemoryBasedGenNum = (FX_DWORD)-1;
459 friend class CPDF_StreamAcc;
460 456
461 static const FX_DWORD kMemoryBasedGenNum = (FX_DWORD)-1;
462 ~CPDF_Stream(); 457 ~CPDF_Stream();
463 458
464 void InitStreamInternal(CPDF_Dictionary* pDict); 459 void InitStreamInternal(CPDF_Dictionary* pDict);
465 460
466 CPDF_Dictionary* m_pDict; 461 CPDF_Dictionary* m_pDict;
467
468 FX_DWORD m_dwSize; 462 FX_DWORD m_dwSize;
469
470 FX_DWORD m_GenNum; 463 FX_DWORD m_GenNum;
471 464
472 union { 465 union {
473 uint8_t* m_pDataBuf; 466 uint8_t* m_pDataBuf;
474
475 IFX_FileRead* m_pFile; 467 IFX_FileRead* m_pFile;
476 }; 468 };
477 }; 469 };
470
478 inline CPDF_Stream* ToStream(CPDF_Object* obj) { 471 inline CPDF_Stream* ToStream(CPDF_Object* obj) {
479 return obj ? obj->AsStream() : nullptr; 472 return obj ? obj->AsStream() : nullptr;
480 } 473 }
474
481 inline const CPDF_Stream* ToStream(const CPDF_Object* obj) { 475 inline const CPDF_Stream* ToStream(const CPDF_Object* obj) {
482 return obj ? obj->AsStream() : nullptr; 476 return obj ? obj->AsStream() : nullptr;
483 } 477 }
484 478
485 class CPDF_StreamAcc { 479 class CPDF_StreamAcc {
486 public: 480 public:
487 CPDF_StreamAcc(); 481 CPDF_StreamAcc();
488
489 ~CPDF_StreamAcc(); 482 ~CPDF_StreamAcc();
490 483
491 void LoadAllData(const CPDF_Stream* pStream, 484 void LoadAllData(const CPDF_Stream* pStream,
492 FX_BOOL bRawAccess = FALSE, 485 FX_BOOL bRawAccess = FALSE,
493 FX_DWORD estimated_size = 0, 486 FX_DWORD estimated_size = 0,
494 FX_BOOL bImageAcc = FALSE); 487 FX_BOOL bImageAcc = FALSE);
495 488
496 const CPDF_Stream* GetStream() const { return m_pStream; } 489 const CPDF_Stream* GetStream() const { return m_pStream; }
497
498 CPDF_Dictionary* GetDict() const { 490 CPDF_Dictionary* GetDict() const {
499 return m_pStream ? m_pStream->GetDict() : nullptr; 491 return m_pStream ? m_pStream->GetDict() : nullptr;
500 } 492 }
501
502 const uint8_t* GetData() const; 493 const uint8_t* GetData() const;
503
504 FX_DWORD GetSize() const; 494 FX_DWORD GetSize() const;
495 const CFX_ByteString& GetImageDecoder() const { return m_ImageDecoder; }
496 const CPDF_Dictionary* GetImageParam() const { return m_pImageParam; }
505 497
506 uint8_t* DetachData(); 498 uint8_t* DetachData();
507 499
508 const CFX_ByteString& GetImageDecoder() { return m_ImageDecoder; }
509
510 const CPDF_Dictionary* GetImageParam() { return m_pImageParam; }
511
512 protected: 500 protected:
513 uint8_t* m_pData; 501 uint8_t* m_pData;
514
515 FX_DWORD m_dwSize; 502 FX_DWORD m_dwSize;
516
517 FX_BOOL m_bNewBuf; 503 FX_BOOL m_bNewBuf;
518
519 CFX_ByteString m_ImageDecoder; 504 CFX_ByteString m_ImageDecoder;
520
521 CPDF_Dictionary* m_pImageParam; 505 CPDF_Dictionary* m_pImageParam;
522
523 const CPDF_Stream* m_pStream; 506 const CPDF_Stream* m_pStream;
524
525 uint8_t* m_pSrcData; 507 uint8_t* m_pSrcData;
526 }; 508 };
527 509
528 class CPDF_Null : public CPDF_Object { 510 class CPDF_Null : public CPDF_Object {
529 public: 511 public:
530 CPDF_Null() : CPDF_Object(NULLOBJ) {} 512 CPDF_Null() {}
513
514 // CPDF_Object.
515 Type GetType() const override { return NULLOBJ; }
516 CPDF_Object* Clone(FX_BOOL bDirect = FALSE) const override {
517 return new CPDF_Null;
518 }
531 }; 519 };
532 520
533 class CPDF_Reference : public CPDF_Object { 521 class CPDF_Reference : public CPDF_Object {
534 public: 522 public:
535 CPDF_Reference(CPDF_IndirectObjectHolder* pDoc, int objnum) 523 CPDF_Reference(CPDF_IndirectObjectHolder* pDoc, int objnum)
536 : CPDF_Object(REFERENCE), m_pObjList(pDoc), m_RefObjNum(objnum) {} 524 : m_pObjList(pDoc), m_RefObjNum(objnum) {}
525
526 // CPDF_Object.
527 Type GetType() const override { return REFERENCE; }
528 CPDF_Object* Clone(FX_BOOL bDirect = FALSE) const override;
529 CPDF_Object* GetDirect() const override;
530 CFX_ByteString GetString() const override {
531 CPDF_Object* obj = SafeGetDirect();
532 return obj ? obj->GetString() : CFX_ByteString();
533 }
534 CFX_ByteStringC GetConstString() const override {
535 CPDF_Object* obj = SafeGetDirect();
536 return obj ? obj->GetConstString() : CFX_ByteStringC();
537 }
538 FX_FLOAT GetNumber() const override {
539 CPDF_Object* obj = SafeGetDirect();
540 return obj ? obj->GetNumber() : 0;
541 }
542 int GetInteger() const override {
543 CPDF_Object* obj = SafeGetDirect();
544 return obj ? obj->GetInteger() : 0;
545 }
546 CPDF_Dictionary* GetDict() const override {
547 CPDF_Object* obj = SafeGetDirect();
548 return obj ? obj->GetDict() : nullptr;
549 }
550 // TODO(weili): check whether GetUnicodeText() and GetArray() are needed.
551 bool IsReference() const override { return true; }
552 CPDF_Reference* AsReference() override { return this; }
553 const CPDF_Reference* AsReference() const override { return this; }
537 554
538 CPDF_IndirectObjectHolder* GetObjList() const { return m_pObjList; } 555 CPDF_IndirectObjectHolder* GetObjList() const { return m_pObjList; }
539
540 FX_DWORD GetRefObjNum() const { return m_RefObjNum; } 556 FX_DWORD GetRefObjNum() const { return m_RefObjNum; }
541 557
542 void SetRef(CPDF_IndirectObjectHolder* pDoc, FX_DWORD objnum); 558 void SetRef(CPDF_IndirectObjectHolder* pDoc, FX_DWORD objnum);
543 559
544 FX_BOOL Identical(CPDF_Reference* pOther) const { 560 protected:
545 return m_RefObjNum == pOther->m_RefObjNum; 561 ~CPDF_Reference() {}
562 CPDF_Object* SafeGetDirect() const {
563 CPDF_Object* obj = GetDirect();
564 if (!obj || obj->IsReference())
565 return nullptr;
566 return obj;
546 } 567 }
547 568
548 protected:
549 CPDF_IndirectObjectHolder* m_pObjList; 569 CPDF_IndirectObjectHolder* m_pObjList;
570 FX_DWORD m_RefObjNum;
571 };
550 572
551 FX_DWORD m_RefObjNum;
552 friend class CPDF_Object;
553 };
554 inline CPDF_Reference* ToReference(CPDF_Object* obj) { 573 inline CPDF_Reference* ToReference(CPDF_Object* obj) {
555 return obj ? obj->AsReference() : nullptr; 574 return obj ? obj->AsReference() : nullptr;
556 } 575 }
576
557 inline const CPDF_Reference* ToReference(const CPDF_Object* obj) { 577 inline const CPDF_Reference* ToReference(const CPDF_Object* obj) {
558 return obj ? obj->AsReference() : nullptr; 578 return obj ? obj->AsReference() : nullptr;
559 } 579 }
560 580
561 class CPDF_IndirectObjectHolder { 581 class CPDF_IndirectObjectHolder {
562 public: 582 public:
563 using iterator = std::map<FX_DWORD, CPDF_Object*>::iterator; 583 using iterator = std::map<FX_DWORD, CPDF_Object*>::iterator;
564 using const_iterator = std::map<FX_DWORD, CPDF_Object*>::const_iterator; 584 using const_iterator = std::map<FX_DWORD, CPDF_Object*>::const_iterator;
565 585
566 explicit CPDF_IndirectObjectHolder(CPDF_Parser* pParser); 586 explicit CPDF_IndirectObjectHolder(CPDF_Parser* pParser);
567 ~CPDF_IndirectObjectHolder(); 587 ~CPDF_IndirectObjectHolder();
568 588
569 CPDF_Object* GetIndirectObject(FX_DWORD objnum); 589 CPDF_Object* GetIndirectObject(FX_DWORD objnum);
570 FX_DWORD AddIndirectObject(CPDF_Object* pObj); 590 FX_DWORD AddIndirectObject(CPDF_Object* pObj);
571 void ReleaseIndirectObject(FX_DWORD objnum); 591 void ReleaseIndirectObject(FX_DWORD objnum);
572 592
573 // Takes ownership of |pObj|. 593 // Takes ownership of |pObj|.
574 FX_BOOL InsertIndirectObject(FX_DWORD objnum, CPDF_Object* pObj); 594 FX_BOOL InsertIndirectObject(FX_DWORD objnum, CPDF_Object* pObj);
575 595
576 FX_DWORD GetLastObjNum() const { return m_LastObjNum; } 596 FX_DWORD GetLastObjNum() const { return m_LastObjNum; }
577 iterator begin() { return m_IndirectObjs.begin(); } 597 iterator begin() { return m_IndirectObjs.begin(); }
578 const_iterator begin() const { return m_IndirectObjs.cbegin(); } 598 const_iterator begin() const { return m_IndirectObjs.begin(); }
579 iterator end() { return m_IndirectObjs.end(); } 599 iterator end() { return m_IndirectObjs.end(); }
580 const_iterator end() const { return m_IndirectObjs.end(); } 600 const_iterator end() const { return m_IndirectObjs.end(); }
581 601
582 protected: 602 protected:
583 CPDF_Parser* m_pParser; 603 CPDF_Parser* m_pParser;
584 FX_DWORD m_LastObjNum; 604 FX_DWORD m_LastObjNum;
585 std::map<FX_DWORD, CPDF_Object*> m_IndirectObjs; 605 std::map<FX_DWORD, CPDF_Object*> m_IndirectObjs;
586 }; 606 };
587 607
588 #endif // CORE_INCLUDE_FPDFAPI_FPDF_OBJECTS_H_ 608 #endif // CORE_INCLUDE_FPDFAPI_FPDF_OBJECTS_H_
OLDNEW
« no previous file with comments | « no previous file | core/src/fpdfapi/fpdf_page/fpdf_page_image.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698