The ColourTrans Module

This module is not part of the ROM, but is in !system.modules.colours in the Welcome Suite. It provides generally useful functionality, and so it is documented as part of RISC OS.

Throughout, a mode of -1 means the current mode, and a palette pointer of 0 means the default palette (i.e. the palette set by the MOS on entry to the specified mode).
-1 as a palette pointer refers to the current palette; this is generally only sensible if -1 is specified for the mode.

"Palette pointer" (from here on just "palette") means a pointer to a list of words, containing BBGGRRxx. In 256 colour modes only the first 16 of these are be referenced, real colours being built from there.

When the destination is a 256 colour mode, "GCOL" means a byte with the real GCOL in bits 2-7, and the tint in bits 0 & 1.

"Colour number" is used to refer to the byte that's placed into screen memory; identical to the GCOL except for 256 colour modes.

"Most different" means "maximises the distance function"; "closest" means "minimises the distance function". The distance function is a weighted least squares, i.e.
where colours are (Rs, Gs, Bs) and (Rd, Gd, Bd)

distance = redweight*(Rs-Rd)^2 +

               greenweight*(Gs-Gd)^2 +
                blueweight*(Bs-Bd)^2.

Currently, blueweight = 1, redweight = 2, greenweight = 3; this seems to give acceptable results on the limited problem we are tackling.

SWIs:

ColourTrans_SelectTable (&40740)


Given a source mode & palette, and destination mode & palette, and a buffer, set up a translation table in the buffer. ("Translation table" means a set of colour numbers as used by the scaled sprite plotting).

and ColourTrans_SelectGCOLTable (&40741)


Given a source mode & palette, and destination mode & palette, and a buffer, set up a list of GCOLs in the buffer.

For both the above:
Input: r0 = source mode
r1 = source palette
r2 = destination mode
r3 = destination palette
r4 = buffer (assumed to be long enough,

                     i.e. no_of_colours(source mode) bytes long)

ColourTrans_ReturnGCOL (&40742)


Given a palette entry (BBGGRRxx), return the closest GCOL in the current mode and palette. Input: r0 = palette entry
Output: r0 = GCOL

ColourTrans_SetGCOL (&40743)


Given a palette entry, return the closest GCOL in the current mode and palette, and also set the GCOL. Input: r0 = palette entry
r3 = 0 or 128 for fore/background
r4 = GCOL action
Both r3 and r4 should have the top three bytes clear, to allow
for future expansion.
Output: r0 = GCOL

ColourTrans_ReturnColourNumber (&40744)


Given a palette entry (BBGGRRxx), return the closest colour number in the current mode and palette. Input: r0 = palette entry
Output: r0 = colour number

ColourTrans_ReturnGCOLForMode (&40745)


Given a palette entry, a destination mode and palette, return the closest GCOL. Input: r0 = palette entry
r1 = destination mode
r2 = destination palette
Output: r0 = GCOL

ColourTrans_ReturnColourNumberForMode (&40746)


Given a palette entry, a destination mode and palette, return the closest colour number. Input: r0 = palette entry
r1 = destination mode
r2 = destination palette
Output: r0 = colour number

ColourTrans_ReturnOppGCOL (&40747)


ColourTrans_SetOppGCOL (&40748)

ColourTrans_ReturnOppColourNumber (&40749)
ColourTrans_ReturnOppGCOLForMode (&4074A)
ColourTrans_ReturnOppColourNumberForMode (&4074B)
Parameters are exactly the same as 40742-40746; action is very similar, but the furthest rather than closest colour is returned.

ColourTrans_GCOLToColourNumber (&4074C)


Translate a GCOL to a colour number (assuming a 256 colour mode is meant). Input: r0 = GCOL
Output: r0 = colour number

ColourTrans_ColourNumberToGCOL (&4074D)


Translate a colour number to a GCOL (assuming a 256 colour mode is meant). Input: r0 = colour number
Output: r0 = GCOL

ColourTrans_ReturnFontColours (&4074E)


ColourTrans_SetFontColours (&4074F)
Input: r0 = font handle
r1 = background palette entry
r2 = foreground palette entry
        r3 = max offset

Output: r0-r3 as passed to Font_SetFontColour

This returns font colours to match the given colours; the closest approximation to the foreground and background will be set, and as many intermediate colours (up to the specified maximum) as can be done.

ColourTrans_SetFontColours also calls Font_SetFontColours. Note: in 256 colour modes, only 16 font colours can be set up before
previously returned information becomes invalid. Therefore, if using ReturnFontColours to obtain information to insert in a string to pass to the font painter, do not allow more than 16 distinct colours in the string.

ColourTrans_InvalidateCache (&40750)


This call must be issued whenever the palette has changed since ColourTrans was last called. Note that palette changes due to mode change are detected by the module.