| Index: experimental/PdfViewer/pdf_viewer_main.cpp
|
| ===================================================================
|
| --- experimental/PdfViewer/pdf_viewer_main.cpp (revision 9625)
|
| +++ experimental/PdfViewer/pdf_viewer_main.cpp (working copy)
|
| @@ -61,6 +61,13 @@
|
| const char* abr,
|
| SkPdfDictionary** data);
|
|
|
| +template <typename T>
|
| +bool DictionaryFromDictionary2(const PdfMemDocument* pdfDoc,
|
| + const PdfDictionary& dict,
|
| + const char* key,
|
| + const char* abr,
|
| + T** data);
|
| +
|
| class SkPdfObject;
|
| bool ObjectFromDictionary(const PdfMemDocument* pdfDoc,
|
| const PdfDictionary& dict,
|
| @@ -72,9 +79,13 @@
|
| #include "pdf_auto_gen.h"
|
|
|
| /*
|
| - * TODO(edisonn): ASAP so skp -> pdf -> png looks greap
|
| - * - load gs/ especially smask and already known prop
|
| - * - use transparency (I think ca and CA ops)
|
| + * TODO(edisonn):
|
| + * - encapsulate podofo in the pdf api so the skpdf does not know anything about podofo
|
| + * - ASAP so skp -> pdf -> png looks great
|
| + * - load gs/ especially smask and already known prop (skp)
|
| + * - use transparency (I think ca and CA ops) (skp)
|
| + * - all font types
|
| + * - word spacing
|
| * - load font for baidu.pdf
|
| * - load font for youtube.pdf
|
| */
|
| @@ -200,7 +211,7 @@
|
| double fWordSpace;
|
| double fCharSpace;
|
|
|
| - const PdfObject* fObjectWithResources;
|
| + SkPdfResourceDictionary fResources;
|
|
|
| SkBitmap fSMask;
|
|
|
| @@ -218,7 +229,6 @@
|
| fTextLeading = 0;
|
| fWordSpace = 0;
|
| fCharSpace = 0;
|
| - fObjectWithResources = NULL;
|
| fHasClipPathToApply = false;
|
| }
|
| };
|
| @@ -913,7 +923,7 @@
|
| return false;
|
| }
|
|
|
| - return PodofoMapper::mapDictionary(*pdfDoc, *value, (SkPdfObject**)data);
|
| + return PodofoMapper::map(*pdfDoc, *value, (SkPdfObject**)data);
|
| }
|
|
|
| bool DictionaryFromDictionary(const PdfMemDocument* pdfDoc,
|
| @@ -926,6 +936,32 @@
|
| return DictionaryFromDictionary(pdfDoc, dict, abr, data);
|
| }
|
|
|
| +template <typename T>
|
| +bool DictionaryFromDictionary2(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::map(*pdfDoc, *value, (T**)data);
|
| +}
|
| +
|
| +template <typename T>
|
| +bool DictionaryFromDictionary2(const PdfMemDocument* pdfDoc,
|
| + const PdfDictionary& dict,
|
| + const char* key,
|
| + const char* abr,
|
| + T** data) {
|
| + if (DictionaryFromDictionary2<T>(pdfDoc, dict, key, data)) return true;
|
| + if (abr == NULL || *abr == '\0') return false;
|
| + return DictionaryFromDictionary2<T>(pdfDoc, dict, abr, data);
|
| +}
|
| +
|
| bool ObjectFromDictionary(const PdfMemDocument* pdfDoc,
|
| const PdfDictionary& dict,
|
| const char* key,
|
| @@ -936,7 +972,7 @@
|
| if (value == NULL) {
|
| return false;
|
| }
|
| - return PodofoMapper::mapObject(*pdfDoc, *value, data);
|
| + return PodofoMapper::map(*pdfDoc, *value, data);
|
| }
|
|
|
| bool ObjectFromDictionary(const PdfMemDocument* pdfDoc,
|
| @@ -950,6 +986,7 @@
|
| }
|
|
|
|
|
| +
|
| // TODO(edisonn): perf!!!
|
|
|
| static SkColorTable* getGrayColortable() {
|
| @@ -1257,20 +1294,39 @@
|
| return true;
|
| }
|
|
|
| -PdfResult doXObject_Form(PdfContext* pdfContext, SkCanvas* canvas, const PdfObject& obj) {
|
| - if (!obj.HasStream() || obj.GetStream() == NULL || obj.GetStream()->GetLength() == 0) {
|
| +SkPdfObject* get(const SkPdfObject* obj, const char* key, const char* abr = "") {
|
| + SkPdfObject* ret = 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, &ret);
|
| + return ret;
|
| +}
|
| +
|
| +PdfResult doXObject_Form(PdfContext* pdfContext, SkCanvas* canvas, SkPdfType1FormDictionary* skobj) {
|
| + if (!skobj || !skobj->podofo() || !skobj->podofo()->HasStream() || skobj->podofo()->GetStream() == NULL || skobj->podofo()->GetStream()->GetLength() == 0) {
|
| return kOK_PdfResult;
|
| }
|
|
|
| PdfOp_q(pdfContext, canvas, NULL);
|
| canvas->save();
|
|
|
| - pdfContext->fGraphicsState.fObjectWithResources = &obj;
|
| + if (get(skobj, "Resources")) {
|
| + SkPdfResourceDictionary* res = NULL;
|
|
|
| + PodofoMapper::map(*get(skobj, "Resources"), &res);
|
| +
|
| + if (res) {
|
| + pdfContext->fGraphicsState.fResources = *res;
|
| + delete res;
|
| + }
|
| + }
|
| +
|
| SkTraceMatrix(pdfContext->fGraphicsState.fMatrix, "Current matrix");
|
|
|
| SkMatrix matrix;
|
| - if (SkMatrixFromDictionary(pdfContext, obj.GetDictionary(), "Matrix", &matrix)) {
|
| + if (SkMatrixFromDictionary(pdfContext, skobj->podofo()->GetDictionary(), "Matrix", &matrix)) {
|
| pdfContext->fGraphicsState.fMatrix.preConcat(matrix);
|
| pdfContext->fGraphicsState.fMatrixTm = pdfContext->fGraphicsState.fMatrix;
|
| pdfContext->fGraphicsState.fMatrixTlm = pdfContext->fGraphicsState.fMatrix;
|
| @@ -1282,7 +1338,7 @@
|
| canvas->setMatrix(pdfContext->fGraphicsState.fMatrix);
|
|
|
| SkRect bbox;
|
| - if (SkRectFromDictionary(pdfContext, obj.GetDictionary(), "BBox", &bbox)) {
|
| + if (SkRectFromDictionary(pdfContext, skobj->podofo()->GetDictionary(), "BBox", &bbox)) {
|
| canvas->clipRect(bbox, SkRegion::kIntersect_Op, true); // TODO(edisonn): AA from settings.
|
| }
|
|
|
| @@ -1296,7 +1352,7 @@
|
|
|
| // TODO(edisonn): get rid of try/catch exceptions! We should not throw on user data!
|
| try {
|
| - obj.GetStream()->GetFilteredCopy(&uncompressedStream, &uncompressedStreamLength);
|
| + skobj->podofo()->GetStream()->GetFilteredCopy(&uncompressedStream, &uncompressedStreamLength);
|
| if (uncompressedStream != NULL && uncompressedStreamLength != 0) {
|
| PdfContentsTokenizer tokenizer(uncompressedStream, uncompressedStreamLength);
|
| PdfMainLooper looper(NULL, &tokenizer, pdfContext, canvas);
|
| @@ -1347,8 +1403,8 @@
|
| CheckRecursiveRendering checkRecursion(obj);
|
|
|
| // TODO(edisonn): check type
|
| - SkPdfObject* skobj = NULL;
|
| - if (!PodofoMapper::mapXObjectDictionary(*pdfContext->fPdfDoc, obj, &skobj)) return kIgnoreError_PdfResult;
|
| + SkPdfXObjectDictionary* skobj = NULL;
|
| + if (!PodofoMapper::map(*pdfContext->fPdfDoc, obj, &skobj)) return kIgnoreError_PdfResult;
|
|
|
| if (!skobj || !skobj->valid()) return kIgnoreError_PdfResult;
|
|
|
| @@ -1359,7 +1415,7 @@
|
| ret = doXObject_Image(pdfContext, canvas, skobj->asImageDictionary());
|
| break;
|
| case kObjectDictionaryXObjectDictionaryType1FormDictionary_SkPdfObjectType:
|
| - ret = doXObject_Form(pdfContext, canvas, obj);//skobj->asType1FormDictionary());
|
| + ret = doXObject_Form(pdfContext, canvas, skobj->asType1FormDictionary());
|
| break;
|
| //case kObjectDictionaryXObjectPS_SkPdfObjectType:
|
| //return doXObject_PS(skxobj.asPS());
|
| @@ -2105,16 +2161,8 @@
|
| std::string str;
|
| #endif
|
|
|
| - const PdfDictionary& pageDict = pdfContext->fGraphicsState.fObjectWithResources->GetDictionary();
|
| + const PdfObject* resources = pdfContext->fGraphicsState.fResources.podofo();
|
|
|
| -#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"));
|
| -
|
| if (resources == NULL) {
|
| #ifdef PDF_TRACE
|
| printf("WARNING: No Resources for a page with 'gs' operator!\n");
|
| @@ -2169,6 +2217,9 @@
|
| printf("gs object value: %s\n", str.c_str());
|
| #endif
|
|
|
| + SkPdfGraphicsStateDictionary gs(pdfContext->fPdfDoc, value);
|
| + printf("caCA %f %f\n", gs.ca(), gs.CA());
|
| +
|
| // TODO(edisonn): now load all those properties in graphic state.
|
|
|
| return kNYI_PdfResult;
|
| @@ -2252,9 +2303,7 @@
|
| PdfResult PdfOp_Do(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** looper) {
|
| PdfName name = pdfContext->fVarStack.top().GetName(); pdfContext->fVarStack.pop();
|
|
|
| - const PdfDictionary& pageDict = pdfContext->fGraphicsState.fObjectWithResources->GetDictionary();
|
| - const PdfObject* resources = resolveReferenceObject(pdfContext->fPdfDoc,
|
| - pageDict.GetKey("Resources"));
|
| + const PdfObject* resources = pdfContext->fGraphicsState.fResources.podofo();
|
|
|
| if (resources == NULL) {
|
| #ifdef PDF_TRACE
|
| @@ -2637,7 +2686,8 @@
|
| pdfContext.fPdfPage = page;
|
| pdfContext.fPdfDoc = &doc;
|
| pdfContext.fOriginalMatrix = SkMatrix::I();
|
| - pdfContext.fGraphicsState.fObjectWithResources = pdfContext.fPdfPage->GetObject();
|
| + pdfContext.fGraphicsState.fResources = SkPdfResourceDictionary(pdfContext.fPdfDoc, resolveReferenceObject(pdfContext.fPdfDoc,
|
| + pdfContext.fPdfPage->GetResources()));
|
|
|
| gPdfContext = &pdfContext;
|
| gDumpBitmap = &bitmap;
|
|
|