Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(88)

Side by Side Diff: experimental/PdfViewer/SkPdfGraphicsState.h

Issue 27057003: pdfviewer: more code comments + concat the pdf matrix with the existing matrix in canvas, instead o… (Closed) Base URL: http://skia.googlecode.com/svn/trunk/
Patch Set: Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « experimental/PdfViewer/SkPdfFont.h ('k') | experimental/PdfViewer/SkPdfGraphicsState.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2013 Google Inc. 2 * Copyright 2013 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #ifndef SkPdfGraphicsState_DEFINED 8 #ifndef SkPdfGraphicsState_DEFINED
9 #define SkPdfGraphicsState_DEFINED 9 #define SkPdfGraphicsState_DEFINED
10 10
11 #include "SkCanvas.h" 11 #include "SkCanvas.h"
12 #include "SkPaint.h" 12 #include "SkPaint.h"
13 #include "SkPdfConfig.h" 13 #include "SkPdfConfig.h"
14 #include "SkPdfUtils.h" 14 #include "SkPdfUtils.h"
15 15
16 class SkPdfAllocator;
16 class SkPdfFont; 17 class SkPdfFont;
17 class SkPdfDoc; 18 class SkPdfDoc;
19 class SkPdfNativeDoc;
18 class SkPdfNativeObject; 20 class SkPdfNativeObject;
19 class SkPdfResourceDictionary; 21 class SkPdfResourceDictionary;
20 class SkPdfSoftMaskDictionary; 22 class SkPdfSoftMaskDictionary;
23 #include "SkTypes.h"
21 24
22 class SkPdfNativeDoc;
23 class SkPdfAllocator;
24 25
25 // TODO(edisonn): move this class in include/core? 26 // TODO(edisonn): move SkTDStackNester class in its own private file
26 // Ref objects can't be dealt unless we use a specific class initialization
27 // The difference between SkTDStackNew and SkTDStack is that SkTDStackNew uses n ew/delete
28 // to be a manage c++ stuff (like initializations)
29 27
30 // Adobe limits it to 28, so 256 should be more than enough 28 // Adobe limits it to 28, so 256 should be more than enough
31 #define MAX_NESTING 256 29 #define MAX_NESTING 256
32 30
33 #include "SkTypes.h" 31 /** \class SkTDStackNester
34 template <typename T> class SkTDStackNew : SkNoncopyable { 32 *
33 * The difference between SkTDStackNester and SkTDStack is that:
34 * - SkTDStackNester uses new/delete to manage initializations
35 * - Supports nest/unnest which simulates a stack of stack. unnest will pop al l the
36 * objects pushed since the last nest
37 */
38
39 template <typename T> class SkTDStackNester : SkNoncopyable {
35 public: 40 public:
36 SkTDStackNew() : fCount(0), fTotalCount(0), fLocalCount(0) { 41 SkTDStackNester() : fCount(0), fTotalCount(0), fLocalCount(0) {
37 fInitialRec.fNext = NULL; 42 fInitialRec.fNext = NULL;
38 fRec = &fInitialRec; 43 fRec = &fInitialRec;
39 44
40 // fCount = kSlotCount; 45 // fCount = kSlotCount;
41 } 46 }
42 47
43 ~SkTDStackNew() { 48 ~SkTDStackNester() {
44 Rec* rec = fRec; 49 Rec* rec = fRec;
45 while (rec != &fInitialRec) { 50 while (rec != &fInitialRec) {
46 Rec* next = rec->fNext; 51 Rec* next = rec->fNext;
47 delete rec; 52 delete rec;
48 rec = next; 53 rec = next;
49 } 54 }
50 } 55 }
51 56
52 int count() const { return fLocalCount; } 57 int count() const { return fLocalCount; }
53 int depth() const { return fLocalCount; } 58 int depth() const { return fLocalCount; }
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
150 Rec* fNext; 155 Rec* fNext;
151 T fSlots[kSlotCount]; 156 T fSlots[kSlotCount];
152 }; 157 };
153 Rec fInitialRec; 158 Rec fInitialRec;
154 Rec* fRec; 159 Rec* fRec;
155 int fCount, fTotalCount, fLocalCount; 160 int fCount, fTotalCount, fLocalCount;
156 int fNestings[MAX_NESTING]; 161 int fNestings[MAX_NESTING];
157 int fNestingLevel; 162 int fNestingLevel;
158 }; 163 };
159 164
160 // TODO(edisonn): better class design. 165 /** \class SkTDStackNester
166 * Operates on stroking or non-stroking properties.
167 */
161 class SkPdfColorOperator { 168 class SkPdfColorOperator {
162 169
163 /* 170 /*
164 color space name or array The current color space in which color value s are to be interpreted 171 color space name or array The current color space in which color value s are to be interpreted
165 (see Section 4.5, “Color Spaces”). There are two separate color space 172 (see Section 4.5, “Color Spaces”). There are two separate color space
166 parameters: one for stroking and one for all other painting opera- 173 parameters: one for stroking and one for all other painting opera-
167 tions. Initial value: DeviceGray. 174 tions. Initial value: DeviceGray.
168 */ 175 */
169 176
170 // TODO(edisonn): implement the array part too 177 // TODO(edisonn): implement the array part too
171 // does not own the char*
172 // TODO(edisonn): remove this public, let fields be private 178 // TODO(edisonn): remove this public, let fields be private
173 // TODO(edisonn): make color space an enum!
174 public: 179 public:
175 NotOwnedString fColorSpace; 180 NotOwnedString fColorSpace;
176 SkPdfNativeObject* fPattern; 181 SkPdfNativeObject* fPattern;
177 182
178 /* 183 /*
179 color (various) The current color to be used during painting operations (see Section 184 color (various) The current color to be used during painting operations (see Section
180 4.5, “Color Spaces”). The type and interpret ation of this parameter 185 4.5, “Color Spaces”). The type and interpret ation of this parameter
181 depend on the current color space; for most color spaces, a color 186 depend on the current color space; for most color spaces, a color
182 value consists of one to four numbers. There are two separate color 187 value consists of one to four numbers. There are two separate color
183 parameters: one for stroking and one for all other painting opera- 188 parameters: one for stroking and one for all other painting opera-
184 tions. Initial value: black. 189 tions. Initial value: black.
185 */ 190 */
186 191
187 SkColor fColor; 192 SkColor fColor;
188 double fOpacity; // ca or CA 193 double fOpacity; // ca or CA
189 194
190 // TODO(edisonn): add here other color space options.
191
192 public: 195 public:
193 void setRGBColor(SkColor color) { 196 void setRGBColor(SkColor color) {
194 // TODO(edisonn): ASSERT DeviceRGB is the color space. 197 // TODO(edisonn): ASSERT DeviceRGB is the color space.
195 fPattern = NULL; 198 fPattern = NULL;
196 fColor = color; 199 fColor = color;
197 } 200 }
198 // TODO(edisonn): double check the default values for all fields. 201
202 // TODO(edisonn): implement the default values for all fields.
199 SkPdfColorOperator() : fPattern(NULL), fColor(SK_ColorBLACK), fOpacity(1) { 203 SkPdfColorOperator() : fPattern(NULL), fColor(SK_ColorBLACK), fOpacity(1) {
200 NotOwnedString::init(&fColorSpace, "DeviceRGB"); 204 NotOwnedString::init(&fColorSpace, "DeviceRGB");
201 } 205 }
202 206
203 void setColorSpace(NotOwnedString* colorSpace) { 207 void setColorSpace(NotOwnedString* colorSpace) {
204 fColorSpace = *colorSpace; 208 fColorSpace = *colorSpace;
205 fPattern = NULL; 209 fPattern = NULL;
206 } 210 }
207 211
208 void setPatternColorSpace(SkPdfNativeObject* pattern) { 212 void setPatternColorSpace(SkPdfNativeObject* pattern) {
209 fColorSpace.fBuffer = (const unsigned char*)"Pattern"; 213 fColorSpace.fBuffer = (const unsigned char*)"Pattern";
210 fColorSpace.fBytes = 7; // strlen("Pattern") 214 fColorSpace.fBytes = 7; // strlen("Pattern")
211 fPattern = pattern; 215 fPattern = pattern;
212 } 216 }
213 217
214 void applyGraphicsState(SkPaint* paint) { 218 void applyGraphicsState(SkPaint* paint) {
215 paint->setColor(SkColorSetA(fColor, (U8CPU)(fOpacity * 255))); 219 paint->setColor(SkColorSetA(fColor, (U8CPU)(fOpacity * 255)));
216 } 220 }
217 }; 221 };
218 222
219 // TODO(edisonn): better class design. 223 /** \class SkTDStackNester
224 * Operates on stroking or non-stroking properties.
225 */
220 struct SkPdfGraphicsState { 226 struct SkPdfGraphicsState {
221 // TODO(edisonn): deprecate and remove these! 227 // TODO(edisonn): deprecate and remove these!
222 double fCurPosX; 228 double fCurPosX;
223 double fCurPosY; 229 double fCurPosY;
224 230
225 double fCurFontSize; 231 double fCurFontSize;
226 bool fTextBlock; 232 bool fTextBlock;
227 SkPdfFont* fSkFont; 233 SkPdfFont* fSkFont;
228 SkPath fPath; 234 SkPath fPath;
229 bool fPathClosed; 235 bool fPathClosed;
230 236
231 double fTextLeading; 237 double fTextLeading;
232 double fWordSpace; 238 double fWordSpace;
233 double fCharSpace; 239 double fCharSpace;
234 240
235 SkPdfResourceDictionary* fResources; 241 SkPdfResourceDictionary* fResources;
236 242
237 243
238 // TODO(edisonn): move most of these in canvas/paint? 244 // TODO(edisonn): Can we move most of these in canvas/paint?
239 // we could have some in canvas (matrixes?), 245 // Might need to strore some properties in 2 paints (stroking paint and non stroking paint)
240 // some in 2 paints (stroking paint and non stroking paint)
241 246
242 // TABLE 4.2 Device-independent graphics state parameters 247 // TABLE 4.2 Device-independent graphics state parameters
243 /* 248 /*
244 * CTM array The current transformation matrix, which maps positions from user 249 * CTM array The current transformation matrix, which maps positions from user
245 coordinates to device coordinates (see Section 4 .2, “Coordinate Sys- 250 coordinates to device coordinates (see Section 4 .2, “Coordinate Sys-
246 tems”). This matrix is modified by each applicati on of the coordi- 251 tems”). This matrix is modified by each applicati on of the coordi-
247 nate transformation operator, cm. Initial value: a matrix that 252 nate transformation operator, cm. Initial value: a matrix that
248 transforms default user coordinates to device co ordinates. 253 transforms default user coordinates to device co ordinates.
249 */ 254 */
250 SkMatrix fCTM; 255 SkMatrix fCTM;
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after
450 /* 455 /*
451 smoothness number (PDF 1.3) The precision with which col or gradients are to be ren- 456 smoothness number (PDF 1.3) The precision with which col or gradients are to be ren-
452 dered on the output device (see Sectio n 6.5.2, “Smoothness Toler- 457 dered on the output device (see Sectio n 6.5.2, “Smoothness Toler-
453 ance”). The value of this parameter gi ves the maximum error 458 ance”). The value of this parameter gi ves the maximum error
454 tolerance, expressed as a fraction of the range of each color compo- 459 tolerance, expressed as a fraction of the range of each color compo-
455 nent; smaller numbers give smoother co lor transitions at the 460 nent; smaller numbers give smoother co lor transitions at the
456 expense of more computation and memory use. Initial value: 461 expense of more computation and memory use. Initial value:
457 installation-dependent. 462 installation-dependent.
458 */ 463 */
459 464
460
461
462 // TODO(edisonn): some defaults are contextual, they could on colorspace, pd f version, ... 465 // TODO(edisonn): some defaults are contextual, they could on colorspace, pd f version, ...
463
464 SkPdfGraphicsState() { 466 SkPdfGraphicsState() {
465 fCurPosX = 0.0; 467 fCurPosX = 0.0;
466 fCurPosY = 0.0; 468 fCurPosY = 0.0;
467 fCurFontSize = 0.0; 469 fCurFontSize = 0.0;
468 fTextBlock = false; 470 fTextBlock = false;
469 fCTM = SkMatrix::I(); 471 fCTM = SkMatrix::I();
470 fMatrixTm = SkMatrix::I(); 472 fMatrixTm = SkMatrix::I();
471 fMatrixTlm = SkMatrix::I(); 473 fMatrixTlm = SkMatrix::I();
472 fPathClosed = true; 474 fPathClosed = true;
473 fLineWidth = 0; 475 fLineWidth = 0;
(...skipping 12 matching lines...) Expand all
486 fDashPhase = 0; 488 fDashPhase = 0;
487 fBlendModesLength = 1; 489 fBlendModesLength = 1;
488 fBlendModes[0] = SkXfermode::kSrc_Mode; // PDF: Normal Blend mode 490 fBlendModes[0] = SkXfermode::kSrc_Mode; // PDF: Normal Blend mode
489 fSMask = NULL; 491 fSMask = NULL;
490 } 492 }
491 493
492 // TODO(edisonn): make two functions instead, stroking and non stoking, avoi d branching 494 // TODO(edisonn): make two functions instead, stroking and non stoking, avoi d branching
493 void applyGraphicsState(SkPaint* paint, bool stroking); 495 void applyGraphicsState(SkPaint* paint, bool stroking);
494 }; 496 };
495 497
498 /** \class SkPdfContext
499 * The context of the drawing. The document we draw from, the current stack of objects, ...
500 */
496 class SkPdfContext { 501 class SkPdfContext {
497 public: 502 public:
498 SkTDStackNew<SkPdfNativeObject*> fObjectStack; 503 SkTDStackNester<SkPdfNativeObject*> fObjectStack;
499 SkTDStackNew<SkPdfGraphicsState> fStateStack; 504 SkTDStackNester<SkPdfGraphicsState> fStateStack;
500 SkPdfGraphicsState fGraphicsState; 505 SkPdfGraphicsState fGraphicsState;
501 SkPdfNativeDoc* fPdfDoc; 506 SkPdfNativeDoc* fPdfDoc;
502 // TODO(edisonn): the allocator, could be freed after the page is done drawi ng, so we have the
503 // pixels on the screen asap.
504 SkPdfAllocator* fTmpPageAllocator; 507 SkPdfAllocator* fTmpPageAllocator;
505 SkMatrix fOriginalMatrix; 508 SkMatrix fOriginalMatrix;
506 509
507 SkPdfContext(SkPdfNativeDoc* doc); 510 SkPdfContext(SkPdfNativeDoc* doc);
508 ~SkPdfContext(); 511 ~SkPdfContext();
509 }; 512 };
510 513
511 #endif // SkPdfGraphicsState_DEFINED 514 #endif // SkPdfGraphicsState_DEFINED
OLDNEW
« no previous file with comments | « experimental/PdfViewer/SkPdfFont.h ('k') | experimental/PdfViewer/SkPdfGraphicsState.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698