1
//========================================================================
5
// Copyright 1996 Derek B. Noonburg
7
//========================================================================
24
//------------------------------------------------------------------------
26
//------------------------------------------------------------------------
28
#define gfxColorMaxComps funcMaxOutputs
31
double c[gfxColorMaxComps];
34
//------------------------------------------------------------------------
36
//------------------------------------------------------------------------
42
//------------------------------------------------------------------------
44
//------------------------------------------------------------------------
50
//------------------------------------------------------------------------
52
//------------------------------------------------------------------------
54
enum GfxColorSpaceMode {
72
virtual ~GfxColorSpace();
73
virtual GfxColorSpace *copy() = 0;
74
virtual GfxColorSpaceMode getMode() = 0;
76
// Construct a color space. Returns NULL if unsuccessful.
77
static GfxColorSpace *parse(Object *csObj);
79
// Convert to gray, RGB, or CMYK.
80
virtual void getGray(GfxColor *color, double *gray) = 0;
81
virtual void getRGB(GfxColor *color, GfxRGB *rgb) = 0;
82
virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk) = 0;
84
// Return the number of color components.
85
virtual int getNComps() = 0;
87
// Return the default ranges for each component, assuming an image
88
// with a max pixel value of <maxImgPixel>.
89
virtual void getDefaultRanges(double *decodeLow, double *decodeRange,
95
//------------------------------------------------------------------------
96
// GfxDeviceGrayColorSpace
97
//------------------------------------------------------------------------
99
class GfxDeviceGrayColorSpace: public GfxColorSpace {
102
GfxDeviceGrayColorSpace();
103
virtual ~GfxDeviceGrayColorSpace();
104
virtual GfxColorSpace *copy();
105
virtual GfxColorSpaceMode getMode() { return csDeviceGray; }
107
virtual void getGray(GfxColor *color, double *gray);
108
virtual void getRGB(GfxColor *color, GfxRGB *rgb);
109
virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk);
111
virtual int getNComps() { return 1; }
116
//------------------------------------------------------------------------
117
// GfxCalGrayColorSpace
118
//------------------------------------------------------------------------
120
class GfxCalGrayColorSpace: public GfxColorSpace {
123
GfxCalGrayColorSpace();
124
virtual ~GfxCalGrayColorSpace();
125
virtual GfxColorSpace *copy();
126
virtual GfxColorSpaceMode getMode() { return csCalGray; }
128
// Construct a CalGray color space. Returns NULL if unsuccessful.
129
static GfxColorSpace *parse(Array *arr);
131
virtual void getGray(GfxColor *color, double *gray);
132
virtual void getRGB(GfxColor *color, GfxRGB *rgb);
133
virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk);
135
virtual int getNComps() { return 1; }
137
// CalGray-specific access.
138
double getWhiteX() { return whiteX; }
139
double getWhiteY() { return whiteY; }
140
double getWhiteZ() { return whiteZ; }
141
double getBlackX() { return blackX; }
142
double getBlackY() { return blackY; }
143
double getBlackZ() { return blackZ; }
144
double getGamma() { return gamma; }
148
double whiteX, whiteY, whiteZ; // white point
149
double blackX, blackY, blackZ; // black point
150
double gamma; // gamma value
153
//------------------------------------------------------------------------
154
// GfxDeviceRGBColorSpace
155
//------------------------------------------------------------------------
157
class GfxDeviceRGBColorSpace: public GfxColorSpace {
160
GfxDeviceRGBColorSpace();
161
virtual ~GfxDeviceRGBColorSpace();
162
virtual GfxColorSpace *copy();
163
virtual GfxColorSpaceMode getMode() { return csDeviceRGB; }
165
virtual void getGray(GfxColor *color, double *gray);
166
virtual void getRGB(GfxColor *color, GfxRGB *rgb);
167
virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk);
169
virtual int getNComps() { return 3; }
174
//------------------------------------------------------------------------
175
// GfxCalRGBColorSpace
176
//------------------------------------------------------------------------
178
class GfxCalRGBColorSpace: public GfxColorSpace {
181
GfxCalRGBColorSpace();
182
virtual ~GfxCalRGBColorSpace();
183
virtual GfxColorSpace *copy();
184
virtual GfxColorSpaceMode getMode() { return csCalRGB; }
186
// Construct a CalRGB color space. Returns NULL if unsuccessful.
187
static GfxColorSpace *parse(Array *arr);
189
virtual void getGray(GfxColor *color, double *gray);
190
virtual void getRGB(GfxColor *color, GfxRGB *rgb);
191
virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk);
193
virtual int getNComps() { return 3; }
195
// CalRGB-specific access.
196
double getWhiteX() { return whiteX; }
197
double getWhiteY() { return whiteY; }
198
double getWhiteZ() { return whiteZ; }
199
double getBlackX() { return blackX; }
200
double getBlackY() { return blackY; }
201
double getBlackZ() { return blackZ; }
202
double getGammaR() { return gammaR; }
203
double getGammaG() { return gammaG; }
204
double getGammaB() { return gammaB; }
205
double *getMatrix() { return mat; }
209
double whiteX, whiteY, whiteZ; // white point
210
double blackX, blackY, blackZ; // black point
211
double gammaR, gammaG, gammaB; // gamma values
212
double mat[9]; // ABC -> XYZ transform matrix
215
//------------------------------------------------------------------------
216
// GfxDeviceCMYKColorSpace
217
//------------------------------------------------------------------------
219
class GfxDeviceCMYKColorSpace: public GfxColorSpace {
222
GfxDeviceCMYKColorSpace();
223
virtual ~GfxDeviceCMYKColorSpace();
224
virtual GfxColorSpace *copy();
225
virtual GfxColorSpaceMode getMode() { return csDeviceCMYK; }
227
virtual void getGray(GfxColor *color, double *gray);
228
virtual void getRGB(GfxColor *color, GfxRGB *rgb);
229
virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk);
231
virtual int getNComps() { return 4; }
236
//------------------------------------------------------------------------
238
//------------------------------------------------------------------------
240
class GfxLabColorSpace: public GfxColorSpace {
244
virtual ~GfxLabColorSpace();
245
virtual GfxColorSpace *copy();
246
virtual GfxColorSpaceMode getMode() { return csLab; }
248
// Construct a Lab color space. Returns NULL if unsuccessful.
249
static GfxColorSpace *parse(Array *arr);
251
virtual void getGray(GfxColor *color, double *gray);
252
virtual void getRGB(GfxColor *color, GfxRGB *rgb);
253
virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk);
255
virtual int getNComps() { return 3; }
257
virtual void getDefaultRanges(double *decodeLow, double *decodeRange,
260
// Lab-specific access.
261
double getWhiteX() { return whiteX; }
262
double getWhiteY() { return whiteY; }
263
double getWhiteZ() { return whiteZ; }
264
double getBlackX() { return blackX; }
265
double getBlackY() { return blackY; }
266
double getBlackZ() { return blackZ; }
267
double getAMin() { return aMin; }
268
double getAMax() { return aMax; }
269
double getBMin() { return bMin; }
270
double getBMax() { return bMax; }
274
double whiteX, whiteY, whiteZ; // white point
275
double blackX, blackY, blackZ; // black point
276
double aMin, aMax, bMin, bMax; // range for the a and b components
277
double kr, kg, kb; // gamut mapping mulitpliers
280
//------------------------------------------------------------------------
281
// GfxICCBasedColorSpace
282
//------------------------------------------------------------------------
284
class GfxICCBasedColorSpace: public GfxColorSpace {
287
GfxICCBasedColorSpace(int nCompsA, GfxColorSpace *altA,
288
Ref *iccProfileStreamA);
289
virtual ~GfxICCBasedColorSpace();
290
virtual GfxColorSpace *copy();
291
virtual GfxColorSpaceMode getMode() { return csICCBased; }
293
// Construct an ICCBased color space. Returns NULL if unsuccessful.
294
static GfxColorSpace *parse(Array *arr);
296
virtual void getGray(GfxColor *color, double *gray);
297
virtual void getRGB(GfxColor *color, GfxRGB *rgb);
298
virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk);
300
virtual int getNComps() { return nComps; }
302
virtual void getDefaultRanges(double *decodeLow, double *decodeRange,
305
// ICCBased-specific access.
306
GfxColorSpace *getAlt() { return alt; }
310
int nComps; // number of color components (1, 3, or 4)
311
GfxColorSpace *alt; // alternate color space
312
double rangeMin[4]; // min values for each component
313
double rangeMax[4]; // max values for each component
314
Ref iccProfileStream; // the ICC profile
317
//------------------------------------------------------------------------
318
// GfxIndexedColorSpace
319
//------------------------------------------------------------------------
321
class GfxIndexedColorSpace: public GfxColorSpace {
324
GfxIndexedColorSpace(GfxColorSpace *baseA, int indexHighA);
325
virtual ~GfxIndexedColorSpace();
326
virtual GfxColorSpace *copy();
327
virtual GfxColorSpaceMode getMode() { return csIndexed; }
329
// Construct a Lab color space. Returns NULL if unsuccessful.
330
static GfxColorSpace *parse(Array *arr);
332
virtual void getGray(GfxColor *color, double *gray);
333
virtual void getRGB(GfxColor *color, GfxRGB *rgb);
334
virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk);
336
virtual int getNComps() { return 1; }
338
virtual void getDefaultRanges(double *decodeLow, double *decodeRange,
341
// Indexed-specific access.
342
GfxColorSpace *getBase() { return base; }
343
int getIndexHigh() { return indexHigh; }
344
Guchar *getLookup() { return lookup; }
348
GfxColorSpace *base; // base color space
349
int indexHigh; // max pixel value
350
Guchar *lookup; // lookup table
353
//------------------------------------------------------------------------
354
// GfxSeparationColorSpace
355
//------------------------------------------------------------------------
357
class GfxSeparationColorSpace: public GfxColorSpace {
360
GfxSeparationColorSpace(GString *nameA, GfxColorSpace *altA,
362
virtual ~GfxSeparationColorSpace();
363
virtual GfxColorSpace *copy();
364
virtual GfxColorSpaceMode getMode() { return csSeparation; }
366
// Construct a Separation color space. Returns NULL if unsuccessful.
367
static GfxColorSpace *parse(Array *arr);
369
virtual void getGray(GfxColor *color, double *gray);
370
virtual void getRGB(GfxColor *color, GfxRGB *rgb);
371
virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk);
373
virtual int getNComps() { return 1; }
375
// Separation-specific access.
376
GString *getName() { return name; }
377
GfxColorSpace *getAlt() { return alt; }
378
Function *getFunc() { return func; }
382
GString *name; // colorant name
383
GfxColorSpace *alt; // alternate color space
384
Function *func; // tint transform (into alternate color space)
387
//------------------------------------------------------------------------
388
// GfxDeviceNColorSpace
389
//------------------------------------------------------------------------
391
class GfxDeviceNColorSpace: public GfxColorSpace {
394
GfxDeviceNColorSpace(int nComps, GfxColorSpace *alt, Function *func);
395
virtual ~GfxDeviceNColorSpace();
396
virtual GfxColorSpace *copy();
397
virtual GfxColorSpaceMode getMode() { return csDeviceN; }
399
// Construct a DeviceN color space. Returns NULL if unsuccessful.
400
static GfxColorSpace *parse(Array *arr);
402
virtual void getGray(GfxColor *color, double *gray);
403
virtual void getRGB(GfxColor *color, GfxRGB *rgb);
404
virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk);
406
virtual int getNComps() { return nComps; }
408
// DeviceN-specific access.
409
GfxColorSpace *getAlt() { return alt; }
413
int nComps; // number of components
414
GString // colorant names
415
*names[gfxColorMaxComps];
416
GfxColorSpace *alt; // alternate color space
417
Function *func; // tint transform (into alternate color space)
421
//------------------------------------------------------------------------
422
// GfxPatternColorSpace
423
//------------------------------------------------------------------------
425
class GfxPatternColorSpace: public GfxColorSpace {
428
GfxPatternColorSpace(GfxColorSpace *underA);
429
virtual ~GfxPatternColorSpace();
430
virtual GfxColorSpace *copy();
431
virtual GfxColorSpaceMode getMode() { return csPattern; }
433
// Construct a Pattern color space. Returns NULL if unsuccessful.
434
static GfxColorSpace *parse(Array *arr);
436
virtual void getGray(GfxColor *color, double *gray);
437
virtual void getRGB(GfxColor *color, GfxRGB *rgb);
438
virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk);
440
virtual int getNComps() { return 0; }
442
// Pattern-specific access.
443
GfxColorSpace *getUnder() { return under; }
447
GfxColorSpace *under; // underlying color space (for uncolored
451
//------------------------------------------------------------------------
453
//------------------------------------------------------------------------
458
GfxPattern(int typeA);
459
virtual ~GfxPattern();
461
static GfxPattern *parse(Object *obj);
463
virtual GfxPattern *copy() = 0;
465
int getType() { return type; }
472
//------------------------------------------------------------------------
474
//------------------------------------------------------------------------
476
class GfxTilingPattern: public GfxPattern {
479
GfxTilingPattern(Dict *streamDict, Object *stream);
480
virtual ~GfxTilingPattern();
482
virtual GfxPattern *copy();
484
int getPaintType() { return paintType; }
485
int getTilingType() { return tilingType; }
486
double *getBBox() { return bbox; }
487
double getXStep() { return xStep; }
488
double getYStep() { return yStep; }
490
{ return resDict.isDict() ? resDict.getDict() : (Dict *)NULL; }
491
double *getMatrix() { return matrix; }
492
Object *getContentStream() { return &contentStream; }
496
GfxTilingPattern(GfxTilingPattern *pat);
504
Object contentStream;
507
//------------------------------------------------------------------------
509
//------------------------------------------------------------------------
511
class GfxImageColorMap {
515
GfxImageColorMap(int bitsA, Object *decode, GfxColorSpace *colorSpaceA);
520
// Is color map valid?
521
GBool isOk() { return ok; }
523
// Get the color space.
524
GfxColorSpace *getColorSpace() { return colorSpace; }
526
// Get stream decoding info.
527
int getNumPixelComps() { return nComps; }
528
int getBits() { return bits; }
531
double getDecodeLow(int i) { return decodeLow[i]; }
532
double getDecodeHigh(int i) { return decodeLow[i] + decodeRange[i]; }
534
// Convert an image pixel to a color.
535
void getGray(Guchar *x, double *gray);
536
void getRGB(Guchar *x, GfxRGB *rgb);
537
void getCMYK(Guchar *x, GfxCMYK *cmyk);
541
GfxColorSpace *colorSpace; // the image color space
542
int bits; // bits per component
543
int nComps; // number of components in a pixel
544
GfxColorSpace *colorSpace2; // secondary color space
545
int nComps2; // number of components in colorSpace2
546
double *lookup; // lookup table
547
double // minimum values for each component
548
decodeLow[gfxColorMaxComps];
549
double // max - min value for each component
550
decodeRange[gfxColorMaxComps];
554
//------------------------------------------------------------------------
555
// GfxSubpath and GfxPath
556
//------------------------------------------------------------------------
562
GfxSubpath(double x1, double y1);
568
GfxSubpath *copy() { return new GfxSubpath(this); }
571
int getNumPoints() { return n; }
572
double getX(int i) { return x[i]; }
573
double getY(int i) { return y[i]; }
574
GBool getCurve(int i) { return curve[i]; }
577
double getLastX() { return x[n-1]; }
578
double getLastY() { return y[n-1]; }
580
// Add a line segment.
581
void lineTo(double x1, double y1);
583
// Add a Bezier curve.
584
void curveTo(double x1, double y1, double x2, double y2,
585
double x3, double y3);
587
// Close the subpath.
589
GBool isClosed() { return closed; }
593
double *x, *y; // points
594
GBool *curve; // curve[i] => point i is a control point
595
// for a Bezier curve
596
int n; // number of points
597
int size; // size of x/y arrays
598
GBool closed; // set if path is closed
600
GfxSubpath(GfxSubpath *subpath);
614
{ return new GfxPath(justMoved, firstX, firstY, subpaths, n, size); }
616
// Is there a current point?
617
GBool isCurPt() { return n > 0 || justMoved; }
619
// Is the path non-empty, i.e., is there at least one segment?
620
GBool isPath() { return n > 0; }
623
int getNumSubpaths() { return n; }
624
GfxSubpath *getSubpath(int i) { return subpaths[i]; }
626
// Get last point on last subpath.
627
double getLastX() { return subpaths[n-1]->getLastX(); }
628
double getLastY() { return subpaths[n-1]->getLastY(); }
630
// Move the current point.
631
void moveTo(double x, double y);
633
// Add a segment to the last subpath.
634
void lineTo(double x, double y);
636
// Add a Bezier curve to the last subpath
637
void curveTo(double x1, double y1, double x2, double y2,
638
double x3, double y3);
640
// Close the last subpath.
641
void close() { subpaths[n-1]->close(); }
645
GBool justMoved; // set if a new subpath was just started
646
double firstX, firstY; // first point in new subpath
647
GfxSubpath **subpaths; // subpaths
648
int n; // number of subpaths
649
int size; // size of subpaths array
651
GfxPath(GBool justMoved1, double firstX1, double firstY1,
652
GfxSubpath **subpaths1, int n1, int size1);
655
//------------------------------------------------------------------------
657
//------------------------------------------------------------------------
662
// Construct a default GfxState, for a device with resolution <dpi>,
663
// page box <pageBox>, page rotation <rotate>, and coordinate system
664
// specified by <upsideDown>.
665
GfxState(double dpi, PDFRectangle *pageBox, int rotate,
672
GfxState *copy() { return new GfxState(this); }
675
double *getCTM() { return ctm; }
676
double getX1() { return px1; }
677
double getY1() { return py1; }
678
double getX2() { return px2; }
679
double getY2() { return py2; }
680
double getPageWidth() { return pageWidth; }
681
double getPageHeight() { return pageHeight; }
682
GfxColor *getFillColor() { return &fillColor; }
683
GfxColor *getStrokeColor() { return &strokeColor; }
684
void getFillGray(double *gray)
685
{ fillColorSpace->getGray(&fillColor, gray); }
686
void getStrokeGray(double *gray)
687
{ strokeColorSpace->getGray(&fillColor, gray); }
688
void getFillRGB(GfxRGB *rgb)
689
{ fillColorSpace->getRGB(&fillColor, rgb); }
690
void getStrokeRGB(GfxRGB *rgb)
691
{ strokeColorSpace->getRGB(&strokeColor, rgb); }
692
void getFillCMYK(GfxCMYK *cmyk)
693
{ fillColorSpace->getCMYK(&fillColor, cmyk); }
694
void getStrokeCMYK(GfxCMYK *cmyk)
695
{ strokeColorSpace->getCMYK(&strokeColor, cmyk); }
696
GfxColorSpace *getFillColorSpace() { return fillColorSpace; }
697
GfxColorSpace *getStrokeColorSpace() { return strokeColorSpace; }
698
GfxPattern *getFillPattern() { return fillPattern; }
699
GfxPattern *getStrokePattern() { return strokePattern; }
700
double getFillOpacity() { return fillOpacity; }
701
double getStrokeOpacity() { return strokeOpacity; }
702
double getLineWidth() { return lineWidth; }
703
void getLineDash(double **dash, int *length, double *start)
704
{ *dash = lineDash; *length = lineDashLength; *start = lineDashStart; }
705
int getFlatness() { return flatness; }
706
int getLineJoin() { return lineJoin; }
707
int getLineCap() { return lineCap; }
708
double getMiterLimit() { return miterLimit; }
709
GfxFont *getFont() { return font; }
710
double getFontSize() { return fontSize; }
711
double *getTextMat() { return textMat; }
712
double getCharSpace() { return charSpace; }
713
double getWordSpace() { return wordSpace; }
714
double getHorizScaling() { return horizScaling; }
715
double getLeading() { return leading; }
716
double getRise() { return rise; }
717
int getRender() { return render; }
718
GfxPath *getPath() { return path; }
719
double getCurX() { return curX; }
720
double getCurY() { return curY; }
721
double getLineX() { return lineX; }
722
double getLineY() { return lineY; }
724
// Is there a current point/path?
725
GBool isCurPt() { return path->isCurPt(); }
726
GBool isPath() { return path->isPath(); }
729
void transform(double x1, double y1, double *x2, double *y2)
730
{ *x2 = ctm[0] * x1 + ctm[2] * y1 + ctm[4];
731
*y2 = ctm[1] * x1 + ctm[3] * y1 + ctm[5]; }
732
void transformDelta(double x1, double y1, double *x2, double *y2)
733
{ *x2 = ctm[0] * x1 + ctm[2] * y1;
734
*y2 = ctm[1] * x1 + ctm[3] * y1; }
735
void textTransform(double x1, double y1, double *x2, double *y2)
736
{ *x2 = textMat[0] * x1 + textMat[2] * y1 + textMat[4];
737
*y2 = textMat[1] * x1 + textMat[3] * y1 + textMat[5]; }
738
void textTransformDelta(double x1, double y1, double *x2, double *y2)
739
{ *x2 = textMat[0] * x1 + textMat[2] * y1;
740
*y2 = textMat[1] * x1 + textMat[3] * y1; }
741
double transformWidth(double w);
742
double getTransformedLineWidth()
743
{ return transformWidth(lineWidth); }
744
double getTransformedFontSize();
745
void getFontTransMat(double *m11, double *m12, double *m21, double *m22);
747
// Change state parameters.
748
void setCTM(double a, double b, double c,
749
double d, double e, double f);
750
void concatCTM(double a, double b, double c,
751
double d, double e, double f);
752
void setFillColorSpace(GfxColorSpace *colorSpace);
753
void setStrokeColorSpace(GfxColorSpace *colorSpace);
754
void setFillColor(GfxColor *color) { fillColor = *color; }
755
void setStrokeColor(GfxColor *color) { strokeColor = *color; }
756
void setFillPattern(GfxPattern *pattern);
757
void setStrokePattern(GfxPattern *pattern);
758
void setFillOpacity(double opac) { fillOpacity = opac; }
759
void setStrokeOpacity(double opac) { strokeOpacity = opac; }
760
void setLineWidth(double width) { lineWidth = width; }
761
void setLineDash(double *dash, int length, double start);
762
void setFlatness(int flatness1) { flatness = flatness1; }
763
void setLineJoin(int lineJoin1) { lineJoin = lineJoin1; }
764
void setLineCap(int lineCap1) { lineCap = lineCap1; }
765
void setMiterLimit(double limit) { miterLimit = limit; }
766
void setFont(GfxFont *fontA, double fontSizeA)
767
{ font = fontA; fontSize = fontSizeA; }
768
void setTextMat(double a, double b, double c,
769
double d, double e, double f)
770
{ textMat[0] = a; textMat[1] = b; textMat[2] = c;
771
textMat[3] = d; textMat[4] = e; textMat[5] = f; }
772
void setCharSpace(double space)
773
{ charSpace = space; }
774
void setWordSpace(double space)
775
{ wordSpace = space; }
776
void setHorizScaling(double scale)
777
{ horizScaling = 0.01 * scale; }
778
void setLeading(double leadingA)
779
{ leading = leadingA; }
780
void setRise(double riseA)
782
void setRender(int renderA)
783
{ render = renderA; }
786
void moveTo(double x, double y)
787
{ path->moveTo(curX = x, curY = y); }
788
void lineTo(double x, double y)
789
{ path->lineTo(curX = x, curY = y); }
790
void curveTo(double x1, double y1, double x2, double y2,
791
double x3, double y3)
792
{ path->curveTo(x1, y1, x2, y2, curX = x3, curY = y3); }
794
{ path->close(); curX = path->getLastX(); curY = path->getLastY(); }
798
void textMoveTo(double tx, double ty)
799
{ lineX = tx; lineY = ty; textTransform(tx, ty, &curX, &curY); }
800
void textShift(double tx);
801
void textShift(double tx, double ty);
803
// Push/pop GfxState on/off stack.
806
GBool hasSaves() { return saved != NULL; }
810
double ctm[6]; // coord transform matrix
811
double px1, py1, px2, py2; // page corners (user coords)
812
double pageWidth, pageHeight; // page size (pixels)
814
GfxColorSpace *fillColorSpace; // fill color space
815
GfxColorSpace *strokeColorSpace; // stroke color space
816
GfxColor fillColor; // fill color
817
GfxColor strokeColor; // stroke color
818
GfxPattern *fillPattern; // fill pattern
819
GfxPattern *strokePattern; // stroke pattern
820
double fillOpacity; // fill opacity
821
double strokeOpacity; // stroke opacity
823
double lineWidth; // line width
824
double *lineDash; // line dash
826
double lineDashStart;
827
int flatness; // curve flatness
828
int lineJoin; // line join style
829
int lineCap; // line cap style
830
double miterLimit; // line miter limit
832
GfxFont *font; // font
833
double fontSize; // font size
834
double textMat[6]; // text matrix
835
double charSpace; // character spacing
836
double wordSpace; // word spacing
837
double horizScaling; // horizontal scaling
838
double leading; // text leading
839
double rise; // text rise
840
int render; // text rendering mode
842
GfxPath *path; // array of path elements
843
double curX, curY; // current point (user coords)
844
double lineX, lineY; // start of current text line (text coords)
846
GfxState *saved; // next GfxState on stack
848
GfxState(GfxState *state);