1.30 class colour

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.

@colour_names also holds the system colours, whose names start with sys_, such as sys_window_background. They reflect the colours of the desktop, e.g., the light or dark appearance and the accent colour, and are reloaded by display_manager ->system_colours_changed if the desktop settings change. Colour objects of these names change their value in place. The xpce user interface and the development tools use theme colours, class theme_colour, whose value follows the selected theme. See the sections System colours and Themes of the XPCE User Guide.

See also
- class theme_colour
- device->foreground
- graphical<->colour
- window->colour

1.30.1 Class variables

colour.hilite_factor: real = 0.9
Default factor for colour<-hilite.
colour.dark_hilite_factor: real = 0.2
Default factor for colour<-hilite if the colour is dark, i.e., its colour<-intensity is below 128. Moving a dark colour most of the way to white makes it unrecognisable, e.g., the preview of a menu item on a dark background would be almost white.
colour.reduce_factor: real = 0.6
Default factor for colour<-reduce.
colour.fade_factor: real = 0.5
Default alpha multiplier for colour<-fade.

1.30.2 Instance variables

colour <- name: name|int
Identifier of the colour. Either a name from @colour_names (or the OS colour database), a CSS hex form (#RRGGBB / #RRGGBBAA) or, for anonymous colours, the encoded integer value.
colour <- kind: {named,rgb,theme}
named when the colour was constructed by name (so resolution happens lazily through the colour database); rgb when the caller supplied numeric components directly; theme for a theme_colour.
colour <- rgba: [int]
Encoded 32-bit RGBA value as an integer (or @default for a not-yet-resolved named colour). Use the colour<-red, colour<-green, colour<-blue and colour<-alpha getters to extract components.

1.30.3 Send methods

colour ->initialise: name=[name], red=[0..360], green=[0..255], blue=[0..255], alpha=[0..255], model=[{rgb,hsv}]
Create a colour from a name and/or numeric 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 ->unlink:
Drop the colour from @colours and release any per-colour resources. Called automatically on destruction.
colour ->equal: colour
Succeed if both colours have the same encoded RGBA value. Use in preference to comparing object references because two colour(@default, ...) literals can yield distinct objects with identical components.

1.30.4 Get methods

colour <-red: -> 0..255
colour <-green: -> 0..255
colour <-blue: -> 0..255
colour <-alpha: -> 0..255
The four 8-bit components of the colour's RGBA value. Triggers lazy resolution of a colour<-kind colour against the colour database on first access.
colour <-hue: -> 0..360
colour <-saturnation: -> 0..100
colour <-value: -> 0..100
Query the colour in the HSV (Hue/Saturation/Value) model:

colour <-intensity: -> 0..255
Grey value of the colour, computed as the weighted average
(20*R + 32*G + 18*B) / 70

which closely matches ITU‑R BT.601 luma. Useful for converting colour to a monochrome substitute.

colour <-distance: colour|int -> int
Perceptual distance to the argument colour (or the encoded RGB integer), computed as CIEDE2000 ΔE₀₀ in CIE Lab space. Smaller is closer; values up to about 2 are considered visually indistinguishable.
colour <-hilite: factor=[ ->
0.0..1.0] -> colour
colour <-reduce: factor=[ ->
0.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. A dark colour uses dark_hilite_factor rather than hilite_factor.

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.

colour <-fade: factor=[ ->
0.0..1.0] -> colour Return a colour with the same RGB but alpha multiplied by factor. 0.0 yields a fully transparent variant; 1.0 leaves alpha unchanged. The default factor comes from the fade_factor class variable (0.5).

Complements graphical->opacity: setting the fill or pen to a faded colour lets a single graphical carry both an alpha component and its shape/stroke identity, without a global graphical opacity slot. Like colour<-hilite and colour<-reduce, the result is cached against the source colour via @colours.

colour <-mix: with=colour, factor=[ ->
0.0..1.0] -> colour Return the colour that is factor of the way from this colour towards with. 0.0 returns this colour and 1.0 returns with. The default factor is 0.5. Mixing a background a little towards the text colour derives a colour that stands out on light and dark backgrounds alike. Like colour<-hilite, the result is associated with the source colour.
colour <-convert: name -> colour
Type-checker hook. First looks the name up in @colours (already-constructed colours). Otherwise:

colour <-lookup: [name|int], red=[0..360], green=[0..255], blue=[0..255], alpha=[0..255], model=[{rgb,hsv}] -> colour
Return an existing colour from @colours matching the arguments, or fail. Used internally to deduplicate equivalent colours; mirrors the signature of colour->initialise. A lookup from RGB values never returns a theme colour, as its value changes with the theme.
colour <-storage_reference: -> name
If the colour is colour<-kind or theme, 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.