1 ///////////////////////////////////////////////////////////////////////////////
2 // Name:        pdfobjects.cpp
3 // Purpose:
4 // Author:      Ulrich Telle
5 // Created:     2006-07-13
6 // Copyright:   (c) Ulrich Telle
7 // Licence:     wxWindows licence
8 ///////////////////////////////////////////////////////////////////////////////
9 
10 /// \file pdfobjects.cpp Implementation of PDF objects
11 
12 // For compilers that support precompilation, includes <wx.h>.
13 #include <wx/wxprec.h>
14 
15 #ifdef __BORLANDC__
16 #pragma hdrstop
17 #endif
18 
19 #ifndef WX_PRECOMP
20 #include <wx/wx.h>
21 #endif
22 
23 // includes
24 
25 #include "wx/pdfobjects.h"
26 #include "wx/pdfutility.h"
27 
28 // --- Object queue for processing the resource tree
29 
wxPdfObjectQueue(int originalObjectId,int actualObjectId,wxPdfObject * object)30 wxPdfObjectQueue::wxPdfObjectQueue(int originalObjectId, int actualObjectId, wxPdfObject* object)
31 {
32   m_originalObjectId = originalObjectId;
33   m_actualObjectId = actualObjectId;
34   m_object = object;
35   m_next = NULL;
36 }
37 
38 // --- Base object
39 
wxPdfObject(int type)40 wxPdfObject::wxPdfObject(int type)
41 {
42   m_type = type;
43   m_objNum = -1;
44   m_objGen = -1;
45   m_actualId = -1;
46   m_indirect = false;
47 }
48 
~wxPdfObject()49 wxPdfObject::~wxPdfObject()
50 {
51 }
52 
53 bool
CanBeInObjStm()54 wxPdfObject::CanBeInObjStm()
55 {
56   return (m_type >= 1 && m_type <= 7);
57 }
58 
59 void
SetObjNum(int objNum,int objGen)60 wxPdfObject::SetObjNum(int objNum, int objGen)
61 {
62   m_objNum = objNum;
63   m_objGen = objGen;
64 }
65 
66 // --- Null object
67 
wxPdfNull()68 wxPdfNull::wxPdfNull()
69   : wxPdfObject(OBJTYPE_NULL)
70 {
71 }
72 
~wxPdfNull()73 wxPdfNull::~wxPdfNull()
74 {
75 }
76 
77 // --- Indirect Reference
78 
wxPdfIndirectReference(int number,int generation)79 wxPdfIndirectReference::wxPdfIndirectReference(int number, int generation)
80   : wxPdfObject(OBJTYPE_INDIRECT)
81 {
82   SetObjNum(number, generation);
83 }
84 
~wxPdfIndirectReference()85 wxPdfIndirectReference::~wxPdfIndirectReference()
86 {
87 }
88 
89 // --- Literal
90 
wxPdfLiteral(int type,const wxString & value)91 wxPdfLiteral::wxPdfLiteral(int type, const wxString& value)
92   : wxPdfObject(type)
93 {
94   m_value = value;
95 }
96 
~wxPdfLiteral()97 wxPdfLiteral::~wxPdfLiteral()
98 {
99 }
100 
101 // --- Boolean
102 
wxPdfBoolean(bool value)103 wxPdfBoolean::wxPdfBoolean(bool value)
104 : wxPdfObject(OBJTYPE_BOOLEAN)
105 {
106   m_value = value;
107 }
108 
~wxPdfBoolean()109 wxPdfBoolean::~wxPdfBoolean()
110 {
111 }
112 
113 wxString
GetAsString()114 wxPdfBoolean::GetAsString()
115 {
116   return (m_value) ? wxS("true") : wxS("false");
117 }
118 
119 // --- String / Hex string
120 
wxPdfString(const wxString & value)121 wxPdfString::wxPdfString(const wxString& value)
122 : wxPdfObject(OBJTYPE_STRING)
123 {
124   m_value = value;
125 }
126 
~wxPdfString()127 wxPdfString::~wxPdfString()
128 {
129 }
130 
131 // --- Number
132 
wxPdfNumber(const wxString & value)133 wxPdfNumber::wxPdfNumber(const wxString& value)
134   : wxPdfObject(OBJTYPE_NUMBER)
135 {
136   m_value = wxPdfUtility::String2Double(value);
137   m_string = value;
138   m_isInt = false;
139 }
140 
wxPdfNumber(int value)141 wxPdfNumber::wxPdfNumber(int value)
142   : wxPdfObject(OBJTYPE_NUMBER)
143 {
144   m_value = value;
145   m_string = wxString::Format(wxS("%d"), value);
146   m_isInt = true;
147 }
148 
wxPdfNumber(double value)149 wxPdfNumber::wxPdfNumber(double value)
150   : wxPdfObject(OBJTYPE_NUMBER)
151 {
152   m_value = value;
153   m_string = wxPdfUtility::Double2String(value, 5);
154   m_isInt = false;
155 }
156 
~wxPdfNumber()157 wxPdfNumber::~wxPdfNumber()
158 {
159 }
160 
161 // --- Name
162 
wxPdfName()163 wxPdfName::wxPdfName()
164   : wxPdfObject(OBJTYPE_NAME)
165 {
166 }
167 
wxPdfName(const wxString & name)168 wxPdfName::wxPdfName(const wxString& name)
169   : wxPdfObject(OBJTYPE_NAME)
170 {
171   m_name = name;
172 }
173 
~wxPdfName()174 wxPdfName::~wxPdfName()
175 {
176 }
177 
178 // --- Array
179 
wxPdfArray()180 wxPdfArray::wxPdfArray()
181   : wxPdfObject(OBJTYPE_ARRAY)
182 {
183 }
184 
~wxPdfArray()185 wxPdfArray::~wxPdfArray()
186 {
187   wxPdfObject* obj;
188   size_t j;
189   for (j = 0; j < m_array.GetCount(); j++)
190   {
191     obj = (wxPdfObject*) m_array.Item(j);
192     if (obj != NULL)
193     {
194       delete obj;
195     }
196   }
197   m_array.Clear();
198 }
199 
200 void
Add(wxPdfObject * obj)201 wxPdfArray::Add(wxPdfObject* obj)
202 {
203   m_array.Add(obj);
204 }
205 
206 void
Add(int value)207 wxPdfArray::Add(int value)
208 {
209   wxPdfNumber* obj = new wxPdfNumber(value);
210   m_array.Add(obj);
211 }
212 
213 void
Add(double value)214 wxPdfArray::Add(double value)
215 {
216   wxPdfNumber* obj = new wxPdfNumber(value);
217   m_array.Add(obj);
218 }
219 
220 wxPdfObject*
Get(size_t index)221 wxPdfArray::Get(size_t index)
222 {
223   wxPdfObject* obj = NULL;
224   if (index < m_array.GetCount())
225   {
226     obj = (wxPdfObject*) m_array.Item(index);
227   }
228   return obj;
229 }
230 
231 // --- Dictionary
232 
wxPdfDictionary()233 wxPdfDictionary::wxPdfDictionary()
234   : wxPdfObject(OBJTYPE_DICTIONARY)
235 {
236   m_hashMap = new wxPdfDictionaryMap();
237 }
238 
wxPdfDictionary(const wxString & type)239 wxPdfDictionary::wxPdfDictionary(const wxString& type)
240   : wxPdfObject(OBJTYPE_DICTIONARY)
241 {
242   m_hashMap = new wxPdfDictionaryMap();
243   Put(wxS("Type"), new wxPdfName(type));
244 }
245 
~wxPdfDictionary()246 wxPdfDictionary::~wxPdfDictionary()
247 {
248   wxPdfDictionaryMap::iterator entry = m_hashMap->begin();
249   for (entry = m_hashMap->begin(); entry != m_hashMap->end(); entry++)
250   {
251     wxPdfObject* obj = entry->second;
252     delete obj;
253   }
254   delete m_hashMap;
255 }
256 
257 void
Put(wxPdfName * key,wxPdfObject * value)258 wxPdfDictionary::Put(wxPdfName* key, wxPdfObject* value)
259 {
260   (*m_hashMap)[key->GetName()] = value;
261 }
262 
263 void
Put(const wxString & key,wxPdfObject * value)264 wxPdfDictionary::Put(const wxString& key, wxPdfObject* value)
265 {
266   (*m_hashMap)[key] = value;
267 }
268 
269 wxPdfObject*
Get(const wxString & key)270 wxPdfDictionary::Get(const wxString& key)
271 {
272   wxPdfObject* value = NULL;
273   wxPdfDictionaryMap::iterator entry = m_hashMap->find(key);
274   if (entry != m_hashMap->end())
275   {
276     value = entry->second;
277   }
278   return value;
279 }
280 
281 // --- Stream
282 
wxPdfStream()283 wxPdfStream::wxPdfStream()
284   : wxPdfObject(OBJTYPE_STREAM)
285 {
286   m_offset     = 0;
287   m_dictionary = NULL;
288   m_buffer     = NULL;
289   m_hasObjOffsets = false;
290 }
291 
wxPdfStream(off_t offset)292 wxPdfStream::wxPdfStream(off_t offset)
293   : wxPdfObject(OBJTYPE_STREAM)
294 {
295   m_offset     = offset;
296   m_dictionary = NULL;
297   m_buffer     = NULL;
298   m_hasObjOffsets = false;
299 }
300 
~wxPdfStream()301 wxPdfStream::~wxPdfStream()
302 {
303   if (m_dictionary != NULL)
304   {
305     delete m_dictionary;
306   }
307   if (m_buffer != NULL)
308   {
309     delete m_buffer;
310   }
311   m_objOffsets.Clear();
312 }
313 
314 wxPdfObject*
Get(const wxString & key)315 wxPdfStream::Get(const wxString& key)
316 {
317   wxPdfObject* obj = (m_dictionary != NULL) ? m_dictionary->Get(key) : NULL;
318   return obj;
319 }
320 
321 
322 int
GetObjOffset(int index) const323 wxPdfStream::GetObjOffset(int index) const
324 {
325   int objOffset = -1;
326   if (index >= 0 && (size_t) index < m_objOffsets.GetCount())
327   {
328     objOffset = m_objOffsets[index];
329   }
330   return objOffset;
331 }
332