CMYK sprites

CMYK sprites (also known as 'type 7 sprites') may now be rendered by SpriteExtend. Calls to PlotSpriteScaled, and PlotSpriteTransformed for these sprites will now render the sprite in the same manner as 32 bpp sprites ('type 6'). As such, CMYK sprites will be subject to colour mapping as 16 bpp or 32 bpp sprites.

Data within CMYK sprites is stored in the format &KKYYMMCC, as compared to 32 bpp RGB sprites which is stored in the format &00BBGGRR. As with other new format sprites, masks are held in 1 bpp format.


A side effect of CMYK-style sprites is that the colour number (ColourTrans_ReturnColourNumber etc.) now spans the whole 32 bits. Thus it is possible to generate colour numbers which, if treated as signed values, are negative. If any private data has previously been stored in the top 8 bits of the colour number by applications or extensions this may now be invalid. The previous assumption that a colour number would be 24bits wide was incorrect.

An example of code that might fail would be code that used +ve colour numbers to mean literal colours, and -ve values to mean special effects, such as ECF plotting. Where such assumptions are made this may result in undefined behaviour of the application concerned. If applications restrict their processing to the standard RGB colours, this should not be an issue.


Masks should function as for other new format sprites; masks are 1bpp. Operations to create and remove masks function correctly, as does redirection to masks.


Standard graphical operations will function normally if ColourTrans is used. For sprite plotting, pixel translation tables must be 'wide' (bit 4 set) to allow colour matching to be performed correctly, as is the case with 16 and 32bpp RGB sprites. Operations which use ColourTrans should function normally.

If it is necessary to determine whether output is directed to a CMYK sprite, OS_ReadModeVariable/OS_ReadVduVariables 0 should be used to read the mode flags. Additional bits have been defined to describe the format of the data :

  bits   meaning
  12-15  data format :
            0 RGB data (sprite types 0 to 6 will return this)
            1 CMYK data (sprite type 7 will return this)
Mode variables for CMYK sprites

Variables returned for CMYK sprites through OS_ReadModeVariable or OS_ReadVduVariables have been updated to supply the following values :

  Variable             Value
     0         (see above for new data format flags)
     3         &FFFFFFFF
     4         from sprite type word
     5         from sprite type word
     9         5
     10        5

Other values are undefined.

Reading colours

Reading a pixel colour will return the colour number at the position declared in the native format (as with the other sprite formats). To convert this to RGB you may need to use ColourTrans_ConvertCMYKToRGB.

Advanced notes

Converting to and from RGB may need to be performed quickly by more advanced applications. Where no calibration is necessary, this can be done with the following code examples :

RGB to CMYK conversion (&00BBGGRR to &KKYYMMCC) :

        ; First, invert the lot
           MVN     r_pixel,r_pixel                 ; invert
           ; Now work out what 'black' value to use
           AND     r_temp1,r_pixel,#&00FF00        ; green component
           AND     r_temp2,r_pixel,#&0000FF        ; red component
           CMP     r_temp1,r_temp2,LSL #8          ; compare them
           MOVHI   r_temp1,r_temp2,LSL #8          ; red was lower
           AND     r_temp2,r_pixel,#&FF0000        ; blue component
           CMP     r_temp1,r_temp2,LSR #8          ; compare them
           MOVHI   r_temp1,r_temp2,LSR #8          ; blue was lower
           ; r_temp1 now = &0000KK00
           ORR     r_temp2,r_temp1,r_temp1,LSL #8  ; &00KKKK00
           ORR     r_temp2,r_temp2,r_temp2,LSL #8  ; &KKKKKK00
           RSB     r_pixel,r_temp2,r_pixel,LSL #8  ; &YYMMCC00
           MOV     r_pixel,r_pixel,LSR #8          ; &00YYMMCC
           ORR     r_pixel,r_pixel,r_temp1,LSL #16 ; &KKYYMMCC

CMYK to RGB conversion (&KKYYMMCC to &00BBGGRR) :

        ; r_pixel = &KKYYMMCC
           AND     r_temp1, r_pixel, #&ff000000       ; K
           AND     r_temp2, r_pixel, #&00ff0000       ; Y
           ADDS    r_temp2, r_temp1, r_temp2, LSL #8  ; Y + K
           MOVCS   r_temp2, #&ff000000                ; clamp
           MOV     r_pixel, r_pixel, LSL #16
           ; r_pixel = &MMCC0000
           ORR     r_pixel, r_pixel, r_temp2, LSR #16 ; B
           ; r_pixel = &MMCCBB00
           ADDS    r_temp2, r_temp1, r_pixel          ; M + K
           MOVCS   r_temp2, #&ff000000
           ORR     r_pixel, r_pixel, r_temp2, LSR #24 ; G
           ; r_pixel = &MMCCBBGG
           ADDS    r_temp2, r_temp1, r_pixel, LSL #8  ; C + K
           MOVCS   r_temp2, #&ff000000
           MOV     r_pixel, r_pixel, LSL #16          ; clear top half
           ; r_pixel = &BBGG0000
           ORR     r_pixel, r_pixel, r_temp2, LSR #16 ; R
           ; r_pixel = &BBGGRRxx
           ; inverted to be true colours
           MVN     r_pixel, r_pixel ; Invert
           MOV     r_pixel, r_pixel, LSR #8 ; Shift to bottom
           ; true 00BBGGRR

For certain operations an updated version of ColourTrans will be necessary.

This documentation is copyright 3QD Developments Ltd 2013 and may not be reproduced or published in any form without the copyright holders permission. RISC OS is subject to continuous development and improvement as such all information is reproduced by 3QD Developments Ltd in good faith and is believed to be correct at the time of publication E&OE. 3QD Developments Ltd cannot accept any liability for any loss or damage arising from the use of any information provided as part of the RISC OS Documentation.

HTML document version 1.03 3rd November 2015