This is an old revision of the document!
PDF distinguishes between filling (paint the interior of a closed path) and stroking (paint the outline of a path) when painting. Each mode has its own color and is used with the appropriate paint operators.
For example, a filled rectangle with border can be painted with one operator (/re) using both the filling and stroking color (which can be different).
In order to set a color, first the colorspace and then the actual color has to be set with the right parameters for that colorspace. For example setting the stroking color to red in RGB:
/DeviceRGB CS % set colorspace for stroking 1 0 0 SC % set stroking color
For the device colorspaces, there exist short cut operators doing both at once. For the above example one can write:
1 0 0 RG % set RGB colorspace and color for stroking
There are 11 distinct colorspaces available in PDF:
### Device colorspaces Device dependent, Not reproducable.
* DeviceGray 1 components [0..1]; `0` is black, `1` is white.
* DeviceRGB additive (for screens); 3 components [0..1]; `0 0 0` is black, `1 1 1` is white.
* DeviceCMYK subtractive (for printing); 4 components [0..1]; `0 0 0 1` is black, `0 0 0 0` is white.
### CIE-based colorspaces Calibrated: device independent, reproducable.
* CalGray
* CalRGB
* Lab
* ICCBased
### Special colorspaces
* Indexed
* Pattern
* Separation
* DeviceN
Most commonly used and easiest are the device colorspaces. Setting black is done like this in the different colorspaces:
% DeviceGray 0 G % stroking 0 g % filling % DeviceRGB 0 0 0 RG % stroking 0 0 0 rg % filling % DeviceCMYK 0 0 0 1 K % stroking 0 0 0 1 k % filling
The PDF4Smalltalk library supports these variations by initializing the renderer with a colorspace. The renderer can than select the right operators when the fill or stroke color is set. The API is:
"colorspace: DeviceGray new" renderer strokeColor: <ColorValue or CMYKColor>. "with conversion" renderer fillColor: <ColorValue or CMYKColor>. "with conversion" "colorspace: DeviceRGB new" renderer strokeColor: <ColorValue>. "no conversion" renderer fillColor: <ColorValue>. "no conversion" "colorspace: DeviceCMYK new" renderer strokeColor: <CMYKColor>. "no conversion" renderer fillColor: <CMYKColor>. "no conversion"
Example:
page := Page newInBounds: (0 @ 0 corner: 100 @ 100) colorspace: DeviceRGB new render: [:renderer | renderer fillColor: ColorValue red. renderer addRectangleLeft: 20 bottom: 20 width: 20 height: 40. renderer fill. renderer strokeColor: ColorValue blue. renderer linewidth: 5. renderer addRectangleLeft: 20 bottom: 20 width: 20 height: 40. renderer stroke].