| OLD | NEW | 
 | (Empty) | 
|    1 #include "SkPodofoParsedPDF.h" |  | 
|    2  |  | 
|    3 #include "SkPdfPodofoTokenizer.h" |  | 
|    4 #include "SkPdfHeaders_autogen.h" |  | 
|    5 #include "SkPdfMapper_autogen.h" |  | 
|    6 #include "SkPdfBasics.h" |  | 
|    7 #include "SkPdfParser.h" |  | 
|    8  |  | 
|    9 #include "podofo.h" |  | 
|   10  |  | 
|   11 SkPodofoParsedPDF::SkPodofoParsedPDF(const char* path) : fDoc(new PoDoFo::PdfMem
     Document(path)) |  | 
|   12                                                        , fMapper(new SkPdfMapper
     (this)) {} |  | 
|   13  |  | 
|   14 SkPodofoParsedPDF::~SkPodofoParsedPDF() { |  | 
|   15     delete fDoc; |  | 
|   16     delete fMapper; |  | 
|   17 } |  | 
|   18  |  | 
|   19 int SkPodofoParsedPDF::pages() const { |  | 
|   20     return fDoc->GetPageCount(); |  | 
|   21 } |  | 
|   22  |  | 
|   23 double SkPodofoParsedPDF::width(int page) const { |  | 
|   24     PoDoFo::PdfRect rect = fDoc->GetPage(page)->GetMediaBox(); |  | 
|   25     return rect.GetWidth() + rect.GetLeft(); |  | 
|   26 } |  | 
|   27  |  | 
|   28 double SkPodofoParsedPDF::height(int page) const { |  | 
|   29     PoDoFo::PdfRect rect = fDoc->GetPage(page)->GetMediaBox(); |  | 
|   30     return rect.GetHeight() + rect.GetBottom(); |  | 
|   31 } |  | 
|   32  |  | 
|   33 const SkPdfResourceDictionary* SkPodofoParsedPDF::pageResources(int page) const 
     { |  | 
|   34     SkPdfPageObjectDictionary* pg = NULL; |  | 
|   35     SkPdfObject* obj = make(fDoc->GetPage(page)->GetObject()); |  | 
|   36     fMapper->mapPageObjectDictionary(obj, &pg); |  | 
|   37     return pg ? pg->Resources() : NULL; |  | 
|   38 } |  | 
|   39  |  | 
|   40 SkRect SkPodofoParsedPDF::MediaBox(int page) const { |  | 
|   41     PoDoFo::PdfRect rect = fDoc->GetPage(page)->GetMediaBox(); |  | 
|   42     SkRect skrect = SkRect::MakeLTRB(SkDoubleToScalar(rect.GetLeft()), |  | 
|   43                                      SkDoubleToScalar(rect.GetBottom()), |  | 
|   44                                      SkDoubleToScalar(rect.GetLeft() + rect.GetW
     idth()), |  | 
|   45                                      SkDoubleToScalar(rect.GetBottom() + rect.Ge
     tHeight())); |  | 
|   46     return skrect; |  | 
|   47 } |  | 
|   48  |  | 
|   49  |  | 
|   50 SkPdfPodofoTokenizer* SkPodofoParsedPDF::tokenizerOfPage(int page) const { |  | 
|   51     PoDoFo::PdfContentsTokenizer* t = new PoDoFo::PdfContentsTokenizer(fDoc->Get
     Page(page)); |  | 
|   52     return new SkPdfPodofoTokenizer(this, t); |  | 
|   53 } |  | 
|   54  |  | 
|   55 SkPdfPodofoTokenizer* SkPodofoParsedPDF::tokenizerOfStream(const SkPdfStream* st
     ream) const { |  | 
|   56     if (stream == NULL) { |  | 
|   57         return NULL; |  | 
|   58     } |  | 
|   59  |  | 
|   60     char* buffer = NULL; |  | 
|   61     long len = 0; |  | 
|   62     stream->GetFilteredCopy(&buffer, &len); |  | 
|   63     return tokenizerOfBuffer(buffer, len); |  | 
|   64 } |  | 
|   65  |  | 
|   66 SkPdfPodofoTokenizer* SkPodofoParsedPDF::tokenizerOfBuffer(char* buffer, size_t 
     len) const { |  | 
|   67     PoDoFo::PdfContentsTokenizer* t = new PoDoFo::PdfContentsTokenizer(buffer, l
     en); |  | 
|   68     return new SkPdfPodofoTokenizer(this, t); |  | 
|   69 } |  | 
|   70  |  | 
|   71 size_t SkPodofoParsedPDF::objects() const { |  | 
|   72     return fDoc->GetObjects().GetSize(); |  | 
|   73 } |  | 
|   74  |  | 
|   75 const SkPdfObject* SkPodofoParsedPDF::object(int i) const { |  | 
|   76     PoDoFo::PdfVecObjects& objects = (PoDoFo::PdfVecObjects&)fDoc->GetObjects(); |  | 
|   77     return make(objects[i]); |  | 
|   78 } |  | 
|   79  |  | 
|   80 SkPdfObject* SkPodofoParsedPDF::make(PoDoFo::PdfObject* obj) const { |  | 
|   81     return new SkPdfObject(this, obj); |  | 
|   82 } |  | 
|   83  |  | 
|   84 const SkPdfObject* SkPodofoParsedPDF::make(const PoDoFo::PdfObject* obj) const { |  | 
|   85     return new SkPdfObject(this, obj); |  | 
|   86 } |  | 
|   87  |  | 
|   88 const SkPdfMapper* SkPodofoParsedPDF::mapper() const { |  | 
|   89     return fMapper; |  | 
|   90 } |  | 
|   91  |  | 
|   92 SkPdfNumber* SkPodofoParsedPDF::createNumber(double number) const { |  | 
|   93     return new SkPdfNumber(this, new PoDoFo::PdfObject(PoDoFo::PdfVariant(number
     ))); |  | 
|   94 } |  | 
|   95  |  | 
|   96 SkPdfInteger* SkPodofoParsedPDF::createInteger(int value) const { |  | 
|   97     return new SkPdfInteger(this, new PoDoFo::PdfObject(PoDoFo::PdfVariant((PoDo
     Fo::pdf_int64)value))); |  | 
|   98 } |  | 
|   99  |  | 
|  100 SkPdfString* SkPodofoParsedPDF::createString(char* sz, size_t len) const { |  | 
|  101     // TODO(edisonn): NYI |  | 
|  102     return NULL; |  | 
|  103 } |  | 
|  104  |  | 
|  105 PdfContext* gPdfContext = NULL; |  | 
|  106  |  | 
|  107 void SkPodofoParsedPDF::drawPage(int page, SkCanvas* canvas) const { |  | 
|  108     SkPdfPodofoTokenizer* tokenizer = tokenizerOfPage(page); |  | 
|  109  |  | 
|  110     PdfContext pdfContext(this); |  | 
|  111     pdfContext.fOriginalMatrix = SkMatrix::I(); |  | 
|  112     pdfContext.fGraphicsState.fResources = pageResources(page); |  | 
|  113  |  | 
|  114     gPdfContext = &pdfContext; |  | 
|  115  |  | 
|  116     // TODO(edisonn): get matrix stuff right. |  | 
|  117     // TODO(edisonn): add DPI/scale/zoom. |  | 
|  118     SkScalar z = SkIntToScalar(0); |  | 
|  119     SkRect rect = MediaBox(page); |  | 
|  120     SkScalar w = rect.width(); |  | 
|  121     SkScalar h = rect.height(); |  | 
|  122  |  | 
|  123     SkPoint pdfSpace[4] = {SkPoint::Make(z, z), SkPoint::Make(w, z), SkPoint::Ma
     ke(w, h), SkPoint::Make(z, h)}; |  | 
|  124 //                SkPoint skiaSpace[4] = {SkPoint::Make(z, h), SkPoint::Make(w, 
     h), SkPoint::Make(w, z), SkPoint::Make(z, z)}; |  | 
|  125  |  | 
|  126     // TODO(edisonn): add flag for this app to create sourunding buffer zone |  | 
|  127     // TODO(edisonn): add flagg for no clipping. |  | 
|  128     // Use larger image to make sure we do not draw anything outside of page |  | 
|  129     // could be used in tests. |  | 
|  130  |  | 
|  131 #ifdef PDF_DEBUG_3X |  | 
|  132     SkPoint skiaSpace[4] = {SkPoint::Make(w+z, h+h), SkPoint::Make(w+w, h+h), Sk
     Point::Make(w+w, h+z), SkPoint::Make(w+z, h+z)}; |  | 
|  133 #else |  | 
|  134     SkPoint skiaSpace[4] = {SkPoint::Make(z, h), SkPoint::Make(w, h), SkPoint::M
     ake(w, z), SkPoint::Make(z, z)}; |  | 
|  135 #endif |  | 
|  136     //SkPoint pdfSpace[2] = {SkPoint::Make(z, z), SkPoint::Make(w, h)}; |  | 
|  137     //SkPoint skiaSpace[2] = {SkPoint::Make(w, z), SkPoint::Make(z, h)}; |  | 
|  138  |  | 
|  139     //SkPoint pdfSpace[2] = {SkPoint::Make(z, z), SkPoint::Make(z, h)}; |  | 
|  140     //SkPoint skiaSpace[2] = {SkPoint::Make(z, h), SkPoint::Make(z, z)}; |  | 
|  141  |  | 
|  142     //SkPoint pdfSpace[3] = {SkPoint::Make(z, z), SkPoint::Make(z, h), SkPoint::
     Make(w, h)}; |  | 
|  143     //SkPoint skiaSpace[3] = {SkPoint::Make(z, h), SkPoint::Make(z, z), SkPoint:
     :Make(w, 0)}; |  | 
|  144  |  | 
|  145     SkAssertResult(pdfContext.fOriginalMatrix.setPolyToPoly(pdfSpace, skiaSpace,
      4)); |  | 
|  146     SkTraceMatrix(pdfContext.fOriginalMatrix, "Original matrix"); |  | 
|  147  |  | 
|  148  |  | 
|  149     pdfContext.fGraphicsState.fMatrix = pdfContext.fOriginalMatrix; |  | 
|  150     pdfContext.fGraphicsState.fMatrixTm = pdfContext.fGraphicsState.fMatrix; |  | 
|  151     pdfContext.fGraphicsState.fMatrixTlm = pdfContext.fGraphicsState.fMatrix; |  | 
|  152  |  | 
|  153     canvas->setMatrix(pdfContext.fOriginalMatrix); |  | 
|  154  |  | 
|  155 #ifndef PDF_DEBUG_NO_PAGE_CLIPING |  | 
|  156     canvas->clipRect(SkRect::MakeXYWH(z, z, w, h), SkRegion::kIntersect_Op, true
     ); |  | 
|  157 #endif |  | 
|  158  |  | 
|  159 // erase with red before? |  | 
|  160 //        SkPaint paint; |  | 
|  161 //        paint.setColor(SK_ColorRED); |  | 
|  162 //        canvas->drawRect(rect, paint); |  | 
|  163  |  | 
|  164     PdfMainLooper looper(NULL, tokenizer, &pdfContext, canvas); |  | 
|  165     looper.loop(); |  | 
|  166  |  | 
|  167     delete tokenizer; |  | 
|  168  |  | 
|  169     canvas->flush(); |  | 
|  170 } |  | 
|  171  |  | 
|  172 // TODO(edisonn): move in trace util. |  | 
|  173 #include "SkMatrix.h" |  | 
|  174 #include "SkRect.h" |  | 
|  175  |  | 
|  176 #ifdef PDF_TRACE |  | 
|  177 void SkTraceMatrix(const SkMatrix& matrix, const char* sz) { |  | 
|  178     printf("SkMatrix %s ", sz); |  | 
|  179     for (int i = 0 ; i < 9 ; i++) { |  | 
|  180         printf("%f ", SkScalarToDouble(matrix.get(i))); |  | 
|  181     } |  | 
|  182     printf("\n"); |  | 
|  183 } |  | 
|  184  |  | 
|  185 void SkTraceRect(const SkRect& rect, const char* sz) { |  | 
|  186     printf("SkRect %s ", sz); |  | 
|  187     printf("x = %f ", SkScalarToDouble(rect.x())); |  | 
|  188     printf("y = %f ", SkScalarToDouble(rect.y())); |  | 
|  189     printf("w = %f ", SkScalarToDouble(rect.width())); |  | 
|  190     printf("h = %f ", SkScalarToDouble(rect.height())); |  | 
|  191     printf("\n"); |  | 
|  192 } |  | 
|  193 #endif |  | 
| OLD | NEW |