aboutsummaryrefslogtreecommitdiffstats
path: root/components/net/image_cache_thread.rs
diff options
context:
space:
mode:
authorGlenn Watson <github@intuitionlibrary.com>2017-01-30 16:33:14 +1000
committerGlenn Watson <github@intuitionlibrary.com>2017-02-01 05:40:44 +1000
commit4cbefe82b5b8adb0ddeecc6d105b46df7d1034ee (patch)
tree1a1c7a9f0b515b1ffff503f1b62b98bd694fb1a5 /components/net/image_cache_thread.rs
parent71deabc8bc40baaccf15415cc1f789392de62f2c (diff)
downloadservo-4cbefe82b5b8adb0ddeecc6d105b46df7d1034ee.tar.gz
servo-4cbefe82b5b8adb0ddeecc6d105b46df7d1034ee.zip
Update WR (radial gradients, subpixel positioning, tiling changes).
Diffstat (limited to 'components/net/image_cache_thread.rs')
-rw-r--r--components/net/image_cache_thread.rs46
1 files changed, 36 insertions, 10 deletions
diff --git a/components/net/image_cache_thread.rs b/components/net/image_cache_thread.rs
index 2df54b8e30c..51d8324bd48 100644
--- a/components/net/image_cache_thread.rs
+++ b/components/net/image_cache_thread.rs
@@ -33,6 +33,26 @@ use webrender_traits;
/// MAYBE(Yoric):
/// * For faster lookups, it might be useful to store the LoadKey in the DOM once we have performed a first load.
+// TODO(gw): This is a port of the old is_image_opaque code from WR.
+// Consider using SIMD to speed this up if it shows in profiles.
+fn is_image_opaque(format: webrender_traits::ImageFormat, bytes: &[u8]) -> bool {
+ match format {
+ webrender_traits::ImageFormat::RGBA8 => {
+ let mut is_opaque = true;
+ for i in 0..(bytes.len() / 4) {
+ if bytes[i * 4 + 3] != 255 {
+ is_opaque = false;
+ break;
+ }
+ }
+ is_opaque
+ }
+ webrender_traits::ImageFormat::RGB8 => true,
+ webrender_traits::ImageFormat::A8 => false,
+ webrender_traits::ImageFormat::Invalid | webrender_traits::ImageFormat::RGBAF32 => unreachable!(),
+ }
+}
+
/// Represents an image that is either being loaded
/// by the resource thread, or decoded by a worker thread.
struct PendingLoad {
@@ -314,12 +334,15 @@ fn get_placeholder_image(webrender_api: &webrender_traits::RenderApi) -> io::Res
let format = convert_format(image.format);
let mut bytes = Vec::new();
bytes.extend_from_slice(&*image.bytes);
+ let descriptor = webrender_traits::ImageDescriptor {
+ width: image.width,
+ height: image.height,
+ stride: None,
+ format: format,
+ is_opaque: is_image_opaque(format, &bytes),
+ };
let data = webrender_traits::ImageData::new(bytes);
- image.id = Some(webrender_api.add_image(image.width,
- image.height,
- None,
- format,
- data));
+ image.id = Some(webrender_api.add_image(descriptor, data));
Ok(Arc::new(image))
}
@@ -476,12 +499,15 @@ impl ImageCache {
let format = convert_format(image.format);
let mut bytes = Vec::new();
bytes.extend_from_slice(&*image.bytes);
+ let descriptor = webrender_traits::ImageDescriptor {
+ width: image.width,
+ height: image.height,
+ stride: None,
+ format: format,
+ is_opaque: is_image_opaque(format, &bytes),
+ };
let data = webrender_traits::ImageData::new(bytes);
- image.id = Some(self.webrender_api.add_image(image.width,
- image.height,
- None,
- format,
- data));
+ image.id = Some(self.webrender_api.add_image(descriptor, data));
}
LoadResult::PlaceholderLoaded(..) | LoadResult::None => {}
}