blob: 31fc2cd07180ae75e98ee1d6f6556f6d329fc31a [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.com2ccc3af2013-07-23 17:43:18 +000019class SkPdfAllocator;
edisonn@google.com3aac1f92013-07-02 22:42:53 +000020
edisonn@google.comb857a0c2013-06-25 20:45:40 +000021// TODO(edisonn): better class design.
edisonn@google.com3aac1f92013-07-02 22:42:53 +000022struct SkPdfColorOperator {
edisonn@google.com571c70b2013-07-10 17:09:50 +000023 // does not own the char*
edisonn@google.com2ccc3af2013-07-23 17:43:18 +000024 NotOwnedString fColorSpace;
edisonn@google.comb857a0c2013-06-25 20:45:40 +000025 SkColor fColor;
26 double fOpacity; // ca or CA
27 // TODO(edisonn): add here other color space options.
28
29 void setRGBColor(SkColor color) {
30 // TODO(edisonn): ASSERT DeviceRGB is the color space.
31 fColor = color;
32 }
33 // TODO(edisonn): double check the default values for all fields.
edisonn@google.com2ccc3af2013-07-23 17:43:18 +000034 SkPdfColorOperator() : fColor(SK_ColorBLACK), fOpacity(1) {
35 NotOwnedString::init(&fColorSpace);
36 }
edisonn@google.comb857a0c2013-06-25 20:45:40 +000037
38 void applyGraphicsState(SkPaint* paint) {
39 paint->setColor(SkColorSetA(fColor, fOpacity * 255));
40 }
41};
42
43// TODO(edisonn): better class design.
edisonn@google.com3aac1f92013-07-02 22:42:53 +000044struct SkPdfGraphicsState {
edisonn@google.comb857a0c2013-06-25 20:45:40 +000045 SkMatrix fMatrix;
46 SkMatrix fMatrixTm;
47 SkMatrix fMatrixTlm;
48
49 double fCurPosX;
50 double fCurPosY;
51
52 double fCurFontSize;
53 bool fTextBlock;
54 SkPdfFont* fSkFont;
55 SkPath fPath;
56 bool fPathClosed;
57
58 // Clip that is applied after the drawing is done!!!
59 bool fHasClipPathToApply;
60 SkPath fClipPath;
61
edisonn@google.com3aac1f92013-07-02 22:42:53 +000062 SkPdfColorOperator fStroking;
63 SkPdfColorOperator fNonStroking;
edisonn@google.comb857a0c2013-06-25 20:45:40 +000064
65 double fLineWidth;
66 double fTextLeading;
67 double fWordSpace;
68 double fCharSpace;
69
edisonn@google.com571c70b2013-07-10 17:09:50 +000070 SkPdfResourceDictionary* fResources;
edisonn@google.comb857a0c2013-06-25 20:45:40 +000071
72 SkBitmap fSMask;
73
edisonn@google.com3aac1f92013-07-02 22:42:53 +000074 SkPdfGraphicsState() {
edisonn@google.comb857a0c2013-06-25 20:45:40 +000075 fCurPosX = 0.0;
76 fCurPosY = 0.0;
77 fCurFontSize = 0.0;
78 fTextBlock = false;
79 fMatrix = SkMatrix::I();
80 fMatrixTm = SkMatrix::I();
81 fMatrixTlm = SkMatrix::I();
82 fPathClosed = true;
83 fLineWidth = 0;
84 fTextLeading = 0;
85 fWordSpace = 0;
86 fCharSpace = 0;
87 fHasClipPathToApply = false;
88 fResources = NULL;
89 fSkFont = NULL;
90 }
91
92 void applyGraphicsState(SkPaint* paint, bool stroking) {
93 if (stroking) {
94 fStroking.applyGraphicsState(paint);
95 } else {
96 fNonStroking.applyGraphicsState(paint);
97 }
98
99 // TODO(edisonn): get this from pdfContext->options,
100 // or pdfContext->addPaintOptions(&paint);
101 paint->setAntiAlias(true);
102
103 // TODO(edisonn): dashing, miter, ...
104 paint->setStrokeWidth(SkDoubleToScalar(fLineWidth));
105 }
106};
107
108// TODO(edisonn): better class design.
edisonn@google.com3aac1f92013-07-02 22:42:53 +0000109// TODO(edisonn): could we remove it?
110// TODO(edisonn): rename to SkPdfInlineImage
111struct SkPdfInlineImage {
edisonn@google.comb857a0c2013-06-25 20:45:40 +0000112 std::map<std::string, std::string> fKeyValuePairs;
113 std::string fImageData;
114};
115
116// TODO(edisonn): better class design.
edisonn@google.com3aac1f92013-07-02 22:42:53 +0000117// TODO(edisonn): rename to SkPdfContext
edisonn@google.comb857a0c2013-06-25 20:45:40 +0000118struct PdfContext {
119 std::stack<SkPdfObject*> fObjectStack;
edisonn@google.com3aac1f92013-07-02 22:42:53 +0000120 std::stack<SkPdfGraphicsState> fStateStack;
121 SkPdfGraphicsState fGraphicsState;
edisonn@google.com571c70b2013-07-10 17:09:50 +0000122 SkNativeParsedPDF* fPdfDoc;
edisonn@google.com2ccc3af2013-07-23 17:43:18 +0000123 // TODO(edisonn): the allocator, could be freed after the page is done drawing.
124 SkPdfAllocator* fTmpPageAllocator;
edisonn@google.comb857a0c2013-06-25 20:45:40 +0000125 SkMatrix fOriginalMatrix;
126
edisonn@google.com3aac1f92013-07-02 22:42:53 +0000127 SkPdfInlineImage fInlineImage;
edisonn@google.comb857a0c2013-06-25 20:45:40 +0000128
edisonn@google.com2ccc3af2013-07-23 17:43:18 +0000129 PdfContext(SkNativeParsedPDF* doc);
130 ~PdfContext();
edisonn@google.comb857a0c2013-06-25 20:45:40 +0000131};
132
edisonn@google.com3aac1f92013-07-02 22:42:53 +0000133// TODO(edisonn): temporary code, to report how much of the PDF we actually think we rendered.
134// TODO(edisonn): rename to SkPdfResult
edisonn@google.comb857a0c2013-06-25 20:45:40 +0000135enum PdfResult {
136 kOK_PdfResult,
137 kPartial_PdfResult,
138 kNYI_PdfResult,
139 kIgnoreError_PdfResult,
140 kError_PdfResult,
141 kUnsupported_PdfResult,
142
143 kCount_PdfResult
144};
145
146#endif // __DEFINED__SkPdfBasics