From 7b0beedf3dc3fca0e5df6655d896523d8df3efe1 Mon Sep 17 00:00:00 2001 From: OJ Kwon Date: Fri, 16 Mar 2018 10:01:02 -0700 Subject: [PATCH] feat(windowevent): expose CaptureWebRender event --- .gitignore | 1 + components/compositing/compositor.rs | 14 +++++++++++++- components/compositing/windowing.rs | 3 +++ components/servo/lib.rs | 4 ++++ 4 files changed, 21 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 9dde417c9c9..35b7815ab7e 100644 --- a/.gitignore +++ b/.gitignore @@ -22,6 +22,7 @@ Servo.app .config.mk.last /glfw +capture_webrender/ # Editors diff --git a/components/compositing/compositor.rs b/components/compositing/compositor.rs index 027151af9b4..88a3dc6b5ef 100644 --- a/components/compositing/compositor.rs +++ b/components/compositing/compositor.rs @@ -23,6 +23,7 @@ use script_traits::CompositorEvent::{MouseMoveEvent, MouseButtonEvent, TouchEven use servo_config::opts; use servo_geometry::DeviceIndependentPixel; use std::collections::HashMap; +use std::env; use std::fs::File; use std::rc::Rc; use std::sync::mpsc::Sender; @@ -30,7 +31,7 @@ use std::time::{Duration, Instant}; use style_traits::{CSSPixel, DevicePixel, PinchZoomFactor}; use style_traits::cursor::CursorKind; use style_traits::viewport::ViewportConstraints; -use time::{precise_time_ns, precise_time_s}; +use time::{now, precise_time_ns, precise_time_s}; use touch::{TouchHandler, TouchAction}; use webrender; use webrender_api::{self, DeviceUintRect, DeviceUintSize, HitTestFlags, HitTestResult}; @@ -1530,6 +1531,17 @@ impl IOCompositor { txn.generate_frame(); self.webrender_api.send_transaction(self.webrender_document, txn); } + + pub fn capture_webrender(&mut self) { + match env::current_dir() { + Ok(current_dir) => { + let capture_id = now().to_timespec().sec.to_string(); + let capture_path = current_dir.join("capture_webrender").join(capture_id); + self.webrender_api.save_capture(capture_path, webrender_api::CaptureBits::all()); + }, + Err(err) => println!("could not locate path to save captures: {:?}", err) + } + } } /// Why we performed a composite. This is used for debugging. diff --git a/components/compositing/windowing.rs b/components/compositing/windowing.rs index 473e85fcb07..0426f0317bf 100644 --- a/components/compositing/windowing.rs +++ b/components/compositing/windowing.rs @@ -84,6 +84,8 @@ pub enum WindowEvent { SelectBrowser(TopLevelBrowsingContextId), /// Toggles a debug flag in WebRender ToggleWebRenderDebug(WebRenderDebugOption), + /// Capture current WebRender + CaptureWebRender, } impl Debug for WindowEvent { @@ -108,6 +110,7 @@ impl Debug for WindowEvent { WindowEvent::CloseBrowser(..) => write!(f, "CloseBrowser"), WindowEvent::SelectBrowser(..) => write!(f, "SelectBrowser"), WindowEvent::ToggleWebRenderDebug(..) => write!(f, "ToggleWebRenderDebug"), + WindowEvent::CaptureWebRender => write!(f, "CaptureWebRender"), } } } diff --git a/components/servo/lib.rs b/components/servo/lib.rs index 45b6af50c89..f5ebed9f04d 100644 --- a/components/servo/lib.rs +++ b/components/servo/lib.rs @@ -333,6 +333,10 @@ impl Servo where Window: WindowMethods + 'static { self.compositor.toggle_webrender_debug(option); } + WindowEvent::CaptureWebRender => { + self.compositor.capture_webrender(); + } + WindowEvent::NewBrowser(url, response_chan) => { let msg = ConstellationMsg::NewBrowser(url, response_chan); if let Err(e) = self.constellation_chan.send(msg) {