diff options
author | Glenn Watson <github@intuitionlibrary.com> | 2017-01-30 16:33:14 +1000 |
---|---|---|
committer | Glenn Watson <github@intuitionlibrary.com> | 2017-02-01 05:40:44 +1000 |
commit | 4cbefe82b5b8adb0ddeecc6d105b46df7d1034ee (patch) | |
tree | 1a1c7a9f0b515b1ffff503f1b62b98bd694fb1a5 /components | |
parent | 71deabc8bc40baaccf15415cc1f789392de62f2c (diff) | |
download | servo-4cbefe82b5b8adb0ddeecc6d105b46df7d1034ee.tar.gz servo-4cbefe82b5b8adb0ddeecc6d105b46df7d1034ee.zip |
Update WR (radial gradients, subpixel positioning, tiling changes).
Diffstat (limited to 'components')
-rw-r--r-- | components/canvas/canvas_paint_thread.rs | 10 | ||||
-rw-r--r-- | components/canvas/webgl_paint_thread.rs | 10 | ||||
-rw-r--r-- | components/compositing/compositor.rs | 1 | ||||
-rw-r--r-- | components/gfx/Cargo.toml | 2 | ||||
-rw-r--r-- | components/layout/webrender_helpers.rs | 3 | ||||
-rw-r--r-- | components/layout_thread/lib.rs | 1 | ||||
-rw-r--r-- | components/net/image_cache_thread.rs | 46 | ||||
-rw-r--r-- | components/servo/lib.rs | 10 |
8 files changed, 64 insertions, 19 deletions
diff --git a/components/canvas/canvas_paint_thread.rs b/components/canvas/canvas_paint_thread.rs index 447d60a2862..43778555736 100644 --- a/components/canvas/canvas_paint_thread.rs +++ b/components/canvas/canvas_paint_thread.rs @@ -559,9 +559,13 @@ impl<'a> CanvasPaintThread<'a> { self.drawtarget.snapshot().get_data_surface().with_data(|element| { let size = self.drawtarget.get_size(); self.webrender_api.update_image(self.webrender_image_key, - size.width as u32, - size.height as u32, - webrender_traits::ImageFormat::RGBA8, + webrender_traits::ImageDescriptor { + width: size.width as u32, + height: size.height as u32, + stride: None, + format: webrender_traits::ImageFormat::RGBA8, + is_opaque: false, + }, element.into()); let data = CanvasImageData { diff --git a/components/canvas/webgl_paint_thread.rs b/components/canvas/webgl_paint_thread.rs index e852742bc15..7dcfabda123 100644 --- a/components/canvas/webgl_paint_thread.rs +++ b/components/canvas/webgl_paint_thread.rs @@ -236,9 +236,13 @@ impl WebGLPaintThread { // TODO: This shouldn't be a common path, but try to avoid // the spurious clone(). webrender_api.update_image(image_key, - width as u32, - height as u32, - webrender_traits::ImageFormat::RGBA8, + webrender_traits::ImageDescriptor { + width: width as u32, + height: height as u32, + stride: None, + format: webrender_traits::ImageFormat::RGBA8, + is_opaque: false, + }, pixels.clone()); let image_data = CanvasImageData { diff --git a/components/compositing/compositor.rs b/components/compositing/compositor.rs index 49b92f8e171..d0769c8a0ec 100644 --- a/components/compositing/compositor.rs +++ b/components/compositing/compositor.rs @@ -739,6 +739,7 @@ impl<Window: WindowMethods> IOCompositor<Window> { let pipeline_id = frame_tree.pipeline.id.to_webrender(); self.webrender_api.set_root_pipeline(pipeline_id); + self.webrender_api.generate_frame(); self.create_pipeline_details_for_frame_tree(&frame_tree); diff --git a/components/gfx/Cargo.toml b/components/gfx/Cargo.toml index 3f6ff4f7104..f71d4d94723 100644 --- a/components/gfx/Cargo.toml +++ b/components/gfx/Cargo.toml @@ -49,7 +49,7 @@ features = ["serde_derive", "ipc"] [target.'cfg(target_os = "macos")'.dependencies] byteorder = "0.5" core-foundation = "0.2" -core-graphics = "0.4" +core-graphics = "0.5" core-text = "2.0" [target.'cfg(any(target_os = "linux", target_os = "android"))'.dependencies] diff --git a/components/layout/webrender_helpers.rs b/components/layout/webrender_helpers.rs index f222109089a..dd4ab6b9f01 100644 --- a/components/layout/webrender_helpers.rs +++ b/components/layout/webrender_helpers.rs @@ -246,7 +246,8 @@ impl WebRenderDisplayItemConverter for DisplayItem { item.text_run.font_key, item.text_color, item.text_run.actual_pt_size, - item.blur_radius); + item.blur_radius, + None); } } DisplayItem::Image(ref item) => { diff --git a/components/layout_thread/lib.rs b/components/layout_thread/lib.rs index 8297c6a725c..8fe49ef5cd8 100644 --- a/components/layout_thread/lib.rs +++ b/components/layout_thread/lib.rs @@ -988,6 +988,7 @@ impl LayoutThread { webrender_traits::Epoch(epoch_number), viewport_size, builder); + self.webrender_api.generate_frame(); }); } 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 => {} } diff --git a/components/servo/lib.rs b/components/servo/lib.rs index c7005629652..9ce7bd971e4 100644 --- a/components/servo/lib.rs +++ b/components/servo/lib.rs @@ -162,13 +162,21 @@ impl<Window> Browser<Window> where Window: WindowMethods + 'static { webrender_traits::RendererKind::Native }; + let recorder = if opts.webrender_record { + let record_path = PathBuf::from("wr-record.bin"); + let recorder = Box::new(webrender::BinaryRecorder::new(&record_path)); + Some(recorder as Box<webrender::ApiRecordingReceiver>) + } else { + None + }; + webrender::Renderer::new(webrender::RendererOptions { device_pixel_ratio: device_pixel_ratio, resource_override_path: Some(resource_path), enable_aa: opts.enable_text_antialiasing, enable_profiler: opts.webrender_stats, debug: opts.webrender_debug, - enable_recording: opts.webrender_record, + recorder: recorder, precache_shaders: opts.precache_shaders, enable_scrollbars: opts.output_file.is_none(), renderer_kind: renderer_kind, |