Skip to content

Commit a4cef90

Browse files
committed
fix cache layer api
1 parent 93f431b commit a4cef90

File tree

3 files changed

+22
-28
lines changed

3 files changed

+22
-28
lines changed

components/layout/context.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -212,10 +212,7 @@ impl LayoutContext<'_> {
212212
size: DeviceIntSize,
213213
node: OpaqueNode,
214214
) -> Option<RasterImage> {
215-
let pipeline_id = self.id;
216-
let result = self
217-
.image_cache
218-
.rasterize_vector_image(pipeline_id, image_id, size);
215+
let result = self.image_cache.rasterize_vector_image(image_id, size);
219216
if result.is_none() {
220217
self.pending_rasterization_images
221218
.lock()

components/net/image_cache.rs

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ const FALLBACK_RIPPY: &[u8] = include_bytes!("../../resources/rippy.png");
5353

5454
fn 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)]
328328
enum 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)]
398398
struct 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
});

components/shared/net/image_cache.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,6 @@ pub trait ImageCache: Sync + Send {
189189

190190
fn rasterize_vector_image(
191191
&self,
192-
pipeline_id: PipelineId,
193192
image_id: VectorImageId,
194193
size: DeviceIntSize,
195194
) -> Option<RasterImage>;

0 commit comments

Comments
 (0)