@@ -53,7 +53,7 @@ const FALLBACK_RIPPY: &[u8] = include_bytes!("../../resources/rippy.png");
5353
5454fn parse_svg_document_in_memory ( bytes : & [ u8 ] ) -> Result < usvg:: Tree , & ' static str > {
5555 let image_string_href_resolver = Box :: new ( move |_: & str , _: & usvg:: Options | {
56- // Do not try to load `href` string in <image> as local file path.
56+ // Do not try to load `href` in <image> as local file path.
5757 None
5858 } ) ;
5959
@@ -326,7 +326,7 @@ impl LoadKeyGenerator {
326326
327327#[ derive( Debug ) ]
328328enum LoadResult {
329- LoadedPixelImage ( RasterImage ) ,
329+ LoadedRasterImage ( RasterImage ) ,
330330 LoadedVectorImage ( VectorImageData ) ,
331331 PlaceholderLoaded ( Arc < RasterImage > ) ,
332332 None ,
@@ -365,7 +365,7 @@ struct PendingLoad {
365365 /// The URL of the final response that contains a body.
366366 final_url : Option < ServoUrl > ,
367367
368- /// The value of the `Content-type` header from the HTTP request .
368+ /// The value of the `Content-type` header in the HTTP response .
369369 content_type : Option < Mime > ,
370370}
371371
@@ -396,10 +396,8 @@ impl PendingLoad {
396396
397397#[ derive( MallocSizeOf ) ]
398398struct RasterizationTask {
399- pipeline_id : PipelineId ,
400399 image_id : PendingImageId ,
401- size : DeviceIntSize ,
402- listeners : Vec < IpcSender < ImageCacheMessage > > ,
400+ listeners : Vec < ( PipelineId , IpcSender < ImageCacheMessage > ) > ,
403401 result : Option < RasterImage > ,
404402}
405403
@@ -414,8 +412,14 @@ struct ImageCacheStore {
414412 // Images that have finished loading (successful or not)
415413 completed_loads : HashMap < ImageKey , CompletedLoad > ,
416414
415+ // Vector (e.g. SVG) images that have been sucessfully loaded and parsed
416+ // but are yet to be rasterized. Since the same SVG data can be used for
417+ // rasterizing at different sizes, we use this hasmap to share the data.
417418 vector_images : HashMap < PendingImageId , VectorImageData > ,
418419
420+ // Vector images for which rasterization at a particular size has started
421+ // or completed. If completed, the `result` member of `RasterizationTask`
422+ // contains the rasterized image.
419423 rasterized_vector_images : HashMap < ( PendingImageId , DeviceIntSize ) , RasterizationTask > ,
420424
421425 // The placeholder image used when an image fails to load
@@ -440,7 +444,7 @@ impl ImageCacheStore {
440444 } ;
441445
442446 match load_result {
443- LoadResult :: LoadedPixelImage ( ref mut image) => {
447+ LoadResult :: LoadedRasterImage ( ref mut image) => {
444448 set_webrender_image_key ( & self . compositor_api , image)
445449 } ,
446450 LoadResult :: LoadedVectorImage ( ref vector_image) => {
@@ -451,7 +455,7 @@ impl ImageCacheStore {
451455
452456 let url = pending_load. final_url . clone ( ) ;
453457 let image_response = match load_result {
454- LoadResult :: LoadedPixelImage ( image) => {
458+ LoadResult :: LoadedRasterImage ( image) => {
455459 ImageResponse :: Loaded ( Image :: Raster ( Arc :: new ( image) ) , url. unwrap ( ) )
456460 } ,
457461 LoadResult :: LoadedVectorImage ( vector_image) => {
@@ -518,7 +522,7 @@ impl ImageCacheStore {
518522 fn handle_decoder ( & mut self , msg : DecoderMsg ) {
519523 let image = match msg. image {
520524 None => LoadResult :: None ,
521- Some ( DecodedImage :: Raster ( image) ) => LoadResult :: LoadedPixelImage ( image) ,
525+ Some ( DecodedImage :: Raster ( image) ) => LoadResult :: LoadedRasterImage ( image) ,
522526 Some ( DecodedImage :: Vector ( tree) ) => LoadResult :: LoadedVectorImage ( tree) ,
523527 } ;
524528 self . complete_load ( msg. key , image) ;
@@ -694,7 +698,7 @@ impl ImageCache for ImageCacheImpl {
694698 size,
695699 ) ) ;
696700 } else {
697- task. listeners . push ( sender) ;
701+ task. listeners . push ( ( pipeline_id , sender) ) ;
698702 }
699703 } ,
700704 Vacant ( _) => {
@@ -705,7 +709,6 @@ impl ImageCache for ImageCacheImpl {
705709
706710 fn rasterize_vector_image (
707711 & self ,
708- pipeline_id : PipelineId ,
709712 image_id : PendingImageId ,
710713 size : DeviceIntSize ,
711714 ) -> Option < RasterImage > {
@@ -717,13 +720,10 @@ impl ImageCache for ImageCacheImpl {
717720
718721 match store. rasterized_vector_images . entry ( ( image_id, size) ) {
719722 Occupied ( occupied_entry) => {
720- let task = occupied_entry. get ( ) ;
721- return task. result . clone ( ) ;
723+ return occupied_entry. get ( ) . result . clone ( ) ;
722724 } ,
723725 Vacant ( entry) => entry. insert ( RasterizationTask {
724- pipeline_id,
725726 image_id,
726- size,
727727 listeners : vec ! [ ] ,
728728 result : None ,
729729 } ) ,
@@ -741,7 +741,6 @@ impl ImageCache for ImageCacheImpl {
741741 requested_size. width ( ) as f32 / natural_size. width ( ) as f32 ,
742742 requested_size. height ( ) as f32 / natural_size. height ( ) as f32 ,
743743 ) ;
744- println ! ( "Rasterizing at {requested_size:?}" ) ;
745744 let mut pixmap =
746745 tiny_skia:: Pixmap :: new ( requested_size. width ( ) , requested_size. height ( ) ) . unwrap ( ) ;
747746 resvg:: render ( & vector_image. svg_tree , transform, & mut pixmap. as_mut ( ) ) ;
@@ -766,13 +765,12 @@ impl ImageCache for ImageCacheImpl {
766765 set_webrender_image_key ( & store. compositor_api , & mut rasterized_image) ;
767766 if let Some ( task) = store. rasterized_vector_images . get_mut ( & ( image_id, size) ) {
768767 task. result = Some ( rasterized_image) ;
769- let response = ImageCacheMessage :: VectorImageRasterizationCompleted (
770- pipeline_id,
771- image_id,
772- size,
773- ) ;
774- for listener in task. listeners . drain ( ..) {
775- let _ = listener. send ( response. clone ( ) ) ;
768+ for ( pipeline_id, sender) in task. listeners . drain ( ..) {
769+ let _ = sender. send ( ImageCacheMessage :: VectorImageRasterizationCompleted (
770+ pipeline_id,
771+ image_id,
772+ size,
773+ ) ) ;
776774 }
777775 }
778776 } ) ;
0 commit comments