| 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);
|
| +}
|
| +
|
| +
|
|
|