aboutsummaryrefslogtreecommitdiffstats
path: root/components/script
diff options
context:
space:
mode:
authorMs2ger <Ms2ger@gmail.com>2017-01-09 13:28:55 +0100
committerMs2ger <Ms2ger@gmail.com>2017-01-09 14:00:54 +0100
commit2839bca0652891b46b26645b9461d3cfae150738 (patch)
tree01d6da50b9bf235a16e97104d4c502a8b3e58efb /components/script
parent13826970c4d9fbbd67cdf9dfb39e8a847cf06541 (diff)
downloadservo-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.rs31
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
}
}