@@ -33,6 +33,25 @@ use webrender_traits;
3333/// MAYBE(Yoric):
3434/// * For faster lookups, it might be useful to store the LoadKey in the DOM once we have performed a first load.
3535
36+ // TODO(gw): This is a port of the old is_image_opaque code from WR.
37+ fn is_image_opaque ( format : webrender_traits:: ImageFormat , bytes : & [ u8 ] ) -> bool {
38+ match format {
39+ webrender_traits:: ImageFormat :: RGBA8 => {
40+ let mut is_opaque = true ;
41+ for i in 0 ..( bytes. len ( ) / 4 ) {
42+ if bytes[ i * 4 + 3 ] != 255 {
43+ is_opaque = false ;
44+ break ;
45+ }
46+ }
47+ is_opaque
48+ }
49+ webrender_traits:: ImageFormat :: RGB8 => true ,
50+ webrender_traits:: ImageFormat :: A8 => false ,
51+ webrender_traits:: ImageFormat :: Invalid | webrender_traits:: ImageFormat :: RGBAF32 => unreachable ! ( ) ,
52+ }
53+ }
54+
3655/// Represents an image that is either being loaded
3756/// by the resource thread, or decoded by a worker thread.
3857struct PendingLoad {
@@ -314,12 +333,15 @@ fn get_placeholder_image(webrender_api: &webrender_traits::RenderApi) -> io::Res
314333 let format = convert_format ( image. format ) ;
315334 let mut bytes = Vec :: new ( ) ;
316335 bytes. extend_from_slice ( & * image. bytes ) ;
336+ let descriptor = webrender_traits:: ImageDescriptor {
337+ width : image. width ,
338+ height : image. height ,
339+ stride : None ,
340+ format : format,
341+ is_opaque : is_image_opaque ( format, & bytes) ,
342+ } ;
317343 let data = webrender_traits:: ImageData :: new ( bytes) ;
318- image. id = Some ( webrender_api. add_image ( image. width ,
319- image. height ,
320- None ,
321- format,
322- data) ) ;
344+ image. id = Some ( webrender_api. add_image ( descriptor, data) ) ;
323345 Ok ( Arc :: new ( image) )
324346}
325347
@@ -476,12 +498,15 @@ impl ImageCache {
476498 let format = convert_format ( image. format ) ;
477499 let mut bytes = Vec :: new ( ) ;
478500 bytes. extend_from_slice ( & * image. bytes ) ;
501+ let descriptor = webrender_traits:: ImageDescriptor {
502+ width : image. width ,
503+ height : image. height ,
504+ stride : None ,
505+ format : format,
506+ is_opaque : is_image_opaque ( format, & bytes) ,
507+ } ;
479508 let data = webrender_traits:: ImageData :: new ( bytes) ;
480- image. id = Some ( self . webrender_api . add_image ( image. width ,
481- image. height ,
482- None ,
483- format,
484- data) ) ;
509+ image. id = Some ( self . webrender_api . add_image ( descriptor, data) ) ;
485510 }
486511 LoadResult :: PlaceholderLoaded ( ..) | LoadResult :: None => { }
487512 }
0 commit comments