OLD | NEW |
1 | 1 |
2 | 2 |
3 import sys | 3 import sys |
4 | 4 |
5 import datatypes | 5 import datatypes |
6 import pdfspec_autogen | 6 import pdfspec_autogen |
7 | 7 |
8 knowTypes = { | 8 knowTypes = { |
9 '(any)': ['SkPdfObject*', 'ObjectFromDictionary', datatypes.CppNull(), 'true'], | 9 '(any)': ['SkPdfObject*', 'ObjectFromDictionary', datatypes.CppNull(), 'true'], |
10 '(undefined)': ['SkPdfObject*', 'ObjectFromDictionary', datatypes.CppNull(), 'tr
ue'], | 10 '(undefined)': ['SkPdfObject*', 'ObjectFromDictionary', datatypes.CppNull(), 'tr
ue'], |
11 '(various)': ['SkPdfObject*', 'ObjectFromDictionary', datatypes.CppNull(), 'true
'], | 11 '(various)': ['SkPdfObject*', 'ObjectFromDictionary', datatypes.CppNull(), 'true
'], |
12 'array': ['SkPdfArray', 'ArrayFromDictionary', datatypes.PdfArrayNone(), 'ret->p
odofo()->GetDataType() == ePdfDataType_Array'], | 12 'array': ['SkPdfArray', 'ArrayFromDictionary', datatypes.PdfArrayNone(), 'ret->p
odofo()->GetDataType() == ePdfDataType_Array'], |
13 'boolean': ['bool', 'BoolFromDictionary', datatypes.PdfBoolean('false'), 'ret->p
odofo()->GetDataType() == ePdfDataType_Bool'], | 13 'boolean': ['bool', 'BoolFromDictionary', datatypes.PdfBoolean('false'), 'ret->p
odofo()->GetDataType() == ePdfDataType_Bool'], |
14 'date': ['SkPdfDate', 'DateFromDictionary', datatypes.PdfDateNever(), 'ret->podo
fo()->GetDataType() == ePdfDataType_Array'], | 14 'date': ['SkPdfDate', 'DateFromDictionary', datatypes.PdfDateNever(), 'ret->podo
fo()->GetDataType() == ePdfDataType_Array'], |
15 'dictionary': ['SkPdfDictionary*', 'DictionaryFromDictionary', datatypes.CppNull
(), 'ret->podofo()->GetDataType() == ePdfDataType_Dictionary'], | 15 'dictionary': ['SkPdfDictionary*', 'DictionaryFromDictionary', datatypes.CppNull
(), 'ret->podofo()->GetDataType() == ePdfDataType_Dictionary'], |
16 'function': ['SkPdfFunction', 'FunctionFromDictionary', datatypes.PdfFunctionNon
e(), 'ret->podofo()->GetDataType() == ePdfDataType_Reference'], | 16 'function': ['SkPdfFunction', 'FunctionFromDictionary', datatypes.PdfFunctionNon
e(), 'ret->podofo()->GetDataType() == ePdfDataType_Reference'], |
17 'integer': ['long', 'LongFromDictionary', datatypes.PdfInteger(0), 'ret->podofo(
)->GetDataType() == ePdfDataType_Number'], | 17 'integer': ['long', 'LongFromDictionary', datatypes.PdfInteger(0), 'ret->podofo(
)->GetDataType() == ePdfDataType_Number'], |
18 'file_specification': ['SkPdfFileSpec', 'FileSpecFromDictionary', datatypes.File
SpecNone(), 'ret->podofo()->GetDataType() == ePdfDataType_Reference'], | 18 'file_specification': ['SkPdfFileSpec', 'FileSpecFromDictionary', datatypes.File
SpecNone(), 'ret->podofo()->GetDataType() == ePdfDataType_Reference'], |
19 'name': ['std::string', 'NameFromDictionary', datatypes.PdfString('""'), 'ret->p
odofo()->GetDataType() == ePdfDataType_Name'], | 19 'name': ['std::string', 'NameFromDictionary', datatypes.PdfString('""'), 'ret->p
odofo()->GetDataType() == ePdfDataType_Name'], |
20 'tree': ['SkPdfTree*', 'TreeFromDictionary', datatypes.CppNull(), 'ret->podofo()
->GetDataType() == ePdfDataType_Reference'], | 20 'tree': ['SkPdfTree*', 'TreeFromDictionary', datatypes.CppNull(), 'ret->podofo()
->GetDataType() == ePdfDataType_Reference'], |
21 'number': ['double', 'DoubleFromDictionary', datatypes.PdfNumber(0), 'ret->podof
o()->GetDataType() == ePdfDataType_Real'], | 21 'number': ['double', 'DoubleFromDictionary', datatypes.PdfNumber(0), 'ret->podof
o()->GetDataType() == ePdfDataType_Real || ret->podofo()->GetDataType() == ePdfD
ataType_Number'], |
22 'rectangle': ['SkRect', 'SkRectFromDictionary', datatypes.PdfEmptyRect(), 'ret->
podofo()->GetDataType() == ePdfDataType_Array'], | 22 'rectangle': ['SkRect', 'SkRectFromDictionary', datatypes.PdfEmptyRect(), 'ret->
podofo()->GetDataType() == ePdfDataType_Array'], |
23 'stream': ['SkPdfStream', 'StreamFromDictionary', datatypes.PdfEmptyStream(), '
ret->podofo()->HasStream()'], | 23 'stream': ['SkPdfStream', 'StreamFromDictionary', datatypes.PdfEmptyStream(), '
ret->podofo()->HasStream()'], |
24 'string': ['std::string', 'StringFromDictionary', datatypes.PdfString('""'), 're
t->podofo()->GetDataType() == ePdfDataType_String || ret->podofo()->GetDataType(
) == ePdfDataType_HexString'], | 24 'string': ['std::string', 'StringFromDictionary', datatypes.PdfString('""'), 're
t->podofo()->GetDataType() == ePdfDataType_String || ret->podofo()->GetDataType(
) == ePdfDataType_HexString'], |
25 'text': ['std::string', 'StringFromDictionary', datatypes.PdfString('""'), 'ret-
>podofo()->GetDataType() == ePdfDataType_String || ret->podofo()->GetDataType()
== ePdfDataType_HexString'], | 25 'text': ['std::string', 'StringFromDictionary', datatypes.PdfString('""'), 'ret-
>podofo()->GetDataType() == ePdfDataType_String || ret->podofo()->GetDataType()
== ePdfDataType_HexString'], |
26 'text string': ['std::string', 'StringFromDictionary', datatypes.PdfString('""')
, 'ret->podofo()->GetDataType() == ePdfDataType_String || ret->podofo()->GetData
Type() == ePdfDataType_HexString'], | 26 'text string': ['std::string', 'StringFromDictionary', datatypes.PdfString('""')
, 'ret->podofo()->GetDataType() == ePdfDataType_String || ret->podofo()->GetData
Type() == ePdfDataType_HexString'], |
27 } | 27 } |
28 | 28 |
29 | 29 |
30 class PdfField: | 30 class PdfField: |
31 def __init__(self, parent, name, abr): | 31 def __init__(self, parent, name, abr): |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
153 | 153 |
154 def addClass(self, name, base='Object', comment=''): | 154 def addClass(self, name, base='Object', comment=''): |
155 if name == 'Object': | 155 if name == 'Object': |
156 cls = PdfClass(name, '', comment) | 156 cls = PdfClass(name, '', comment) |
157 else: | 157 else: |
158 cls = PdfClass(name, base, comment) | 158 cls = PdfClass(name, base, comment) |
159 self.fClasses[name] = cls | 159 self.fClasses[name] = cls |
160 self.fClassesNamesInOrder.append(name) | 160 self.fClassesNamesInOrder.append(name) |
161 return cls | 161 return cls |
162 | 162 |
163 def longName(self, name): | 163 def writeEnum(self, fileEnums, enum, enumToCls): |
164 #return name | 164 fileEnums.write(' ' + enum + ',\n') |
165 # TODO(edisonn): we need the long name to nenerate and sort enums, but we ca
n generate them recursively | |
166 ret = '' | |
167 while name != '': | |
168 cls = self.fClasses[name] | |
169 ret = name + ret | |
170 name = cls.fBase | |
171 | |
172 return ret | |
173 | |
174 | |
175 def writeEnum(self, enum, enumToCls): | |
176 print(' ' + enum + ',') | |
177 cls = enumToCls[enum] | 165 cls = enumToCls[enum] |
178 cls.fEnumSubclasses.sort() | 166 cls.fEnumSubclasses.sort() |
179 | 167 |
180 cnt = 0 | 168 cnt = 0 |
181 for sub in cls.fEnumSubclasses: | 169 for sub in cls.fEnumSubclasses: |
182 self.writeEnum(cls.fEnumSubclasses[cnt], enumToCls) | 170 self.writeEnum(fileEnums, cls.fEnumSubclasses[cnt], enumToCls) |
183 cnt = cnt + 1 | 171 cnt = cnt + 1 |
184 | 172 |
185 if cnt != 0: | 173 if cnt != 0: |
186 print(' ' + cls.fEnumEnd + ',') | 174 fileEnums.write(' ' + cls.fEnumEnd + ',\n') |
187 | 175 |
188 | 176 |
189 def writeAsNull(self, cls, enumToCls): | 177 def writeAsNull(self, fileClass, cls, enumToCls): |
190 print(' virtual SkPdf' + cls.fName +'* as' + cls.fName + '() {return NULL;}
') | 178 fileClass.write(' virtual SkPdf' + cls.fName +'* as' + cls.fName + '() {ret
urn NULL;}\n') |
191 print(' virtual const SkPdf' + cls.fName +'* as' + cls.fName + '() const {r
eturn NULL;}') | 179 fileClass.write(' virtual const SkPdf' + cls.fName +'* as' + cls.fName + '(
) const {return NULL;}\n') |
192 print | 180 fileClass.write('\n') |
193 | 181 |
194 cnt = 0 | 182 cnt = 0 |
195 for sub in cls.fEnumSubclasses: | 183 for sub in cls.fEnumSubclasses: |
196 self.writeAsNull(enumToCls[cls.fEnumSubclasses[cnt]], enumToCls) | 184 self.writeAsNull(fileClass, enumToCls[cls.fEnumSubclasses[cnt]], enumToCls
) |
197 cnt = cnt + 1 | 185 cnt = cnt + 1 |
198 | 186 |
199 | 187 |
200 def writeAsFoo(self, cls, enumToCls): | 188 def writeAsFoo(self, fileClass, cls, enumToCls): |
201 # TODO(edisonn): add a container, with sections, public, private, default, .
.. | 189 # TODO(edisonn): add a container, with sections, public, private, default, .
.. |
202 # the end code will be grouped | 190 # the end code will be grouped |
203 | 191 |
204 # me | 192 # me |
205 print('public:') | 193 fileClass.write('public:\n') |
206 print(' virtual SkPdf' + cls.fName +'* as' + cls.fName + '() {return this;}
') | 194 fileClass.write(' virtual SkPdf' + cls.fName +'* as' + cls.fName + '() {ret
urn this;}\n') |
207 print(' virtual const SkPdf' + cls.fName +'* as' + cls.fName + '() const {r
eturn this;}') | 195 fileClass.write(' virtual const SkPdf' + cls.fName +'* as' + cls.fName + '(
) const {return this;}\n') |
208 print | 196 fileClass.write('\n') |
209 | 197 |
210 if cls.fName == 'Object': | 198 if cls.fName == 'Object': |
211 cnt = 0 | 199 cnt = 0 |
212 for sub in cls.fEnumSubclasses: | 200 for sub in cls.fEnumSubclasses: |
213 self.writeAsNull(enumToCls[cls.fEnumSubclasses[cnt]], enumToCls) | 201 self.writeAsNull(fileClass, enumToCls[cls.fEnumSubclasses[cnt]], enumToC
ls) |
214 cnt = cnt + 1 | 202 cnt = cnt + 1 |
215 | 203 |
216 if cls.fName != 'Object': | 204 if cls.fName != 'Object': |
217 print('private:') | 205 fileClass.write('private:\n') |
218 base = self.fClasses[cls.fBase] | 206 base = self.fClasses[cls.fBase] |
219 cnt = 0 | 207 cnt = 0 |
220 for sub in base.fEnumSubclasses: | 208 for sub in base.fEnumSubclasses: |
221 if enumToCls[base.fEnumSubclasses[cnt]].fName != cls.fName: | 209 if enumToCls[base.fEnumSubclasses[cnt]].fName != cls.fName: |
222 self.writeAsNull(enumToCls[base.fEnumSubclasses[cnt]], enumToCls) | 210 self.writeAsNull(fileClass, enumToCls[base.fEnumSubclasses[cnt]], enum
ToCls) |
223 cnt = cnt + 1 | 211 cnt = cnt + 1 |
224 | 212 |
225 | 213 |
226 | 214 |
227 def write(self): | 215 def write(self): |
228 | 216 global fileHeaders |
229 global knowTypes | 217 global knowTypes |
230 | 218 |
231 # generate enum | 219 # generate enum |
232 enumsRoot = [] | 220 enumsRoot = [] |
233 | 221 |
234 enumToCls = {} | 222 enumToCls = {} |
235 | 223 |
236 for name in self.fClasses: | 224 for name in self.fClasses: |
237 cls = self.fClasses[name] | 225 cls = self.fClasses[name] |
238 enum = self.longName(name) | 226 cls.fEnum = 'k' + name + '_SkPdfObjectType' |
239 cls.fEnum = 'k' + enum + '_SkPdfObjectType' | 227 cls.fEnumEnd = 'k' + name + '__End_SkPdfObjectType' |
240 cls.fEnumEnd = 'k' + enum + '__End_SkPdfObjectType' | 228 |
| 229 fileHeaders.write('#include "SkPdf' + cls.fName + '_autogen.h"\n') |
241 | 230 |
242 if cls.fBase != '': | 231 if cls.fBase != '': |
243 self.fClasses[cls.fBase].fEnumSubclasses.append(cls.fEnum) | 232 self.fClasses[cls.fBase].fEnumSubclasses.append(cls.fEnum) |
244 | 233 |
245 if cls.fBase == '': | 234 if cls.fBase == '': |
246 enumsRoot.append(cls.fEnum) | 235 enumsRoot.append(cls.fEnum) |
247 | 236 |
248 enumToCls[cls.fEnum] = cls | 237 enumToCls[cls.fEnum] = cls |
249 | 238 |
250 enumsRoot.sort() | 239 enumsRoot.sort() |
251 | 240 |
252 | 241 |
253 # TODO(edisonn): move each .h in it's own file | 242 # TODO(edisonn): move each .h in it's own file |
254 # write imports | 243 # write imports |
255 | 244 |
256 # write enums | 245 # write enums |
257 print('enum SkPdfObjectType {') | 246 fileEnums = open('SkPdfEnums_autogen.h', 'w') |
| 247 fileEnums.write('#ifndef __DEFINED__SkPdfEnums\n') |
| 248 fileEnums.write('#define __DEFINED__SkPdfEnums\n') |
| 249 fileEnums.write('\n') |
| 250 |
| 251 fileEnums.write('enum SkPdfObjectType {\n') |
258 for enum in enumsRoot: | 252 for enum in enumsRoot: |
259 self.writeEnum(enum, enumToCls) | 253 self.writeEnum(fileEnums, enum, enumToCls) |
260 print('};') | 254 fileEnums.write('};\n') |
261 print | 255 fileEnums.write('\n') |
262 | 256 |
263 # write forward class declaration | 257 # write forward class declaration |
264 for name in self.fClassesNamesInOrder: | 258 for name in self.fClassesNamesInOrder: |
265 print('class SkPdf' + name + ';') | 259 fileEnums.write('class SkPdf' + name + ';\n') |
266 print | 260 fileEnums.write('\n') |
| 261 |
| 262 fileEnums.write('#endif // __DEFINED__SkPdfEnums\n') |
| 263 fileEnums.close() |
267 | 264 |
268 for name in self.fClassesNamesInOrder: | 265 for name in self.fClassesNamesInOrder: |
269 cls = self.fClasses[name] | 266 cls = self.fClasses[name] |
270 enum = cls.fEnum | 267 enum = cls.fEnum |
271 | 268 |
| 269 fileClass = open('SkPdf' + cls.fName + '_autogen.h', 'w') |
| 270 fileClass.write('#ifndef __DEFINED__SkPdf' + cls.fName + '\n') |
| 271 fileClass.write('#define __DEFINED__SkPdf' + cls.fName + '\n') |
| 272 fileClass.write('\n') |
| 273 |
| 274 fileClass.write('#include "SkPdfEnums_autogen.h"\n') |
| 275 fileClass.write('#include "SkPdfArray_autogen.h"\n') |
| 276 |
272 if cls.fBase == '': | 277 if cls.fBase == '': |
273 print('class SkPdf' + cls.fName + ' {') | 278 fileClass.write('\nclass SkPdf' + cls.fName + ' {\n') |
274 else: | 279 else: |
275 print('class SkPdf' + cls.fName + ' : public SkPdf' + cls.fBase + ' {') | 280 fileClass.write('#include "SkPdf' + cls.fBase + '_autogen.h"\n') |
| 281 fileClass.write('\nclass SkPdf' + cls.fName + ' : public SkPdf' + cls.fB
ase + ' {\n') |
276 | 282 |
277 print('public:') | 283 fileClass.write('public:\n') |
278 print(' virtual SkPdfObjectType getType() const { return ' + cls.fEnum +
';}') | 284 fileClass.write(' virtual SkPdfObjectType getType() const { return ' + cl
s.fEnum + ';}\n') |
279 if len(cls.fEnumSubclasses) == 0: | 285 if len(cls.fEnumSubclasses) == 0: |
280 print(' virtual SkPdfObjectType getTypeEnd() const { return (SkPdfObjec
tType)(' + cls.fEnum + ' + 1);}') | 286 fileClass.write(' virtual SkPdfObjectType getTypeEnd() const { return (
SkPdfObjectType)(' + cls.fEnum + ' + 1);}\n') |
281 else: | 287 else: |
282 print(' virtual SkPdfObjectType getTypeEnd() const { return ' + cls.fEn
umEnd + ';}') | 288 fileClass.write(' virtual SkPdfObjectType getTypeEnd() const { return '
+ cls.fEnumEnd + ';}\n') |
283 | 289 |
| 290 self.writeAsFoo(fileClass, cls, enumToCls) |
284 | 291 |
285 self.writeAsFoo(cls, enumToCls) | 292 fileClass.write('public:\n') |
286 | |
287 print('public:') | |
288 for cc in cls.fCCPublic: | 293 for cc in cls.fCCPublic: |
289 print(' ' + cc) | 294 fileClass.write(' ' + cc + '\n') |
290 | 295 |
291 print('private:') | 296 fileClass.write('private:\n') |
292 for cc in cls.fCCPrivate: | 297 for cc in cls.fCCPrivate: |
293 print(' ' + cc) | 298 fileClass.write(' ' + cc + '\n') |
294 | 299 |
295 if cls.fBase == '': | 300 if cls.fBase == '': |
296 print('protected:') | 301 fileClass.write('protected:\n') |
297 print(' const PdfMemDocument* fPodofoDoc;') | 302 fileClass.write(' const PdfMemDocument* fPodofoDoc;\n') |
298 print(' const PdfObject* fPodofoObj;') | 303 fileClass.write(' const PdfObject* fPodofoObj;\n') |
299 print | 304 fileClass.write('\n') |
300 print('public:') | 305 fileClass.write('public:\n') |
301 print(' SkPdf' + cls.fName + '(const PdfMemDocument* podofoDoc = NULL,
const PdfObject* podofoObj = NULL) : fPodofoDoc(podofoDoc), fPodofoObj(podofoObj
) {}') | 306 fileClass.write(' SkPdf' + cls.fName + '(const PdfMemDocument* podofoDo
c = NULL, const PdfObject* podofoObj = NULL) : fPodofoDoc(podofoDoc), fPodofoObj
(podofoObj) {}\n') |
302 print(' const PdfMemDocument* doc() const { return fPodofoDoc;}') | 307 fileClass.write(' const PdfMemDocument* doc() const { return fPodofoDoc
;}\n') |
303 print(' const PdfObject* podofo() const { return fPodofoObj;}') | 308 fileClass.write(' const PdfObject* podofo() const { return fPodofoObj;}
\n') |
304 else: | 309 else: |
305 print('public:') | 310 fileClass.write('public:\n') |
306 print(' SkPdf' + cls.fName + '(const PdfMemDocument* podofoDoc = NULL,
const PdfObject* podofoObj = NULL) : SkPdf' + cls.fBase + '(podofoDoc, podofoObj
) {}') | 311 fileClass.write(' SkPdf' + cls.fName + '(const PdfMemDocument* podofoDo
c = NULL, const PdfObject* podofoObj = NULL) : SkPdf' + cls.fBase + '(podofoDoc,
podofoObj) {}\n') |
307 print | 312 fileClass.write('\n') |
308 | 313 |
309 #check required fieds, also, there should be an internal_valid() manually
wrote for complex | 314 #check required fieds, also, there should be an internal_valid() manually
wrote for complex |
310 # situations | 315 # situations |
311 # right now valid return true | 316 # right now valid return true |
312 print(' virtual bool valid() const {return true;}') | 317 fileClass.write(' virtual bool valid() const {return true;}\n') |
313 print | 318 fileClass.write('\n') |
314 | 319 |
315 print(' SkPdf' + cls.fName + '& operator=(const SkPdf' + cls.fName + '& f
rom) {this->fPodofoDoc = from.fPodofoDoc; this->fPodofoObj = from.fPodofoObj; re
turn *this;}') | 320 fileClass.write(' SkPdf' + cls.fName + '& operator=(const SkPdf' + cls.fN
ame + '& from) {this->fPodofoDoc = from.fPodofoDoc; this->fPodofoObj = from.fPod
ofoObj; return *this;}\n') |
316 print | 321 fileClass.write('\n') |
317 | 322 |
318 for field in cls.fFields: | 323 for field in cls.fFields: |
319 prop = field.fProp | 324 prop = field.fProp |
320 if prop.fCppName != '': | 325 if prop.fCppName != '': |
321 if prop.fCppName[0] == '[': | 326 if prop.fCppName[0] == '[': |
322 print('/*') # comment code of the atributes that can have any name | 327 fileClass.write('/*\n') # comment code of the atributes that can ha
ve any name |
323 | 328 |
324 # TODO(edisonn): has_foo(); | 329 # TODO(edisonn): has_foo(); |
325 print(' bool has_' + prop.fCppName + '() const {') | 330 fileClass.write(' bool has_' + prop.fCppName + '() const {\n') |
326 print(' return (ObjectFromDictionary(fPodofoDoc, fPodofoObj->GetD
ictionary(), \"' + prop.fName + '\", \"' + prop.fAbr + '\", NULL));') | 331 fileClass.write(' return (ObjectFromDictionary(fPodofoDoc, fPodof
oObj->GetDictionary(), \"' + prop.fName + '\", \"' + prop.fAbr + '\", NULL));\n'
) |
327 print(' }') | 332 fileClass.write(' }\n') |
328 | 333 |
329 if len(prop.fTypes.split()) == 1: | 334 if len(prop.fTypes.split()) == 1: |
330 t = prop.fTypes.strip() | 335 t = prop.fTypes.strip() |
331 print(' ' + knowTypes[t][0] + ' ' + prop.fCppName + '() const {') | 336 fileClass.write(' ' + knowTypes[t][0] + ' ' + prop.fCppName + '() c
onst {\n') |
332 print(' ' + knowTypes[t][0] + ' ret;') | 337 fileClass.write(' ' + knowTypes[t][0] + ' ret;\n') |
333 print(' if (' + knowTypes[t][1] + '(fPodofoDoc, fPodofoObj->GetDi
ctionary(), \"' + prop.fName + '\", \"' + prop.fAbr + '\", &ret)) return ret;') | 338 fileClass.write(' if (' + knowTypes[t][1] + '(fPodofoDoc, fPodofo
Obj->GetDictionary(), \"' + prop.fName + '\", \"' + prop.fAbr + '\", &ret)) retu
rn ret;\n') |
334 if field.fRequired == False and prop.fDefault != '': | 339 if field.fRequired == False and prop.fDefault != '': |
335 print(' return ' + prop.fDefault.toCpp() + ';'); | 340 fileClass.write(' return ' + prop.fDefault.toCpp() + ';\n'); |
336 else: | 341 else: |
337 print(' // TODO(edisonn): warn about missing required field, as
sert for known good pdfs') | 342 fileClass.write(' // TODO(edisonn): warn about missing required
field, assert for known good pdfs\n') |
338 print(' return ' + knowTypes[t][2].toCpp() + ';'); | 343 fileClass.write(' return ' + knowTypes[t][2].toCpp() + ';\n'); |
339 print(' }') | 344 fileClass.write(' }\n') |
340 print | 345 fileClass.write('\n') |
341 else: | 346 else: |
342 for type in prop.fTypes.split(): | 347 for type in prop.fTypes.split(): |
343 t = type.strip() | 348 t = type.strip() |
344 print(' bool is' + prop.fCppName + 'A' + t.title() + '() const {'
) | 349 fileClass.write(' bool is' + prop.fCppName + 'A' + t.title() + '(
) const {\n') |
345 print(' SkPdfObject* ret = NULL;') | 350 fileClass.write(' SkPdfObject* ret = NULL;\n') |
346 print(' if (!ObjectFromDictionary(fPodofoDoc, fPodofoObj->GetDi
ctionary(), \"' + prop.fName + '\", \"' + prop.fAbr + '\", &ret)) return false;'
) | 351 fileClass.write(' if (!ObjectFromDictionary(fPodofoDoc, fPodofo
Obj->GetDictionary(), \"' + prop.fName + '\", \"' + prop.fAbr + '\", &ret)) retu
rn false;\n') |
347 print(' return ' + knowTypes[t][3] + ';') | 352 fileClass.write(' return ' + knowTypes[t][3] + ';\n') |
348 print(' }') | 353 fileClass.write(' }\n') |
349 print | 354 fileClass.write('\n') |
350 | 355 |
351 print(' ' + knowTypes[t][0] + ' get' + prop.fCppName + 'As' + t.t
itle() + '() const {') | 356 fileClass.write(' ' + knowTypes[t][0] + ' get' + prop.fCppName +
'As' + t.title() + '() const {\n') |
352 print(' ' + knowTypes[t][0] + ' ret = ' + knowTypes[t][2].toCpp
() + ';') | 357 fileClass.write(' ' + knowTypes[t][0] + ' ret = ' + knowTypes[t
][2].toCpp() + ';\n') |
353 print(' if (' + knowTypes[t][1] + '(fPodofoDoc, fPodofoObj->Get
Dictionary(), \"' + prop.fName + '\", \"' + prop.fAbr + '\", &ret)) return ret;'
) | 358 fileClass.write(' if (' + knowTypes[t][1] + '(fPodofoDoc, fPodo
foObj->GetDictionary(), \"' + prop.fName + '\", \"' + prop.fAbr + '\", &ret)) re
turn ret;\n') |
354 print(' // TODO(edisonn): warn about missing required field, as
sert for known good pdfs') | 359 fileClass.write(' // TODO(edisonn): warn about missing required
field, assert for known good pdfs\n') |
355 print(' return ' + knowTypes[t][2].toCpp() + ';') | 360 fileClass.write(' return ' + knowTypes[t][2].toCpp() + ';\n') |
356 print(' }') | 361 fileClass.write(' }\n') |
357 print | 362 fileClass.write('\n') |
358 | 363 |
359 | 364 |
360 if prop.fCppName[0] == '[': | 365 if prop.fCppName[0] == '[': |
361 print('*/') # comment code of the atributes that can have any name | 366 fileClass.write('*/\n') # comment code of the atributes that can ha
ve any name |
362 | 367 |
363 | 368 |
364 print('};') | 369 fileClass.write('};\n') |
365 print | 370 fileClass.write('\n') |
366 print | 371 |
| 372 fileClass.write('#endif // __DEFINED__SkPdf' + cls.fName + '\n') |
| 373 fileClass.close() |
367 | 374 |
368 | 375 |
369 | 376 |
370 # generate constructor when knowing the type | 377 # generate constructor when knowing the type |
371 # later, p2, generate constructor when not knowing the type - very similar
with parsing? | 378 # later, p2, generate constructor when not knowing the type - very similar
with parsing? |
372 | 379 |
373 # generate parser | 380 # generate parser |
374 | |
375 # TODO(edisonn): fast recognition based on must attributes. | 381 # TODO(edisonn): fast recognition based on must attributes. |
376 print('class PodofoMapper {') | 382 fileMapper = open('SkPdfPodofoMapper_autogen.h', 'w') |
377 print('public:') | 383 fileMapper.write('#ifndef __DEFINED__SkPdfPodofoMapper\n') |
| 384 fileMapper.write('#define __DEFINED__SkPdfPodofoMapper\n') |
| 385 fileMapper.write('\n') |
| 386 |
| 387 fileMapper.write('#include "SkPdfHeaders_autogen.h"\n') |
| 388 fileMapper.write('class PodofoMapper {\n') |
| 389 fileMapper.write('public:\n') |
378 for name in self.fClassesNamesInOrder: | 390 for name in self.fClassesNamesInOrder: |
379 cls = self.fClasses[name] | 391 cls = self.fClasses[name] |
380 | 392 |
381 | 393 |
382 print(' static bool map(const SkPdfObject& in, SkPdf' + name + '** out) {
') | 394 fileMapper.write(' static bool map(const SkPdfObject& in, SkPdf' + name +
'** out) {\n') |
383 print(' return map(*in.doc(), *in.podofo(), out);') | 395 fileMapper.write(' return map(*in.doc(), *in.podofo(), out);\n') |
384 print(' }') | 396 fileMapper.write(' }\n') |
385 print | 397 fileMapper.write('\n') |
386 | 398 |
387 print(' static bool map(const PdfMemDocument& podofoDoc, const PdfObject&
podofoObj, SkPdf' + name + '** out) {') | 399 fileMapper.write(' static bool map(const PdfMemDocument& podofoDoc, const
PdfObject& podofoObj, SkPdf' + name + '** out) {\n') |
388 print(' if (!is' + name + '(podofoDoc, podofoObj)) return false;') | 400 fileMapper.write(' if (!is' + name + '(podofoDoc, podofoObj)) return fa
lse;\n') |
389 print | 401 fileMapper.write('\n') |
390 | 402 |
391 for sub in cls.fEnumSubclasses: | 403 for sub in cls.fEnumSubclasses: |
392 print(' if (map(podofoDoc, podofoObj, (SkPdf' + enumToCls[sub].fName
+ '**)out)) return true;') | 404 fileMapper.write(' if (map(podofoDoc, podofoObj, (SkPdf' + enumToCls[
sub].fName + '**)out)) return true;\n') |
393 | 405 |
394 print | 406 fileMapper.write('\n') |
395 | 407 |
396 print(' *out = new SkPdf' + name + '(&podofoDoc, &podofoObj);') | 408 fileMapper.write(' *out = new SkPdf' + name + '(&podofoDoc, &podofoObj)
;\n') |
397 print(' return true;') | 409 fileMapper.write(' return true;\n') |
398 print(' }') | 410 fileMapper.write(' }\n') |
399 print | 411 fileMapper.write('\n') |
400 | 412 |
401 for name in self.fClassesNamesInOrder: | 413 for name in self.fClassesNamesInOrder: |
402 cls = self.fClasses[name] | 414 cls = self.fClasses[name] |
403 | 415 |
404 print(' static bool is' + name + '(const PdfMemDocument& podofoDoc, const
PdfObject& podofoObj) {') | 416 fileMapper.write(' static bool is' + name + '(const PdfMemDocument& podof
oDoc, const PdfObject& podofoObj) {\n') |
405 | 417 |
406 if cls.fCheck != '': | 418 if cls.fCheck != '': |
407 print(' return ' + cls.fCheck + ';') | 419 fileMapper.write(' return ' + cls.fCheck + ';\n') |
408 else: | 420 else: |
409 cntMust = 0 | 421 cntMust = 0 |
410 for field in cls.fFields: | 422 for field in cls.fFields: |
411 prop = field.fProp | 423 prop = field.fProp |
412 if prop.fHasMust: | 424 if prop.fHasMust: |
413 cntMust = cntMust + 1 | 425 cntMust = cntMust + 1 |
414 print(' ' + knowTypes[prop.fTypes.strip()][0] + ' ' + prop.fCppNa
me + ';') | 426 fileMapper.write(' ' + knowTypes[prop.fTypes.strip()][0] + ' ' +
prop.fCppName + ';\n') |
415 print(' if (!' + knowTypes[prop.fTypes.strip()][1] + '(&podofoDoc
, podofoObj.GetDictionary(), \"' + prop.fName + '\", \"' + prop.fAbr + '\", &' +
prop.fCppName + ')) return false;') | 427 fileMapper.write(' if (!' + knowTypes[prop.fTypes.strip()][1] + '
(&podofoDoc, podofoObj.GetDictionary(), \"' + prop.fName + '\", \"' + prop.fAbr
+ '\", &' + prop.fCppName + ')) return false;\n') |
416 print(' if (' + prop.fCppName + ' != ' + prop.fMustBe.toCpp() + '
) return false;') | 428 fileMapper.write(' if (' + prop.fCppName + ' != ' + prop.fMustBe.
toCpp() + ') return false;\n') |
417 print | 429 fileMapper.write('\n') |
418 | 430 |
419 print(' return true;') | 431 fileMapper.write(' return true;\n') |
420 | 432 |
421 print(' }') | 433 fileMapper.write(' }\n') |
422 print | 434 fileMapper.write('\n') |
423 | 435 |
424 print('};') | 436 fileMapper.write('};\n') |
425 print | 437 fileMapper.write('\n') |
| 438 |
| 439 fileMapper.write('#endif // __DEFINED__SkPdfPodofoMapper\n') |
| 440 fileMapper.close() |
426 | 441 |
427 return | 442 return |
428 | 443 |
429 def generateCode(): | 444 def generateCode(): |
| 445 global fileHeaders |
| 446 |
| 447 fileHeaders = open('SkPdfHeaders_autogen.h', 'w') |
| 448 fileHeaders.write('#ifndef __DEFINED__SkPdfHeaders\n') |
| 449 fileHeaders.write('#define __DEFINED__SkPdfHeaders\n') |
| 450 fileHeaders.write('\n') |
| 451 |
| 452 fileHeaders.write('#include "SkPdfEnums_autogen.h"\n') |
| 453 |
430 manager = PdfClassManager() | 454 manager = PdfClassManager() |
431 | 455 |
432 manager.addClass('Object') | 456 manager.addClass('Object') |
433 | 457 |
434 manager.addClass('Null').check('podofoObj.GetDataType() == ePdfDataType_Null') | 458 manager.addClass('Null').check('podofoObj.GetDataType() == ePdfDataType_Null') |
435 manager.addClass('Boolean').check('podofoObj.GetDataType() == ePdfDataType_Boo
l')\ | 459 manager.addClass('Boolean').check('podofoObj.GetDataType() == ePdfDataType_Boo
l')\ |
436 .carbonCopyPublic('bool value() const {return fPodo
foObj->GetBool();}') | 460 .carbonCopyPublic('bool value() const {return fPodo
foObj->GetBool();}') |
437 | 461 |
438 manager.addClass('Integer').check('podofoObj.GetDataType() == ePdfDataType_Num
ber')\ | 462 manager.addClass('Integer').check('podofoObj.GetDataType() == ePdfDataType_Num
ber || podofoObj.GetDataType() == ePdfDataType_Real')\ |
439 .carbonCopyPublic('long value() const {return fPodo
foObj->GetNumber();}') | 463 .carbonCopyPublic('long value() const {return fPodo
foObj->GetNumber();}') |
440 | 464 |
441 manager.addClass('Number').check('podofoObj.GetDataType() == ePdfDataType_Real
')\ | 465 manager.addClass('Number', 'Integer').check('podofoObj.GetDataType() == ePdfDa
taType_Number || podofoObj.GetDataType() == ePdfDataType_Real')\ |
442 .carbonCopyPublic('double value() const {return fPo
dofoObj->GetReal();}') | 466 .carbonCopyPublic('double value() const {return fPo
dofoObj->GetReal();}') |
443 | 467 |
444 manager.addClass('Name').check('podofoObj.GetDataType() == ePdfDataType_Name')
\ | 468 manager.addClass('Name').check('podofoObj.GetDataType() == ePdfDataType_Name')
\ |
445 .carbonCopyPublic('const std::string& value() const
{return fPodofoObj->GetName().GetName();}') | 469 .carbonCopyPublic('const std::string& value() const
{return fPodofoObj->GetName().GetName();}') |
446 | 470 |
447 #manager.addClass('Stream') - attached to a dictionary | 471 #manager.addClass('Stream') - attached to a dictionary |
448 manager.addClass('Reference').check('podofoObj.GetDataType() == ePdfDataType_R
eference') | 472 manager.addClass('Reference').check('podofoObj.GetDataType() == ePdfDataType_R
eference') |
449 | 473 |
450 manager.addClass('Array').check('podofoObj.GetDataType() == ePdfDataType_Array
')\ | 474 manager.addClass('Array').check('podofoObj.GetDataType() == ePdfDataType_Array
')\ |
451 .carbonCopyPublic('const int size() const {return f
PodofoObj->GetArray().GetSize();}')\ | 475 .carbonCopyPublic('const int size() const {return f
PodofoObj->GetArray().GetSize();}')\ |
452 .carbonCopyPublic('const SkPdfObject operator[](int
i) const {return SkPdfObject(fPodofoDoc, &fPodofoObj->GetArray()[i]);}')\ | 476 .carbonCopyPublic('const SkPdfObject operator[](int
i) const {return SkPdfObject(fPodofoDoc, &fPodofoObj->GetArray()[i]);}')\ |
453 .carbonCopyPublic('SkPdfObject operator[](int i) {r
eturn SkPdfObject(fPodofoDoc, &fPodofoObj->GetArray()[i]);}') | 477 .carbonCopyPublic('SkPdfObject operator[](int i) {r
eturn SkPdfObject(fPodofoDoc, &fPodofoObj->GetArray()[i]);}') |
454 | 478 |
455 manager.addClass('String').check('podofoObj.GetDataType() == ePdfDataType_Stri
ng')\ | 479 manager.addClass('String').check('podofoObj.GetDataType() == ePdfDataType_Stri
ng || podofoObj.GetDataType() == ePdfDataType_HexString')\ |
456 .carbonCopyPublic('const std::string& value() const
{return fPodofoObj->GetString().GetStringUtf8();}') | 480 .carbonCopyPublic('const std::string& value() const
{return fPodofoObj->GetString().GetStringUtf8();}') |
457 | 481 |
458 manager.addClass('HexString').check('podofoObj.GetDataType() == ePdfDataType_H
exString')\ | 482 manager.addClass('HexString', 'String').check('podofoObj.GetDataType() == ePdf
DataType_HexString')\ |
459 .carbonCopyPublic('const std::string& value() const
{return fPodofoObj->GetString().GetStringUtf8();}') | 483 .carbonCopyPublic('const std::string& value() const
{return fPodofoObj->GetString().GetStringUtf8();}') |
460 | 484 |
461 manager.addClass('Dictionary').check('podofoObj.GetDataType() == ePdfDataType_
Dictionary') | 485 manager.addClass('Dictionary').check('podofoObj.GetDataType() == ePdfDataType_
Dictionary')\ |
| 486 .carbonCopyPublic('const SkPdfObject get(const c
har* dictionaryKeyName) const {return SkPdfObject(fPodofoDoc, resolveReferenceOb
ject(fPodofoDoc, fPodofoObj->GetDictionary().GetKey(PdfName(dictionaryKeyName)))
);}')\ |
| 487 .carbonCopyPublic('SkPdfObject get(const char* d
ictionaryKeyName) {return SkPdfObject(fPodofoDoc, resolveReferenceObject(fPodofo
Doc, fPodofoObj->GetDictionary().GetKey(PdfName(dictionaryKeyName))));}')\ |
| 488 |
462 | 489 |
463 # these classes are not explicitely backed by a table in the pdf spec | 490 # these classes are not explicitely backed by a table in the pdf spec |
464 manager.addClass('XObjectDictionary', 'Dictionary') | 491 manager.addClass('XObjectDictionary', 'Dictionary') |
465 | 492 |
466 manager.addClass('FontDictionary', 'Dictionary') | 493 manager.addClass('FontDictionary', 'Dictionary') |
467 | 494 |
468 manager.addClass('TrueTypeFontDictionary', 'FontDictionary') | 495 manager.addClass('TrueTypeFontDictionary', 'FontDictionary') |
469 | 496 |
470 pdfspec_autogen.buildPdfSpec(manager) | 497 pdfspec_autogen.buildPdfSpec(manager) |
471 | 498 |
472 manager.addClass('MultiMasterFontDictionary', 'Type1FontDictionary')\ | 499 manager.addClass('MultiMasterFontDictionary', 'Type1FontDictionary')\ |
473 .required('NULL')\ | 500 .required('NULL')\ |
474 .field('Subtype')\ | 501 .field('Subtype')\ |
475 .name('Subtype')\ | 502 .name('Subtype')\ |
476 .type('name')\ | 503 .type('name')\ |
477 .comment('')\ | 504 .comment('')\ |
478 .must(datatypes.PdfName('MMType1'))\ | 505 .must(datatypes.PdfName('MMType1'))\ |
479 .done().done()\ | 506 .done().done()\ |
480 | 507 |
481 | 508 |
482 manager.write() | 509 manager.write() |
483 | 510 |
| 511 fileHeaders.write('#endif // __DEFINED__SkPdfHeaders\n') |
| 512 fileHeaders.close() |
| 513 |
484 return 1 | 514 return 1 |
485 | 515 |
486 if '__main__' == __name__: | 516 if '__main__' == __name__: |
487 sys.exit(generateCode()) | 517 sys.exit(generateCode()) |
488 | 518 |
489 | |
OLD | NEW |