blob: 747c32a3d4b6ae351e3212d774df9174f4f8c9f4 [file] [log] [blame]
edisonn@google.comb857a0c2013-06-25 20:45:40 +00001#ifndef __DEFINED__SkPdfBasics
2#define __DEFINED__SkPdfBasics
3
edisonn@google.com131d4ee2013-06-26 17:48:12 +00004#include "SkCanvas.h"
5#include "SkPaint.h"
edisonn@google.com3aac1f92013-07-02 22:42:53 +00006#include "SkPdfConfig.h"
edisonn@google.com131d4ee2013-06-26 17:48:12 +00007
edisonn@google.comb857a0c2013-06-25 20:45:40 +00008#include <iostream>
9#include <cstdio>
edisonn@google.com3aac1f92013-07-02 22:42:53 +000010#include <map>
edisonn@google.comb857a0c2013-06-25 20:45:40 +000011#include <stack>
12
edisonn@google.comb857a0c2013-06-25 20:45:40 +000013class SkPdfFont;
14class SkPdfDoc;
edisonn@google.com131d4ee2013-06-26 17:48:12 +000015class SkPdfObject;
16class SkPdfResourceDictionary;
edisonn@google.comb857a0c2013-06-25 20:45:40 +000017
edisonn@google.com571c70b2013-07-10 17:09:50 +000018class SkNativeParsedPDF;
edisonn@google.com3aac1f92013-07-02 22:42:53 +000019
edisonn@google.comb857a0c2013-06-25 20:45:40 +000020// TODO(edisonn): better class design.
edisonn@google.com3aac1f92013-07-02 22:42:53 +000021struct SkPdfColorOperator {
edisonn@google.com571c70b2013-07-10 17:09:50 +000022 // does not own the char*
23 const char* fColorSpace; // TODO(edisonn): use SkString, or even char*
edisonn@google.comb857a0c2013-06-25 20:45:40 +000024 SkColor fColor;
25 double fOpacity; // ca or CA
26 // TODO(edisonn): add here other color space options.
27
28 void setRGBColor(SkColor color) {
29 // TODO(edisonn): ASSERT DeviceRGB is the color space.
30 fColor = color;
31 }
32 // TODO(edisonn): double check the default values for all fields.
edisonn@google.com571c70b2013-07-10 17:09:50 +000033 SkPdfColorOperator() : fColorSpace(NULL), fColor(SK_ColorBLACK), fOpacity(1) {}
edisonn@google.comb857a0c2013-06-25 20:45:40 +000034
35 void applyGraphicsState(SkPaint* paint) {
36 paint->setColor(SkColorSetA(fColor, fOpacity * 255));
37 }
38};
39
40// TODO(edisonn): better class design.
edisonn@google.com3aac1f92013-07-02 22:42:53 +000041struct SkPdfGraphicsState {
edisonn@google.comb857a0c2013-06-25 20:45:40 +000042 SkMatrix fMatrix;
43 SkMatrix fMatrixTm;
44 SkMatrix fMatrixTlm;
45
46 double fCurPosX;
47 double fCurPosY;
48
49 double fCurFontSize;
50 bool fTextBlock;
51 SkPdfFont* fSkFont;
52 SkPath fPath;
53 bool fPathClosed;
54
55 // Clip that is applied after the drawing is done!!!
56 bool fHasClipPathToApply;
57 SkPath fClipPath;
58
edisonn@google.com3aac1f92013-07-02 22:42:53 +000059 SkPdfColorOperator fStroking;
60 SkPdfColorOperator fNonStroking;
edisonn@google.comb857a0c2013-06-25 20:45:40 +000061
62 double fLineWidth;
63 double fTextLeading;
64 double fWordSpace;
65 double fCharSpace;
66
edisonn@google.com571c70b2013-07-10 17:09:50 +000067 SkPdfResourceDictionary* fResources;
edisonn@google.comb857a0c2013-06-25 20:45:40 +000068
69 SkBitmap fSMask;
70
edisonn@google.com3aac1f92013-07-02 22:42:53 +000071 SkPdfGraphicsState() {
edisonn@google.comb857a0c2013-06-25 20:45:40 +000072 fCurPosX = 0.0;
73 fCurPosY = 0.0;
74 fCurFontSize = 0.0;
75 fTextBlock = false;
76 fMatrix = SkMatrix::I();
77 fMatrixTm = SkMatrix::I();
78 fMatrixTlm = SkMatrix::I();
79 fPathClosed = true;
80 fLineWidth = 0;
81 fTextLeading = 0;
82 fWordSpace = 0;
83 fCharSpace = 0;
84 fHasClipPathToApply = false;
85 fResources = NULL;
86 fSkFont = NULL;
87 }
88
89 void applyGraphicsState(SkPaint* paint, bool stroking) {
90 if (stroking) {
91 fStroking.applyGraphicsState(paint);
92 } else {
93 fNonStroking.applyGraphicsState(paint);
94 }
95
96 // TODO(edisonn): get this from pdfContext->options,
97 // or pdfContext->addPaintOptions(&paint);
98 paint->setAntiAlias(true);
99
100 // TODO(edisonn): dashing, miter, ...
101 paint->setStrokeWidth(SkDoubleToScalar(fLineWidth));
102 }
103};
104
105// TODO(edisonn): better class design.
edisonn@google.com3aac1f92013-07-02 22:42:53 +0000106// TODO(edisonn): could we remove it?
107// TODO(edisonn): rename to SkPdfInlineImage
108struct SkPdfInlineImage {
edisonn@google.comb857a0c2013-06-25 20:45:40 +0000109 std::map<std::string, std::string> fKeyValuePairs;
110 std::string fImageData;
111};
112
113// TODO(edisonn): better class design.
edisonn@google.com3aac1f92013-07-02 22:42:53 +0000114// TODO(edisonn): rename to SkPdfContext
edisonn@google.comb857a0c2013-06-25 20:45:40 +0000115struct PdfContext {
116 std::stack<SkPdfObject*> fObjectStack;
edisonn@google.com3aac1f92013-07-02 22:42:53 +0000117 std::stack<SkPdfGraphicsState> fStateStack;
118 SkPdfGraphicsState fGraphicsState;
edisonn@google.com571c70b2013-07-10 17:09:50 +0000119 SkNativeParsedPDF* fPdfDoc;
edisonn@google.comb857a0c2013-06-25 20:45:40 +0000120 SkMatrix fOriginalMatrix;
121
edisonn@google.com3aac1f92013-07-02 22:42:53 +0000122 SkPdfInlineImage fInlineImage;
edisonn@google.comb857a0c2013-06-25 20:45:40 +0000123
edisonn@google.com571c70b2013-07-10 17:09:50 +0000124 PdfContext(SkNativeParsedPDF* doc) : fPdfDoc(doc) {}
edisonn@google.comb857a0c2013-06-25 20:45:40 +0000125
126};
127
edisonn@google.com3aac1f92013-07-02 22:42:53 +0000128// TODO(edisonn): temporary code, to report how much of the PDF we actually think we rendered.
129// TODO(edisonn): rename to SkPdfResult
edisonn@google.comb857a0c2013-06-25 20:45:40 +0000130enum PdfResult {
131 kOK_PdfResult,
132 kPartial_PdfResult,
133 kNYI_PdfResult,
134 kIgnoreError_PdfResult,
135 kError_PdfResult,
136 kUnsupported_PdfResult,
137
138 kCount_PdfResult
139};
140
141#endif // __DEFINED__SkPdfBasics