]> git.ipfire.org Git - thirdparty/cups.git/blob - pdftops/GfxState.h
2056c4d1fb36f6f110a82fbb08d103f3e3e64e4e
[thirdparty/cups.git] / pdftops / GfxState.h
1 //========================================================================
2 //
3 // GfxState.h
4 //
5 // Copyright 1996 Derek B. Noonburg
6 //
7 //========================================================================
8
9 #ifndef GFXSTATE_H
10 #define GFXSTATE_H
11
12 #ifdef __GNUC__
13 #pragma interface
14 #endif
15
16 #include "gtypes.h"
17 #include "Object.h"
18
19 class Array;
20 class Function;
21 class GfxFont;
22
23 //------------------------------------------------------------------------
24 // GfxColor
25 //------------------------------------------------------------------------
26
27 #define gfxColorMaxComps 8
28
29 struct GfxColor {
30 double c[gfxColorMaxComps];
31 };
32
33 //------------------------------------------------------------------------
34 // GfxRGB
35 //------------------------------------------------------------------------
36
37 struct GfxRGB {
38 double r, g, b;
39 };
40
41 //------------------------------------------------------------------------
42 // GfxCMYK
43 //------------------------------------------------------------------------
44
45 struct GfxCMYK {
46 double c, m, y, k;
47 };
48
49 //------------------------------------------------------------------------
50 // GfxColorSpace
51 //------------------------------------------------------------------------
52
53 enum GfxColorSpaceMode {
54 csDeviceGray,
55 csCalGray,
56 csDeviceRGB,
57 csCalRGB,
58 csDeviceCMYK,
59 csLab,
60 csICCBased,
61 csIndexed,
62 csSeparation,
63 csDeviceN,
64 csPattern
65 };
66
67 class GfxColorSpace {
68 public:
69
70 GfxColorSpace();
71 virtual ~GfxColorSpace();
72 virtual GfxColorSpace *copy() = 0;
73 virtual GfxColorSpaceMode getMode() = 0;
74
75 // Construct a color space. Returns NULL if unsuccessful.
76 static GfxColorSpace *parse(Object *csObj);
77
78 // Convert to gray, RGB, or CMYK.
79 virtual void getGray(GfxColor *color, double *gray) = 0;
80 virtual void getRGB(GfxColor *color, GfxRGB *rgb) = 0;
81 virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk) = 0;
82
83 // Return the number of color components.
84 virtual int getNComps() = 0;
85
86 // Return the default ranges for each component, assuming an image
87 // with a max pixel value of <maxImgPixel>.
88 virtual void getDefaultRanges(double *decodeLow, double *decodeRange,
89 int maxImgPixel);
90
91 private:
92 };
93
94 //------------------------------------------------------------------------
95 // GfxDeviceGrayColorSpace
96 //------------------------------------------------------------------------
97
98 class GfxDeviceGrayColorSpace: public GfxColorSpace {
99 public:
100
101 GfxDeviceGrayColorSpace();
102 virtual ~GfxDeviceGrayColorSpace();
103 virtual GfxColorSpace *copy();
104 virtual GfxColorSpaceMode getMode() { return csDeviceGray; }
105
106 virtual void getGray(GfxColor *color, double *gray);
107 virtual void getRGB(GfxColor *color, GfxRGB *rgb);
108 virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk);
109
110 virtual int getNComps() { return 1; }
111
112 private:
113 };
114
115 //------------------------------------------------------------------------
116 // GfxCalGrayColorSpace
117 //------------------------------------------------------------------------
118
119 class GfxCalGrayColorSpace: public GfxColorSpace {
120 public:
121
122 GfxCalGrayColorSpace();
123 virtual ~GfxCalGrayColorSpace();
124 virtual GfxColorSpace *copy();
125 virtual GfxColorSpaceMode getMode() { return csCalGray; }
126
127 // Construct a CalGray color space. Returns NULL if unsuccessful.
128 static GfxColorSpace *parse(Array *arr);
129
130 virtual void getGray(GfxColor *color, double *gray);
131 virtual void getRGB(GfxColor *color, GfxRGB *rgb);
132 virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk);
133
134 virtual int getNComps() { return 1; }
135
136 // CalGray-specific access.
137 double getWhiteX() { return whiteX; }
138 double getWhiteY() { return whiteY; }
139 double getWhiteZ() { return whiteZ; }
140 double getBlackX() { return blackX; }
141 double getBlackY() { return blackY; }
142 double getBlackZ() { return blackZ; }
143 double getGamma() { return gamma; }
144
145 private:
146
147 double whiteX, whiteY, whiteZ; // white point
148 double blackX, blackY, blackZ; // black point
149 double gamma; // gamma value
150 };
151
152 //------------------------------------------------------------------------
153 // GfxDeviceRGBColorSpace
154 //------------------------------------------------------------------------
155
156 class GfxDeviceRGBColorSpace: public GfxColorSpace {
157 public:
158
159 GfxDeviceRGBColorSpace();
160 virtual ~GfxDeviceRGBColorSpace();
161 virtual GfxColorSpace *copy();
162 virtual GfxColorSpaceMode getMode() { return csDeviceRGB; }
163
164 virtual void getGray(GfxColor *color, double *gray);
165 virtual void getRGB(GfxColor *color, GfxRGB *rgb);
166 virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk);
167
168 virtual int getNComps() { return 3; }
169
170 private:
171 };
172
173 //------------------------------------------------------------------------
174 // GfxCalRGBColorSpace
175 //------------------------------------------------------------------------
176
177 class GfxCalRGBColorSpace: public GfxColorSpace {
178 public:
179
180 GfxCalRGBColorSpace();
181 virtual ~GfxCalRGBColorSpace();
182 virtual GfxColorSpace *copy();
183 virtual GfxColorSpaceMode getMode() { return csCalRGB; }
184
185 // Construct a CalRGB color space. Returns NULL if unsuccessful.
186 static GfxColorSpace *parse(Array *arr);
187
188 virtual void getGray(GfxColor *color, double *gray);
189 virtual void getRGB(GfxColor *color, GfxRGB *rgb);
190 virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk);
191
192 virtual int getNComps() { return 3; }
193
194 // CalRGB-specific access.
195 double getWhiteX() { return whiteX; }
196 double getWhiteY() { return whiteY; }
197 double getWhiteZ() { return whiteZ; }
198 double getBlackX() { return blackX; }
199 double getBlackY() { return blackY; }
200 double getBlackZ() { return blackZ; }
201 double getGammaR() { return gammaR; }
202 double getGammaG() { return gammaG; }
203 double getGammaB() { return gammaB; }
204 double *getMatrix() { return m; }
205
206 private:
207
208 double whiteX, whiteY, whiteZ; // white point
209 double blackX, blackY, blackZ; // black point
210 double gammaR, gammaG, gammaB; // gamma values
211 double m[9]; // ABC -> XYZ transform matrix
212 };
213
214 //------------------------------------------------------------------------
215 // GfxDeviceCMYKColorSpace
216 //------------------------------------------------------------------------
217
218 class GfxDeviceCMYKColorSpace: public GfxColorSpace {
219 public:
220
221 GfxDeviceCMYKColorSpace();
222 virtual ~GfxDeviceCMYKColorSpace();
223 virtual GfxColorSpace *copy();
224 virtual GfxColorSpaceMode getMode() { return csDeviceCMYK; }
225
226 virtual void getGray(GfxColor *color, double *gray);
227 virtual void getRGB(GfxColor *color, GfxRGB *rgb);
228 virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk);
229
230 virtual int getNComps() { return 4; }
231
232 private:
233 };
234
235 //------------------------------------------------------------------------
236 // GfxLabColorSpace
237 //------------------------------------------------------------------------
238
239 class GfxLabColorSpace: public GfxColorSpace {
240 public:
241
242 GfxLabColorSpace();
243 virtual ~GfxLabColorSpace();
244 virtual GfxColorSpace *copy();
245 virtual GfxColorSpaceMode getMode() { return csLab; }
246
247 // Construct a Lab color space. Returns NULL if unsuccessful.
248 static GfxColorSpace *parse(Array *arr);
249
250 virtual void getGray(GfxColor *color, double *gray);
251 virtual void getRGB(GfxColor *color, GfxRGB *rgb);
252 virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk);
253
254 virtual int getNComps() { return 3; }
255
256 virtual void getDefaultRanges(double *decodeLow, double *decodeRange,
257 int maxImgPixel);
258
259 // Lab-specific access.
260 double getWhiteX() { return whiteX; }
261 double getWhiteY() { return whiteY; }
262 double getWhiteZ() { return whiteZ; }
263 double getBlackX() { return blackX; }
264 double getBlackY() { return blackY; }
265 double getBlackZ() { return blackZ; }
266 double getAMin() { return aMin; }
267 double getAMax() { return aMax; }
268 double getBMin() { return bMin; }
269 double getBMax() { return bMax; }
270
271 private:
272
273 double whiteX, whiteY, whiteZ; // white point
274 double blackX, blackY, blackZ; // black point
275 double aMin, aMax, bMin, bMax; // range for the a and b components
276 double kr, kg, kb; // gamut mapping mulitpliers
277 };
278
279 //------------------------------------------------------------------------
280 // GfxICCBasedColorSpace
281 //------------------------------------------------------------------------
282
283 class GfxICCBasedColorSpace: public GfxColorSpace {
284 public:
285
286 GfxICCBasedColorSpace(int nComps, GfxColorSpace *alt,
287 Ref *iccProfileStream);
288 virtual ~GfxICCBasedColorSpace();
289 virtual GfxColorSpace *copy();
290 virtual GfxColorSpaceMode getMode() { return csICCBased; }
291
292 // Construct an ICCBased color space. Returns NULL if unsuccessful.
293 static GfxColorSpace *parse(Array *arr);
294
295 virtual void getGray(GfxColor *color, double *gray);
296 virtual void getRGB(GfxColor *color, GfxRGB *rgb);
297 virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk);
298
299 virtual int getNComps() { return nComps; }
300
301 virtual void getDefaultRanges(double *decodeLow, double *decodeRange,
302 int maxImgPixel);
303
304 // ICCBased-specific access.
305 GfxColorSpace *getAlt() { return alt; }
306
307 private:
308
309 int nComps; // number of color components (1, 3, or 4)
310 GfxColorSpace *alt; // alternate color space
311 double rangeMin[4]; // min values for each component
312 double rangeMax[4]; // max values for each component
313 Ref iccProfileStream; // the ICC profile
314 };
315
316 //------------------------------------------------------------------------
317 // GfxIndexedColorSpace
318 //------------------------------------------------------------------------
319
320 class GfxIndexedColorSpace: public GfxColorSpace {
321 public:
322
323 GfxIndexedColorSpace(GfxColorSpace *base, int indexHigh);
324 virtual ~GfxIndexedColorSpace();
325 virtual GfxColorSpace *copy();
326 virtual GfxColorSpaceMode getMode() { return csIndexed; }
327
328 // Construct a Lab color space. Returns NULL if unsuccessful.
329 static GfxColorSpace *parse(Array *arr);
330
331 virtual void getGray(GfxColor *color, double *gray);
332 virtual void getRGB(GfxColor *color, GfxRGB *rgb);
333 virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk);
334
335 virtual int getNComps() { return 1; }
336
337 virtual void getDefaultRanges(double *decodeLow, double *decodeRange,
338 int maxImgPixel);
339
340 // Indexed-specific access.
341 GfxColorSpace *getBase() { return base; }
342 int getIndexHigh() { return indexHigh; }
343 Guchar *getLookup() { return lookup; }
344
345 private:
346
347 GfxColorSpace *base; // base color space
348 int indexHigh; // max pixel value
349 Guchar *lookup; // lookup table
350 };
351
352 //------------------------------------------------------------------------
353 // GfxSeparationColorSpace
354 //------------------------------------------------------------------------
355
356 class GfxSeparationColorSpace: public GfxColorSpace {
357 public:
358
359 GfxSeparationColorSpace(GString *name, GfxColorSpace *alt,
360 Function *func);
361 virtual ~GfxSeparationColorSpace();
362 virtual GfxColorSpace *copy();
363 virtual GfxColorSpaceMode getMode() { return csSeparation; }
364
365 // Construct a Separation color space. Returns NULL if unsuccessful.
366 static GfxColorSpace *parse(Array *arr);
367
368 virtual void getGray(GfxColor *color, double *gray);
369 virtual void getRGB(GfxColor *color, GfxRGB *rgb);
370 virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk);
371
372 virtual int getNComps() { return 1; }
373
374 // Separation-specific access.
375 GString *getName() { return name; }
376 GfxColorSpace *getAlt() { return alt; }
377 Function *getFunc() { return func; }
378
379 private:
380
381 GString *name; // colorant name
382 GfxColorSpace *alt; // alternate color space
383 Function *func; // tint transform (into alternate color space)
384 };
385
386 //------------------------------------------------------------------------
387 // GfxDeviceNColorSpace
388 //------------------------------------------------------------------------
389
390 class GfxDeviceNColorSpace: public GfxColorSpace {
391 public:
392
393 GfxDeviceNColorSpace(int nComps, GfxColorSpace *alt, Function *func);
394 virtual ~GfxDeviceNColorSpace();
395 virtual GfxColorSpace *copy();
396 virtual GfxColorSpaceMode getMode() { return csDeviceN; }
397
398 // Construct a DeviceN color space. Returns NULL if unsuccessful.
399 static GfxColorSpace *parse(Array *arr);
400
401 virtual void getGray(GfxColor *color, double *gray);
402 virtual void getRGB(GfxColor *color, GfxRGB *rgb);
403 virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk);
404
405 virtual int getNComps() { return nComps; }
406
407 // DeviceN-specific access.
408 GfxColorSpace *getAlt() { return alt; }
409
410 private:
411
412 int nComps; // number of components
413 GString // colorant names
414 *names[gfxColorMaxComps];
415 GfxColorSpace *alt; // alternate color space
416 Function *func; // tint transform (into alternate color space)
417
418 };
419
420 //------------------------------------------------------------------------
421 // GfxPatternColorSpace
422 //------------------------------------------------------------------------
423
424 class GfxPatternColorSpace: public GfxColorSpace {
425 public:
426
427 GfxPatternColorSpace(GfxColorSpace *under);
428 virtual ~GfxPatternColorSpace();
429 virtual GfxColorSpace *copy();
430 virtual GfxColorSpaceMode getMode() { return csPattern; }
431
432 // Construct a Pattern color space. Returns NULL if unsuccessful.
433 static GfxColorSpace *parse(Array *arr);
434
435 virtual void getGray(GfxColor *color, double *gray);
436 virtual void getRGB(GfxColor *color, GfxRGB *rgb);
437 virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk);
438
439 virtual int getNComps() { return 0; }
440
441 // Pattern-specific access.
442 GfxColorSpace *getUnder() { return under; }
443
444 private:
445
446 GfxColorSpace *under; // underlying color space (for uncolored
447 // patterns)
448 };
449
450 //------------------------------------------------------------------------
451 // GfxPattern
452 //------------------------------------------------------------------------
453
454 class GfxPattern {
455 public:
456
457 GfxPattern(int type);
458 virtual ~GfxPattern();
459
460 static GfxPattern *parse(Object *obj);
461
462 virtual GfxPattern *copy() = 0;
463
464 int getType() { return type; }
465
466 private:
467
468 int type;
469 };
470
471 //------------------------------------------------------------------------
472 // GfxTilingPattern
473 //------------------------------------------------------------------------
474
475 class GfxTilingPattern: public GfxPattern {
476 public:
477
478 GfxTilingPattern(Dict *streamDict, Object *stream);
479 virtual ~GfxTilingPattern();
480
481 virtual GfxPattern *copy();
482
483 int getPaintType() { return paintType; }
484 int getTilingType() { return tilingType; }
485 double *getBBox() { return bbox; }
486 double getXStep() { return xStep; }
487 double getYStep() { return yStep; }
488 Dict *getResDict()
489 { return resDict.isDict() ? resDict.getDict() : (Dict *)NULL; }
490 double *getMatrix() { return matrix; }
491 Object *getContentStream() { return &contentStream; }
492
493 private:
494
495 GfxTilingPattern(GfxTilingPattern *pat);
496
497 int paintType;
498 int tilingType;
499 double bbox[4];
500 double xStep, yStep;
501 Object resDict;
502 double matrix[6];
503 Object contentStream;
504 };
505
506 //------------------------------------------------------------------------
507 // Function
508 //------------------------------------------------------------------------
509
510 #define funcMaxInputs 1
511 #define funcMaxOutputs 8
512
513 class Function {
514 public:
515
516 Function();
517
518 virtual ~Function();
519
520 // Construct a function. Returns NULL if unsuccessful.
521 static Function *parse(Object *funcObj);
522
523 // Initialize the entries common to all function types.
524 GBool init(Dict *dict);
525
526 virtual Function *copy() = 0;
527
528 // Return size of input and output tuples.
529 int getInputSize() { return m; }
530 int getOutputSize() { return n; }
531
532 // Transform an input tuple into an output tuple.
533 virtual void transform(double *in, double *out) = 0;
534
535 virtual GBool isOk() = 0;
536
537 protected:
538
539 int m, n; // size of input and output tuples
540 double // min and max values for function domain
541 domain[funcMaxInputs][2];
542 double // min and max values for function range
543 range[funcMaxOutputs][2];
544 GBool hasRange; // set if range is defined
545 };
546
547 //------------------------------------------------------------------------
548 // SampledFunction
549 //------------------------------------------------------------------------
550
551 class SampledFunction: public Function {
552 public:
553
554 SampledFunction(Object *funcObj, Dict *dict);
555 virtual ~SampledFunction();
556 virtual Function *copy() { return new SampledFunction(this); }
557 virtual void transform(double *in, double *out);
558 virtual GBool isOk() { return ok; }
559
560 private:
561
562 SampledFunction(SampledFunction *func);
563
564 int // number of samples for each domain element
565 sampleSize[funcMaxInputs];
566 double // min and max values for domain encoder
567 encode[funcMaxInputs][2];
568 double // min and max values for range decoder
569 decode[funcMaxOutputs][2];
570 double *samples; // the samples
571 GBool ok;
572 };
573
574 //------------------------------------------------------------------------
575 // ExponentialFunction
576 //------------------------------------------------------------------------
577
578 class ExponentialFunction: public Function {
579 public:
580
581 ExponentialFunction(Object *funcObj, Dict *dict);
582 virtual ~ExponentialFunction();
583 virtual Function *copy() { return new ExponentialFunction(this); }
584 virtual void transform(double *in, double *out);
585 virtual GBool isOk() { return ok; }
586
587 private:
588
589 ExponentialFunction(ExponentialFunction *func);
590
591 double c0[funcMaxOutputs];
592 double c1[funcMaxOutputs];
593 double e;
594 GBool ok;
595 };
596
597 //------------------------------------------------------------------------
598 // GfxImageColorMap
599 //------------------------------------------------------------------------
600
601 class GfxImageColorMap {
602 public:
603
604 // Constructor.
605 GfxImageColorMap(int bits, Object *decode, GfxColorSpace *colorSpace);
606
607 // Destructor.
608 ~GfxImageColorMap();
609
610 // Is color map valid?
611 GBool isOk() { return ok; }
612
613 // Get the color space.
614 GfxColorSpace *getColorSpace() { return colorSpace; }
615
616 // Get stream decoding info.
617 int getNumPixelComps() { return nComps; }
618 int getBits() { return bits; }
619
620 // Get decode table.
621 double getDecodeLow(int i) { return decodeLow[i]; }
622 double getDecodeHigh(int i) { return decodeLow[i] + decodeRange[i]; }
623
624 // Convert an image pixel to a color.
625 void getGray(Guchar *x, double *gray);
626 void getRGB(Guchar *x, GfxRGB *rgb);
627 void getCMYK(Guchar *x, GfxCMYK *cmyk);
628
629 private:
630
631 GfxColorSpace *colorSpace; // the image color space
632 int bits; // bits per component
633 int nComps; // number of components in a pixel
634 GfxColorSpace *colorSpace2; // secondary color space
635 int nComps2; // number of components in colorSpace2
636 double *lookup; // lookup table
637 double // minimum values for each component
638 decodeLow[gfxColorMaxComps];
639 double // max - min value for each component
640 decodeRange[gfxColorMaxComps];
641 GBool ok;
642 };
643
644 //------------------------------------------------------------------------
645 // GfxSubpath and GfxPath
646 //------------------------------------------------------------------------
647
648 class GfxSubpath {
649 public:
650
651 // Constructor.
652 GfxSubpath(double x1, double y1);
653
654 // Destructor.
655 ~GfxSubpath();
656
657 // Copy.
658 GfxSubpath *copy() { return new GfxSubpath(this); }
659
660 // Get points.
661 int getNumPoints() { return n; }
662 double getX(int i) { return x[i]; }
663 double getY(int i) { return y[i]; }
664 GBool getCurve(int i) { return curve[i]; }
665
666 // Get last point.
667 double getLastX() { return x[n-1]; }
668 double getLastY() { return y[n-1]; }
669
670 // Add a line segment.
671 void lineTo(double x1, double y1);
672
673 // Add a Bezier curve.
674 void curveTo(double x1, double y1, double x2, double y2,
675 double x3, double y3);
676
677 // Close the subpath.
678 void close();
679 GBool isClosed() { return closed; }
680
681 private:
682
683 double *x, *y; // points
684 GBool *curve; // curve[i] => point i is a control point
685 // for a Bezier curve
686 int n; // number of points
687 int size; // size of x/y arrays
688 GBool closed; // set if path is closed
689
690 GfxSubpath(GfxSubpath *subpath);
691 };
692
693 class GfxPath {
694 public:
695
696 // Constructor.
697 GfxPath();
698
699 // Destructor.
700 ~GfxPath();
701
702 // Copy.
703 GfxPath *copy()
704 { return new GfxPath(justMoved, firstX, firstY, subpaths, n, size); }
705
706 // Is there a current point?
707 GBool isCurPt() { return n > 0 || justMoved; }
708
709 // Is the path non-empty, i.e., is there at least one segment?
710 GBool isPath() { return n > 0; }
711
712 // Get subpaths.
713 int getNumSubpaths() { return n; }
714 GfxSubpath *getSubpath(int i) { return subpaths[i]; }
715
716 // Get last point on last subpath.
717 double getLastX() { return subpaths[n-1]->getLastX(); }
718 double getLastY() { return subpaths[n-1]->getLastY(); }
719
720 // Move the current point.
721 void moveTo(double x, double y);
722
723 // Add a segment to the last subpath.
724 void lineTo(double x, double y);
725
726 // Add a Bezier curve to the last subpath
727 void curveTo(double x1, double y1, double x2, double y2,
728 double x3, double y3);
729
730 // Close the last subpath.
731 void close() { subpaths[n-1]->close(); }
732
733 private:
734
735 GBool justMoved; // set if a new subpath was just started
736 double firstX, firstY; // first point in new subpath
737 GfxSubpath **subpaths; // subpaths
738 int n; // number of subpaths
739 int size; // size of subpaths array
740
741 GfxPath(GBool justMoved1, double firstX1, double firstY1,
742 GfxSubpath **subpaths1, int n1, int size1);
743 };
744
745 //------------------------------------------------------------------------
746 // GfxState
747 //------------------------------------------------------------------------
748
749 class GfxState {
750 public:
751
752 // Construct a default GfxState, for a device with resolution <dpi>,
753 // page box (<x1>,<y1>)-(<x2>,<y2>), page rotation <rotate>, and
754 // coordinate system specified by <upsideDown>.
755 GfxState(double dpi, double px1a, double py1a,
756 double px2a, double py2a, int rotate, GBool upsideDown);
757
758 // Destructor.
759 ~GfxState();
760
761 // Copy.
762 GfxState *copy() { return new GfxState(this); }
763
764 // Accessors.
765 double *getCTM() { return ctm; }
766 double getX1() { return px1; }
767 double getY1() { return py1; }
768 double getX2() { return px2; }
769 double getY2() { return py2; }
770 double getPageWidth() { return pageWidth; }
771 double getPageHeight() { return pageHeight; }
772 GfxColor *getFillColor() { return &fillColor; }
773 GfxColor *getStrokeColor() { return &strokeColor; }
774 void getFillRGB(GfxRGB *rgb)
775 { fillColorSpace->getRGB(&fillColor, rgb); }
776 void getStrokeRGB(GfxRGB *rgb)
777 { strokeColorSpace->getRGB(&strokeColor, rgb); }
778 void getFillCMYK(GfxCMYK *cmyk)
779 { fillColorSpace->getCMYK(&fillColor, cmyk); }
780 void getStrokeCMYK(GfxCMYK *cmyk)
781 { strokeColorSpace->getCMYK(&strokeColor, cmyk); }
782 GfxColorSpace *getFillColorSpace() { return fillColorSpace; }
783 GfxColorSpace *getStrokeColorSpace() { return strokeColorSpace; }
784 GfxPattern *getFillPattern() { return fillPattern; }
785 GfxPattern *getStrokePattern() { return strokePattern; }
786 double getFillOpacity() { return fillOpacity; }
787 double getStrokeOpacity() { return strokeOpacity; }
788 double getLineWidth() { return lineWidth; }
789 void getLineDash(double **dash, int *length, double *start)
790 { *dash = lineDash; *length = lineDashLength; *start = lineDashStart; }
791 int getFlatness() { return flatness; }
792 int getLineJoin() { return lineJoin; }
793 int getLineCap() { return lineCap; }
794 double getMiterLimit() { return miterLimit; }
795 GfxFont *getFont() { return font; }
796 double getFontSize() { return fontSize; }
797 double *getTextMat() { return textMat; }
798 double getCharSpace() { return charSpace; }
799 double getWordSpace() { return wordSpace; }
800 double getHorizScaling() { return horizScaling; }
801 double getLeading() { return leading; }
802 double getRise() { return rise; }
803 int getRender() { return render; }
804 GfxPath *getPath() { return path; }
805 double getCurX() { return curX; }
806 double getCurY() { return curY; }
807 double getLineX() { return lineX; }
808 double getLineY() { return lineY; }
809
810 // Is there a current point/path?
811 GBool isCurPt() { return path->isCurPt(); }
812 GBool isPath() { return path->isPath(); }
813
814 // Transforms.
815 void transform(double x1, double y1, double *x2, double *y2)
816 { *x2 = ctm[0] * x1 + ctm[2] * y1 + ctm[4];
817 *y2 = ctm[1] * x1 + ctm[3] * y1 + ctm[5]; }
818 void transformDelta(double x1, double y1, double *x2, double *y2)
819 { *x2 = ctm[0] * x1 + ctm[2] * y1;
820 *y2 = ctm[1] * x1 + ctm[3] * y1; }
821 void textTransform(double x1, double y1, double *x2, double *y2)
822 { *x2 = textMat[0] * x1 + textMat[2] * y1 + textMat[4];
823 *y2 = textMat[1] * x1 + textMat[3] * y1 + textMat[5]; }
824 void textTransformDelta(double x1, double y1, double *x2, double *y2)
825 { *x2 = textMat[0] * x1 + textMat[2] * y1;
826 *y2 = textMat[1] * x1 + textMat[3] * y1; }
827 double transformWidth(double w);
828 double getTransformedLineWidth()
829 { return transformWidth(lineWidth); }
830 double getTransformedFontSize();
831 void getFontTransMat(double *m11, double *m12, double *m21, double *m22);
832
833 // Change state parameters.
834 void setCTM(double a, double b, double c,
835 double d, double e, double f);
836 void concatCTM(double a, double b, double c,
837 double d, double e, double f);
838 void setFillColorSpace(GfxColorSpace *colorSpace);
839 void setStrokeColorSpace(GfxColorSpace *colorSpace);
840 void setFillColor(GfxColor *color) { fillColor = *color; }
841 void setStrokeColor(GfxColor *color) { strokeColor = *color; }
842 void setFillPattern(GfxPattern *pattern);
843 void setStrokePattern(GfxPattern *pattern);
844 void setFillOpacity(double opac) { fillOpacity = opac; }
845 void setStrokeOpacity(double opac) { strokeOpacity = opac; }
846 void setLineWidth(double width) { lineWidth = width; }
847 void setLineDash(double *dash, int length, double start);
848 void setFlatness(int flatness1) { flatness = flatness1; }
849 void setLineJoin(int lineJoin1) { lineJoin = lineJoin1; }
850 void setLineCap(int lineCap1) { lineCap = lineCap1; }
851 void setMiterLimit(double miterLimit1) { miterLimit = miterLimit1; }
852 void setFont(GfxFont *font1, double fontSize1)
853 { font = font1; fontSize = fontSize1; }
854 void setTextMat(double a, double b, double c,
855 double d, double e, double f)
856 { textMat[0] = a; textMat[1] = b; textMat[2] = c;
857 textMat[3] = d; textMat[4] = e; textMat[5] = f; }
858 void setCharSpace(double space)
859 { charSpace = space; }
860 void setWordSpace(double space)
861 { wordSpace = space; }
862 void setHorizScaling(double scale)
863 { horizScaling = 0.01 * scale; }
864 void setLeading(double leading1)
865 { leading = leading1; }
866 void setRise(double rise1)
867 { rise = rise1; }
868 void setRender(int render1)
869 { render = render1; }
870
871 // Add to path.
872 void moveTo(double x, double y)
873 { path->moveTo(curX = x, curY = y); }
874 void lineTo(double x, double y)
875 { path->lineTo(curX = x, curY = y); }
876 void curveTo(double x1, double y1, double x2, double y2,
877 double x3, double y3)
878 { path->curveTo(x1, y1, x2, y2, curX = x3, curY = y3); }
879 void closePath()
880 { path->close(); curX = path->getLastX(); curY = path->getLastY(); }
881 void clearPath();
882
883 // Text position.
884 void textMoveTo(double tx, double ty)
885 { lineX = tx; lineY = ty; textTransform(tx, ty, &curX, &curY); }
886 void textShift(double tx);
887 void textShift(double tx, double ty);
888
889 // Push/pop GfxState on/off stack.
890 GfxState *save();
891 GfxState *restore();
892 GBool hasSaves() { return saved != NULL; }
893
894 private:
895
896 double ctm[6]; // coord transform matrix
897 double px1, py1, px2, py2; // page corners (user coords)
898 double pageWidth, pageHeight; // page size (pixels)
899
900 GfxColorSpace *fillColorSpace; // fill color space
901 GfxColorSpace *strokeColorSpace; // stroke color space
902 GfxColor fillColor; // fill color
903 GfxColor strokeColor; // stroke color
904 GfxPattern *fillPattern; // fill pattern
905 GfxPattern *strokePattern; // stroke pattern
906 double fillOpacity; // fill opacity
907 double strokeOpacity; // stroke opacity
908
909 double lineWidth; // line width
910 double *lineDash; // line dash
911 int lineDashLength;
912 double lineDashStart;
913 int flatness; // curve flatness
914 int lineJoin; // line join style
915 int lineCap; // line cap style
916 double miterLimit; // line miter limit
917
918 GfxFont *font; // font
919 double fontSize; // font size
920 double textMat[6]; // text matrix
921 double charSpace; // character spacing
922 double wordSpace; // word spacing
923 double horizScaling; // horizontal scaling
924 double leading; // text leading
925 double rise; // text rise
926 int render; // text rendering mode
927
928 GfxPath *path; // array of path elements
929 double curX, curY; // current point (user coords)
930 double lineX, lineY; // start of current text line (text coords)
931
932 GfxState *saved; // next GfxState on stack
933
934 GfxState(GfxState *state);
935 };
936
937 #endif