| /* |
| * 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 |