mirror of
https://github.com/servo/servo.git
synced 2025-08-05 13:40:08 +01:00
Auto merge of #20423 - servo:bytes, r=emilio
Use ByteBuf for the canvas messages <!-- Reviewable:start --> This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/20423) <!-- Reviewable:end -->
This commit is contained in:
commit
9c5bdd932e
19 changed files with 170 additions and 62 deletions
|
@ -78,6 +78,7 @@ script_plugins = {path = "../script_plugins"}
|
|||
script_traits = {path = "../script_traits"}
|
||||
selectors = { path = "../selectors" }
|
||||
serde = "1.0"
|
||||
serde_bytes = "0.10"
|
||||
servo_allocator = {path = "../allocator"}
|
||||
servo_arc = {path = "../servo_arc"}
|
||||
servo_atoms = {path = "../atoms"}
|
||||
|
|
|
@ -453,13 +453,13 @@ impl CanvasRenderingContext2D {
|
|||
}
|
||||
|
||||
let smoothing_enabled = self.state.borrow().image_smoothing_enabled;
|
||||
self.ipc_renderer
|
||||
.send(CanvasMsg::Canvas2d(Canvas2dMsg::DrawImage(image_data,
|
||||
image_size,
|
||||
dest_rect,
|
||||
source_rect,
|
||||
smoothing_enabled)))
|
||||
.unwrap();
|
||||
self.ipc_renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::DrawImage(
|
||||
image_data.into(),
|
||||
image_size,
|
||||
dest_rect,
|
||||
source_rect,
|
||||
smoothing_enabled,
|
||||
))).unwrap();
|
||||
self.mark_as_dirty();
|
||||
Ok(())
|
||||
}
|
||||
|
@ -1127,7 +1127,7 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D {
|
|||
let sh = cmp::max(1, sh.to_u32().unwrap());
|
||||
let sw = cmp::max(1, sw.to_u32().unwrap());
|
||||
|
||||
let (sender, receiver) = ipc::channel::<Vec<u8>>(self.global().time_profiler_chan().clone()).unwrap();
|
||||
let (sender, receiver) = ipc::channel(self.global().time_profiler_chan().clone()).unwrap();
|
||||
let dest_rect = Rect::new(Point2D::new(sx.to_i32().unwrap(), sy.to_i32().unwrap()),
|
||||
Size2D::new(sw as i32, sh as i32));
|
||||
let canvas_size = self.canvas.as_ref().map(|c| c.get_size()).unwrap_or(Size2D::zero());
|
||||
|
@ -1135,7 +1135,7 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D {
|
|||
self.ipc_renderer
|
||||
.send(CanvasMsg::Canvas2d(Canvas2dMsg::GetImageData(dest_rect, canvas_size, sender)))
|
||||
.unwrap();
|
||||
let mut data = receiver.recv().unwrap();
|
||||
let mut data = Vec::from(receiver.recv().unwrap());
|
||||
|
||||
// Un-premultiply alpha
|
||||
for chunk in data.chunks_mut(4) {
|
||||
|
@ -1174,10 +1174,12 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D {
|
|||
|
||||
let dirty_rect = Rect::new(Point2D::new(*dirty_x, *dirty_y),
|
||||
Size2D::new(*dirty_width, *dirty_height));
|
||||
let msg = CanvasMsg::Canvas2d(Canvas2dMsg::PutImageData(data,
|
||||
offset,
|
||||
image_data_size,
|
||||
dirty_rect));
|
||||
let msg = CanvasMsg::Canvas2d(Canvas2dMsg::PutImageData(
|
||||
data.into(),
|
||||
offset,
|
||||
image_data_size,
|
||||
dirty_rect,
|
||||
));
|
||||
self.ipc_renderer.send(msg).unwrap();
|
||||
self.mark_as_dirty();
|
||||
}
|
||||
|
|
|
@ -263,7 +263,7 @@ impl HTMLCanvasElement {
|
|||
let msg = CanvasMsg::FromScript(FromScriptMsg::SendPixels(sender));
|
||||
context.get_ipc_renderer().send(msg).unwrap();
|
||||
|
||||
receiver.recv().unwrap()?
|
||||
receiver.recv().unwrap()?.into()
|
||||
},
|
||||
Some(&CanvasContext::WebGL(_)) => {
|
||||
// TODO: add a method in WebGLRenderingContext to get the pixels.
|
||||
|
|
|
@ -35,6 +35,7 @@ use ipc_channel::ipc::IpcSender;
|
|||
use profile_traits::ipc;
|
||||
use script_runtime::CommonScriptMsg;
|
||||
use script_runtime::ScriptThreadEventCategory::WebVREvent;
|
||||
use serde_bytes::ByteBuf;
|
||||
use std::cell::Cell;
|
||||
use std::mem;
|
||||
use std::ops::Deref;
|
||||
|
@ -68,7 +69,7 @@ pub struct VRDisplay {
|
|||
// Compositor VRFrameData synchonization
|
||||
frame_data_status: Cell<VRFrameDataStatus>,
|
||||
#[ignore_malloc_size_of = "closures are hard"]
|
||||
frame_data_receiver: DomRefCell<Option<WebGLReceiver<Result<Vec<u8>, ()>>>>,
|
||||
frame_data_receiver: DomRefCell<Option<WebGLReceiver<Result<ByteBuf, ()>>>>,
|
||||
running_display_raf: Cell<bool>,
|
||||
paused: Cell<bool>,
|
||||
stopped_on_pause: Cell<bool>,
|
||||
|
|
|
@ -93,7 +93,11 @@ impl WebGLBuffer {
|
|||
}
|
||||
}
|
||||
self.capacity.set(data.len());
|
||||
self.renderer.send(WebGLCommand::BufferData(target, data.to_vec(), usage)).unwrap();
|
||||
self.renderer.send(WebGLCommand::BufferData(
|
||||
target,
|
||||
data.to_vec().into(),
|
||||
usage,
|
||||
)).unwrap();
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
|
|
@ -1050,12 +1050,15 @@ impl WebGLRenderingContext {
|
|||
let internal_format = self.extension_manager.get_effective_tex_internal_format(format, data_type);
|
||||
|
||||
// TODO(emilio): convert colorspace if requested
|
||||
let msg = WebGLCommand::TexImage2D(target.as_gl_constant(), level as i32,
|
||||
internal_format as i32,
|
||||
width as i32, height as i32,
|
||||
format,
|
||||
data_type,
|
||||
pixels);
|
||||
let msg = WebGLCommand::TexImage2D(
|
||||
target.as_gl_constant(),
|
||||
level as i32,
|
||||
internal_format as i32,
|
||||
width as i32, height as i32,
|
||||
format,
|
||||
data_type,
|
||||
pixels.into(),
|
||||
);
|
||||
|
||||
self.send_command(msg);
|
||||
|
||||
|
@ -1102,11 +1105,17 @@ impl WebGLRenderingContext {
|
|||
self.send_command(WebGLCommand::PixelStorei(constants::UNPACK_ALIGNMENT, unpacking_alignment as i32));
|
||||
|
||||
// TODO(emilio): convert colorspace if requested
|
||||
let msg = WebGLCommand::TexSubImage2D(target.as_gl_constant(),
|
||||
level as i32, xoffset, yoffset,
|
||||
width as i32, height as i32,
|
||||
format.as_gl_constant(),
|
||||
data_type.as_gl_constant(), pixels);
|
||||
let msg = WebGLCommand::TexSubImage2D(
|
||||
target.as_gl_constant(),
|
||||
level as i32,
|
||||
xoffset,
|
||||
yoffset,
|
||||
width as i32,
|
||||
height as i32,
|
||||
format.as_gl_constant(),
|
||||
data_type.as_gl_constant(),
|
||||
pixels.into(),
|
||||
);
|
||||
|
||||
self.send_command(msg);
|
||||
}
|
||||
|
@ -1182,7 +1191,7 @@ impl WebGLRenderingContext {
|
|||
constants::UNSIGNED_BYTE,
|
||||
sender,
|
||||
));
|
||||
Some(receiver.recv().unwrap())
|
||||
Some(receiver.recv().unwrap().into())
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1759,7 +1768,11 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
|
|||
if (offset as usize) + data_vec.len() > bound_buffer.capacity() {
|
||||
return self.webgl_error(InvalidValue);
|
||||
}
|
||||
self.send_command(WebGLCommand::BufferSubData(target, offset as isize, data_vec));
|
||||
self.send_command(WebGLCommand::BufferSubData(
|
||||
target,
|
||||
offset as isize,
|
||||
data_vec.into(),
|
||||
));
|
||||
}
|
||||
|
||||
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.8
|
||||
|
|
|
@ -81,6 +81,7 @@ extern crate script_layout_interface;
|
|||
extern crate script_traits;
|
||||
extern crate selectors;
|
||||
extern crate serde;
|
||||
extern crate serde_bytes;
|
||||
extern crate servo_allocator;
|
||||
extern crate servo_arc;
|
||||
#[macro_use] extern crate servo_atoms;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue