A colour object represents a 32-bit RGBA colour value (8
bits each for red, green, blue and alpha). Colours are typically
attached to
graphical objects:
?- send(new(P, picture), open), send(P, display, new(B, box(100, 100))), send(B, colour, red), send(B, fill, blue).
Like fonts and cursors, colour
objects are reusable — they can be attached to multiple graphicals.
xpce will not create the same colour twice; instead it returns the
existing colour object
from the
@colours table
(see colour<-lookup).
Application code normally just names a colour and lets the type-checker
convert.
xpce ships with the classic SVG/CSS named-colour set (red, blue,
dark_green, …) in the hash table @colour_names; any name
not in that table is looked up via the OS colour database. Colours may
also be specified in CSS hex notation (#RGB, #RGBA, #RRGGBB,
#RRGGBBAA) or constructed from RGB or HSV triples — see
colour->initialise.
<-hilite.<-reduce.
|int#RRGGBB / #RRGGBBAA)
or, for anonymous colours, the encoded integer value.named when the colour was constructed by name (so
resolution happens lazily through the colour database); rgb
when the caller supplied numeric components directly.<-red, colour<-green,
colour<-blue
and colour<-alpha
getters to extract components.
Named colours improve readability — @colour_names
maps well-known names (the SVG/CSS palette) to RGB triples. Names in the
form #RGB, #RGBA, #RRGGBB or #RRGGBBAA
are interpreted as CSS hex literals.
When name is @default,
the colour is built from the numeric components. The default model is rgb
and each component is an integer 0..255. The first component is
therefore named
red but actually carries the hue (0..360) when
model=hsv.
Examples:
new(C1, colour(red)) %% named new(C2, colour(@default, 255, 0, 0)) %% RGB triple new(C3, colour(@default, 180, 50, 50, 255, hsv)) %% HSV
See colour<-hue/colour<-saturnation/colour<-value
for the HSV model.
colour(@default, ...) literals can yield distinct objects
with identical components.
<-kind
colour against the colour database on first access.
<-hue
selects the basic colour (think of it as a position on the rainbow);
<-saturnation
is how intense the colour is — 0 is grey, 100 is fully saturated;
<-value
is brightness — 0 is black, 100 is white. HSV is more convenient than
RGB for shading and palette arithmetic. Colours may be created in this
space via
colour->initialise
with model=hsv. Reasoning in colour spaces is beyond the
scope of this manual.
(20*R + 32*G + 18*B) / 70
which closely matches ITU‑R BT.601 luma.
Useful for converting colour to a monochrome substitute.
|int -> int.0..1.0] ->
colour.0..1.0] ->
colour Return a lighter (colour<-hilite)
or darker (colour<-reduce)
variant. Used by class elevation to derive the lit and
shadow sides of a 3-D box. 0.0 returns the
colour unchanged; 1.0 returns white (colour<-hilite)
or black (colour<-reduce).
Defaults come from the hilite_factor / reduce_factor
class variables.
The derived colour is associated with the original; asking for the same modification again returns the cached object, and destroying the original lets the derivative go.
# and has 3, 4, 6 or 8 hex
digits after it, interpret it as a CSS hex literal:
#c0453f -> R=192, G=69, B=63, A=255
With three or four hex digits, each digit is doubled (#abc
≡ #aabbcc). With four or eight digits the trailing byte
is the alpha channel.
|int],
red=[0..360], green=[0..255], blue=[0..255], alpha=[0..255], model=[{rgb,hsv}] -> colour->initialise.<-kind,
return its colour<-name.
Otherwise return #RRGGBB (or #RRGGBBAA when
alpha is not 255). The result is suitable as input to colour<-convert.
See also object<-storage_reference, object->save_in_file
and source_sink<-object.