| Index: experimental/PdfViewer/pdf_viewer_main.cpp
|
| ===================================================================
|
| --- experimental/PdfViewer/pdf_viewer_main.cpp (revision 9547)
|
| +++ experimental/PdfViewer/pdf_viewer_main.cpp (working copy)
|
| @@ -30,6 +30,12 @@
|
| const char* abr,
|
| long* data);
|
|
|
| +bool DoubleFromDictionary(const PdfMemDocument* pdfDoc,
|
| + const PdfDictionary& dict,
|
| + const char* key,
|
| + const char* abr,
|
| + double* data);
|
| +
|
| bool BoolFromDictionary(const PdfMemDocument* pdfDoc,
|
| const PdfDictionary& dict,
|
| const char* key,
|
| @@ -42,8 +48,27 @@
|
| const char* abr,
|
| std::string* data);
|
|
|
| +bool StringFromDictionary(const PdfMemDocument* pdfDoc,
|
| + const PdfDictionary& dict,
|
| + const char* key,
|
| + const char* abr,
|
| + std::string* data);
|
|
|
| +class SkPdfDictionary;
|
| +bool DictionaryFromDictionary(const PdfMemDocument* pdfDoc,
|
| + const PdfDictionary& dict,
|
| + const char* key,
|
| + const char* abr,
|
| + SkPdfDictionary** data);
|
|
|
| +class SkPdfObject;
|
| +bool ObjectFromDictionary(const PdfMemDocument* pdfDoc,
|
| + const PdfDictionary& dict,
|
| + const char* key,
|
| + const char* abr,
|
| + SkPdfObject** data);
|
| +
|
| +
|
| #include "pdf_auto_gen.h"
|
|
|
| /*
|
| @@ -776,6 +801,32 @@
|
| return LongFromDictionary(pdfDoc, dict, abr, data);
|
| }
|
|
|
| +bool DoubleFromDictionary(const PdfMemDocument* pdfDoc,
|
| + const PdfDictionary& dict,
|
| + const char* key,
|
| + double* data) {
|
| + const PdfObject* value = resolveReferenceObject(pdfDoc,
|
| + dict.GetKey(PdfName(key)));
|
| +
|
| + if (value == NULL || !value->IsReal()) {
|
| + return false;
|
| + }
|
| +
|
| + *data = value->GetReal();
|
| + return true;
|
| +}
|
| +
|
| +bool DoubleFromDictionary(const PdfMemDocument* pdfDoc,
|
| + const 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 PdfMemDocument* pdfDoc,
|
| const PdfDictionary& dict,
|
| const char* key,
|
| @@ -826,6 +877,79 @@
|
| return NameFromDictionary(pdfDoc, dict, abr, data);
|
| }
|
|
|
| +bool StringFromDictionary(const PdfMemDocument* pdfDoc,
|
| + const PdfDictionary& dict,
|
| + const char* key,
|
| + std::string* data) {
|
| + const PdfObject* value = resolveReferenceObject(pdfDoc,
|
| + dict.GetKey(PdfName(key)),
|
| + true);
|
| + if (value == NULL || (!value->IsString() && !value->IsHexString())) {
|
| + return false;
|
| + }
|
| +
|
| + *data = value->GetString().GetString();
|
| + return true;
|
| +}
|
| +
|
| +bool StringFromDictionary(const PdfMemDocument* pdfDoc,
|
| + const 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 DictionaryFromDictionary(const PdfMemDocument* pdfDoc,
|
| + const PdfDictionary& dict,
|
| + const char* key,
|
| + SkPdfDictionary** data) {
|
| + const PdfObject* value = resolveReferenceObject(pdfDoc,
|
| + dict.GetKey(PdfName(key)),
|
| + true);
|
| + if (value == NULL || !value->IsDictionary()) {
|
| + return false;
|
| + }
|
| +
|
| + return PodofoMapper::mapDictionary(*pdfDoc, *value, (SkPdfObject**)data);
|
| +}
|
| +
|
| +bool DictionaryFromDictionary(const PdfMemDocument* pdfDoc,
|
| + const PdfDictionary& dict,
|
| + const char* key,
|
| + const char* abr,
|
| + SkPdfDictionary** 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 PdfMemDocument* pdfDoc,
|
| + const PdfDictionary& dict,
|
| + const char* key,
|
| + SkPdfObject** data) {
|
| + const PdfObject* value = resolveReferenceObject(pdfDoc,
|
| + dict.GetKey(PdfName(key)),
|
| + true);
|
| + if (value == NULL) {
|
| + return false;
|
| + }
|
| + return PodofoMapper::mapObject(*pdfDoc, *value, data);
|
| +}
|
| +
|
| +bool ObjectFromDictionary(const PdfMemDocument* pdfDoc,
|
| + const PdfDictionary& dict,
|
| + const char* key,
|
| + const char* abr,
|
| + SkPdfObject** data) {
|
| + if (ObjectFromDictionary(pdfDoc, dict, key, data)) return true;
|
| + if (abr == NULL || *abr == '\0') return false;
|
| + return ObjectFromDictionary(pdfDoc, dict, abr, data);
|
| +}
|
| +
|
| +
|
| // TODO(edisonn): perf!!!
|
|
|
| static SkColorTable* getGrayColortable() {
|
| @@ -952,7 +1076,7 @@
|
|
|
| // this functions returns the image, it does not look at the smask.
|
|
|
| -SkBitmap getImageFromObject(PdfContext* pdfContext, const SkPdfImage* image, bool transparencyMask) {
|
| +SkBitmap getImageFromObject(PdfContext* pdfContext, const SkPdfImageDictionary* image, bool transparencyMask) {
|
| if (image == NULL || !image->valid()) {
|
| // TODO(edisonn): report warning to be used in testing.
|
| return SkBitmap();
|
| @@ -970,10 +1094,16 @@
|
| // SkImageDecoder::Factory()
|
| // }
|
|
|
| - long bpc = image->bpc();
|
| - long width = image->w();
|
| - long height = image->h();
|
| - std::string colorSpace = image->cs();
|
| + long bpc = image->BitsPerComponent();
|
| + long width = image->Width();
|
| + long height = image->Height();
|
| + SkPdfObject* colorSpaceDict = image->ColorSpace();
|
| + std::string colorSpace = "DeviceRGB";
|
| + // TODO(edisonn): for multiple type fileds, generate code, like, isName(), isArray(), ...and fields like colorSpace_name(), colorSpace_array()
|
| + // so we do nto go to podofo anywhere in our cpp file
|
| + if (colorSpaceDict && colorSpaceDict->podofo() && colorSpaceDict->podofo()->IsName()) {
|
| + colorSpace = colorSpaceDict->podofo()->GetName().GetName();
|
| + }
|
|
|
| /*
|
| bool imageMask = image->imageMask();
|
| @@ -1019,7 +1149,7 @@
|
| return bitmap;
|
| }
|
|
|
| -SkBitmap getSmaskFromObject(PdfContext* pdfContext, const SkPdfImage* obj) {
|
| +SkBitmap getSmaskFromObject(PdfContext* pdfContext, const SkPdfImageDictionary* obj) {
|
| const PdfObject* sMask = resolveReferenceObject(pdfContext->fPdfDoc,
|
| obj->podofo()->GetDictionary().GetKey(PdfName("SMask")));
|
|
|
| @@ -1032,7 +1162,7 @@
|
| #endif
|
|
|
| if (sMask) {
|
| - SkPdfImage skxobjmask(pdfContext->fPdfDoc, sMask);
|
| + SkPdfImageDictionary skxobjmask(pdfContext->fPdfDoc, sMask);
|
| return getImageFromObject(pdfContext, &skxobjmask, true);
|
| }
|
|
|
| @@ -1040,7 +1170,7 @@
|
| return pdfContext->fGraphicsState.fSMask;
|
| }
|
|
|
| -PdfResult doXObject_Image(PdfContext* pdfContext, SkCanvas* canvas, const SkPdfImage* skpdfimage) {
|
| +PdfResult doXObject_Image(PdfContext* pdfContext, SkCanvas* canvas, const SkPdfImageDictionary* skpdfimage) {
|
| if (skpdfimage == NULL || !skpdfimage->valid()) {
|
| return kIgnoreError_PdfResult;
|
| }
|
| @@ -1218,18 +1348,18 @@
|
|
|
| // TODO(edisonn): check type
|
| SkPdfObject* skobj = NULL;
|
| - if (!PodofoMapper::mapObject(*pdfContext->fPdfDoc, obj, &skobj)) return kIgnoreError_PdfResult;
|
| + if (!PodofoMapper::mapXObjectDictionary(*pdfContext->fPdfDoc, obj, &skobj)) return kIgnoreError_PdfResult;
|
|
|
| if (!skobj || !skobj->valid()) return kIgnoreError_PdfResult;
|
|
|
| PdfResult ret = kIgnoreError_PdfResult;
|
| switch (skobj->getType())
|
| {
|
| - case kObjectDictionaryXObjectImage_SkPdfObjectType:
|
| - ret = doXObject_Image(pdfContext, canvas, skobj->asImage());
|
| + case kObjectDictionaryXObjectDictionaryImageDictionary_SkPdfObjectType:
|
| + ret = doXObject_Image(pdfContext, canvas, skobj->asImageDictionary());
|
| break;
|
| - case kObjectDictionaryXObjectForm_SkPdfObjectType:
|
| - ret = doXObject_Form(pdfContext, canvas, obj);
|
| + case kObjectDictionaryXObjectDictionaryType1FormDictionary_SkPdfObjectType:
|
| + ret = doXObject_Form(pdfContext, canvas, obj);//skobj->asType1FormDictionary());
|
| break;
|
| //case kObjectDictionaryXObjectPS_SkPdfObjectType:
|
| //return doXObject_PS(skxobj.asPS());
|
| @@ -1971,7 +2101,17 @@
|
| PdfResult PdfOp_gs(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** looper) {
|
| PdfName name = pdfContext->fVarStack.top().GetName(); pdfContext->fVarStack.pop();
|
|
|
| +#ifdef PDF_TRACE
|
| + std::string str;
|
| +#endif
|
| +
|
| const PdfDictionary& pageDict = pdfContext->fGraphicsState.fObjectWithResources->GetDictionary();
|
| +
|
| +#ifdef PDF_TRACE
|
| + pdfContext->fGraphicsState.fObjectWithResources->ToString(str);
|
| + printf("Print Object with resources: %s\n", str.c_str());
|
| +#endif
|
| +
|
| const PdfObject* resources = resolveReferenceObject(pdfContext->fPdfDoc,
|
| pageDict.GetKey("Resources"));
|
|
|
| @@ -1983,7 +2123,6 @@
|
| }
|
|
|
| #ifdef PDF_TRACE
|
| - std::string str;
|
| resources->ToString(str);
|
| printf("Print gs Page Resources: %s\n", str.c_str());
|
| #endif
|
|
|