|
|
|
|
|
Description |
Datatypes for representing the human perception of colour.
Includes common operations for blending and compositing colours.
The most common way of creating colours is either by name
(see Data.Colour.Names) or by giving an sRGB triple
(see Data.Colour.SRGB).
Methods of specifying Colours can be found in
Colours can be specified in a generic Data.Colour.RGBSpace.RGBSpace
by using
|
|
Synopsis |
|
|
|
|
Interfacing with Other Libraries' Colour Spaces
|
|
Executive summary: Always use Data.Colour.SRGB when interfacing with
other libraries.
Use Data.Colour.SRGB.toSRGB24 / Data.Colour.SRGB.sRGB24 when
interfacing with libraries wanting Data.Word.Word8 per channel.
Use Data.Colour.SRGB.toSRGB / Data.Colour.SRGB.sRGB when
interfacing with libraries wanting Double or Float per channel.
Interfacing with the colour for other libraries, such as cairo
(http://www.haskell.org/gtk2hs/archives/category/cairo/) and OpenGL
(http://hackage.haskell.org/cgi-bin/hackage-scripts/package/OpenGL),
can be a challenge because these libraries often do not use colour spaces
in a consistent way.
The problem is that these libraries work in a device dependent colour
space and give no indication what the colour space is.
For most devices this colours space is implicitly the non-linear sRGB
space.
However, to make matters worse, these libraries also do their
compositing and blending in the device colour space.
Blending and compositing ought to be done in a linear colour space,
but since the device space is typically non-linear sRGB, these libraries
typically produce colour blends that are too dark.
(Note that Data.Colour is a device independent colour space, and
produces correct blends.
e.g. compare toSRGB (blend 0.5 lime red) with RGB 0.5 0.5 0)
Because these other colour libraries can only blend in device colour
spaces, they are fundamentally broken and there is no "right" way
to interface with them.
For most libraries, the best one can do is assume they are working
with an sRGB colour space and doing incorrect blends.
In these cases use Data.Colour.SRGB to convert to and from the
colour coordinates. This is the best advice for interfacing with cairo.
When using OpenGL, the choice is less clear.
Again, OpenGL usually does blending in the device colour space.
However, because blending is an important part of proper shading, one
may want to consider that OpenGL is working in a linear colour space,
and the resulting rasters are improperly displayed.
This is born out by the fact that OpenGL extensions that support
sRGB do so by converting sRGB input/output to linear colour coordinates
for processing by OpenGL.
The best way to use OpenGL, is to use proper sRGB surfaces for textures
and rendering.
These surfaces will automatically convert to and from OpenGL's linear
colour space.
In this case, use Data.Colour.SRGB.Linear to interface OpenGL's linear
colour space.
If not using proper surfaces with OpenGL, then you have a choice between
having OpenGL do improper blending or improper display
If you are using OpenGL for 3D shading, I recommend using
Data.Colour.SRGB.Linear (thus choosing improper OpenGL display).
If you are not using OpenGL for 3D shading, I recommend using
Data.Colour.SRGB (thus choosing improper OpenGL blending).
|
|
Colour type
|
|
|
This type represents the human preception of colour.
The a parameter is a numeric type used internally for the
representation.
The Monoid instance allows one to add colours, but beware that adding
colours can take you out of gamut. Consider using blend whenever
possible.
| Instances | |
|
|
|
Change the type used to represent the colour coordinates.
|
|
|
|
|
This type represents a Colour that may be semi-transparent.
The Monoid instance allows you to composite colours.
x `mappend` y == x `over` y
To get the (pre-multiplied) colour channel of an AlphaColour c,
simply composite c over black.
c `over` (mempty :: Colour a)
| Instances | |
|
|
|
Creates an opaque AlphaColour from a Colour.
|
|
|
Creates an AlphaColour from a Colour with a given opacity.
c `withOpacity` o == dissolve o (opaque c)
|
|
|
This AlphaColour is entirely transparent and has no associated
colour channel.
|
|
|
Change the type used to represent the colour coordinates.
|
|
|
Returns the opacity of an AlphaColour.
|
|
Colour operations
|
|
These operations allow combine and modify existing colours
|
|
class AffineSpace f where | Source |
|
| Methods | affineCombo :: Num a => [(a, f a)] -> f a -> f a | Source |
| Compute a affine Combination (weighted-average) of points.
The last parameter will get the remaining weight.
e.g.
affineCombo [(0.2,a), (0.3,b)] c == 0.2*a + 0.3*b + 0.4*c
Weights can be negative, or greater than 1.0; however, be aware
that non-convex combinations may lead to out of gamut colours.
|
| | Instances | |
|
|
|
Compute the weighted average of two points.
e.g.
blend 0.4 a b = 0.4*a + 0.6*b
The weight can be negative, or greater than 1.0; however, be aware
that non-convex combinations may lead to out of gamut colours.
|
|
|
| Methods | | c1 `over` c2 returns the Colour created by compositing the
AlphaColour c1 over c2, which may be either a Colour or
AlphaColour.
| | | darken s c blends a colour with black without changing it's opacity.
For Colour, darken s c = blend s c mempty
|
| | Instances | |
|
|
|
Returns an AlphaColour more transparent by a factor of o.
|
|
|
c1 `atop` c2 returns the AlphaColour produced by covering
the portion of c2 visible by c1.
The resulting alpha channel is always the same as the alpha channel
of c2.
c1 `atop` (opaque c2) == c1 `over` (opaque c2)
AlphaChannel (c1 `atop` c2) == AlphaChannel c2
|
|
Produced by Haddock version 2.6.1 |