| Index: experimental/PdfViewer/pdf_viewer_main.cpp
|
| ===================================================================
|
| --- experimental/PdfViewer/pdf_viewer_main.cpp (revision 9669)
|
| +++ experimental/PdfViewer/pdf_viewer_main.cpp (working copy)
|
| @@ -24,6 +24,10 @@
|
| #include "podofo.h"
|
| using namespace PoDoFo;
|
|
|
| +const PdfObject* resolveReferenceObject(const PdfMemDocument* pdfDoc,
|
| + const PdfObject* obj,
|
| + bool resolveOneElementArrays = false);
|
| +
|
| bool LongFromDictionary(const PdfMemDocument* pdfDoc,
|
| const PdfDictionary& dict,
|
| const char* key,
|
| @@ -128,7 +132,9 @@
|
| SkPdfFunction* data);
|
|
|
|
|
| -#include "pdf_auto_gen.h"
|
| +#include "SkPdfHeaders_autogen.h"
|
| +#include "SkPdfPodofoMapper_autogen.h"
|
| +#include "SkPdfParser.h"
|
|
|
| bool ArrayFromDictionary(const PdfMemDocument* pdfDoc,
|
| const PdfDictionary& dict,
|
| @@ -160,12 +166,6 @@
|
| const char* abr,
|
| SkPdfDate* data) {return false;}
|
|
|
| -bool SkRectFromDictionary(const PdfMemDocument* pdfDoc,
|
| - const PdfDictionary& dict,
|
| - const char* key,
|
| - const char* abr,
|
| - SkRect* data) {return false;}
|
| -
|
| bool FunctionFromDictionary(const PdfMemDocument* pdfDoc,
|
| const PdfDictionary& dict,
|
| const char* key,
|
| @@ -235,7 +235,7 @@
|
|
|
| const PdfObject* resolveReferenceObject(const PdfMemDocument* pdfDoc,
|
| const PdfObject* obj,
|
| - bool resolveOneElementArrays = false) {
|
| + bool resolveOneElementArrays) {
|
| while (obj && (obj->IsReference() || (resolveOneElementArrays &&
|
| obj->IsArray() &&
|
| obj->GetArray().GetSize() == 1))) {
|
| @@ -307,7 +307,7 @@
|
| double fWordSpace;
|
| double fCharSpace;
|
|
|
| - SkPdfResourceDictionary fResources;
|
| + SkPdfResourceDictionary* fResources;
|
|
|
| SkBitmap fSMask;
|
|
|
| @@ -326,6 +326,7 @@
|
| fWordSpace = 0;
|
| fCharSpace = 0;
|
| fHasClipPathToApply = false;
|
| + fResources = NULL;
|
| }
|
| };
|
|
|
| @@ -338,17 +339,15 @@
|
|
|
| // TODO(edisonn): better class design.
|
| struct PdfContext {
|
| - std::stack<PdfVariant> fVarStack;
|
| + std::stack<SkPdfObject*> fObjectStack;
|
| std::stack<PdfGraphicsState> fStateStack;
|
| PdfGraphicsState fGraphicsState;
|
| - PoDoFo::PdfPage* fPdfPage;
|
| - PdfMemDocument* fPdfDoc;
|
| + SkPdfDoc& fPdfDoc;
|
| SkMatrix fOriginalMatrix;
|
|
|
| PdfInlineImage fInlineImage;
|
|
|
| - PdfContext() : fPdfPage(NULL),
|
| - fPdfDoc(NULL) {}
|
| + PdfContext(SkPdfDoc& doc) : fPdfDoc(doc) {}
|
|
|
| };
|
|
|
| @@ -364,20 +363,12 @@
|
| kCount_PdfResult
|
| };
|
|
|
| -struct PdfToken {
|
| - const char* pszToken;
|
| - PdfVariant var;
|
| - EPdfContentsType eType;
|
| -
|
| - PdfToken() : pszToken(NULL) {}
|
| -};
|
| -
|
| PdfContext* gPdfContext = NULL;
|
| SkBitmap* gDumpBitmap = NULL;
|
| SkCanvas* gDumpCanvas = NULL;
|
| char gLastKeyword[100] = "";
|
| int gLastOpKeyword = -1;
|
| -char allOpWithVisualEffects[100] = ",S,s,f,F,f*,B,B*,b,b*,n,Tj,TJ,\',\",d0,d1,sh,EI,Do,EX";
|
| +char allOpWithVisualEffects[100] = ",S,s,f,F,f*,B,B*,b,b*,n,Tj,TJ,\',\",d0,d1,sh,EI,Do,EX,";
|
| int gReadOp = 0;
|
|
|
|
|
| @@ -394,8 +385,8 @@
|
| }
|
|
|
| // TODO(edisonn): Pass PdfContext and SkCanvasd only with the define for instrumentation.
|
| -static bool readToken(PdfContentsTokenizer* fTokenizer, PdfToken* token) {
|
| - bool ret = fTokenizer->ReadNext(token->eType, token->pszToken, token->var);
|
| +static bool readToken(SkPdfTokenizer fTokenizer, PdfToken* token) {
|
| + bool ret = fTokenizer.readToken(token);
|
|
|
| gReadOp++;
|
|
|
| @@ -474,8 +465,8 @@
|
| SkImageEncoder::EncodeFile(out.c_str(), bitmap, SkImageEncoder::kPNG_Type, 100);
|
| }
|
|
|
| - if (token->eType == ePdfContentsType_Keyword) {
|
| - strcpy(gLastKeyword, token->pszToken);
|
| + if (token->fType == kKeyword_TokenType) {
|
| + strcpy(gLastKeyword, token->fKeyword);
|
| gLastOpKeyword = gReadOp;
|
| } else {
|
| strcpy(gLastKeyword, "");
|
| @@ -489,13 +480,13 @@
|
| class PdfTokenLooper {
|
| protected:
|
| PdfTokenLooper* fParent;
|
| - PdfContentsTokenizer* fTokenizer;
|
| + SkPdfTokenizer fTokenizer;
|
| PdfContext* fPdfContext;
|
| SkCanvas* fCanvas;
|
|
|
| public:
|
| PdfTokenLooper(PdfTokenLooper* parent,
|
| - PdfContentsTokenizer* tokenizer,
|
| + SkPdfTokenizer tokenizer,
|
| PdfContext* pdfContext,
|
| SkCanvas* canvas)
|
| : fParent(parent), fTokenizer(tokenizer), fPdfContext(pdfContext), fCanvas(canvas) {}
|
| @@ -514,7 +505,7 @@
|
| class PdfMainLooper : public PdfTokenLooper {
|
| public:
|
| PdfMainLooper(PdfTokenLooper* parent,
|
| - PdfContentsTokenizer* tokenizer,
|
| + SkPdfTokenizer tokenizer,
|
| PdfContext* pdfContext,
|
| SkCanvas* canvas)
|
| : PdfTokenLooper(parent, tokenizer, pdfContext, canvas) {}
|
| @@ -526,7 +517,7 @@
|
| class PdfInlineImageLooper : public PdfTokenLooper {
|
| public:
|
| PdfInlineImageLooper()
|
| - : PdfTokenLooper(NULL, NULL, NULL, NULL) {}
|
| + : PdfTokenLooper(NULL, SkPdfTokenizer(), NULL, NULL) {}
|
|
|
| virtual PdfResult consumeToken(PdfToken& token);
|
| virtual void loop();
|
| @@ -536,7 +527,7 @@
|
| class PdfCompatibilitySectionLooper : public PdfTokenLooper {
|
| public:
|
| PdfCompatibilitySectionLooper()
|
| - : PdfTokenLooper(NULL, NULL, NULL, NULL) {}
|
| + : PdfTokenLooper(NULL, SkPdfTokenizer(), NULL, NULL) {}
|
|
|
| virtual PdfResult consumeToken(PdfToken& token);
|
| virtual void loop();
|
| @@ -716,7 +707,7 @@
|
| if (fCurFont->GetObject()->IsDictionary() && fCurFont->GetObject()->GetDictionary().HasKey(PdfName("ToUnicode"))) {
|
| PdfCMapEncoding* enc = new PdfCMapEncoding(
|
| fCurFont->GetObject(),
|
| - (PdfObject*)resolveReferenceObject(pdfContext->fPdfDoc,
|
| + (PdfObject*)resolveReferenceObject(&pdfContext->fPdfDoc.podofo(),
|
| fCurFont->GetObject()->GetDictionary().GetKey(PdfName("ToUnicode"))),
|
| PdfCMapEncoding::eBaseEncoding_Identity); // todo, read the base encoding
|
| gFontsFixed[fCurFont] = enc;
|
| @@ -1282,7 +1273,7 @@
|
| }
|
|
|
| SkBitmap getSmaskFromObject(PdfContext* pdfContext, const SkPdfImageDictionary* obj) {
|
| - const PdfObject* sMask = resolveReferenceObject(pdfContext->fPdfDoc,
|
| + const PdfObject* sMask = resolveReferenceObject(&pdfContext->fPdfDoc.podofo(),
|
| obj->podofo()->GetDictionary().GetKey(PdfName("SMask")));
|
|
|
| #ifdef PDF_TRACE
|
| @@ -1294,7 +1285,7 @@
|
| #endif
|
|
|
| if (sMask) {
|
| - SkPdfImageDictionary skxobjmask(pdfContext->fPdfDoc, sMask);
|
| + SkPdfImageDictionary skxobjmask(&pdfContext->fPdfDoc.podofo(), sMask);
|
| return getImageFromObject(pdfContext, &skxobjmask, true);
|
| }
|
|
|
| @@ -1334,7 +1325,7 @@
|
| const PdfDictionary& dict,
|
| const char* key,
|
| SkMatrix* matrix) {
|
| - const PdfObject* value = resolveReferenceObject(pdfContext->fPdfDoc,
|
| + const PdfObject* value = resolveReferenceObject(&pdfContext->fPdfDoc.podofo(),
|
| dict.GetKey(PdfName(key)));
|
|
|
| if (value == NULL || !value->IsArray()) {
|
| @@ -1347,7 +1338,7 @@
|
|
|
| double array[6];
|
| for (int i = 0; i < 6; i++) {
|
| - const PdfObject* elem = resolveReferenceObject(pdfContext->fPdfDoc, &value->GetArray()[i]);
|
| + const PdfObject* elem = resolveReferenceObject(&pdfContext->fPdfDoc.podofo(), &value->GetArray()[i]);
|
| if (elem == NULL || (!elem->IsReal() && !elem->IsNumber())) {
|
| return false;
|
| }
|
| @@ -1358,11 +1349,11 @@
|
| return true;
|
| }
|
|
|
| -bool SkRectFromDictionary(PdfContext* pdfContext,
|
| +bool SkRectFromDictionary(const PdfMemDocument* pdfDoc,
|
| const PdfDictionary& dict,
|
| const char* key,
|
| SkRect* rect) {
|
| - const PdfObject* value = resolveReferenceObject(pdfContext->fPdfDoc,
|
| + const PdfObject* value = resolveReferenceObject(pdfDoc,
|
| dict.GetKey(PdfName(key)));
|
|
|
| if (value == NULL || !value->IsArray()) {
|
| @@ -1375,7 +1366,7 @@
|
|
|
| double array[4];
|
| for (int i = 0; i < 4; i++) {
|
| - const PdfObject* elem = resolveReferenceObject(pdfContext->fPdfDoc, &value->GetArray()[i]);
|
| + const PdfObject* elem = resolveReferenceObject(pdfDoc, &value->GetArray()[i]);
|
| if (elem == NULL || (!elem->IsReal() && !elem->IsNumber())) {
|
| return false;
|
| }
|
| @@ -1389,6 +1380,18 @@
|
| return true;
|
| }
|
|
|
| +bool SkRectFromDictionary(const PdfMemDocument* pdfDoc,
|
| + const 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 = "") {
|
| SkPdfObject* ret = NULL;
|
| if (obj == NULL) return NULL;
|
| @@ -1413,8 +1416,7 @@
|
| PodofoMapper::map(*get(skobj, "Resources"), &res);
|
|
|
| if (res) {
|
| - pdfContext->fGraphicsState.fResources = *res;
|
| - delete res;
|
| + pdfContext->fGraphicsState.fResources = res;
|
| }
|
| }
|
|
|
| @@ -1433,7 +1435,7 @@
|
| canvas->setMatrix(pdfContext->fGraphicsState.fMatrix);
|
|
|
| SkRect bbox;
|
| - if (SkRectFromDictionary(pdfContext, skobj->podofo()->GetDictionary(), "BBox", &bbox)) {
|
| + if (SkRectFromDictionary(&pdfContext->fPdfDoc.podofo(), skobj->podofo()->GetDictionary(), "BBox", &bbox)) {
|
| canvas->clipRect(bbox, SkRegion::kIntersect_Op, true); // TODO(edisonn): AA from settings.
|
| }
|
|
|
| @@ -1449,8 +1451,8 @@
|
| try {
|
| skobj->podofo()->GetStream()->GetFilteredCopy(&uncompressedStream, &uncompressedStreamLength);
|
| if (uncompressedStream != NULL && uncompressedStreamLength != 0) {
|
| - PdfContentsTokenizer tokenizer(uncompressedStream, uncompressedStreamLength);
|
| - PdfMainLooper looper(NULL, &tokenizer, pdfContext, canvas);
|
| + SkPdfTokenizer tokenizer = pdfContext->fPdfDoc.tokenizerOfStream(uncompressedStream, uncompressedStreamLength);
|
| + PdfMainLooper looper(NULL, tokenizer, pdfContext, canvas);
|
| looper.loop();
|
| }
|
| free(uncompressedStream);
|
| @@ -1469,7 +1471,7 @@
|
| return kNYI_PdfResult;
|
| }
|
|
|
| -// TODO(edisonn): faster, have the property on the PdfObject itself.
|
| +// TODO(edisonn): faster, have the property on the SkPdfObject itself?
|
| std::set<const PdfObject*> gInRendering;
|
|
|
| class CheckRecursiveRendering {
|
| @@ -1489,27 +1491,27 @@
|
| }
|
| };
|
|
|
| -PdfResult doXObject(PdfContext* pdfContext, SkCanvas* canvas, const PdfObject& obj) {
|
| - if (CheckRecursiveRendering::IsInRendering(obj)) {
|
| +PdfResult doXObject(PdfContext* pdfContext, SkCanvas* canvas, const SkPdfObject& obj) {
|
| + if (CheckRecursiveRendering::IsInRendering(*obj.podofo())) {
|
| // Oops, corrupt PDF!
|
| return kIgnoreError_PdfResult;
|
| }
|
|
|
| - CheckRecursiveRendering checkRecursion(obj);
|
| + CheckRecursiveRendering checkRecursion(*obj.podofo());
|
|
|
| // TODO(edisonn): check type
|
| SkPdfXObjectDictionary* skobj = NULL;
|
| - if (!PodofoMapper::map(*pdfContext->fPdfDoc, obj, &skobj)) return kIgnoreError_PdfResult;
|
| + if (!PodofoMapper::map(obj, &skobj)) return kIgnoreError_PdfResult;
|
|
|
| if (!skobj || !skobj->valid()) return kIgnoreError_PdfResult;
|
|
|
| PdfResult ret = kIgnoreError_PdfResult;
|
| switch (skobj->getType())
|
| {
|
| - case kObjectDictionaryXObjectDictionaryImageDictionary_SkPdfObjectType:
|
| + case kImageDictionary_SkPdfObjectType:
|
| ret = doXObject_Image(pdfContext, canvas, skobj->asImageDictionary());
|
| break;
|
| - case kObjectDictionaryXObjectDictionaryType1FormDictionary_SkPdfObjectType:
|
| + case kType1FormDictionary_SkPdfObjectType:
|
| ret = doXObject_Form(pdfContext, canvas, skobj->asType1FormDictionary());
|
| break;
|
| //case kObjectDictionaryXObjectPS_SkPdfObjectType:
|
| @@ -1536,8 +1538,8 @@
|
| PdfResult PdfOp_cm(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** looper) {
|
| double array[6];
|
| for (int i = 0 ; i < 6 ; i++) {
|
| - array[5 - i] = pdfContext->fVarStack.top().GetReal();
|
| - pdfContext->fVarStack.pop();
|
| + array[5 - i] = pdfContext->fObjectStack.top()->asNumber()->value();
|
| + pdfContext->fObjectStack.pop();
|
| }
|
|
|
| // a b
|
| @@ -1571,7 +1573,7 @@
|
| //, to leading, which is a number expressed in unscaled text
|
| //space units. Text leading is used only by the T*, ', and " operators. Initial value: 0.
|
| PdfResult PdfOp_TL(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** looper) {
|
| - double ty = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop();
|
| + double ty = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext->fObjectStack.pop();
|
|
|
| pdfContext->fGraphicsState.fTextLeading = ty;
|
|
|
| @@ -1579,8 +1581,8 @@
|
| }
|
|
|
| PdfResult PdfOp_Td(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** looper) {
|
| - double ty = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop();
|
| - double tx = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop();
|
| + double ty = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext->fObjectStack.pop();
|
| + double tx = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext->fObjectStack.pop();
|
|
|
| double array[6] = {1, 0, 0, 1, tx, ty};
|
| SkMatrix matrix = SkMatrixFromPdfMatrix(array);
|
| @@ -1592,27 +1594,30 @@
|
| }
|
|
|
| PdfResult PdfOp_TD(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** looper) {
|
| - double ty = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop();
|
| - double tx = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop();
|
| + double ty = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext->fObjectStack.pop();
|
| + double tx = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext->fObjectStack.pop();
|
|
|
| - PdfVariant _ty(-ty);
|
| - pdfContext->fVarStack.push(_ty);
|
| + PdfObject _ty(PdfVariant(-ty));
|
| + pdfContext->fObjectStack.push(new SkPdfNumber(&pdfContext->fPdfDoc.podofo(), &_ty));
|
| +
|
| PdfOp_TL(pdfContext, canvas, looper);
|
|
|
| - PdfVariant vtx(tx);
|
| - PdfVariant vty(ty);
|
| - pdfContext->fVarStack.push(vtx);
|
| - pdfContext->fVarStack.push(vty);
|
| + PdfObject vtx(PdfVariant(-(-tx))); // TODO(edisonn) Hmm, the compiler thinks I have here a function pointer if we use (tx), but not -(-tx)
|
| + pdfContext->fObjectStack.push(new SkPdfNumber(&pdfContext->fPdfDoc.podofo(), &vtx));
|
| +
|
| + PdfObject vty(PdfVariant(-(-ty)));
|
| + pdfContext->fObjectStack.push(new SkPdfNumber(&pdfContext->fPdfDoc.podofo(), &vty));
|
| +
|
| return PdfOp_Td(pdfContext, canvas, looper);
|
| }
|
|
|
| PdfResult PdfOp_Tm(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** looper) {
|
| - double f = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop();
|
| - double e = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop();
|
| - double d = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop();
|
| - double c = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop();
|
| - double b = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop();
|
| - double a = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop();
|
| + double f = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext->fObjectStack.pop();
|
| + double e = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext->fObjectStack.pop();
|
| + double d = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext->fObjectStack.pop();
|
| + double c = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext->fObjectStack.pop();
|
| + double b = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext->fObjectStack.pop();
|
| + double a = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext->fObjectStack.pop();
|
|
|
| double array[6];
|
| array[0] = a;
|
| @@ -1636,11 +1641,11 @@
|
| //0 Tl Td
|
| //where Tl is the current leading parameter in the text state
|
| PdfResult PdfOp_T_star(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** looper) {
|
| - PdfVariant zero(0.0);
|
| - PdfVariant tl(pdfContext->fGraphicsState.fTextLeading);
|
| + PdfObject zero(PdfVariant(0.0));
|
| + PdfObject tl(PdfVariant(-(-pdfContext->fGraphicsState.fTextLeading)));
|
|
|
| - pdfContext->fVarStack.push(zero);
|
| - pdfContext->fVarStack.push(tl);
|
| + pdfContext->fObjectStack.push(new SkPdfNumber(&pdfContext->fPdfDoc.podofo(), &zero));
|
| + pdfContext->fObjectStack.push(new SkPdfNumber(&pdfContext->fPdfDoc.podofo(), &tl));
|
| return PdfOp_Td(pdfContext, canvas, looper);
|
| }
|
|
|
| @@ -1650,8 +1655,8 @@
|
| pdfContext->fGraphicsState.fPathClosed = false;
|
| }
|
|
|
| - pdfContext->fGraphicsState.fCurPosY = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop();
|
| - pdfContext->fGraphicsState.fCurPosX = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop();
|
| + pdfContext->fGraphicsState.fCurPosY = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext->fObjectStack.pop();
|
| + pdfContext->fGraphicsState.fCurPosX = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext->fObjectStack.pop();
|
|
|
| pdfContext->fGraphicsState.fPath.moveTo(SkDoubleToScalar(pdfContext->fGraphicsState.fCurPosX),
|
| SkDoubleToScalar(pdfContext->fGraphicsState.fCurPosY));
|
| @@ -1665,8 +1670,8 @@
|
| pdfContext->fGraphicsState.fPathClosed = false;
|
| }
|
|
|
| - pdfContext->fGraphicsState.fCurPosY = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop();
|
| - pdfContext->fGraphicsState.fCurPosX = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop();
|
| + pdfContext->fGraphicsState.fCurPosY = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext->fObjectStack.pop();
|
| + pdfContext->fGraphicsState.fCurPosX = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext->fObjectStack.pop();
|
|
|
| pdfContext->fGraphicsState.fPath.lineTo(SkDoubleToScalar(pdfContext->fGraphicsState.fCurPosX),
|
| SkDoubleToScalar(pdfContext->fGraphicsState.fCurPosY));
|
| @@ -1680,12 +1685,12 @@
|
| pdfContext->fGraphicsState.fPathClosed = false;
|
| }
|
|
|
| - double y3 = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop();
|
| - double x3 = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop();
|
| - double y2 = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop();
|
| - double x2 = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop();
|
| - double y1 = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop();
|
| - double x1 = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop();
|
| + double y3 = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext->fObjectStack.pop();
|
| + double x3 = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext->fObjectStack.pop();
|
| + double y2 = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext->fObjectStack.pop();
|
| + double x2 = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext->fObjectStack.pop();
|
| + double y1 = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext->fObjectStack.pop();
|
| + double x1 = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext->fObjectStack.pop();
|
|
|
| pdfContext->fGraphicsState.fPath.cubicTo(SkDoubleToScalar(x1), SkDoubleToScalar(y1),
|
| SkDoubleToScalar(x2), SkDoubleToScalar(y2),
|
| @@ -1703,10 +1708,10 @@
|
| pdfContext->fGraphicsState.fPathClosed = false;
|
| }
|
|
|
| - double y3 = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop();
|
| - double x3 = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop();
|
| - double y2 = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop();
|
| - double x2 = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop();
|
| + double y3 = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext->fObjectStack.pop();
|
| + double x3 = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext->fObjectStack.pop();
|
| + double y2 = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext->fObjectStack.pop();
|
| + double x2 = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext->fObjectStack.pop();
|
| double y1 = pdfContext->fGraphicsState.fCurPosY;
|
| double x1 = pdfContext->fGraphicsState.fCurPosX;
|
|
|
| @@ -1726,12 +1731,12 @@
|
| pdfContext->fGraphicsState.fPathClosed = false;
|
| }
|
|
|
| - double y3 = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop();
|
| - double x3 = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop();
|
| + double y3 = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext->fObjectStack.pop();
|
| + double x3 = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext->fObjectStack.pop();
|
| double y2 = pdfContext->fGraphicsState.fCurPosY;
|
| double x2 = pdfContext->fGraphicsState.fCurPosX;
|
| - double y1 = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop();
|
| - double x1 = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop();
|
| + double y1 = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext->fObjectStack.pop();
|
| + double x1 = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext->fObjectStack.pop();
|
|
|
| pdfContext->fGraphicsState.fPath.cubicTo(SkDoubleToScalar(x1), SkDoubleToScalar(y1),
|
| SkDoubleToScalar(x2), SkDoubleToScalar(y2),
|
| @@ -1749,10 +1754,10 @@
|
| pdfContext->fGraphicsState.fPathClosed = false;
|
| }
|
|
|
| - double height = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop();
|
| - double width = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop();
|
| - double y = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop();
|
| - double x = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop();
|
| + double height = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext->fObjectStack.pop();
|
| + double width = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext->fObjectStack.pop();
|
| + double y = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext->fObjectStack.pop();
|
| + double x = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext->fObjectStack.pop();
|
|
|
| pdfContext->fGraphicsState.fPath.addRect(SkDoubleToScalar(x), SkDoubleToScalar(y),
|
| SkDoubleToScalar(x + width), SkDoubleToScalar(y + height));
|
| @@ -1904,18 +1909,26 @@
|
| //a number representing a scale factor. There is no initial value for either font or
|
| //size; they must be specified explicitly using Tf before any text is shown.
|
| PdfResult PdfOp_Tf(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** looper) {
|
| - pdfContext->fGraphicsState.fCurFontSize = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop();
|
| - PdfName fontName = pdfContext->fVarStack.top().GetName(); pdfContext->fVarStack.pop();
|
| + pdfContext->fGraphicsState.fCurFontSize = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext->fObjectStack.pop();
|
| + std::string fontName = pdfContext->fObjectStack.top()->asName()->value(); pdfContext->fObjectStack.pop();
|
|
|
| +#ifdef PDF_TRACE
|
| + printf("font name: %s\n", fontName.c_str());
|
| + std::string str;
|
| + pdfContext->fGraphicsState.fResources->podofo()->ToString(str);
|
| + printf("Print Tf font Resources: %s\n", str.c_str());
|
| +#endif
|
| +
|
| // TODO(edisonn): Load font from pdfContext->fGraphicsState.fObjectWithResources ?
|
| - PdfObject* pFont = pdfContext->fPdfPage->GetFromResources( PdfName("Font"), fontName );
|
| + const PdfObject* pFont = resolveReferenceObject(&pdfContext->fPdfDoc.podofo(),
|
| + pdfContext->fGraphicsState.fResources->Font()->get(fontName.c_str()).podofo());
|
| if( !pFont )
|
| {
|
| // TODO(edisonn): try to ignore the error, make sure we do not crash.
|
| return kIgnoreError_PdfResult;
|
| }
|
|
|
| - pdfContext->fGraphicsState.fCurFont = pdfContext->fPdfDoc->GetFont( pFont );
|
| + pdfContext->fGraphicsState.fCurFont = pdfContext->fPdfDoc.podofo().GetFont( (PdfObject*)pFont );
|
| if( !pdfContext->fGraphicsState.fCurFont )
|
| {
|
| // TODO(edisonn): check ~/crasing, for one of the files PoDoFo throws exception
|
| @@ -1934,9 +1947,9 @@
|
|
|
| PdfResult ret = DrawText(pdfContext,
|
| pdfContext->fGraphicsState.fCurFont,
|
| - pdfContext->fVarStack.top().GetString(),
|
| + pdfContext->fObjectStack.top()->podofo()->GetString(),
|
| canvas);
|
| - pdfContext->fVarStack.pop();
|
| + pdfContext->fObjectStack.pop();
|
|
|
| return ret;
|
| }
|
| @@ -1958,17 +1971,17 @@
|
| return kIgnoreError_PdfResult;
|
| }
|
|
|
| - PdfVariant str = pdfContext->fVarStack.top(); pdfContext->fVarStack.pop();
|
| - PdfVariant ac = pdfContext->fVarStack.top(); pdfContext->fVarStack.pop();
|
| - PdfVariant aw = pdfContext->fVarStack.top(); pdfContext->fVarStack.pop();
|
| + SkPdfObject* str = pdfContext->fObjectStack.top(); pdfContext->fObjectStack.pop();
|
| + SkPdfObject* ac = pdfContext->fObjectStack.top(); pdfContext->fObjectStack.pop();
|
| + SkPdfObject* aw = pdfContext->fObjectStack.top(); pdfContext->fObjectStack.pop();
|
|
|
| - pdfContext->fVarStack.push(aw);
|
| + pdfContext->fObjectStack.push(aw);
|
| PdfOp_Tw(pdfContext, canvas, looper);
|
|
|
| - pdfContext->fVarStack.push(ac);
|
| + pdfContext->fObjectStack.push(ac);
|
| PdfOp_Tc(pdfContext, canvas, looper);
|
|
|
| - pdfContext->fVarStack.push(str);
|
| + pdfContext->fObjectStack.push(str);
|
| PdfOp_quote(pdfContext, canvas, looper);
|
|
|
| return kPartial_PdfResult;
|
| @@ -1980,18 +1993,18 @@
|
| return kIgnoreError_PdfResult;
|
| }
|
|
|
| - PdfArray array = pdfContext->fVarStack.top().GetArray();
|
| - pdfContext->fVarStack.pop();
|
| + SkPdfArray* array = pdfContext->fObjectStack.top()->asArray();
|
| + pdfContext->fObjectStack.pop();
|
|
|
| - for( int i=0; i<static_cast<int>(array.GetSize()); i++ )
|
| + for( int i=0; i<static_cast<int>(array->size()); i++ )
|
| {
|
| - if( array[i].IsString() || array[i].IsHexString() ) {
|
| + if( (*array)[i].asString()) {
|
| DrawText(pdfContext,
|
| pdfContext->fGraphicsState.fCurFont,
|
| - array[i].GetString(),
|
| + (*array)[i].podofo()->GetString(),
|
| canvas);
|
| - } else if (array[i].IsReal() || array[i].IsNumber()) {
|
| - double dx = array[i].GetReal();
|
| + } else if ((*array)[i].asInteger() || (*array)[i].asNumber()) {
|
| + double dx = (*array)[i].asNumber()->value();
|
| SkMatrix matrix;
|
| matrix.setAll(SkDoubleToScalar(1),
|
| SkDoubleToScalar(0),
|
| @@ -2011,7 +2024,7 @@
|
| }
|
|
|
| PdfResult PdfOp_CS_cs(PdfContext* pdfContext, SkCanvas* canvas, PdfColorOperator* colorOperator) {
|
| - colorOperator->fColorSpace = pdfContext->fVarStack.top().GetName().GetName(); pdfContext->fVarStack.pop();
|
| + colorOperator->fColorSpace = pdfContext->fObjectStack.top()->asName()->value(); pdfContext->fObjectStack.pop();
|
| return kOK_PdfResult;
|
| }
|
|
|
| @@ -2040,9 +2053,9 @@
|
|
|
| for (int i = n - 1; i >= 0 ; i--) {
|
| if (doubles) {
|
| - c[i] = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop();
|
| + c[i] = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext->fObjectStack.pop();
|
| } else {
|
| - v[i] = pdfContext->fVarStack.top().GetNumber(); pdfContext->fVarStack.pop();
|
| + v[i] = pdfContext->fObjectStack.top()->asInteger()->value(); pdfContext->fObjectStack.pop();
|
| }
|
| }
|
|
|
| @@ -2064,8 +2077,8 @@
|
| PdfResult PdfOp_SCN_scn(PdfContext* pdfContext, SkCanvas* canvas, PdfColorOperator* colorOperator) {
|
| PdfString name;
|
|
|
| - if (pdfContext->fVarStack.top().IsName()) {
|
| - pdfContext->fVarStack.pop();
|
| + if (pdfContext->fObjectStack.top()->asName()) {
|
| + pdfContext->fObjectStack.pop();
|
| }
|
|
|
| // TODO(edisonn): SCN supports more color spaces than SCN. Read and implement spec.
|
| @@ -2083,7 +2096,7 @@
|
| }
|
|
|
| PdfResult PdfOp_G_g(PdfContext* pdfContext, SkCanvas* canvas, PdfColorOperator* colorOperator) {
|
| - double gray = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop();
|
| + double gray = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext->fObjectStack.pop();
|
| return kNYI_PdfResult;
|
| }
|
|
|
| @@ -2096,9 +2109,9 @@
|
| }
|
|
|
| PdfResult PdfOp_RG_rg(PdfContext* pdfContext, SkCanvas* canvas, PdfColorOperator* colorOperator) {
|
| - double b = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop();
|
| - double g = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop();
|
| - double r = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop();
|
| + double b = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext->fObjectStack.pop();
|
| + double g = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext->fObjectStack.pop();
|
| + double r = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext->fObjectStack.pop();
|
|
|
| colorOperator->fColorSpace = "DeviceRGB";
|
| colorOperator->setRGBColor(SkColorSetRGB(255*r, 255*g, 255*b));
|
| @@ -2115,10 +2128,10 @@
|
|
|
| PdfResult PdfOp_K_k(PdfContext* pdfContext, SkCanvas* canvas, PdfColorOperator* colorOperator) {
|
| // TODO(edisonn): spec has some rules about overprint, implement them.
|
| - double k = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop();
|
| - double y = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop();
|
| - double m = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop();
|
| - double c = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop();
|
| + double k = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext->fObjectStack.pop();
|
| + double y = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext->fObjectStack.pop();
|
| + double m = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext->fObjectStack.pop();
|
| + double c = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext->fObjectStack.pop();
|
|
|
| colorOperator->fColorSpace = "DeviceCMYK";
|
| // TODO(edisonn): Set color.
|
| @@ -2192,7 +2205,7 @@
|
|
|
| //lineWidth w Set the line width in the graphics state (see “Line Width” on page 152).
|
| PdfResult PdfOp_w(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** looper) {
|
| - double lineWidth = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop();
|
| + double lineWidth = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext->fObjectStack.pop();
|
| pdfContext->fGraphicsState.fLineWidth = lineWidth;
|
|
|
| return kOK_PdfResult;
|
| @@ -2200,24 +2213,24 @@
|
|
|
| //lineCap J Set the line cap style in the graphics state (see “Line Cap Style” on page 153).
|
| PdfResult PdfOp_J(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** looper) {
|
| - pdfContext->fVarStack.pop();
|
| - //double lineCap = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop();
|
| + pdfContext->fObjectStack.pop();
|
| + //double lineCap = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext->fObjectStack.pop();
|
|
|
| return kNYI_PdfResult;
|
| }
|
|
|
| //lineJoin j Set the line join style in the graphics state (see “Line Join Style” on page 153).
|
| PdfResult PdfOp_j(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** looper) {
|
| - pdfContext->fVarStack.pop();
|
| - //double lineJoin = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop();
|
| + pdfContext->fObjectStack.pop();
|
| + //double lineJoin = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext->fObjectStack.pop();
|
|
|
| return kNYI_PdfResult;
|
| }
|
|
|
| //miterLimit M Set the miter limit in the graphics state (see “Miter Limit” on page 153).
|
| PdfResult PdfOp_M(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** looper) {
|
| - pdfContext->fVarStack.pop();
|
| - //double miterLimit = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop();
|
| + pdfContext->fObjectStack.pop();
|
| + //double miterLimit = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext->fObjectStack.pop();
|
|
|
| return kNYI_PdfResult;
|
| }
|
| @@ -2225,15 +2238,15 @@
|
| //dashArray dashPhase d Set the line dash pattern in the graphics state (see “Line Dash Pattern” on
|
| //page 155).
|
| PdfResult PdfOp_d(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** looper) {
|
| - pdfContext->fVarStack.pop();
|
| - pdfContext->fVarStack.pop();
|
| + pdfContext->fObjectStack.pop();
|
| + pdfContext->fObjectStack.pop();
|
|
|
| return kNYI_PdfResult;
|
| }
|
|
|
| //intent ri (PDF 1.1) Set the color rendering intent in the graphics state (see “Rendering Intents” on page 197).
|
| PdfResult PdfOp_ri(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** looper) {
|
| - pdfContext->fVarStack.pop();
|
| + pdfContext->fObjectStack.pop();
|
|
|
| return kNYI_PdfResult;
|
| }
|
| @@ -2242,7 +2255,7 @@
|
| //Tolerance”). flatness is a number in the range 0 to 100; a value of 0 speci-
|
| //fies the output device’s default flatness tolerance.
|
| PdfResult PdfOp_i(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** looper) {
|
| - pdfContext->fVarStack.pop();
|
| + pdfContext->fObjectStack.pop();
|
|
|
| return kNYI_PdfResult;
|
| }
|
| @@ -2250,37 +2263,14 @@
|
| //dictName gs (PDF 1.2) Set the specified parameters in the graphics state. dictName is
|
| //the name of a graphics state parameter dictionary in the ExtGState subdictionary of the current resource dictionary (see the next section).
|
| PdfResult PdfOp_gs(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** looper) {
|
| - PdfName name = pdfContext->fVarStack.top().GetName(); pdfContext->fVarStack.pop();
|
| + std::string name = pdfContext->fObjectStack.top()->asName()->value(); pdfContext->fObjectStack.pop();
|
|
|
| #ifdef PDF_TRACE
|
| std::string str;
|
| #endif
|
|
|
| - const PdfObject* resources = pdfContext->fGraphicsState.fResources.podofo();
|
| -
|
| - if (resources == NULL) {
|
| -#ifdef PDF_TRACE
|
| - printf("WARNING: No Resources for a page with 'gs' operator!\n");
|
| -#endif
|
| - return kIgnoreError_PdfResult;
|
| - }
|
| -
|
| -#ifdef PDF_TRACE
|
| - resources->ToString(str);
|
| - printf("Print gs Page Resources: %s\n", str.c_str());
|
| -#endif
|
| -
|
| - if (!resources->IsDictionary()) {
|
| -#ifdef PDF_TRACE
|
| - printf("Resources is not a dictionary!\n");
|
| -#endif
|
| - return kIgnoreError_PdfResult;
|
| - }
|
| -
|
| - const PdfDictionary& resourceDict = resources->GetDictionary();
|
| //Next, get the ExtGState Dictionary from the Resource Dictionary:
|
| - const PdfObject* extGStateDictionary = resolveReferenceObject(pdfContext->fPdfDoc,
|
| - resourceDict.GetKey("ExtGState"));
|
| + const SkPdfDictionary* extGStateDictionary = pdfContext->fGraphicsState.fResources->ExtGState();
|
|
|
| if (extGStateDictionary == NULL) {
|
| #ifdef PDF_TRACE
|
| @@ -2289,31 +2279,16 @@
|
| return kIgnoreError_PdfResult;
|
| }
|
|
|
| - if (!extGStateDictionary->IsDictionary()) {
|
| -#ifdef PDF_TRACE
|
| - printf("extGStateDictionary is not a dictionary!\n");
|
| -#endif
|
| - return kIgnoreError_PdfResult;
|
| - }
|
| + SkPdfObject value = extGStateDictionary->get(name.c_str());
|
|
|
| - const PdfObject* value =
|
| - resolveReferenceObject(pdfContext->fPdfDoc,
|
| - extGStateDictionary->GetDictionary().GetKey(name));
|
| -
|
| - if (value == NULL) {
|
| #ifdef PDF_TRACE
|
| - printf("Named object not found!\n");
|
| +// value->ToString(str);
|
| +// printf("gs object value: %s\n", str.c_str());
|
| #endif
|
| - return kIgnoreError_PdfResult;
|
| - }
|
|
|
| -#ifdef PDF_TRACE
|
| - value->ToString(str);
|
| - printf("gs object value: %s\n", str.c_str());
|
| -#endif
|
| + SkPdfGraphicsStateDictionary* gs = NULL;
|
| + PodofoMapper::map(value, &gs);
|
|
|
| - SkPdfGraphicsStateDictionary gs(pdfContext->fPdfDoc, value);
|
| -
|
| // TODO(edisonn): now load all those properties in graphic state.
|
|
|
| return kNYI_PdfResult;
|
| @@ -2323,7 +2298,7 @@
|
| //, to charSpace, which is a number expressed in unscaled text space units. Character spacing is used by the Tj, TJ, and ' operators.
|
| //Initial value: 0.
|
| PdfResult PdfOp_Tc(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** looper) {
|
| - double charSpace = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop();
|
| + double charSpace = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext->fObjectStack.pop();
|
| pdfContext->fGraphicsState.fCharSpace = charSpace;
|
|
|
| return kOK_PdfResult;
|
| @@ -2335,7 +2310,7 @@
|
| //text space units. Word spacing is used by the Tj, TJ, and ' operators. Initial
|
| //value: 0.
|
| PdfResult PdfOp_Tw(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** looper) {
|
| - double wordSpace = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop();
|
| + double wordSpace = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext->fObjectStack.pop();
|
| pdfContext->fGraphicsState.fWordSpace = wordSpace;
|
|
|
| return kOK_PdfResult;
|
| @@ -2345,7 +2320,7 @@
|
| //, to (scale ˜ 100). scale is a number specifying the
|
| //percentage of the normal width. Initial value: 100 (normal width).
|
| PdfResult PdfOp_Tz(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** looper) {
|
| - double scale = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop();
|
| + double scale = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext->fObjectStack.pop();
|
|
|
| return kNYI_PdfResult;
|
| }
|
| @@ -2353,7 +2328,7 @@
|
| //render Tr Set the text rendering mode, T
|
| //mode, to render, which is an integer. Initial value: 0.
|
| PdfResult PdfOp_Tr(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** looper) {
|
| - double render = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop();
|
| + double render = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext->fObjectStack.pop();
|
|
|
| return kNYI_PdfResult;
|
| }
|
| @@ -2361,107 +2336,65 @@
|
| //rise Ts Set the text rise, Trise, to rise, which is a number expressed in unscaled text space
|
| //units. Initial value: 0.
|
| PdfResult PdfOp_Ts(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** looper) {
|
| - double rise = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop();
|
| + double rise = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext->fObjectStack.pop();
|
|
|
| return kNYI_PdfResult;
|
| }
|
|
|
| //wx wy d0
|
| PdfResult PdfOp_d0(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** looper) {
|
| - pdfContext->fVarStack.pop();
|
| - pdfContext->fVarStack.pop();
|
| + pdfContext->fObjectStack.pop();
|
| + pdfContext->fObjectStack.pop();
|
|
|
| return kNYI_PdfResult;
|
| }
|
|
|
| //wx wy llx lly urx ury d1
|
| PdfResult PdfOp_d1(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** looper) {
|
| - pdfContext->fVarStack.pop();
|
| - pdfContext->fVarStack.pop();
|
| - pdfContext->fVarStack.pop();
|
| - pdfContext->fVarStack.pop();
|
| - pdfContext->fVarStack.pop();
|
| - pdfContext->fVarStack.pop();
|
| + pdfContext->fObjectStack.pop();
|
| + pdfContext->fObjectStack.pop();
|
| + pdfContext->fObjectStack.pop();
|
| + pdfContext->fObjectStack.pop();
|
| + pdfContext->fObjectStack.pop();
|
| + pdfContext->fObjectStack.pop();
|
|
|
| return kNYI_PdfResult;
|
| }
|
|
|
| //name sh
|
| PdfResult PdfOp_sh(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** looper) {
|
| - pdfContext->fVarStack.pop();
|
| + pdfContext->fObjectStack.pop();
|
|
|
| return kNYI_PdfResult;
|
| }
|
|
|
| //name Do
|
| PdfResult PdfOp_Do(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** looper) {
|
| - PdfName name = pdfContext->fVarStack.top().GetName(); pdfContext->fVarStack.pop();
|
| + std::string name = pdfContext->fObjectStack.top()->asName()->value(); pdfContext->fObjectStack.pop();
|
|
|
| - const PdfObject* resources = pdfContext->fGraphicsState.fResources.podofo();
|
| + SkPdfDictionary* xObject = pdfContext->fGraphicsState.fResources->XObject();
|
|
|
| - if (resources == NULL) {
|
| + if (xObject == NULL) {
|
| #ifdef PDF_TRACE
|
| - printf("WARNING: No Resources for a page with 'Do' operator!s\n");
|
| -#endif
|
| - return kIgnoreError_PdfResult;
|
| - }
|
| -
|
| -#ifdef PDF_TRACE
|
| - std::string str;
|
| - resources->ToString(str);
|
| - printf("Print Do Page Resources: %s\n", str.c_str());
|
| -#endif
|
| -
|
| - if (!resources->IsDictionary()) {
|
| -#ifdef PDF_TRACE
|
| - printf("Resources is not a dictionary!\n");
|
| -#endif
|
| - return kIgnoreError_PdfResult;
|
| - }
|
| -
|
| - const PdfDictionary& resourceDict = resources->GetDictionary();
|
| - //Next, get the XObject Dictionary from the Resource Dictionary:
|
| - const PdfObject* xObjectDictionary = resolveReferenceObject(pdfContext->fPdfDoc,
|
| - resourceDict.GetKey("XObject"));
|
| -
|
| - if (xObjectDictionary == NULL) {
|
| -#ifdef PDF_TRACE
|
| printf("XObject is NULL!\n");
|
| #endif
|
| return kIgnoreError_PdfResult;
|
| }
|
|
|
| - if (!xObjectDictionary->IsDictionary()) {
|
| -#ifdef PDF_TRACE
|
| - printf("xObjectDictionary is not a dictionary!\n");
|
| -#endif
|
| - return kIgnoreError_PdfResult;
|
| - }
|
| + SkPdfObject value = xObject->get(name.c_str());
|
|
|
| - const PdfObject* value =
|
| - resolveReferenceObject(pdfContext->fPdfDoc,
|
| - xObjectDictionary->GetDictionary().GetKey(name));
|
| -
|
| - if (value == NULL) {
|
| #ifdef PDF_TRACE
|
| - printf("Named object not found!\n");
|
| +// value->ToString(str);
|
| +// printf("Do object value: %s\n", str.c_str());
|
| #endif
|
| - return kIgnoreError_PdfResult;
|
| - }
|
|
|
| -#ifdef PDF_TRACE
|
| - value->ToString(str);
|
| - printf("Do object value: %s\n", str.c_str());
|
| -#endif
|
| -
|
| - return doXObject(pdfContext, canvas, *value);
|
| + return doXObject(pdfContext, canvas, value);
|
| }
|
|
|
| -
|
| //tag MP Designate a marked-content point. tag is a name object indicating the role or
|
| //significance of the point.
|
| PdfResult PdfOp_MP(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** looper) {
|
| - pdfContext->fVarStack.pop();
|
| + pdfContext->fObjectStack.pop();
|
|
|
| return kNYI_PdfResult;
|
| }
|
| @@ -2472,8 +2405,8 @@
|
| //associated with it in the Properties subdictionary of the current resource
|
| //dictionary (see Section 9.5.1, “Property Lists”).
|
| PdfResult PdfOp_DP(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** looper) {
|
| - pdfContext->fVarStack.pop();
|
| - pdfContext->fVarStack.pop();
|
| + pdfContext->fObjectStack.pop();
|
| + pdfContext->fObjectStack.pop();
|
|
|
| return kNYI_PdfResult;
|
| }
|
| @@ -2481,7 +2414,7 @@
|
| //tag BMC Begin a marked-content sequence terminated by a balancing EMC operator.
|
| //tag is a name object indicating the role or significance of the sequence.
|
| PdfResult PdfOp_BMC(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** looper) {
|
| - pdfContext->fVarStack.pop();
|
| + pdfContext->fObjectStack.pop();
|
|
|
| return kNYI_PdfResult;
|
| }
|
| @@ -2490,8 +2423,8 @@
|
| //by a balancing EMCoperator. tag is a name object indicating the role or significance of the sequence; propertiesis either an inline dictionary containing the
|
| //property list or a name object associated with it in the Properties subdictionary of the current resource dictionary (see Section 9.5.1, “Property Lists”).
|
| PdfResult PdfOp_BDC(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** looper) {
|
| - pdfContext->fVarStack.pop();
|
| - pdfContext->fVarStack.pop();
|
| + pdfContext->fObjectStack.pop();
|
| + pdfContext->fObjectStack.pop();
|
|
|
| return kNYI_PdfResult;
|
| }
|
| @@ -2610,17 +2543,17 @@
|
| }
|
|
|
| PdfResult PdfMainLooper::consumeToken(PdfToken& token) {
|
| - if( token.eType == ePdfContentsType_Keyword )
|
| + if (token.fType == kKeyword_TokenType)
|
| {
|
| // TODO(edisonn): log trace flag (verbose, error, info, warning, ...)
|
| #ifdef PDF_TRACE
|
| - printf("KEYWORD: %s\n", token.pszToken);
|
| + printf("KEYWORD: %s\n", token.fKeyword);
|
| #endif
|
| - PdfOperatorRenderer pdfOperatorRenderer = gPdfOps[token.pszToken];
|
| + PdfOperatorRenderer pdfOperatorRenderer = gPdfOps[token.fKeyword];
|
| if (pdfOperatorRenderer) {
|
| // caller, main work is done by pdfOperatorRenderer(...)
|
| PdfTokenLooper* childLooper = NULL;
|
| - gRenderStats[pdfOperatorRenderer(fPdfContext, fCanvas, &childLooper)][token.pszToken]++;
|
| + gRenderStats[pdfOperatorRenderer(fPdfContext, fCanvas, &childLooper)][token.fKeyword]++;
|
|
|
| if (childLooper) {
|
| childLooper->setUp(this);
|
| @@ -2628,19 +2561,19 @@
|
| delete childLooper;
|
| }
|
| } else {
|
| - gRenderStats[kUnsupported_PdfResult][token.pszToken]++;
|
| + gRenderStats[kUnsupported_PdfResult][token.fKeyword]++;
|
| }
|
| }
|
| - else if ( token.eType == ePdfContentsType_Variant )
|
| + else if (token.fType == kObject_TokenType)
|
| {
|
| #ifdef PDF_TRACE
|
| std::string _var;
|
| - token.var.ToString(_var);
|
| + token.fObject->podofo()->ToString(_var);
|
| printf("var: %s\n", _var.c_str());
|
| #endif
|
| - fPdfContext->fVarStack.push( token.var );
|
| + fPdfContext->fObjectStack.push( token.fObject );
|
| }
|
| - else if ( token.eType == ePdfContentsType_ImageData) {
|
| + else if ( token.fType == kImageData_TokenType) {
|
| // TODO(edisonn): implement inline image.
|
| }
|
| else {
|
| @@ -2664,12 +2597,12 @@
|
| void PdfInlineImageLooper::loop() {
|
| PdfToken token;
|
| while (readToken(fTokenizer, &token)) {
|
| - if (token.eType == ePdfContentsType_Keyword && strcmp(token.pszToken, "BX") == 0) {
|
| + if (token.fType == kKeyword_TokenType && strcmp(token.fKeyword, "BX") == 0) {
|
| PdfTokenLooper* looper = new PdfCompatibilitySectionLooper();
|
| looper->setUp(this);
|
| looper->loop();
|
| } else {
|
| - if (token.eType == ePdfContentsType_Keyword && strcmp(token.pszToken, "EI") == 0) {
|
| + if (token.fType == kKeyword_TokenType && strcmp(token.fKeyword, "EI") == 0) {
|
| done();
|
| return;
|
| }
|
| @@ -2710,13 +2643,13 @@
|
| // pop-ing too much will not affect outside the section.
|
| PdfToken token;
|
| while (readToken(fTokenizer, &token)) {
|
| - if (token.eType == ePdfContentsType_Keyword && strcmp(token.pszToken, "BX") == 0) {
|
| + if (token.fType == kKeyword_TokenType && strcmp(token.fKeyword, "BX") == 0) {
|
| PdfTokenLooper* looper = new PdfCompatibilitySectionLooper();
|
| looper->setUp(this);
|
| looper->loop();
|
| delete looper;
|
| } else {
|
| - if (token.eType == ePdfContentsType_Keyword && strcmp(token.pszToken, "EX") == 0) break;
|
| + if (token.fType == kKeyword_TokenType && strcmp(token.fKeyword, "EX") == 0) break;
|
| fParent->consumeToken(token);
|
| }
|
| }
|
| @@ -2744,44 +2677,41 @@
|
| {
|
| std::cout << "Init: " << inputFileName.c_str() << std::endl;
|
|
|
| - PdfMemDocument doc(inputFileName.c_str());
|
| - if( !doc.GetPageCount() )
|
| + SkPdfDoc doc(inputFileName.c_str());
|
| + if( !doc.pages() )
|
| {
|
| std::cout << "ERROR: Empty Document" << inputFileName.c_str() << std::endl;
|
| return false;
|
| } else {
|
|
|
| - for (int pn = 0; pn < doc.GetPageCount(); ++pn) {
|
| - PoDoFo::PdfPage* page = doc.GetPage(pn);
|
| - PdfRect rect = page->GetMediaBox();
|
| + for (int pn = 0; pn < doc.pages(); ++pn) {
|
| + SkPdfPageObjectDictionary* page = doc.page(pn);
|
| +
|
| + // TODO(edisonn): implement inheritance properties as per PDF spec
|
| + //SkRect rect = page->MediaBox();
|
| + SkRect rect = doc.MediaBox(pn);
|
| +
|
| #ifdef PDF_TRACE
|
| - printf("Page Width: %f, Page Height: %f\n", rect.GetWidth(), rect.GetHeight());
|
| + printf("Page Width: %f, Page Height: %f\n", SkScalarToDouble(rect.width()), SkScalarToDouble(rect.height()));
|
| #endif
|
|
|
| // TODO(edisonn): page->GetCropBox(), page->GetTrimBox() ... how to use?
|
|
|
| SkBitmap bitmap;
|
| #ifdef PDF_DEBUG_3X
|
| - setup_bitmap(&bitmap, 3*rect.GetWidth(), 3*rect.GetHeight());
|
| + setup_bitmap(&bitmap, 3 * (int)SkScalarToDouble(rect.width()), 3 * (int)SkScalarToDouble(rect.height()))
|
| #else
|
| - setup_bitmap(&bitmap, rect.GetWidth(), rect.GetHeight());
|
| + setup_bitmap(&bitmap, (int)SkScalarToDouble(rect.width()), (int)SkScalarToDouble(rect.height()));
|
| #endif
|
| SkAutoTUnref<SkDevice> device(SkNEW_ARGS(SkDevice, (bitmap)));
|
| SkCanvas canvas(device);
|
|
|
| + SkPdfTokenizer tokenizer = doc.tokenizerOfPage(pn);
|
|
|
| - const char* pszToken = NULL;
|
| - PdfVariant var;
|
| - EPdfContentsType eType;
|
| -
|
| - PdfContentsTokenizer tokenizer( page );
|
| -
|
| - PdfContext pdfContext;
|
| - pdfContext.fPdfPage = page;
|
| - pdfContext.fPdfDoc = &doc;
|
| + PdfContext pdfContext(doc);
|
| pdfContext.fOriginalMatrix = SkMatrix::I();
|
| - pdfContext.fGraphicsState.fResources = SkPdfResourceDictionary(pdfContext.fPdfDoc, resolveReferenceObject(pdfContext.fPdfDoc,
|
| - pdfContext.fPdfPage->GetResources()));
|
| + pdfContext.fGraphicsState.fResources = NULL;
|
| + PodofoMapper::map(*page->Resources(), &pdfContext.fGraphicsState.fResources);
|
|
|
| gPdfContext = &pdfContext;
|
| gDumpBitmap = &bitmap;
|
| @@ -2791,8 +2721,8 @@
|
| // TODO(edisonn): get matrix stuff right.
|
| // TODO(edisonn): add DPI/scale/zoom.
|
| SkScalar z = SkIntToScalar(0);
|
| - SkScalar w = SkDoubleToScalar(rect.GetWidth());
|
| - SkScalar h = SkDoubleToScalar(rect.GetHeight());
|
| + SkScalar w = rect.width();
|
| + SkScalar h = rect.height();
|
|
|
| SkPoint pdfSpace[4] = {SkPoint::Make(z, z), SkPoint::Make(w, z), SkPoint::Make(w, h), SkPoint::Make(z, h)};
|
| // SkPoint skiaSpace[4] = {SkPoint::Make(z, h), SkPoint::Make(w, h), SkPoint::Make(w, z), SkPoint::Make(z, z)};
|
| @@ -2830,7 +2760,7 @@
|
| canvas.clipRect(SkRect::MakeXYWH(z, z, w, h), SkRegion::kIntersect_Op, true);
|
| #endif
|
|
|
| - PdfMainLooper looper(NULL, &tokenizer, &pdfContext, &canvas);
|
| + PdfMainLooper looper(NULL, tokenizer, &pdfContext, &canvas);
|
| looper.loop();
|
|
|
| canvas.flush();
|
|
|