mirror of
https://github.com/servo/servo.git
synced 2025-08-06 06:00:15 +01:00
canvas: Make GetImageData simple and only IPC message to obtain pixels (#38274)
Currently we had `GetImageData` and `SendPixels` to obtain pixels from script thread. This PR unifies those into single `GetImageData` that does not need canvas size and has optional rect (for obtaining sub image). Testing: Existing WPT tests Signed-off-by: sagudev <16504129+sagudev@users.noreply.github.com>
This commit is contained in:
parent
77f85f390e
commit
8b2a5fca54
5 changed files with 26 additions and 63 deletions
|
@ -443,23 +443,6 @@ impl CanvasState {
|
|||
}
|
||||
}
|
||||
|
||||
pub(crate) fn get_rect(&self, canvas_size: Size2D<u32>, rect: Rect<u32>) -> Vec<u8> {
|
||||
assert!(self.origin_is_clean());
|
||||
assert!(Rect::from_size(canvas_size).contains_rect(&rect));
|
||||
|
||||
let (sender, receiver) = ipc::channel().unwrap();
|
||||
self.send_canvas_2d_msg(Canvas2dMsg::GetImageData(rect, canvas_size, sender));
|
||||
let snapshot = receiver.recv().unwrap().to_owned();
|
||||
snapshot
|
||||
.to_vec(
|
||||
Some(SnapshotAlphaMode::Transparent {
|
||||
premultiplied: false,
|
||||
}),
|
||||
Some(SnapshotPixelFormat::RGBA),
|
||||
)
|
||||
.0
|
||||
}
|
||||
|
||||
///
|
||||
/// drawImage coordinates explained
|
||||
///
|
||||
|
@ -701,7 +684,6 @@ impl CanvasState {
|
|||
OffscreenRenderingContext::Context2d(ref context) => {
|
||||
context.send_canvas_2d_msg(Canvas2dMsg::DrawImageInOther(
|
||||
self.get_canvas_id(),
|
||||
image_size,
|
||||
dest_rect,
|
||||
source_rect,
|
||||
smoothing_enabled,
|
||||
|
@ -781,7 +763,6 @@ impl CanvasState {
|
|||
RenderingContext::Context2d(ref context) => {
|
||||
context.send_canvas_2d_msg(Canvas2dMsg::DrawImageInOther(
|
||||
self.get_canvas_id(),
|
||||
image_size,
|
||||
dest_rect,
|
||||
source_rect,
|
||||
smoothing_enabled,
|
||||
|
@ -813,7 +794,6 @@ impl CanvasState {
|
|||
OffscreenRenderingContext::Context2d(ref context) => context
|
||||
.send_canvas_2d_msg(Canvas2dMsg::DrawImageInOther(
|
||||
self.get_canvas_id(),
|
||||
image_size,
|
||||
dest_rect,
|
||||
source_rect,
|
||||
smoothing_enabled,
|
||||
|
@ -1755,7 +1735,19 @@ impl CanvasState {
|
|||
};
|
||||
|
||||
let data = if self.is_paintable() {
|
||||
Some(self.get_rect(canvas_size, read_rect))
|
||||
let (sender, receiver) = ipc::channel().unwrap();
|
||||
self.send_canvas_2d_msg(Canvas2dMsg::GetImageData(Some(read_rect), sender));
|
||||
let snapshot = receiver.recv().unwrap().to_owned();
|
||||
Some(
|
||||
snapshot
|
||||
.to_vec(
|
||||
Some(SnapshotAlphaMode::Transparent {
|
||||
premultiplied: false,
|
||||
}),
|
||||
Some(SnapshotPixelFormat::RGBA),
|
||||
)
|
||||
.0,
|
||||
)
|
||||
} else {
|
||||
None
|
||||
};
|
||||
|
|
|
@ -2,12 +2,11 @@
|
|||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||
|
||||
use canvas_traits::canvas::{Canvas2dMsg, CanvasId, CanvasMsg, FromScriptMsg};
|
||||
use canvas_traits::canvas::{Canvas2dMsg, CanvasId, CanvasMsg};
|
||||
use dom_struct::dom_struct;
|
||||
use euclid::default::Size2D;
|
||||
use ipc_channel::ipc::IpcSender;
|
||||
use ipc_channel::ipc::{self, IpcSender};
|
||||
use pixels::Snapshot;
|
||||
use profile_traits::ipc;
|
||||
use script_bindings::inheritance::Castable;
|
||||
use servo_url::ServoUrl;
|
||||
use webrender_api::ImageKey;
|
||||
|
@ -162,10 +161,9 @@ impl CanvasContext for CanvasRenderingContext2D {
|
|||
return None;
|
||||
}
|
||||
|
||||
let (sender, receiver) = ipc::channel(self.global().time_profiler_chan().clone()).unwrap();
|
||||
let msg = CanvasMsg::FromScript(FromScriptMsg::SendPixels(sender), self.get_canvas_id());
|
||||
self.canvas_state.get_ipc_renderer().send(msg).unwrap();
|
||||
|
||||
let (sender, receiver) = ipc::channel().unwrap();
|
||||
self.canvas_state
|
||||
.send_canvas_2d_msg(Canvas2dMsg::GetImageData(None, sender));
|
||||
Some(receiver.recv().unwrap().to_owned())
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue