From a29dabca4c10f15fc0d5e8ab75405147c3c132f1 Mon Sep 17 00:00:00 2001 From: Nicolas Silva Date: Tue, 28 Mar 2017 19:10:02 +0200 Subject: [PATCH] Expose images to the BlobImageRenderer. --- webrender/examples/basic.rs | 5 ++-- webrender/src/resource_cache.rs | 53 +++++++++++++++++++++++++++------ webrender_traits/src/image.rs | 13 +++++--- 3 files changed, 56 insertions(+), 15 deletions(-) diff --git a/webrender/examples/basic.rs b/webrender/examples/basic.rs index 1cfc565148..63f475c103 100644 --- a/webrender/examples/basic.rs +++ b/webrender/examples/basic.rs @@ -22,7 +22,7 @@ use webrender_traits::{BlobImageData, BlobImageDescriptor, BlobImageError, BlobI use webrender_traits::{BlobImageResult, ClipRegion, ColorF, Epoch, GlyphInstance}; use webrender_traits::{DeviceIntPoint, DeviceUintSize, DeviceUintRect, LayoutPoint, LayoutRect, LayoutSize}; use webrender_traits::{ImageData, ImageDescriptor, ImageFormat, ImageKey, ImageRendering}; -use webrender_traits::{PipelineId, RasterizedBlobImage, TransformStyle, BoxShadowClipMode}; +use webrender_traits::{PipelineId, RasterizedBlobImage, ImageStore, TransformStyle, BoxShadowClipMode}; #[derive(Debug)] enum Gesture { @@ -482,7 +482,8 @@ impl BlobImageRenderer for FakeBlobImageRenderer { key: ImageKey, _: Arc, descriptor: &BlobImageDescriptor, - _dirty_rect: Option) { + _dirty_rect: Option, + _images: &ImageStore) { let mut texels = Vec::with_capacity((descriptor.width * descriptor.height * 4) as usize); for y in 0..descriptor.height { for x in 0..descriptor.width { diff --git a/webrender/src/resource_cache.rs b/webrender/src/resource_cache.rs index 42330b6622..242b86e8e6 100644 --- a/webrender/src/resource_cache.rs +++ b/webrender/src/resource_cache.rs @@ -25,7 +25,7 @@ use webrender_traits::{Epoch, FontKey, GlyphKey, ImageKey, ImageFormat, ImageRen use webrender_traits::{FontRenderMode, ImageData, GlyphDimensions, WebGLContextId}; use webrender_traits::{DevicePoint, DeviceIntSize, DeviceUintRect, ImageDescriptor, ColorF}; use webrender_traits::{GlyphOptions, GlyphInstance, TileOffset, TileSize}; -use webrender_traits::{BlobImageRenderer, BlobImageDescriptor, BlobImageError}; +use webrender_traits::{BlobImageRenderer, BlobImageDescriptor, BlobImageError, ImageStore}; use webrender_traits::{ExternalImageData, ExternalImageType, LayoutPoint}; use threadpool::ThreadPool; use euclid::Point2D; @@ -116,6 +116,40 @@ struct ImageResource { dirty_rect: Option } +struct ImageTemplates { + images: HashMap>, +} + +impl ImageTemplates { + fn new() -> Self { + ImageTemplates { + images: HashMap::with_hasher(Default::default()) + } + } + + fn insert(&mut self, key: ImageKey, resource: ImageResource) { + self.images.insert(key, resource); + } + + fn remove(&mut self, key: ImageKey) -> Option { + self.images.remove(&key) + } + + fn get(&self, key: ImageKey) -> Option<&ImageResource> { + self.images.get(&key) + } + + fn get_mut(&mut self, key: ImageKey) -> Option<&mut ImageResource> { + self.images.get_mut(&key) + } +} + +impl ImageStore for ImageTemplates { + fn get_image(&self, key: ImageKey) -> Option<(&ImageData, &ImageDescriptor)> { + self.images.get(&key).map(|resource|{ (&resource.data, &resource.descriptor) }) + } +} + struct CachedImageInfo { texture_cache_id: TextureCacheItemId, epoch: Epoch, @@ -207,7 +241,7 @@ pub struct ResourceCache { webgl_textures: HashMap>, font_templates: HashMap>, - image_templates: HashMap>, + image_templates: ImageTemplates, enable_aa: bool, state: State, current_frame_id: FrameId, @@ -236,7 +270,7 @@ impl ResourceCache { cached_images: ResourceClassCache::new(), webgl_textures: HashMap::default(), font_templates: HashMap::default(), - image_templates: HashMap::default(), + image_templates: ImageTemplates::new(), cached_glyph_dimensions: HashMap::default(), texture_cache: texture_cache, state: State::Idle, @@ -311,7 +345,7 @@ impl ResourceCache { descriptor: ImageDescriptor, data: ImageData, dirty_rect: Option) { - let resource = if let Some(image) = self.image_templates.get(&image_key) { + let resource = if let Some(image) = self.image_templates.get(image_key) { assert_eq!(image.descriptor.width, descriptor.width); assert_eq!(image.descriptor.height, descriptor.height); assert_eq!(image.descriptor.format, descriptor.format); @@ -342,7 +376,7 @@ impl ResourceCache { } pub fn delete_image_template(&mut self, image_key: ImageKey) { - let value = self.image_templates.remove(&image_key); + let value = self.image_templates.remove(image_key); if value.is_none() { println!("Delete the non-exist key:{:?}", image_key); @@ -376,7 +410,7 @@ impl ResourceCache { tile: tile, }; - let template = self.image_templates.get(&key).unwrap(); + let template = self.image_templates.get(key).unwrap(); if let ImageData::Blob(ref data) = template.data { if let Some(ref mut renderer) = self.blob_image_renderer { let same_epoch = match self.cached_images.resources.get(&request) { @@ -396,6 +430,7 @@ impl ResourceCache { scale_factor: 1.0, }, template.dirty_rect, + &self.image_templates, ); } } @@ -519,7 +554,7 @@ impl ResourceCache { } pub fn get_image_properties(&self, image_key: ImageKey) -> ImageProperties { - let image_template = &self.image_templates[&image_key]; + let image_template = &self.image_templates.get(image_key).unwrap(); let external_image = match image_template.data { ImageData::External(ext_image) => { @@ -668,7 +703,7 @@ impl ResourceCache { request: &ImageRequest, image_data: Option, texture_cache_profile: &mut TextureCacheProfileCounters) { - let image_template = self.image_templates.get_mut(&request.key).unwrap(); + let image_template = self.image_templates.get_mut(request.key).unwrap(); let image_data = image_data.unwrap_or_else(||{ image_template.data.clone() }); @@ -751,7 +786,7 @@ impl ResourceCache { request: ImageRequest, image_data: Option, texture_cache_profile: &mut TextureCacheProfileCounters) { - match self.image_templates.get(&request.key).unwrap().data { + match self.image_templates.get(request.key).unwrap().data { ImageData::External(ext_image) => { match ext_image.image_type { ExternalImageType::Texture2DHandle | diff --git a/webrender_traits/src/image.rs b/webrender_traits/src/image.rs index 95afbcb226..0b97ce7fc5 100644 --- a/webrender_traits/src/image.rs +++ b/webrender_traits/src/image.rs @@ -115,10 +115,11 @@ impl ImageData { pub trait BlobImageRenderer: Send { fn request_blob_image(&mut self, - key: ImageKey, - data: Arc, - descriptor: &BlobImageDescriptor, - dirty_rect: Option); + key: ImageKey, + data: Arc, + descriptor: &BlobImageDescriptor, + dirty_rect: Option, + images: &ImageStore); fn resolve_blob_image(&mut self, key: ImageKey) -> BlobImageResult; } @@ -148,3 +149,7 @@ pub enum BlobImageError { InvalidData, Other(String), } + +pub trait ImageStore { + fn get_image(&self, key: ImageKey) -> Option<(&ImageData, &ImageDescriptor)>; +}