Index: experimental/PdfViewer/SkPdfBasics.h |
=================================================================== |
--- experimental/PdfViewer/SkPdfBasics.h (revision 0) |
+++ experimental/PdfViewer/SkPdfBasics.h (revision 0) |
@@ -0,0 +1,136 @@ |
+#ifndef __DEFINED__SkPdfBasics |
+#define __DEFINED__SkPdfBasics |
+ |
+#include "podofo.h" |
+using namespace PoDoFo; |
+ |
+#include <iostream> |
+#include <cstdio> |
+#include <stack> |
+ |
+//#define PDF_TRACE |
+//#define PDF_TRACE_DIFF_IN_PNG |
+//#define PDF_DEBUG_NO_CLIPING |
+//#define PDF_DEBUG_NO_PAGE_CLIPING |
+//#define PDF_DEBUG_3X |
+ |
+class SkPdfFont; |
+class SkPdfDoc; |
+ |
+// TODO(edisonn): better class design. |
+struct PdfColorOperator { |
+ std::string fColorSpace; // TODO(edisonn): use SkString |
+ SkColor fColor; |
+ double fOpacity; // ca or CA |
+ // TODO(edisonn): add here other color space options. |
+ |
+ void setRGBColor(SkColor color) { |
+ // TODO(edisonn): ASSERT DeviceRGB is the color space. |
+ fColor = color; |
+ } |
+ // TODO(edisonn): double check the default values for all fields. |
+ PdfColorOperator() : fColor(SK_ColorBLACK), fOpacity(1) {} |
+ |
+ void applyGraphicsState(SkPaint* paint) { |
+ paint->setColor(SkColorSetA(fColor, fOpacity * 255)); |
+ } |
+}; |
+ |
+// TODO(edisonn): better class design. |
+struct PdfGraphicsState { |
+ SkMatrix fMatrix; |
+ SkMatrix fMatrixTm; |
+ SkMatrix fMatrixTlm; |
+ |
+ double fCurPosX; |
+ double fCurPosY; |
+ |
+ double fCurFontSize; |
+ bool fTextBlock; |
+ SkPdfFont* fSkFont; |
+ SkPath fPath; |
+ bool fPathClosed; |
+ |
+ // Clip that is applied after the drawing is done!!! |
+ bool fHasClipPathToApply; |
+ SkPath fClipPath; |
+ |
+ PdfColorOperator fStroking; |
+ PdfColorOperator fNonStroking; |
+ |
+ double fLineWidth; |
+ double fTextLeading; |
+ double fWordSpace; |
+ double fCharSpace; |
+ |
+ SkPdfResourceDictionary* fResources; |
+ |
+ SkBitmap fSMask; |
+ |
+ PdfGraphicsState() { |
+ fCurPosX = 0.0; |
+ fCurPosY = 0.0; |
+ fCurFontSize = 0.0; |
+ fTextBlock = false; |
+ fMatrix = SkMatrix::I(); |
+ fMatrixTm = SkMatrix::I(); |
+ fMatrixTlm = SkMatrix::I(); |
+ fPathClosed = true; |
+ fLineWidth = 0; |
+ fTextLeading = 0; |
+ fWordSpace = 0; |
+ fCharSpace = 0; |
+ fHasClipPathToApply = false; |
+ fResources = NULL; |
+ fSkFont = NULL; |
+ } |
+ |
+ void applyGraphicsState(SkPaint* paint, bool stroking) { |
+ if (stroking) { |
+ fStroking.applyGraphicsState(paint); |
+ } else { |
+ fNonStroking.applyGraphicsState(paint); |
+ } |
+ |
+ // TODO(edisonn): get this from pdfContext->options, |
+ // or pdfContext->addPaintOptions(&paint); |
+ paint->setAntiAlias(true); |
+ |
+ // TODO(edisonn): dashing, miter, ... |
+ paint->setStrokeWidth(SkDoubleToScalar(fLineWidth)); |
+ } |
+}; |
+ |
+// TODO(edisonn): better class design. |
+struct PdfInlineImage { |
+ std::map<std::string, std::string> fKeyValuePairs; |
+ std::string fImageData; |
+}; |
+ |
+// TODO(edisonn): better class design. |
+struct PdfContext { |
+ std::stack<SkPdfObject*> fObjectStack; |
+ std::stack<PdfGraphicsState> fStateStack; |
+ PdfGraphicsState fGraphicsState; |
+ SkPdfDoc* fPdfDoc; |
+ SkMatrix fOriginalMatrix; |
+ |
+ PdfInlineImage fInlineImage; |
+ |
+ PdfContext(SkPdfDoc* doc) : fPdfDoc(doc) {} |
+ |
+}; |
+ |
+// TODO(edisonn): temporary code, to report how much of the PDF we actually think we rendered. |
+enum PdfResult { |
+ kOK_PdfResult, |
+ kPartial_PdfResult, |
+ kNYI_PdfResult, |
+ kIgnoreError_PdfResult, |
+ kError_PdfResult, |
+ kUnsupported_PdfResult, |
+ |
+ kCount_PdfResult |
+}; |
+ |
+#endif // __DEFINED__SkPdfBasics |