@@ -34,16 +34,6 @@ use webrender_api;
3434// Helper functions.
3535// ======================================================================
3636
37- fn convert_format ( format : PixelFormat ) -> webrender_api:: ImageFormat {
38- match format {
39- PixelFormat :: K8 | PixelFormat :: KA8 => {
40- panic ! ( "Not support by webrender yet" ) ;
41- }
42- PixelFormat :: RGB8 => webrender_api:: ImageFormat :: RGB8 ,
43- PixelFormat :: BGRA8 => webrender_api:: ImageFormat :: BGRA8 ,
44- }
45- }
46-
4737fn decode_bytes_sync ( key : LoadKey , bytes : & [ u8 ] ) -> DecoderMsg {
4838 let image = load_from_memory ( bytes) ;
4939 DecoderMsg {
@@ -63,19 +53,35 @@ fn get_placeholder_image(webrender_api: &webrender_api::RenderApi, path: &PathBu
6353
6454fn set_webrender_image_key ( webrender_api : & webrender_api:: RenderApi , image : & mut Image ) {
6555 if image. id . is_some ( ) { return ; }
66- let format = convert_format ( image. format ) ;
6756 let mut bytes = Vec :: new ( ) ;
68- bytes. extend_from_slice ( & * image. bytes ) ;
69- if format == webrender_api:: ImageFormat :: BGRA8 {
70- premultiply ( bytes. as_mut_slice ( ) ) ;
71- }
57+ let is_opaque = match image. format {
58+ PixelFormat :: BGRA8 => {
59+ bytes. extend_from_slice ( & * image. bytes ) ;
60+ premultiply ( bytes. as_mut_slice ( ) )
61+ }
62+ PixelFormat :: RGB8 => {
63+ for bgr in image. bytes . chunks ( 3 ) {
64+ bytes. extend_from_slice ( & [
65+ bgr[ 2 ] ,
66+ bgr[ 1 ] ,
67+ bgr[ 0 ] ,
68+ 0xff
69+ ] ) ;
70+ }
71+
72+ true
73+ }
74+ PixelFormat :: K8 | PixelFormat :: KA8 => {
75+ panic ! ( "Not support by webrender yet" ) ;
76+ }
77+ } ;
7278 let descriptor = webrender_api:: ImageDescriptor {
7379 width : image. width ,
7480 height : image. height ,
7581 stride : None ,
76- format : format ,
82+ format : webrender_api :: ImageFormat :: BGRA8 ,
7783 offset : 0 ,
78- is_opaque : is_image_opaque ( format , & bytes ) ,
84+ is_opaque,
7985 } ;
8086 let data = webrender_api:: ImageData :: new ( bytes) ;
8187 let image_key = webrender_api. generate_image_key ( ) ;
@@ -85,28 +91,10 @@ fn set_webrender_image_key(webrender_api: &webrender_api::RenderApi, image: &mut
8591 image. id = Some ( image_key) ;
8692}
8793
88- // TODO(gw): This is a port of the old is_image_opaque code from WR.
89- // Consider using SIMD to speed this up if it shows in profiles.
90- fn is_image_opaque ( format : webrender_api:: ImageFormat , bytes : & [ u8 ] ) -> bool {
91- match format {
92- webrender_api:: ImageFormat :: BGRA8 => {
93- let mut is_opaque = true ;
94- for i in 0 ..( bytes. len ( ) / 4 ) {
95- if bytes[ i * 4 + 3 ] != 255 {
96- is_opaque = false ;
97- break ;
98- }
99- }
100- is_opaque
101- }
102- webrender_api:: ImageFormat :: RGB8 => true ,
103- webrender_api:: ImageFormat :: RG8 => true ,
104- webrender_api:: ImageFormat :: A8 => false ,
105- webrender_api:: ImageFormat :: Invalid | webrender_api:: ImageFormat :: RGBAF32 => unreachable ! ( ) ,
106- }
107- }
108-
109- fn premultiply ( data : & mut [ u8 ] ) {
94+ // Returns true if the image was found to be
95+ // completely opaque.
96+ fn premultiply ( data : & mut [ u8 ] ) -> bool {
97+ let mut is_opaque = true ;
11098 let length = data. len ( ) ;
11199
112100 let mut i = 0 ;
@@ -121,7 +109,10 @@ fn premultiply(data: &mut [u8]) {
121109 data[ i + 2 ] = ( r * a / 255 ) as u8 ;
122110
123111 i += 4 ;
112+ is_opaque = is_opaque && a == 255 ;
124113 }
114+
115+ is_opaque
125116}
126117
127118// ======================================================================
0 commit comments