mirror of
https://github.com/servo/servo.git
synced 2025-07-28 17:50:37 +01:00
implemented CreateImageBitmap function for Canvas image source
This commit is contained in:
parent
9dbc6554f0
commit
ef6f99d8f5
78 changed files with 394 additions and 71 deletions
|
@ -5,6 +5,9 @@
|
|||
use crate::dom::bindings::cell::DomRefCell;
|
||||
use crate::dom::bindings::codegen::Bindings::BroadcastChannelBinding::BroadcastChannelMethods;
|
||||
use crate::dom::bindings::codegen::Bindings::EventSourceBinding::EventSourceBinding::EventSourceMethods;
|
||||
use crate::dom::bindings::codegen::Bindings::ImageBitmapBinding::{
|
||||
ImageBitmapOptions, ImageBitmapSource,
|
||||
};
|
||||
use crate::dom::bindings::codegen::Bindings::PermissionStatusBinding::PermissionState;
|
||||
use crate::dom::bindings::codegen::Bindings::VoidFunctionBinding::VoidFunction;
|
||||
use crate::dom::bindings::codegen::Bindings::WindowBinding::WindowMethods;
|
||||
|
@ -31,6 +34,7 @@ use crate::dom::eventtarget::EventTarget;
|
|||
use crate::dom::file::File;
|
||||
use crate::dom::htmlscriptelement::ScriptId;
|
||||
use crate::dom::identityhub::Identities;
|
||||
use crate::dom::imagebitmap::ImageBitmap;
|
||||
use crate::dom::messageevent::MessageEvent;
|
||||
use crate::dom::messageport::MessagePort;
|
||||
use crate::dom::paintworkletglobalscope::PaintWorkletGlobalScope;
|
||||
|
@ -41,7 +45,7 @@ use crate::dom::window::Window;
|
|||
use crate::dom::workerglobalscope::WorkerGlobalScope;
|
||||
use crate::dom::workletglobalscope::WorkletGlobalScope;
|
||||
use crate::microtask::{Microtask, MicrotaskQueue, UserMicrotask};
|
||||
use crate::realms::{enter_realm, InRealm};
|
||||
use crate::realms::{enter_realm, AlreadyInRealm, InRealm};
|
||||
use crate::script_module::ModuleTree;
|
||||
use crate::script_runtime::{CommonScriptMsg, JSContext as SafeJSContext, ScriptChan, ScriptPort};
|
||||
use crate::script_thread::{MainThreadScriptChan, ScriptThread};
|
||||
|
@ -2227,6 +2231,71 @@ impl GlobalScope {
|
|||
}))
|
||||
}
|
||||
|
||||
pub fn create_image_bitmap(
|
||||
&self,
|
||||
image: ImageBitmapSource,
|
||||
options: &ImageBitmapOptions,
|
||||
) -> Rc<Promise> {
|
||||
let in_realm_proof = AlreadyInRealm::assert(&self);
|
||||
let p = Promise::new_in_current_realm(&self, InRealm::Already(&in_realm_proof));
|
||||
if options.resizeWidth.map_or(false, |w| w == 0) {
|
||||
p.reject_error(Error::InvalidState);
|
||||
return p;
|
||||
}
|
||||
|
||||
if options.resizeHeight.map_or(false, |w| w == 0) {
|
||||
p.reject_error(Error::InvalidState);
|
||||
return p;
|
||||
}
|
||||
|
||||
let promise = match image {
|
||||
ImageBitmapSource::HTMLCanvasElement(ref canvas) => {
|
||||
// https://html.spec.whatwg.org/multipage/#check-the-usability-of-the-image-argument
|
||||
if !canvas.is_valid() {
|
||||
p.reject_error(Error::InvalidState);
|
||||
return p;
|
||||
}
|
||||
|
||||
if let Some((data, size)) = canvas.fetch_all_data() {
|
||||
let data = data
|
||||
.map(|data| data.to_vec())
|
||||
.unwrap_or_else(|| vec![0; size.area() as usize * 4]);
|
||||
|
||||
let image_bitmap = ImageBitmap::new(&self, size.width, size.height).unwrap();
|
||||
|
||||
image_bitmap.set_bitmap_data(data);
|
||||
image_bitmap.set_origin_clean(canvas.origin_is_clean());
|
||||
p.resolve_native(&(image_bitmap));
|
||||
}
|
||||
p
|
||||
},
|
||||
ImageBitmapSource::OffscreenCanvas(ref canvas) => {
|
||||
// https://html.spec.whatwg.org/multipage/#check-the-usability-of-the-image-argument
|
||||
if !canvas.is_valid() {
|
||||
p.reject_error(Error::InvalidState);
|
||||
return p;
|
||||
}
|
||||
|
||||
if let Some((data, size)) = canvas.fetch_all_data() {
|
||||
let data = data
|
||||
.map(|data| data.to_vec())
|
||||
.unwrap_or_else(|| vec![0; size.area() as usize * 4]);
|
||||
|
||||
let image_bitmap = ImageBitmap::new(&self, size.width, size.height).unwrap();
|
||||
image_bitmap.set_bitmap_data(data);
|
||||
image_bitmap.set_origin_clean(canvas.origin_is_clean());
|
||||
p.resolve_native(&(image_bitmap));
|
||||
}
|
||||
p
|
||||
},
|
||||
_ => {
|
||||
p.reject_error(Error::NotSupported);
|
||||
return p;
|
||||
},
|
||||
};
|
||||
promise
|
||||
}
|
||||
|
||||
pub fn fire_timer(&self, handle: TimerEventId) {
|
||||
self.timers.fire_timer(handle, self);
|
||||
}
|
||||
|
|
|
@ -12,6 +12,7 @@ use crate::dom::bindings::error::Fallible;
|
|||
use crate::dom::bindings::reflector::{reflect_dom_object, Reflector};
|
||||
use dom_struct::dom_struct;
|
||||
|
||||
use std::cell::Cell;
|
||||
use std::vec::Vec;
|
||||
|
||||
#[dom_struct]
|
||||
|
@ -20,6 +21,7 @@ pub struct ImageBitmap {
|
|||
width: u32,
|
||||
height: u32,
|
||||
bitmap_data: DomRefCell<Vec<u8>>,
|
||||
origin_clean: Cell<bool>,
|
||||
}
|
||||
|
||||
impl ImageBitmap {
|
||||
|
@ -29,6 +31,7 @@ impl ImageBitmap {
|
|||
width: width_arg,
|
||||
height: height_arg,
|
||||
bitmap_data: DomRefCell::new(vec![]),
|
||||
origin_clean: Cell::new(true),
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -39,6 +42,14 @@ impl ImageBitmap {
|
|||
|
||||
Ok(reflect_dom_object(imagebitmap, global))
|
||||
}
|
||||
|
||||
pub fn set_bitmap_data(&self, data: Vec<u8>) {
|
||||
*self.bitmap_data.borrow_mut() = data;
|
||||
}
|
||||
|
||||
pub fn set_origin_clean(&self, origin_is_clean: bool) {
|
||||
self.origin_clean.set(origin_is_clean);
|
||||
}
|
||||
}
|
||||
|
||||
impl ImageBitmapMethods for ImageBitmap {
|
||||
|
|
|
@ -24,7 +24,7 @@ interface mixin WindowOrWorkerGlobalScope {
|
|||
void queueMicrotask(VoidFunction callback);
|
||||
|
||||
// ImageBitmap
|
||||
// Promise<ImageBitmap> createImageBitmap(ImageBitmapSource image, optional ImageBitmapOptions options);
|
||||
Promise<ImageBitmap> createImageBitmap(ImageBitmapSource image, optional ImageBitmapOptions options = {});
|
||||
// Promise<ImageBitmap> createImageBitmap(
|
||||
// ImageBitmapSource image, long sx, long sy, long sw, long sh, optional ImageBitmapOptions options);
|
||||
};
|
||||
|
|
|
@ -7,6 +7,9 @@ use crate::dom::bindings::codegen::Bindings::DocumentBinding::{
|
|||
DocumentMethods, DocumentReadyState,
|
||||
};
|
||||
use crate::dom::bindings::codegen::Bindings::HistoryBinding::HistoryBinding::HistoryMethods;
|
||||
use crate::dom::bindings::codegen::Bindings::ImageBitmapBinding::{
|
||||
ImageBitmapOptions, ImageBitmapSource,
|
||||
};
|
||||
use crate::dom::bindings::codegen::Bindings::MediaQueryListBinding::MediaQueryListBinding::MediaQueryListMethods;
|
||||
use crate::dom::bindings::codegen::Bindings::RequestBinding::RequestInit;
|
||||
use crate::dom::bindings::codegen::Bindings::VoidFunctionBinding::VoidFunction;
|
||||
|
@ -889,6 +892,18 @@ impl WindowMethods for Window {
|
|||
.queue_function_as_microtask(callback);
|
||||
}
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/#dom-createimagebitmap
|
||||
fn CreateImageBitmap(
|
||||
&self,
|
||||
image: ImageBitmapSource,
|
||||
options: &ImageBitmapOptions,
|
||||
) -> Rc<Promise> {
|
||||
let p = self
|
||||
.upcast::<GlobalScope>()
|
||||
.create_image_bitmap(image, options);
|
||||
p
|
||||
}
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/#dom-window
|
||||
fn Window(&self) -> DomRoot<WindowProxy> {
|
||||
self.window_proxy()
|
||||
|
|
|
@ -3,6 +3,9 @@
|
|||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||
|
||||
use crate::dom::bindings::cell::{DomRefCell, Ref};
|
||||
use crate::dom::bindings::codegen::Bindings::ImageBitmapBinding::{
|
||||
ImageBitmapOptions, ImageBitmapSource,
|
||||
};
|
||||
use crate::dom::bindings::codegen::Bindings::RequestBinding::RequestInit;
|
||||
use crate::dom::bindings::codegen::Bindings::VoidFunctionBinding::VoidFunction;
|
||||
use crate::dom::bindings::codegen::Bindings::WorkerBinding::WorkerType;
|
||||
|
@ -347,6 +350,18 @@ impl WorkerGlobalScopeMethods for WorkerGlobalScope {
|
|||
.queue_function_as_microtask(callback);
|
||||
}
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/#dom-createimagebitmap
|
||||
fn CreateImageBitmap(
|
||||
&self,
|
||||
image: ImageBitmapSource,
|
||||
options: &ImageBitmapOptions,
|
||||
) -> Rc<Promise> {
|
||||
let p = self
|
||||
.upcast::<GlobalScope>()
|
||||
.create_image_bitmap(image, options);
|
||||
p
|
||||
}
|
||||
|
||||
#[allow(unrooted_must_root)]
|
||||
// https://fetch.spec.whatwg.org/#fetch-method
|
||||
fn Fetch(
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue