@@ -813,15 +813,16 @@ fn read_image(cmd_ix: u32) -> CmdImage {
813813 let width_height = info [info_offset + 7u ];
814814 let sample_alpha = info [info_offset + 8u ];
815815 let alpha = f32 (sample_alpha & 0xFFu ) / 255 .0 ;
816- let quality = sample_alpha >> 12u ;
816+ let format = sample_alpha >> 14u ;
817+ let quality = (sample_alpha >> 12u ) & 0x3u ;
817818 let x_extend = (sample_alpha >> 10u ) & 0x3u ;
818819 let y_extend = (sample_alpha >> 8u ) & 0x3u ;
819820 // The following are not intended to be bitcasts
820821 let x = f32 (xy >> 16u );
821822 let y = f32 (xy & 0xffffu );
822823 let width = f32 (width_height >> 16u );
823824 let height = f32 (width_height & 0xffffu );
824- return CmdImage (matrx , xlat , vec2 (x , y ), vec2 (width , height ), x_extend , y_extend , quality , alpha );
825+ return CmdImage (matrx , xlat , vec2 (x , y ), vec2 (width , height ), format , x_extend , y_extend , quality , alpha );
825826}
826827
827828fn read_end_clip (cmd_ix : u32 ) -> CmdEndClip {
@@ -830,6 +831,21 @@ fn read_end_clip(cmd_ix: u32) -> CmdEndClip {
830831 return CmdEndClip (blend , alpha );
831832}
832833
834+ const PIXEL_FORMAT_RGBA : u32 = 0u ;
835+ const PIXEL_FORMAT_BGRA : u32 = 1u ;
836+ // Normalises subpixel order loaded from an image, based on the image's format.
837+ fn pixel_format (pixel : vec4f , format : u32 ) -> vec4f {
838+ switch format {
839+ case PIXEL_FORMAT_BGRA : {
840+ // The conversion from RGBA to BGRA is its own inverse.
841+ return pixel . bgra ;
842+ }
843+ case PIXEL_FORMAT_RGBA , default : {
844+ return pixel ;
845+ }
846+ }
847+ }
848+
833849const EXTEND_PAD : u32 = 0u ;
834850const EXTEND_REPEAT : u32 = 1u ;
835851const EXTEND_REFLECT : u32 = 2u ;
@@ -1198,13 +1214,13 @@ fn main(
11981214 let atlas_uv_clamped = clamp (atlas_uv , image . atlas_offset , atlas_max );
11991215 // Nearest neighbor sampling
12001216 let fg_rgba = premul_alpha (textureLoad (image_atlas , vec2 <i32 >(atlas_uv_clamped ), 0 ));
1201- let fg_i = fg_rgba * area [i ] * image . alpha ;
1217+ let fg_i = pixel_format ( fg_rgba * area [i ] * image . alpha , image . format ) ;
12021218 rgba [i ] = rgba [i ] * (1 .0 - fg_i . a ) + fg_i ;
12031219 }
12041220 }
12051221 }
12061222 case IMAGE_QUALITY_MEDIUM , default : {
1207- // We don't have an implementation for `IMAGE_QUALITY_HIGH` yet, just use the same as medium
1223+ // We don't have an implementation for `IMAGE_QUALITY_HIGH` yet, just use the same as medium
12081224 for (var i = 0u ; i < PIXELS_PER_THREAD ; i += 1u ) {
12091225 // We only need to load from the textures if the value will be used.
12101226 if area [i ] != 0 .0 {
@@ -1225,7 +1241,7 @@ fn main(
12251241 let d = premul_alpha (textureLoad (image_atlas , vec2 <i32 >(uv_quad . zw ), 0 ));
12261242 // Bilinear sampling
12271243 let fg_rgba = mix (mix (a , b , uv_frac . y ), mix (c , d , uv_frac . y ), uv_frac . x );
1228- let fg_i = fg_rgba * area [i ] * image . alpha ;
1244+ let fg_i = pixel_format ( fg_rgba * area [i ] * image . alpha , image . format ) ;
12291245 rgba [i ] = rgba [i ] * (1 .0 - fg_i . a ) + fg_i ;
12301246 }
12311247 }
0 commit comments