diff options
Diffstat (limited to 'experimental/PdfViewer/pdf_viewer_main.cpp')
-rw-r--r-- | experimental/PdfViewer/pdf_viewer_main.cpp | 331 |
1 files changed, 168 insertions, 163 deletions
diff --git a/experimental/PdfViewer/pdf_viewer_main.cpp b/experimental/PdfViewer/pdf_viewer_main.cpp index d2d0ff3590..39d93ef9a0 100644 --- a/experimental/PdfViewer/pdf_viewer_main.cpp +++ b/experimental/PdfViewer/pdf_viewer_main.cpp @@ -25,8 +25,17 @@ #include "podofo.h" using namespace PoDoFo; + __SK_FORCE_IMAGE_DECODER_LINKING; + +//#define PDF_TRACE +//#define PDF_TRACE_DIFF_IN_PNG +//#define PDF_DEBUG_NO_CLIPING +//#define PDF_DEBUG_NO_PAGE_CLIPING +//#define PDF_DEBUG_3X + + const PdfObject* resolveReferenceObject(const PdfMemDocument* pdfDoc, const PdfObject* obj, bool resolveOneElementArrays = false); @@ -85,7 +94,7 @@ bool ObjectFromDictionary(const PdfMemDocument* pdfDoc, struct SkPdfFileSpec {}; class SkPdfArray; -struct SkPdfStream {}; +class SkPdfStream; struct SkPdfDate {}; struct SkPdfTree {}; struct SkPdfFunction {}; @@ -108,7 +117,7 @@ bool StreamFromDictionary(const PdfMemDocument* pdfDoc, const PdfDictionary& dict, const char* key, const char* abr, - SkPdfStream* data); + SkPdfStream** data); bool TreeFromDictionary(const PdfMemDocument* pdfDoc, const PdfDictionary& dict, @@ -138,6 +147,10 @@ bool FunctionFromDictionary(const PdfMemDocument* pdfDoc, #include "SkPdfHeaders_autogen.h" #include "SkPdfPodofoMapper_autogen.h" #include "SkPdfParser.h" +#include "SkPdfFont.h" + +// TODO(edisonn): fix the mess with the files. +#include "SkPdfFont.cpp" bool ArrayFromDictionary(const PdfMemDocument* pdfDoc, const PdfDictionary& dict, @@ -155,7 +168,7 @@ bool StreamFromDictionary(const PdfMemDocument* pdfDoc, const PdfDictionary& dict, const char* key, const char* abr, - SkPdfStream* data) {return false;} + SkPdfStream** data); bool TreeFromDictionary(const PdfMemDocument* pdfDoc, const PdfDictionary& dict, @@ -179,14 +192,14 @@ bool FunctionFromDictionary(const PdfMemDocument* pdfDoc, /* * TODO(edisonn): - * - encapsulate podofo in the pdf api so the skpdf does not know anything about podofo ... in progress - * - ASAP so skp -> pdf -> png looks great - * - load gs/ especially smask and already known prop (skp)... * - all font types and all ppdf font features * - word spacing * - load font for baidu.pdf * - load font for youtube.pdf * - parser for pdf from the definition already available in pdfspec_autogen.py + * - all docs from ~/work + * - encapsulate podofo in the pdf api so the skpdf does not know anything about podofo ... in progress + * - load gs/ especially smask and already known prop (skp) ... in progress * - wrapper on classes for customizations? e.g. * SkPdfPageObjectVanila - has only the basic loaders/getters * SkPdfPageObject : public SkPdfPageObjectVanila, extends, and I can add customizations here @@ -195,11 +208,6 @@ bool FunctionFromDictionary(const PdfMemDocument* pdfDoc, * - deal with specific type in spec directly, add all dictionary types to known types */ -//#define PDF_TRACE -//#define PDF_TRACE_DIFF_IN_PNG -//#define PDF_DEBUG_NO_CLIPING -//#define PDF_DEBUG_NO_PAGE_CLIPING -//#define PDF_DEBUG_3X // TODO(edisonn): move in trace util. #ifdef PDF_TRACE @@ -307,6 +315,7 @@ struct PdfGraphicsState { double fCurFontSize; bool fTextBlock; PdfFont* fCurFont; + SkPdfFont* fSkFont; SkPath fPath; bool fPathClosed; @@ -342,6 +351,7 @@ struct PdfGraphicsState { fCharSpace = 0; fHasClipPathToApply = false; fResources = NULL; + fSkFont = NULL; } void applyGraphicsState(SkPaint* paint, bool stroking) { @@ -415,8 +425,8 @@ bool hasVisualEffect(const char* pdfOp) { } // TODO(edisonn): Pass PdfContext and SkCanvasd only with the define for instrumentation. -static bool readToken(SkPdfTokenizer fTokenizer, PdfToken* token) { - bool ret = fTokenizer.readToken(token); +static bool readToken(SkPdfTokenizer* fTokenizer, PdfToken* token) { + bool ret = fTokenizer->readToken(token); gReadOp++; @@ -510,13 +520,13 @@ static bool readToken(SkPdfTokenizer fTokenizer, PdfToken* token) { class PdfTokenLooper { protected: PdfTokenLooper* fParent; - SkPdfTokenizer fTokenizer; + SkPdfTokenizer* fTokenizer; PdfContext* fPdfContext; SkCanvas* fCanvas; public: PdfTokenLooper(PdfTokenLooper* parent, - SkPdfTokenizer tokenizer, + SkPdfTokenizer* tokenizer, PdfContext* pdfContext, SkCanvas* canvas) : fParent(parent), fTokenizer(tokenizer), fPdfContext(pdfContext), fCanvas(canvas) {} @@ -535,7 +545,7 @@ public: class PdfMainLooper : public PdfTokenLooper { public: PdfMainLooper(PdfTokenLooper* parent, - SkPdfTokenizer tokenizer, + SkPdfTokenizer* tokenizer, PdfContext* pdfContext, SkCanvas* canvas) : PdfTokenLooper(parent, tokenizer, pdfContext, canvas) {} @@ -547,7 +557,7 @@ public: class PdfInlineImageLooper : public PdfTokenLooper { public: PdfInlineImageLooper() - : PdfTokenLooper(NULL, SkPdfTokenizer(), NULL, NULL) {} + : PdfTokenLooper(NULL, NULL, NULL, NULL) {} virtual PdfResult consumeToken(PdfToken& token); virtual void loop(); @@ -557,7 +567,7 @@ public: class PdfCompatibilitySectionLooper : public PdfTokenLooper { public: PdfCompatibilitySectionLooper() - : PdfTokenLooper(NULL, SkPdfTokenizer(), NULL, NULL) {} + : PdfTokenLooper(NULL, NULL, NULL, NULL) {} virtual PdfResult consumeToken(PdfToken& token); virtual void loop(); @@ -578,104 +588,11 @@ char* gRenderStatsNames[kCount_PdfResult] = { "Unsupported/Unknown" }; -struct SkPdfStandardFont { - const char* fName; - bool fIsBold; - bool fIsItalic; -}; - -static map<std::string, SkPdfStandardFont>& getStandardFonts() { - static std::map<std::string, SkPdfStandardFont> gPdfStandardFonts; - - // TODO (edisonn): , vs - ? what does it mean? - // TODO (edisonn): MT, PS, Oblique=italic?, ... what does it mean? - if (gPdfStandardFonts.empty()) { - gPdfStandardFonts["Arial"] = {"Arial", false, false}; - gPdfStandardFonts["Arial,Bold"] = {"Arial", true, false}; - gPdfStandardFonts["Arial,BoldItalic"] = {"Arial", true, true}; - gPdfStandardFonts["Arial,Italic"] = {"Arial", false, true}; - gPdfStandardFonts["Arial-Bold"] = {"Arial", true, false}; - gPdfStandardFonts["Arial-BoldItalic"] = {"Arial", true, true}; - gPdfStandardFonts["Arial-BoldItalicMT"] = {"Arial", true, true}; - gPdfStandardFonts["Arial-BoldMT"] = {"Arial", true, false}; - gPdfStandardFonts["Arial-Italic"] = {"Arial", false, true}; - gPdfStandardFonts["Arial-ItalicMT"] = {"Arial", false, true}; - gPdfStandardFonts["ArialMT"] = {"Arial", false, false}; - gPdfStandardFonts["Courier"] = {"Courier New", false, false}; - gPdfStandardFonts["Courier,Bold"] = {"Courier New", true, false}; - gPdfStandardFonts["Courier,BoldItalic"] = {"Courier New", true, true}; - gPdfStandardFonts["Courier,Italic"] = {"Courier New", false, true}; - gPdfStandardFonts["Courier-Bold"] = {"Courier New", true, false}; - gPdfStandardFonts["Courier-BoldOblique"] = {"Courier New", true, true}; - gPdfStandardFonts["Courier-Oblique"] = {"Courier New", false, true}; - gPdfStandardFonts["CourierNew"] = {"Courier New", false, false}; - gPdfStandardFonts["CourierNew,Bold"] = {"Courier New", true, false}; - gPdfStandardFonts["CourierNew,BoldItalic"] = {"Courier New", true, true}; - gPdfStandardFonts["CourierNew,Italic"] = {"Courier New", false, true}; - gPdfStandardFonts["CourierNew-Bold"] = {"Courier New", true, false}; - gPdfStandardFonts["CourierNew-BoldItalic"] = {"Courier New", true, true}; - gPdfStandardFonts["CourierNew-Italic"] = {"Courier New", false, true}; - gPdfStandardFonts["CourierNewPS-BoldItalicMT"] = {"Courier New", true, true}; - gPdfStandardFonts["CourierNewPS-BoldMT"] = {"Courier New", true, false}; - gPdfStandardFonts["CourierNewPS-ItalicMT"] = {"Courier New", false, true}; - gPdfStandardFonts["CourierNewPSMT"] = {"Courier New", false, false}; - gPdfStandardFonts["Helvetica"] = {"Helvetica", false, false}; - gPdfStandardFonts["Helvetica,Bold"] = {"Helvetica", true, false}; - gPdfStandardFonts["Helvetica,BoldItalic"] = {"Helvetica", true, true}; - gPdfStandardFonts["Helvetica,Italic"] = {"Helvetica", false, true}; - gPdfStandardFonts["Helvetica-Bold"] = {"Helvetica", true, false}; - gPdfStandardFonts["Helvetica-BoldItalic"] = {"Helvetica", true, true}; - gPdfStandardFonts["Helvetica-BoldOblique"] = {"Helvetica", true, true}; - gPdfStandardFonts["Helvetica-Italic"] = {"Helvetica", false, true}; - gPdfStandardFonts["Helvetica-Oblique"] = {"Helvetica", false, true}; - gPdfStandardFonts["Times-Bold"] = {"Times", true, false}; - gPdfStandardFonts["Times-BoldItalic"] = {"Times", true, true}; - gPdfStandardFonts["Times-Italic"] = {"Times", false, true}; - gPdfStandardFonts["Times-Roman"] = {"Times New Roman", false, false}; - gPdfStandardFonts["TimesNewRoman"] = {"Times New Roman", false, false}; - gPdfStandardFonts["TimesNewRoman,Bold"] = {"Times New Roman", true, false}; - gPdfStandardFonts["TimesNewRoman,BoldItalic"] = {"Times New Roman", true, true}; - gPdfStandardFonts["TimesNewRoman,Italic"] = {"Times New Roman", false, true}; - gPdfStandardFonts["TimesNewRoman-Bold"] = {"Times New Roman", true, false}; - gPdfStandardFonts["TimesNewRoman-BoldItalic"] = {"Times New Roman", true, true}; - gPdfStandardFonts["TimesNewRoman-Italic"] = {"Times New Roman", false, true}; - gPdfStandardFonts["TimesNewRomanPS"] = {"Times New Roman", false, false}; - gPdfStandardFonts["TimesNewRomanPS-Bold"] = {"Times New Roman", true, false}; - gPdfStandardFonts["TimesNewRomanPS-BoldItalic"] = {"Times New Roman", true, true}; - gPdfStandardFonts["TimesNewRomanPS-BoldItalicMT"] = {"Times New Roman", true, true}; - gPdfStandardFonts["TimesNewRomanPS-BoldMT"] = {"Times New Roman", true, false}; - gPdfStandardFonts["TimesNewRomanPS-Italic"] = {"Times New Roman", false, true}; - gPdfStandardFonts["TimesNewRomanPS-ItalicMT"] = {"Times New Roman", false, true}; - gPdfStandardFonts["TimesNewRomanPSMT"] = {"Times New Roman", false, false}; - } - - return gPdfStandardFonts; -} - -static SkTypeface* SkTypefaceFromPdfStandardFont(const char* fontName, bool bold, bool italic) { - map<std::string, SkPdfStandardFont>& standardFontMap = getStandardFonts(); - - if (standardFontMap.find(fontName) != standardFontMap.end()) { - SkPdfStandardFont fontData = standardFontMap[fontName]; - - // TODO(edisonn): How does the bold/italic specified in standard definition combines with - // the one in /font key? use OR for now. - bold = bold || fontData.fIsBold; - italic = italic || fontData.fIsItalic; - - SkTypeface* typeface = SkTypeface::CreateFromName( - fontData.fName, - SkTypeface::Style((bold ? SkTypeface::kBold : 0) | - (italic ? SkTypeface::kItalic : 0))); - if (typeface) { - typeface->ref(); - } - return typeface; +static SkTypeface* SkTypefaceFromPdfFont(PdfFont* font) { + if (font == NULL) { + return SkTypeface::CreateFromName("Times New Roman", SkTypeface::kNormal); } - return NULL; -} -static SkTypeface* SkTypefaceFromPdfFont(PdfFont* font) { PdfObject* fontObject = font->GetObject(); PdfObject* pBaseFont = NULL; @@ -728,6 +645,7 @@ static SkTypeface* SkTypefaceFromPdfFont(PdfFont* font) { (font->IsItalic() ? SkTypeface::kItalic : 0))); } + // TODO(edisonn): move this code in podofo, so we don't have to fix the font. // This logic needs to be moved in PdfEncodingObjectFactory::CreateEncoding std::map<PdfFont*, PdfCMapEncoding*> gFontsFixed; @@ -751,23 +669,85 @@ PdfEncoding* FixPdfFont(PdfContext* pdfContext, PdfFont* fCurFont) { } PdfResult DrawText(PdfContext* pdfContext, - PdfFont* fCurFont, - const PdfString& rString, + const SkPdfObject* str, SkCanvas* canvas) { + + SkPdfFont* skfont = pdfContext->fGraphicsState.fSkFont; + if (skfont == NULL) { + skfont = SkPdfFont::Default(); + } + + SkUnencodedText binary(str); + + SkDecodedText decoded; + skfont->encoding()->decodeText(binary, &decoded); + + SkUnicodeText unicode; + skfont->ToUnicode(decoded, &unicode); + + SkPaint paint; + // TODO(edisonn): when should fCurFont->GetFontSize() used? When cur is fCurFontSize == 0? + // Or maybe just not call setTextSize at all? + if (pdfContext->fGraphicsState.fCurFontSize != 0) { + paint.setTextSize(SkDoubleToScalar(pdfContext->fGraphicsState.fCurFontSize)); + } + +// if (fCurFont && fCurFont->GetFontScale() != 0) { +// paint.setTextScaleX(SkFloatToScalar(fCurFont->GetFontScale() / 100.0)); +// } + + pdfContext->fGraphicsState.applyGraphicsState(&paint, false); + + canvas->save(); + +#if 1 + SkMatrix matrix = pdfContext->fGraphicsState.fMatrixTm; + + SkPoint point1; + pdfContext->fGraphicsState.fMatrixTm.mapXY(SkIntToScalar(0), SkIntToScalar(0), &point1); + + SkMatrix mirror; + mirror.setTranslate(0, -point1.y()); + // TODO(edisonn): fix rotated text, and skewed too + mirror.postScale(SK_Scalar1, -SK_Scalar1); + // TODO(edisonn): post rotate, skew + mirror.postTranslate(0, point1.y()); + + matrix.postConcat(mirror); + + canvas->setMatrix(matrix); + + SkTraceMatrix(matrix, "mirrored"); +#endif + + skfont->drawText(unicode, &paint, canvas, &pdfContext->fGraphicsState.fMatrixTm); + canvas->restore(); + +/* + PdfString& rString = str->podofo()->GetString(); + + //pdfContext->fGraphicsState.fSkFont->GetDecoding()->ToUnicode(rString); + //void* text; + //int len; + //SkPaint paint; + //pdfContext->fGraphicsState.fSkFont->drawText(text, len, paint, canvas, &pdfContext->fGraphicsState.fMatrixTm); + + PdfFont* fCurFont = pdfContext->fGraphicsState.fCurFont; + if (!fCurFont) { // TODO(edisonn): ignore the error, use the default font? - return kError_PdfResult; + // return kError_PdfResult; } - const PdfEncoding* enc = FixPdfFont(pdfContext, fCurFont); + const PdfEncoding* enc = fCurFont ? FixPdfFont(pdfContext, fCurFont) : NULL; bool cMapUnicodeFont = enc != NULL; - if (!enc) enc = fCurFont->GetEncoding(); + if (!enc) enc = fCurFont ? fCurFont->GetEncoding() : NULL; if (!enc) { // TODO(edisonn): Can we recover from this error? - return kError_PdfResult; + //return kError_PdfResult; } PdfString r2 = rString; @@ -777,7 +757,7 @@ PdfResult DrawText(PdfContext* pdfContext, r2 = PdfString((pdf_utf16be*)rString.GetString(), rString.GetLength() / 2); } - unicode = enc->ConvertToUnicode( r2, fCurFont ); + unicode = enc ? enc->ConvertToUnicode( r2, fCurFont ) : r2.ToUnicode(); #ifdef PDF_TRACE printf("%i %i ? %c rString.len = %i\n", (int)rString.GetString()[0], (int)rString.GetString()[1], (int)rString.GetString()[1], rString.GetLength()); @@ -790,7 +770,7 @@ PdfResult DrawText(PdfContext* pdfContext, if (pdfContext->fGraphicsState.fCurFontSize != 0) { paint.setTextSize(SkDoubleToScalar(pdfContext->fGraphicsState.fCurFontSize)); } - if (fCurFont->GetFontScale() != 0) { + if (fCurFont && fCurFont->GetFontScale() != 0) { paint.setTextScaleX(SkFloatToScalar(fCurFont->GetFontScale() / 100.0)); } @@ -798,9 +778,6 @@ PdfResult DrawText(PdfContext* pdfContext, paint.setTypeface(SkTypefaceFromPdfFont(fCurFont)); - paint.setAntiAlias(true); - // TODO(edisonn): paint.setStyle(...); - canvas->save(); SkMatrix matrix = pdfContext->fGraphicsState.fMatrixTm; @@ -892,7 +869,7 @@ PdfResult DrawText(PdfContext* pdfContext, canvas->restore(); - +*/ return kPartial_PdfResult; } @@ -1128,6 +1105,31 @@ bool ObjectFromDictionary(const PdfMemDocument* pdfDoc, return ObjectFromDictionary(pdfDoc, dict, abr, data); } +bool StreamFromDictionary(const PdfMemDocument* pdfDoc, + const PdfDictionary& dict, + const char* key, + SkPdfStream** data) { + const PdfObject* value = resolveReferenceObject(pdfDoc, + dict.GetKey(PdfName(key)), + true); + if (value == NULL) { + return false; + } + if (data == NULL) { + return true; + } + return PodofoMapper::map(*pdfDoc, *value, data); +} + +bool StreamFromDictionary(const PdfMemDocument* pdfDoc, + const 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); +} // TODO(edisonn): perf!!! @@ -1499,23 +1501,10 @@ PdfResult doXObject_Form(PdfContext* pdfContext, SkCanvas* canvas, SkPdfType1For // TODO(edisonn): iterate smart on the stream even if it is compressed, tokenize it as we go. // For this PdfContentsTokenizer needs to be extended. - char* uncompressedStream = NULL; - pdf_long uncompressedStreamLength = 0; - PdfResult ret = kPartial_PdfResult; - - // TODO(edisonn): get rid of try/catch exceptions! We should not throw on user data! - try { - skobj->podofo()->GetStream()->GetFilteredCopy(&uncompressedStream, &uncompressedStreamLength); - if (uncompressedStream != NULL && uncompressedStreamLength != 0) { - SkPdfTokenizer tokenizer = pdfContext->fPdfDoc.tokenizerOfStream(uncompressedStream, uncompressedStreamLength); - PdfMainLooper looper(NULL, tokenizer, pdfContext, canvas); - looper.loop(); - } - free(uncompressedStream); - } catch (PdfError& e) { - ret = kIgnoreError_PdfResult; - } + SkPdfTokenizer tokenizer(skobj); + PdfMainLooper looper(NULL, &tokenizer, pdfContext, canvas); + looper.loop(); // TODO(edisonn): should we restore the variable stack at the same state? // There could be operands left, that could be consumed by a parent tokenizer when we pop. @@ -1970,9 +1959,31 @@ PdfResult PdfOp_Tf(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo 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()); + printf("Print Tf Resources: %s\n", str.c_str()); + pdfContext->fGraphicsState.fResources->Font()->podofo()->ToString(str); + printf("Print Tf Resources/Font: %s\n", str.c_str()); #endif + SkPdfFontDictionary* fd = NULL; + if (pdfContext->fGraphicsState.fResources->Font()) { + SkPdfObject objFont = pdfContext->fGraphicsState.fResources->Font()->get(fontName.c_str()); + PodofoMapper::map(objFont, &fd); + +#ifdef PDF_TRACE + objFont.podofo()->ToString(str); + printf("Print Font loaded: %s\n", str.c_str()); + fd->podofo()->ToString(str); + printf("Print Font loaded and resolved and upgraded: %s\n", str.c_str()); +#endif + + } + + SkPdfFont* skfont = SkPdfFont::fontFromPdfDictionary(fd); + + if (skfont) { + pdfContext->fGraphicsState.fSkFont = skfont; + } + // TODO(edisonn): Load font from pdfContext->fGraphicsState.fObjectWithResources ? const PdfObject* pFont = resolveReferenceObject(&pdfContext->fPdfDoc.podofo(), pdfContext->fGraphicsState.fResources->Font()->get(fontName.c_str()).podofo()); @@ -1982,9 +1993,10 @@ PdfResult PdfOp_Tf(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo return kIgnoreError_PdfResult; } - pdfContext->fGraphicsState.fCurFont = pdfContext->fPdfDoc.podofo().GetFont( (PdfObject*)pFont ); - if( !pdfContext->fGraphicsState.fCurFont ) - { + PdfFont* font = pdfContext->fPdfDoc.podofo().GetFont( (PdfObject*)pFont ); + if (font) { + pdfContext->fGraphicsState.fCurFont = font; + } else { // TODO(edisonn): check ~/crasing, for one of the files PoDoFo throws exception // when calling pFont->Reference(), with Linked list corruption. return kIgnoreError_PdfResult; @@ -2000,8 +2012,7 @@ PdfResult PdfOp_Tj(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo } PdfResult ret = DrawText(pdfContext, - pdfContext->fGraphicsState.fCurFont, - pdfContext->fObjectStack.top()->podofo()->GetString(), + pdfContext->fObjectStack.top(), canvas); pdfContext->fObjectStack.pop(); @@ -2052,13 +2063,13 @@ PdfResult PdfOp_TJ(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo for( int i=0; i<static_cast<int>(array->size()); i++ ) { - if( (*array)[i].asString()) { + if( (*array)[i]->asString()) { + SkPdfObject* obj = (*array)[i]; DrawText(pdfContext, - pdfContext->fGraphicsState.fCurFont, - (*array)[i].podofo()->GetString(), - canvas); - } else if ((*array)[i].asInteger() || (*array)[i].asNumber()) { - double dx = (*array)[i].asNumber()->value(); + obj, + canvas); + } else if ((*array)[i]->asInteger() || (*array)[i]->asNumber()) { + double dx = (*array)[i]->asNumber()->value(); SkMatrix matrix; matrix.setAll(SkDoubleToScalar(1), SkDoubleToScalar(0), @@ -2617,9 +2628,6 @@ PdfResult PdfMainLooper::consumeToken(PdfToken& token) { if (token.fType == kKeyword_TokenType) { // TODO(edisonn): log trace flag (verbose, error, info, warning, ...) -#ifdef PDF_TRACE - printf("KEYWORD: %s\n", token.fKeyword); -#endif PdfOperatorRenderer pdfOperatorRenderer = gPdfOps[token.fKeyword]; if (pdfOperatorRenderer) { // caller, main work is done by pdfOperatorRenderer(...) @@ -2637,11 +2645,6 @@ PdfResult PdfMainLooper::consumeToken(PdfToken& token) { } else if (token.fType == kObject_TokenType) { -#ifdef PDF_TRACE - std::string _var; - token.fObject->podofo()->ToString(_var); - printf("var: %s\n", _var.c_str()); -#endif fPdfContext->fObjectStack.push( token.fObject ); } else if ( token.fType == kImageData_TokenType) { @@ -2777,7 +2780,7 @@ public: SkAutoTUnref<SkDevice> device(SkNEW_ARGS(SkDevice, (bitmap))); SkCanvas canvas(device); - SkPdfTokenizer tokenizer = doc.tokenizerOfPage(pn); + SkPdfTokenizer* tokenizer = doc.tokenizerOfPage(pn); PdfContext pdfContext(doc); pdfContext.fOriginalMatrix = SkMatrix::I(); @@ -2834,6 +2837,8 @@ public: PdfMainLooper looper(NULL, tokenizer, &pdfContext, &canvas); looper.loop(); + delete tokenizer; + canvas.flush(); SkString out; |