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

Unified Diff: experimental/PdfViewer/pdfparser/podofo/SkPodofoUtils.cpp

Issue 18042005: isolate podofo to prepare for native parser, autogenerate PDF API during build (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/pdfparser/podofo/SkPodofoUtils.h ('k') | experimental/PdfViewer/spec2def.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: experimental/PdfViewer/pdfparser/podofo/SkPodofoUtils.cpp
===================================================================
--- experimental/PdfViewer/pdfparser/podofo/SkPodofoUtils.cpp (revision 0)
+++ experimental/PdfViewer/pdfparser/podofo/SkPodofoUtils.cpp (revision 0)
@@ -0,0 +1,416 @@
+
+#include "SkPodofoUtils.h"
+#include "SkMatrix.h"
+#include "SkPdfHeaders_autogen.h"
+#include "SkPdfMapper_autogen.h"
+
+#include "podofo.h"
+
+const PoDoFo::PdfObject* resolveReferenceObject(const SkPodofoParsedPDF* pdfDoc,
+ const PoDoFo::PdfObject* obj,
+ bool resolveOneElementArrays) {
+ while (obj && (obj->IsReference() || (resolveOneElementArrays &&
+ obj->IsArray() &&
+ obj->GetArray().GetSize() == 1))) {
+ if (obj->IsReference()) {
+ // We need to force the non const, the only update we will do is for recurssion checks.
+ PoDoFo::PdfReference& ref = (PoDoFo::PdfReference&)obj->GetReference();
+ obj = pdfDoc->podofo()->GetObjects().GetObject(ref);
+ } else {
+ obj = &obj->GetArray()[0];
+ }
+ }
+
+ return obj;
+}
+
+// TODO(edisonn): deal with synonyms (/BPC == /BitsPerComponent), here or in GetKey?
+// Always pass long form in key, and have a map of long -> short key
+bool LongFromDictionary(const SkPodofoParsedPDF* pdfDoc,
+ const PoDoFo::PdfDictionary& dict,
+ const char* key,
+ long* data) {
+ const PoDoFo::PdfObject* value = resolveReferenceObject(pdfDoc,
+ dict.GetKey(PoDoFo::PdfName(key)));
+
+ if (value == NULL || !value->IsNumber()) {
+ return false;
+ }
+ if (data == NULL) {
+ return true;
+ }
+
+ *data = value->GetNumber();
+ return true;
+}
+
+bool LongFromDictionary(const SkPodofoParsedPDF* pdfDoc,
+ const PoDoFo::PdfDictionary& dict,
+ const char* key,
+ const char* abr,
+ long* data) {
+ if (LongFromDictionary(pdfDoc, dict, key, data)) return true;
+ if (abr == NULL || *abr == '\0') return false;
+ return LongFromDictionary(pdfDoc, dict, abr, data);
+}
+
+bool DoubleFromDictionary(const SkPodofoParsedPDF* pdfDoc,
+ const PoDoFo::PdfDictionary& dict,
+ const char* key,
+ double* data) {
+ const PoDoFo::PdfObject* value = resolveReferenceObject(pdfDoc,
+ dict.GetKey(PoDoFo::PdfName(key)));
+
+ if (value == NULL || (!value->IsReal() && !value->IsNumber())) {
+ return false;
+ }
+ if (data == NULL) {
+ return true;
+ }
+
+ *data = value->GetReal();
+ return true;
+}
+
+bool DoubleFromDictionary(const SkPodofoParsedPDF* pdfDoc,
+ const PoDoFo::PdfDictionary& dict,
+ const char* key,
+ const char* abr,
+ double* data) {
+ if (DoubleFromDictionary(pdfDoc, dict, key, data)) return true;
+ if (abr == NULL || *abr == '\0') return false;
+ return DoubleFromDictionary(pdfDoc, dict, abr, data);
+}
+
+
+bool BoolFromDictionary(const SkPodofoParsedPDF* pdfDoc,
+ const PoDoFo::PdfDictionary& dict,
+ const char* key,
+ bool* data) {
+ const PoDoFo::PdfObject* value = resolveReferenceObject(pdfDoc,
+ dict.GetKey(PoDoFo::PdfName(key)));
+
+ if (value == NULL || !value->IsBool()) {
+ return false;
+ }
+ if (data == NULL) {
+ return true;
+ }
+
+ *data = value->GetBool();
+ return true;
+}
+
+bool BoolFromDictionary(const SkPodofoParsedPDF* pdfDoc,
+ const PoDoFo::PdfDictionary& dict,
+ const char* key,
+ const char* abr,
+ bool* data) {
+ if (BoolFromDictionary(pdfDoc, dict, key, data)) return true;
+ if (abr == NULL || *abr == '\0') return false;
+ return BoolFromDictionary(pdfDoc, dict, abr, data);
+}
+
+bool NameFromDictionary(const SkPodofoParsedPDF* pdfDoc,
+ const PoDoFo::PdfDictionary& dict,
+ const char* key,
+ std::string* data) {
+ const PoDoFo::PdfObject* value = resolveReferenceObject(pdfDoc,
+ dict.GetKey(PoDoFo::PdfName(key)),
+ true);
+ if (value == NULL || !value->IsName()) {
+ return false;
+ }
+ if (data == NULL) {
+ return true;
+ }
+
+ *data = value->GetName().GetName();
+ return true;
+}
+
+bool NameFromDictionary(const SkPodofoParsedPDF* pdfDoc,
+ const PoDoFo::PdfDictionary& dict,
+ const char* key,
+ const char* abr,
+ std::string* data) {
+ if (NameFromDictionary(pdfDoc, dict, key, data)) return true;
+ if (abr == NULL || *abr == '\0') return false;
+ return NameFromDictionary(pdfDoc, dict, abr, data);
+}
+
+bool StringFromDictionary(const SkPodofoParsedPDF* pdfDoc,
+ const PoDoFo::PdfDictionary& dict,
+ const char* key,
+ std::string* data) {
+ const PoDoFo::PdfObject* value = resolveReferenceObject(pdfDoc,
+ dict.GetKey(PoDoFo::PdfName(key)),
+ true);
+ if (value == NULL || (!value->IsString() && !value->IsHexString())) {
+ return false;
+ }
+ if (data == NULL) {
+ return true;
+ }
+
+ *data = value->GetString().GetString();
+ return true;
+}
+
+bool StringFromDictionary(const SkPodofoParsedPDF* pdfDoc,
+ const PoDoFo::PdfDictionary& dict,
+ const char* key,
+ const char* abr,
+ std::string* data) {
+ if (StringFromDictionary(pdfDoc, dict, key, data)) return true;
+ if (abr == NULL || *abr == '\0') return false;
+ return StringFromDictionary(pdfDoc, dict, abr, data);
+}
+
+
+bool SkMatrixFromDictionary(const SkPodofoParsedPDF* pdfDoc,
+ const PoDoFo::PdfDictionary& dict,
+ const char* key,
+ SkMatrix** matrix) {
+ const PoDoFo::PdfObject* value = resolveReferenceObject(pdfDoc,
+ dict.GetKey(PoDoFo::PdfName(key)));
+
+ if (value == NULL || !value->IsArray()) {
+ return false;
+ }
+
+ if (value->GetArray().GetSize() != 6) {
+ return false;
+ }
+
+ double array[6];
+ for (int i = 0; i < 6; i++) {
+ const PoDoFo::PdfObject* elem = resolveReferenceObject(pdfDoc, &value->GetArray()[i]);
+ if (elem == NULL || (!elem->IsReal() && !elem->IsNumber())) {
+ return false;
+ }
+ array[i] = elem->GetReal();
+ }
+
+ *matrix = new SkMatrix();
+ **matrix = SkMatrixFromPdfMatrix(array);
+ return true;
+}
+
+bool SkMatrixFromDictionary(const SkPodofoParsedPDF* pdfDoc,
+ const PoDoFo::PdfDictionary& dict,
+ const char* key,
+ const char* abr,
+ SkMatrix** data) {
+ if (SkMatrixFromDictionary(pdfDoc, dict, key, data)) return true;
+ if (abr == NULL || *abr == '\0') return false;
+ return SkMatrixFromDictionary(pdfDoc, dict, abr, data);
+
+}
+
+bool SkRectFromDictionary(const SkPodofoParsedPDF* pdfDoc,
+ const PoDoFo::PdfDictionary& dict,
+ const char* key,
+ SkRect** rect) {
+ const PoDoFo::PdfObject* value = resolveReferenceObject(pdfDoc,
+ dict.GetKey(PoDoFo::PdfName(key)));
+
+ if (value == NULL || !value->IsArray()) {
+ return false;
+ }
+
+ if (value->GetArray().GetSize() != 4) {
+ return false;
+ }
+
+ double array[4];
+ for (int i = 0; i < 4; i++) {
+ const PoDoFo::PdfObject* elem = resolveReferenceObject(pdfDoc, &value->GetArray()[i]);
+ if (elem == NULL || (!elem->IsReal() && !elem->IsNumber())) {
+ return false;
+ }
+ array[i] = elem->GetReal();
+ }
+
+ *rect = new SkRect();
+ **rect = SkRect::MakeLTRB(SkDoubleToScalar(array[0]),
+ SkDoubleToScalar(array[1]),
+ SkDoubleToScalar(array[2]),
+ SkDoubleToScalar(array[3]));
+ return true;
+}
+
+bool SkRectFromDictionary(const SkPodofoParsedPDF* pdfDoc,
+ const PoDoFo::PdfDictionary& dict,
+ const char* key,
+ const char* abr,
+ SkRect** data) {
+ if (SkRectFromDictionary(pdfDoc, dict, key, data)) return true;
+ if (abr == NULL || *abr == '\0') return false;
+ return SkRectFromDictionary(pdfDoc, dict, abr, data);
+
+}
+
+
+SkPdfObject* get(const SkPdfObject* obj, const char* key, const char* abr = "") {
+ PoDoFo::PdfObject* podofoObj = NULL;
+ if (obj == NULL) return NULL;
+ const SkPdfDictionary* dict = obj->asDictionary();
+ if (dict == NULL) return NULL;
+ if (!dict->podofo()->IsDictionary()) return NULL;
+ ObjectFromDictionary(dict->doc(), dict->podofo()->GetDictionary(), key, abr, &podofoObj);
+ SkPdfObject* ret = NULL;
+ obj->doc()->mapper()->mapObject(podofoObj, &ret);
+ return ret;
+}
+
+bool ArrayFromDictionary(const SkPodofoParsedPDF* pdfDoc,
+ const PoDoFo::PdfDictionary& dict,
+ const char* key,
+ const char* abr,
+ SkPdfArray* data) {return false;}
+
+bool FileSpecFromDictionary(const SkPodofoParsedPDF* pdfDoc,
+ const PoDoFo::PdfDictionary& dict,
+ const char* key,
+ const char* abr,
+ SkPdfFileSpec* data) {return false;}
+
+bool StreamFromDictionary(const SkPodofoParsedPDF* pdfDoc,
+ const PoDoFo::PdfDictionary& dict,
+ const char* key,
+ const char* abr,
+ SkPdfStream** data);
+
+bool TreeFromDictionary(const SkPodofoParsedPDF* pdfDoc,
+ const PoDoFo::PdfDictionary& dict,
+ const char* key,
+ const char* abr,
+ SkPdfTree** data) {return false;}
+
+bool DateFromDictionary(const SkPodofoParsedPDF* pdfDoc,
+ const PoDoFo::PdfDictionary& dict,
+ const char* key,
+ const char* abr,
+ SkPdfDate* data) {return false;}
+
+bool FunctionFromDictionary(const SkPodofoParsedPDF* pdfDoc,
+ const PoDoFo::PdfDictionary& dict,
+ const char* key,
+ const char* abr,
+ SkPdfFunction* data) {return false;}
+
+
+
+
+bool ArrayFromDictionary(const SkPodofoParsedPDF* pdfDoc,
+ const PoDoFo::PdfDictionary& dict,
+ const char* key,
+ SkPdfArray** data) {
+ const PoDoFo::PdfObject* value = resolveReferenceObject(pdfDoc,
+ dict.GetKey(PoDoFo::PdfName(key)),
+ true);
+ if (value == NULL || !value->IsArray()) {
+ return false;
+ }
+ if (data == NULL) {
+ return true;
+ }
+
+ return pdfDoc->mapper()->mapArray(value, data);
+}
+
+
+bool ArrayFromDictionary(const SkPodofoParsedPDF* pdfDoc,
+ const PoDoFo::PdfDictionary& dict,
+ const char* key,
+ const char* abr,
+ SkPdfArray** data) {
+ if (ArrayFromDictionary(pdfDoc, dict, key, data)) return true;
+ if (abr == NULL || *abr == '\0') return false;
+ return ArrayFromDictionary(pdfDoc, dict, abr, data);
+}
+
+/*
+bool DictionaryFromDictionary(const SkPodofoParsedPDF* pdfDoc,
+ const PoDoFo::PdfDictionary& dict,
+ const char* key,
+ SkPoDoFo::PdfDictionary** data) {
+ const PoDoFo::PdfObject* value = resolveReferenceObject(pdfDoc,
+ dict.GetKey(PoDoFo::PdfName(key)),
+ true);
+ if (value == NULL || !value->IsDictionary()) {
+ return false;
+ }
+ if (data == NULL) {
+ return true;
+ }
+
+ return pdfDoc->mapper()->mapDictionary(value, data);
+}
+
+bool DictionaryFromDictionary(const SkPodofoParsedPDF* pdfDoc,
+ const PoDoFo::PdfDictionary& dict,
+ const char* key,
+ const char* abr,
+ SkPoDoFo::PdfDictionary** data) {
+ if (DictionaryFromDictionary(pdfDoc, dict, key, data)) return true;
+ if (abr == NULL || *abr == '\0') return false;
+ return DictionaryFromDictionary(pdfDoc, dict, abr, data);
+}
+*/
+
+bool ObjectFromDictionary(const SkPodofoParsedPDF* pdfDoc,
+ const PoDoFo::PdfDictionary& dict,
+ const char* key,
+ PoDoFo::PdfObject** data) {
+ const PoDoFo::PdfObject* value = resolveReferenceObject(pdfDoc,
+ dict.GetKey(PoDoFo::PdfName(key)),
+ true);
+ if (value == NULL) {
+ return false;
+ }
+ if (data == NULL) {
+ return true;
+ }
+ *data = (PoDoFo::PdfObject*)value;
+ return true;
+}
+
+bool ObjectFromDictionary(const SkPodofoParsedPDF* pdfDoc,
+ const PoDoFo::PdfDictionary& dict,
+ const char* key,
+ const char* abr,
+ PoDoFo::PdfObject** data) {
+ if (ObjectFromDictionary(pdfDoc, dict, key, data)) return true;
+ if (abr == NULL || *abr == '\0') return false;
+ return ObjectFromDictionary(pdfDoc, dict, abr, data);
+}
+
+bool StreamFromDictionary(const SkPodofoParsedPDF* pdfDoc,
+ const PoDoFo::PdfDictionary& dict,
+ const char* key,
+ SkPdfStream** data) {
+ const PoDoFo::PdfObject* value = resolveReferenceObject(pdfDoc,
+ dict.GetKey(PoDoFo::PdfName(key)),
+ true);
+ if (value == NULL) {
+ return false;
+ }
+ if (data == NULL) {
+ return true;
+ }
+ return pdfDoc->mapper()->mapStream(value, data);
+}
+
+bool StreamFromDictionary(const SkPodofoParsedPDF* pdfDoc,
+ const PoDoFo::PdfDictionary& dict,
+ const char* key,
+ const char* abr,
+ SkPdfStream** data) {
+ if (StreamFromDictionary(pdfDoc, dict, key, data)) return true;
+ if (abr == NULL || *abr == '\0') return false;
+ return StreamFromDictionary(pdfDoc, dict, abr, data);
+}
+
+
« no previous file with comments | « experimental/PdfViewer/pdfparser/podofo/SkPodofoUtils.h ('k') | experimental/PdfViewer/spec2def.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698