aboutsummaryrefslogtreecommitdiffstats
path: root/components/compositing
diff options
context:
space:
mode:
authorGeorge Roman <george.roman.99@gmail.com>2019-08-09 20:30:56 +0300
committerGeorge Roman <george.roman.99@gmail.com>2019-08-20 00:52:46 +0300
commitd3696baf27fb77d67b012a90403b6c699ca40484 (patch)
treec88883dd1e912a51c1b9a0752c1d5b8b78a96007 /components/compositing
parenta084997afee23bb541e89a807905ff1c815a649e (diff)
downloadservo-d3696baf27fb77d67b012a90403b6c699ca40484.tar.gz
servo-d3696baf27fb77d67b012a90403b6c699ca40484.zip
Implement TakeElementScreenshot WebDriver command
Diffstat (limited to 'components/compositing')
-rw-r--r--components/compositing/compositor.rs37
-rw-r--r--components/compositing/compositor_thread.rs4
-rw-r--r--components/compositing/gl.rs6
3 files changed, 36 insertions, 11 deletions
diff --git a/components/compositing/compositor.rs b/components/compositing/compositor.rs
index 7ac80ee4832..f0474363fa4 100644
--- a/components/compositing/compositor.rs
+++ b/components/compositing/compositor.rs
@@ -14,7 +14,7 @@ use crate::CompositionPipeline;
use crate::SendableFrameTree;
use crossbeam_channel::Sender;
use embedder_traits::Cursor;
-use euclid::{Point2D, Scale, Vector2D};
+use euclid::{Point2D, Rect, Scale, Vector2D};
use gfx_traits::Epoch;
#[cfg(feature = "gl")]
use image::{DynamicImage, ImageFormat};
@@ -442,8 +442,8 @@ impl<Window: WindowMethods + ?Sized> IOCompositor<Window> {
self.touch_handler.on_event_processed(result);
},
- (Msg::CreatePng(reply), ShutdownState::NotShuttingDown) => {
- let res = self.composite_specific_target(CompositeTarget::WindowAndPng);
+ (Msg::CreatePng(rect, reply), ShutdownState::NotShuttingDown) => {
+ let res = self.composite_specific_target(CompositeTarget::WindowAndPng, rect);
if let Err(ref e) = res {
info!("Error retrieving PNG: {:?}", e);
}
@@ -1229,7 +1229,7 @@ impl<Window: WindowMethods + ?Sized> IOCompositor<Window> {
pub fn composite(&mut self) {
let target = self.composite_target;
- match self.composite_specific_target(target) {
+ match self.composite_specific_target(target, None) {
Ok(_) => {
if self.output_file.is_some() || self.exit_after_load {
println!("Shutting down the Constellation after generating an output file or exit flag specified");
@@ -1256,6 +1256,7 @@ impl<Window: WindowMethods + ?Sized> IOCompositor<Window> {
fn composite_specific_target(
&mut self,
target: CompositeTarget,
+ rect: Option<Rect<f32, CSSPixel>>,
) -> Result<Option<Image>, UnableToComposite> {
let size = self.embedder_coordinates.framebuffer.to_u32();
@@ -1347,6 +1348,22 @@ impl<Window: WindowMethods + ?Sized> IOCompositor<Window> {
}
}
+ let (x, y, width, height) = match rect {
+ Some(rect) => {
+ let rect = self.device_pixels_per_page_px().transform_rect(&rect);
+
+ let x = rect.origin.x as i32;
+ // We need to convert to the bottom-left origin coordinate
+ // system used by OpenGL
+ let y = (size.height as f32 - rect.origin.y - rect.size.height) as i32;
+ let w = rect.size.width as u32;
+ let h = rect.size.height as u32;
+
+ (x, y, w, h)
+ },
+ None => (0, 0, size.width, size.height),
+ };
+
let rv = match target {
CompositeTarget::Window => None,
#[cfg(feature = "gl")]
@@ -1354,8 +1371,10 @@ impl<Window: WindowMethods + ?Sized> IOCompositor<Window> {
let img = gl::draw_img(
&*self.window.gl(),
rt_info,
- FramebufferUintLength::new(size.width),
- FramebufferUintLength::new(size.height),
+ x,
+ y,
+ FramebufferUintLength::new(width),
+ FramebufferUintLength::new(height),
);
Some(Image {
width: img.width(),
@@ -1378,8 +1397,10 @@ impl<Window: WindowMethods + ?Sized> IOCompositor<Window> {
let img = gl::draw_img(
gl,
rt_info,
- FramebufferUintLength::new(size.width),
- FramebufferUintLength::new(size.height),
+ x,
+ y,
+ FramebufferUintLength::new(width),
+ FramebufferUintLength::new(height),
);
let dynamic_image = DynamicImage::ImageRgb8(img);
if let Err(e) = dynamic_image.write_to(&mut file, ImageFormat::PNG)
diff --git a/components/compositing/compositor_thread.rs b/components/compositing/compositor_thread.rs
index f095ab65b1c..e10aff78844 100644
--- a/components/compositing/compositor_thread.rs
+++ b/components/compositing/compositor_thread.rs
@@ -8,6 +8,7 @@ use crate::compositor::CompositingReason;
use crate::SendableFrameTree;
use crossbeam_channel::{Receiver, Sender};
use embedder_traits::EventLoopWaker;
+use euclid::Rect;
use gfx_traits::Epoch;
use ipc_channel::ipc::IpcSender;
use msg::constellation_msg::{PipelineId, TopLevelBrowsingContextId};
@@ -17,6 +18,7 @@ use profile_traits::time;
use script_traits::{AnimationState, ConstellationMsg, EventResult, MouseButton, MouseEventType};
use std::fmt::{Debug, Error, Formatter};
use style_traits::viewport::ViewportConstraints;
+use style_traits::CSSPixel;
use webrender_api;
use webrender_api::units::{DeviceIntPoint, DeviceIntSize};
use webvr_traits::WebVRMainThreadHeartbeat;
@@ -80,7 +82,7 @@ pub enum Msg {
/// Script has handled a touch event, and either prevented or allowed default actions.
TouchEventProcessed(EventResult),
/// Composite to a PNG file and return the Image over a passed channel.
- CreatePng(IpcSender<Option<Image>>),
+ CreatePng(Option<Rect<f32, CSSPixel>>, IpcSender<Option<Image>>),
/// Alerts the compositor that the viewport has been constrained in some manner
ViewportConstrained(PipelineId, ViewportConstraints),
/// A reply to the compositor asking if the output image is stable.
diff --git a/components/compositing/gl.rs b/components/compositing/gl.rs
index 44d69254692..45d33f19a7d 100644
--- a/components/compositing/gl.rs
+++ b/components/compositing/gl.rs
@@ -82,6 +82,8 @@ pub fn initialize_png(
pub fn draw_img(
gl: &dyn gl::Gl,
render_target_info: RenderTargetInfo,
+ x: i32,
+ y: i32,
width: FramebufferUintLength,
height: FramebufferUintLength,
) -> RgbImage {
@@ -96,8 +98,8 @@ pub fn draw_img(
gl.bind_vertex_array(0);
let mut pixels = gl.read_pixels(
- 0,
- 0,
+ x,
+ y,
width as gl::GLsizei,
height as gl::GLsizei,
gl::RGB,