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

Unified Diff: experimental/PdfViewer/generate_code.py

Issue 17294008: load font manually, for now Type0 (Closed) Base URL: http://skia.googlecode.com/svn/trunk/
Patch Set: Created 7 years, 6 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « experimental/PdfViewer/SkPdfXObjectDictionary_autogen.h ('k') | experimental/PdfViewer/pdf_viewer_main.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: experimental/PdfViewer/generate_code.py
===================================================================
--- experimental/PdfViewer/generate_code.py (revision 9685)
+++ experimental/PdfViewer/generate_code.py (working copy)
@@ -20,7 +20,7 @@
'tree': ['SkPdfTree*', 'TreeFromDictionary', datatypes.CppNull(), 'ret->podofo()->GetDataType() == ePdfDataType_Reference'],
'number': ['double', 'DoubleFromDictionary', datatypes.PdfNumber(0), 'ret->podofo()->GetDataType() == ePdfDataType_Real || ret->podofo()->GetDataType() == ePdfDataType_Number'],
'rectangle': ['SkRect', 'SkRectFromDictionary', datatypes.PdfEmptyRect(), 'ret->podofo()->GetDataType() == ePdfDataType_Array'],
-'stream': ['SkPdfStream', 'StreamFromDictionary', datatypes.PdfEmptyStream(), 'ret->podofo()->HasStream()'],
+'stream': ['SkPdfStream*', 'StreamFromDictionary', datatypes.CppNull(), 'ret->podofo()->HasStream()'],
'string': ['std::string', 'StringFromDictionary', datatypes.PdfString('""'), 'ret->podofo()->GetDataType() == ePdfDataType_String || ret->podofo()->GetDataType() == ePdfDataType_HexString'],
'text': ['std::string', 'StringFromDictionary', datatypes.PdfString('""'), 'ret->podofo()->GetDataType() == ePdfDataType_String || ret->podofo()->GetDataType() == ePdfDataType_HexString'],
'text string': ['std::string', 'StringFromDictionary', datatypes.PdfString('""'), 'ret->podofo()->GetDataType() == ePdfDataType_String || ret->podofo()->GetDataType() == ePdfDataType_HexString'],
@@ -38,7 +38,7 @@
self.fCppName = ''
self.fEnumValues = []
self.fHasMust = False
- self.fMustBe = ''
+ self.fMustBe = []
self.fComment = ''
def must(self, value):
@@ -212,6 +212,23 @@
cnt = cnt + 1
+ def determineAllMustBe(self, cls, field, enumToCls):
+ mustBe = []
+ for sub in cls.fEnumSubclasses:
+ mustBe = mustBe + self.determineAllMustBe(enumToCls[sub], field, enumToCls)
+
+ for subField in cls.fFields:
+ if subField.fProp.fName == field.fProp.fName:
+ mustBe = mustBe + subField.fProp.fMustBe
+
+# while cls.fBase != '':
+# cls = self.fClasses[cls.fBase]
+# # TODO(edisonn): bad perf
+# for subField in cls.fFields:
+# if subField.fProp.fName == field.fProp.fName:
+# mustBe = mustBe + subField.fProp.fMustBe
+
+ return mustBe
def write(self):
global fileHeaders
@@ -414,9 +431,18 @@
fileMapper.write(' static bool map(const PdfMemDocument& podofoDoc, const PdfObject& podofoObj, SkPdf' + name + '** out) {\n')
fileMapper.write(' if (!is' + name + '(podofoDoc, podofoObj)) return false;\n')
fileMapper.write('\n')
+
+ # stream must be last one
+ hasStream = False
+ for sub in cls.fEnumSubclasses:
+ if cls.fName == 'Object' and enumToCls[sub].fName == 'Stream':
+ hasStream = True
+ else:
+ fileMapper.write(' if (map(podofoDoc, podofoObj, (SkPdf' + enumToCls[sub].fName + '**)out)) return true;\n')
- for sub in cls.fEnumSubclasses:
- fileMapper.write(' if (map(podofoDoc, podofoObj, (SkPdf' + enumToCls[sub].fName + '**)out)) return true;\n')
+ if hasStream:
+ fileMapper.write(' if (map(podofoDoc, podofoObj, (SkPdfStream**)out)) return true;\n')
+
fileMapper.write('\n')
@@ -440,8 +466,21 @@
cntMust = cntMust + 1
fileMapper.write(' ' + knowTypes[prop.fTypes.strip()][0] + ' ' + prop.fCppName + ';\n')
fileMapper.write(' if (!' + knowTypes[prop.fTypes.strip()][1] + '(&podofoDoc, podofoObj.GetDictionary(), \"' + prop.fName + '\", \"' + prop.fAbr + '\", &' + prop.fCppName + ')) return false;\n')
- fileMapper.write(' if (' + prop.fCppName + ' != ' + prop.fMustBe.toCpp() + ') return false;\n')
- fileMapper.write('\n')
+
+ eval = '';
+ # TODO(edisonn): this could get out of hand, and could have poor performance if continued on this path
+ # but if we would write our parser, then best thing would be to create a map of (key, value) -> to bits
+ # and at each (key, value) we do an and with the bits existent, then we check what bits are left, which would tell the posible types of this dictionary
+ # and for non unique posinilities (if any) based on context, or the requester of dictionry we can determine fast the dictionary type
+ mustBe = self.determineAllMustBe(cls, field, enumToCls)
+ if len(mustBe) > 0:
+ for cnd in mustBe:
+ if eval == '':
+ eval = '(' + prop.fCppName + ' != ' + cnd.toCpp() + ')'
+ else:
+ eval = eval + ' && ' + '(' + prop.fCppName + ' != ' + cnd.toCpp() + ')'
+ fileMapper.write(' if (' + eval + ') return false;\n')
+ fileMapper.write('\n')
fileMapper.write(' return true;\n')
@@ -483,13 +522,11 @@
manager.addClass('Name').check('podofoObj.GetDataType() == ePdfDataType_Name')\
.carbonCopyPublic('const std::string& value() const {return fPodofoObj->GetName().GetName();}')
- #manager.addClass('Stream') - attached to a dictionary
manager.addClass('Reference').check('podofoObj.GetDataType() == ePdfDataType_Reference')
manager.addClass('Array').check('podofoObj.GetDataType() == ePdfDataType_Array')\
.carbonCopyPublic('const int size() const {return fPodofoObj->GetArray().GetSize();}')\
- .carbonCopyPublic('const SkPdfObject operator[](int i) const {return SkPdfObject(fPodofoDoc, &fPodofoObj->GetArray()[i]);}')\
- .carbonCopyPublic('SkPdfObject operator[](int i) {return SkPdfObject(fPodofoDoc, &fPodofoObj->GetArray()[i]);}')
+ .carbonCopyPublic('SkPdfObject* operator[](int i) const {return new SkPdfObject(fPodofoDoc, &fPodofoObj->GetArray()[i]);}')\
manager.addClass('String').check('podofoObj.GetDataType() == ePdfDataType_String || podofoObj.GetDataType() == ePdfDataType_HexString')\
.carbonCopyPublic('const std::string& value() const {return fPodofoObj->GetString().GetStringUtf8();}')
@@ -500,6 +537,8 @@
manager.addClass('Dictionary').check('podofoObj.GetDataType() == ePdfDataType_Dictionary')\
.carbonCopyPublic('const SkPdfObject get(const char* dictionaryKeyName) const {return SkPdfObject(fPodofoDoc, resolveReferenceObject(fPodofoDoc, fPodofoObj->GetDictionary().GetKey(PdfName(dictionaryKeyName))));}')\
.carbonCopyPublic('SkPdfObject get(const char* dictionaryKeyName) {return SkPdfObject(fPodofoDoc, resolveReferenceObject(fPodofoDoc, fPodofoObj->GetDictionary().GetKey(PdfName(dictionaryKeyName))));}')\
+
+ manager.addClass('Stream') # attached to a dictionary in podofo
# these classes are not explicitely backed by a table in the pdf spec
@@ -507,7 +546,14 @@
manager.addClass('FontDictionary', 'Dictionary')
- manager.addClass('TrueTypeFontDictionary', 'FontDictionary')
+ manager.addClass('TrueTypeFontDictionary', 'Type1FontDictionary')\
+ .required('NULL')\
+ .field('Subtype')\
+ .name('Subtype')\
+ .type('name')\
+ .comment('')\
+ .must([datatypes.PdfName('TrueType')])\
+ .done().done()\
pdfspec_autogen.buildPdfSpec(manager)
@@ -517,7 +563,7 @@
.name('Subtype')\
.type('name')\
.comment('')\
- .must(datatypes.PdfName('MMType1'))\
+ .must([datatypes.PdfName('MMType1')])\
.done().done()\
« no previous file with comments | « experimental/PdfViewer/SkPdfXObjectDictionary_autogen.h ('k') | experimental/PdfViewer/pdf_viewer_main.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698