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 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.
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