aboutsummaryrefslogtreecommitdiffstats
path: root/components
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
parent71deabc8bc40baaccf15415cc1f789392de62f2c (diff)
downloadservo-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.rs10
-rw-r--r--components/canvas/webgl_paint_thread.rs10
-rw-r--r--components/compositing/compositor.rs1
-rw-r--r--components/gfx/Cargo.toml2
-rw-r--r--components/layout/webrender_helpers.rs3
-rw-r--r--components/layout_thread/lib.rs1
-rw-r--r--components/net/image_cache_thread.rs46
-rw-r--r--components/servo/lib.rs10
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,