diff options
author | Ms2ger <Ms2ger@gmail.com> | 2017-01-09 13:28:55 +0100 |
---|---|---|
committer | Ms2ger <Ms2ger@gmail.com> | 2017-01-09 14:00:54 +0100 |
commit | 2839bca0652891b46b26645b9461d3cfae150738 (patch) | |
tree | 01d6da50b9bf235a16e97104d4c502a8b3e58efb /components/script | |
parent | 13826970c4d9fbbd67cdf9dfb39e8a847cf06541 (diff) | |
download | servo-2839bca0652891b46b26645b9461d3cfae150738.tar.gz servo-2839bca0652891b46b26645b9461d3cfae150738.zip |
Use the typed array APIs in ImageData.
Diffstat (limited to 'components/script')
-rw-r--r-- | components/script/dom/imagedata.rs | 31 |
1 files changed, 11 insertions, 20 deletions
diff --git a/components/script/dom/imagedata.rs b/components/script/dom/imagedata.rs index 877510c7d9a..4cc6f3fa235 100644 --- a/components/script/dom/imagedata.rs +++ b/components/script/dom/imagedata.rs @@ -10,11 +10,10 @@ use dom::bindings::reflector::{Reflector, reflect_dom_object}; use dom::globalscope::GlobalScope; use euclid::size::Size2D; use js::jsapi::{Heap, JSContext, JSObject}; -use js::jsapi::{JS_GetUint8ClampedArrayData, JS_NewUint8ClampedArray}; -use libc::uint8_t; +use js::rust::Runtime; +use js::typedarray::Uint8ClampedArray; use std::default::Default; use std::ptr; -use std::slice; use std::vec::Vec; #[dom_struct] @@ -37,16 +36,10 @@ impl ImageData { unsafe { let cx = global.get_cx(); - let js_object: *mut JSObject = JS_NewUint8ClampedArray(cx, width * height * 4); - assert!(!js_object.is_null()); - - if let Some(vec) = data { - let mut is_shared = false; - let js_object_data: *mut uint8_t = JS_GetUint8ClampedArrayData(js_object, &mut is_shared, ptr::null()); - assert!(!is_shared); - ptr::copy_nonoverlapping(vec.as_ptr(), js_object_data, vec.len()) - } - (*imagedata).data.set(js_object); + rooted!(in (cx) let mut js_object = ptr::null_mut()); + let data = data.as_ref().map(|d| &d[..]); + Uint8ClampedArray::create(cx, width * height * 4, data, js_object.handle_mut()).unwrap(); + (*imagedata).data.set(js_object.get()); } reflect_dom_object(imagedata, @@ -56,14 +49,12 @@ impl ImageData { #[allow(unsafe_code)] pub fn get_data_array(&self) -> Vec<u8> { unsafe { - let mut is_shared = false; assert!(!self.data.get().is_null()); - let data: *const uint8_t = - JS_GetUint8ClampedArrayData(self.data.get(), &mut is_shared, ptr::null()) as *const uint8_t; - assert!(!data.is_null()); - assert!(!is_shared); - let len = self.Width() * self.Height() * 4; - slice::from_raw_parts(data, len as usize).to_vec() + let cx = Runtime::get(); + assert!(!cx.is_null()); + typedarray!(in(cx) let array: Uint8ClampedArray = self.data.get()); + let vec = array.unwrap().as_slice().to_vec(); + vec } } |