/* * Copyright 2013 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef SkPdfGraphicsState_DEFINED #define SkPdfGraphicsState_DEFINED #include "SkCanvas.h" #include "SkPaint.h" #include "SkPdfConfig.h" #include "SkPdfUtils.h" class SkPdfFont; class SkPdfNativeObject; class SkPdfResourceDictionary; class SkPdfSoftMaskDictionary; /** \class SkPdfColorOperator * Operates on stroking or non-stroking properties. */ class SkPdfColorOperator { /* color space name or array The current color space in which color values are to be interpreted (see Section 4.5, “Color Spaces”). There are two separate color space parameters: one for stroking and one for all other painting opera- tions. Initial value: DeviceGray. */ // TODO(edisonn): implement the array part too // TODO(edisonn): remove this public, let fields be private public: NotOwnedString fColorSpace; SkPdfNativeObject* fPattern; /* color (various) The current color to be used during painting operations (see Section 4.5, “Color Spaces”). The type and interpretation of this parameter depend on the current color space; for most color spaces, a color value consists of one to four numbers. There are two separate color parameters: one for stroking and one for all other painting opera- tions. Initial value: black. */ SkColor fColor; double fOpacity; // ca or CA public: void setRGBColor(SkColor color) { // TODO(edisonn): ASSERT DeviceRGB is the color space. fPattern = NULL; fColor = color; } // TODO(edisonn): implement the default values for all fields. SkPdfColorOperator() : fPattern(NULL), fColor(SK_ColorBLACK), fOpacity(1) { NotOwnedString::init(&fColorSpace, "DeviceRGB"); } void setColorSpace(NotOwnedString* colorSpace) { fColorSpace = *colorSpace; fPattern = NULL; } void setPatternColorSpace(SkPdfNativeObject* pattern) { fColorSpace.fBuffer = (const unsigned char*)"Pattern"; fColorSpace.fBytes = 7; // strlen("Pattern") fPattern = pattern; } void applyGraphicsState(SkPaint* paint) { paint->setColor(SkColorSetA(fColor, (U8CPU)(fOpacity * 255))); } }; /** * Operates on stroking or non-stroking properties. */ struct SkPdfGraphicsState { // TODO(edisonn): deprecate and remove these! double fCurPosX; double fCurPosY; double fCurFontSize; bool fTextBlock; SkPdfFont* fSkFont; SkPath fPath; bool fPathClosed; double fTextLeading; double fWordSpace; double fCharSpace; SkPdfResourceDictionary* fResources; // TODO(edisonn): Can we move most of these in canvas/paint? // Might need to strore some properties in 2 paints (stroking paint and non stroking paint) // TABLE 4.2 Device-independent graphics state parameters /* * CTM array The current transformation matrix, which maps positions from user coordinates to device coordinates (see Section 4.2, “Coordinate Sys- tems”). This matrix is modified by each application of the coordi- nate transformation operator, cm. Initial value: a matrix that transforms default user coordinates to device coordinates. */ SkMatrix fCTM; SkMatrix fContentStreamMatrix; /* clipping path (internal) The current clipping path, which defines the boundary against which all output is to be cropped (see Section 4.4.3, “Clipping Path Operators”). Initial value: the boundary of the entire imageable portion of the output page. */ // Clip that is applied after the drawing is done!!! bool fHasClipPathToApply; SkPath fClipPath; SkPdfColorOperator fStroking; SkPdfColorOperator fNonStroking; /* text state (various) A set of nine graphics state parameters that pertain only to the painting of text. These include parameters that select the font, scale the glyphs to an appropriate size, and accomplish other effects. The text state parameters are described in Section 5.2, “Text State Parameters and Operators.” */ // TODO(edisonn): add SkPdfTextState class. remove these two existing fields SkMatrix fMatrixTm; SkMatrix fMatrixTlm; /* line width number The thickness, in user space units, of paths to be stroked (see “Line Width” on page 152). Initial value: 1.0. */ double fLineWidth; /* line cap integer A code specifying the shape of the endpoints for any open path that is stroked (see “Line Cap Style” on page 153). Initial value: 0, for square butt caps. */ // TODO (edisonn): implement defaults - page 153 int fLineCap; /* line join integer A code specifying the shape of joints between connected segments of a stroked path (see “Line Join Style” on page 153). Initial value: 0, for mitered joins. */ // TODO (edisonn): implement defaults - page 153 int fLineJoin; /* miter limit number The maximum length of mitered line joins for stroked paths (see “Miter Limit” on page 153). This parameter limits the length of “spikes” produced when line segments join at sharp angles. Initial value: 10.0, for a miter cutoff below approximately 11.5 degrees. */ // TODO (edisonn): implement defaults - page 153 double fMiterLimit; /* dash pattern array and A description of the dash pattern to be used when paths are number stroked (see “Line Dash Pattern” on page 155). Initial value: a solid line. */ SkScalar fDashArray[256]; // TODO(edisonn): allocate array? int fDashArrayLength; SkScalar fDashPhase; /* rendering intent name The rendering intent to be used when converting CIE-based colors to device colors (see “Rendering Intents” on page 197). Default value: RelativeColorimetric. */ // TODO(edisonn): seems paper only. Verify. /* stroke adjustment boolean (PDF 1.2) A flag specifying whether to compensate for possible ras- terization effects when stroking a path with a line width that is small relative to the pixel resolution of the output device (see Sec- tion 6.5.4, “Automatic Stroke Adjustment”). Note that this is con- sidered a device-independent parameter, even though the details of its effects are device-dependent. Initial value: false. */ // TODO(edisonn): stroke adjustment low priority. /* blend mode name or array (PDF 1.4) The current blend mode to be used in the transparent imaging model (see Sections 7.2.4, “Blend Mode,” and 7.5.2, “Spec- ifying Blending Color Space and Blend Mode”). This parameter is implicitly reset to its initial value at the beginning of execution of a transparency group XObject (see Section 7.5.5, “Transparency Group XObjects”). Initial value: Normal. */ SkXfermode::Mode fBlendModes[256]; int fBlendModesLength; /* soft mask dictionary (PDF 1.4) A soft-mask dictionary (see “Soft-Mask Dictionaries” on or name page 445) specifying the mask shape or mask opacity values to be used in the transparent imaging model (see “Source Shape and Opacity” on page 421 and “Mask Shape and Opacity” on page 443), or the name None if no such mask is specified. This parameter is implicitly reset to its initial value at the beginning of execution of a transparency group XObject (see Section 7.5.5, “Transparency Group XObjects”). Initial value: None. */ SkPdfSoftMaskDictionary* fSoftMaskDictionary; // TODO(edisonn): make sMask private, add setter and getter, ref/unref/..., at the moment we most likely leask SkBitmap* fSMask; /* alpha constant number (PDF 1.4) The constant shape or constant opacity value to be used in the transparent imaging model (see “Source Shape and Opacity” on page 421 and “Constant Shape and Opacity” on page 444). There are two separate alpha constant parameters: one for stroking and one for all other painting operations. This parameter is implic- itly reset to its initial value at the beginning of execution of a trans- parency group XObject (see Section 7.5.5, “Transparency Group XObjects”). Initial value: 1.0. */ double fAphaConstant; /* alpha source boolean (PDF 1.4) A flag specifying whether the current soft mask and alpha constant parameters are to be interpreted as shape values (true) or opacity values (false). This flag also governs the interpretation of the SMask entry, if any, in an image dictionary (see Section 4.8.4, “Image Dictionaries”). Initial value: false. */ bool fAlphaSource; // TODO(edisonn): Device-dependent seem to be required only on the actual physical printer? // TABLE 4.3 Device-dependent graphics state parameters /* overprint boolean (PDF 1.2) A flag specifying (on output devices that support the overprint control feature) whether painting in one set of colorants should cause the corresponding areas of other colorants to be erased (false) or left unchanged (true); see Section 4.5.6, “Over- print Control.” In PDF 1.3, there are two separate overprint param- eters: one for stroking and one for all other painting operations. Initial value: false. */ /* overprint mode number (PDF 1.3) A code specifying whether a color component value of 0 in a DeviceCMYK color space should erase that component (0) or leave it unchanged (1) when overprinting (see Section 4.5.6, “Over- print Control”). Initial value: 0. */ /* black generation function (PDF 1.2) A function that calculates the level of the black color or name component to use when converting RGB colors to CMYK (see Sec- tion 6.2.3, “Conversion from DeviceRGB to DeviceCMYK”). Initial value: installation-dependent. */ /* undercolor removal function (PDF 1.2) A function that calculates the reduction in the levels of or name the cyan, magenta, and yellow color components to compensate for the amount of black added by black generation (see Section 6.2.3, “Conversion from DeviceRGB to DeviceCMYK”). Initial value: in- stallation-dependent. */ /* transfer function, (PDF 1.2) A function that adjusts device gray or color component array, or name levels to compensate for nonlinear response in a particular out- put device (see Section 6.3, “Transfer Functions”). Initial value: installation-dependent. */ /* halftone dictionary, (PDF 1.2) A halftone screen for gray and color rendering, specified stream, or name as a halftone dictionary or stream (see Section 6.4, “Halftones”). Initial value: installation-dependent. */ /* flatness number The precision with which curves are to be rendered on the output device (see Section 6.5.1, “Flatness Tolerance”). The value of this parameter gives the maximum error tolerance, measured in output device pixels; smaller numbers give smoother curves at the expense of more computation and memory use. Initial value: 1.0. */ /* smoothness number (PDF 1.3) The precision with which color gradients are to be ren- dered on the output device (see Section 6.5.2, “Smoothness Toler- ance”). The value of this parameter gives the maximum error tolerance, expressed as a fraction of the range of each color compo- nent; smaller numbers give smoother color transitions at the expense of more computation and memory use. Initial value: installation-dependent. */ // TODO(edisonn): some defaults are contextual, they could on colorspace, pdf version, ... SkPdfGraphicsState() { fCurPosX = 0.0; fCurPosY = 0.0; fCurFontSize = 0.0; fTextBlock = false; fCTM = SkMatrix::I(); fMatrixTm = SkMatrix::I(); fMatrixTlm = SkMatrix::I(); fPathClosed = true; fLineWidth = 0; fTextLeading = 0; fWordSpace = 0; fCharSpace = 0; fHasClipPathToApply = false; fResources = NULL; fSkFont = NULL; fLineCap = 0; fLineJoin = 0; fMiterLimit = 10.0; fAphaConstant = 1.0; fAlphaSource = false; fDashArrayLength = 0; fDashPhase = 0; fBlendModesLength = 1; fBlendModes[0] = SkXfermode::kSrc_Mode; // PDF: Normal Blend mode fSMask = NULL; } // TODO(edisonn): make two functions instead, stroking and non stoking, avoid branching void applyGraphicsState(SkPaint* paint, bool stroking); }; #endif // SkPdfGraphicsState_DEFINED