mirror of
https://github.com/servo/servo.git
synced 2025-08-03 12:40:06 +01:00
webgl: Honor ArrayBuffer or ArrayBufferView in bufferData and bufferSubData.
This commit is contained in:
parent
7a559ad442
commit
d7e2b40484
2 changed files with 40 additions and 5 deletions
|
@ -48,7 +48,7 @@ use js::glue::{RUST_JSID_IS_INT, RUST_JSID_TO_INT};
|
||||||
use js::glue::{RUST_JSID_IS_STRING, RUST_JSID_TO_STRING, UnwrapObject};
|
use js::glue::{RUST_JSID_IS_STRING, RUST_JSID_TO_STRING, UnwrapObject};
|
||||||
use js::jsapi::{HandleId, HandleObject, HandleValue, JSClass, JSContext};
|
use js::jsapi::{HandleId, HandleObject, HandleValue, JSClass, JSContext};
|
||||||
use js::jsapi::{JSObject, JSString, JS_GetArrayBufferViewType, JS_GetClass};
|
use js::jsapi::{JSObject, JSString, JS_GetArrayBufferViewType, JS_GetClass};
|
||||||
use js::jsapi::{JS_GetLatin1StringCharsAndLength, JS_GetObjectAsArrayBufferView};
|
use js::jsapi::{JS_GetLatin1StringCharsAndLength, JS_GetObjectAsArrayBuffer, JS_GetObjectAsArrayBufferView};
|
||||||
use js::jsapi::{JS_GetReservedSlot, JS_GetTwoByteStringCharsAndLength, ToWindowProxyIfWindow};
|
use js::jsapi::{JS_GetReservedSlot, JS_GetTwoByteStringCharsAndLength, ToWindowProxyIfWindow};
|
||||||
use js::jsapi::{JS_IsArrayObject, JS_NewStringCopyN, JS_StringHasLatin1Chars};
|
use js::jsapi::{JS_IsArrayObject, JS_NewStringCopyN, JS_StringHasLatin1Chars};
|
||||||
use js::jsapi::{JS_WrapValue, MutableHandleValue, Type, IsObjectInContextCompartment};
|
use js::jsapi::{JS_WrapValue, MutableHandleValue, Type, IsObjectInContextCompartment};
|
||||||
|
@ -580,6 +580,29 @@ pub unsafe fn array_buffer_view_to_vec_checked<T>(abv: *mut JSObject) -> Option<
|
||||||
array_buffer_view_data_checked(abv).map(|data| data.to_vec())
|
array_buffer_view_data_checked(abv).map(|data| data.to_vec())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Similar API as the array_buffer_view_xxx functions, but for ArrayBuffer
|
||||||
|
/// objects.
|
||||||
|
pub unsafe fn array_buffer_data<'a, T>(ab: *mut JSObject) -> Option<&'a mut [T]>
|
||||||
|
where T: ArrayBufferViewContents
|
||||||
|
{
|
||||||
|
assert!(!ab.is_null());
|
||||||
|
|
||||||
|
let mut byte_length = 0;
|
||||||
|
let mut ptr = ptr::null_mut();
|
||||||
|
let ret = JS_GetObjectAsArrayBuffer(ab, &mut byte_length, &mut ptr);
|
||||||
|
if ret.is_null() {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
Some(slice::from_raw_parts_mut(ptr as *mut T, byte_length as usize / mem::size_of::<T>()))
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Similar API to array_buffer_view_to_vec, but for ArrayBuffer objects.
|
||||||
|
pub unsafe fn array_buffer_to_vec<T>(ab: *mut JSObject) -> Option<Vec<T>>
|
||||||
|
where T: ArrayBufferViewContents
|
||||||
|
{
|
||||||
|
array_buffer_data(ab).map(|data| data.to_vec())
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns whether `value` is an array-like object.
|
/// Returns whether `value` is an array-like object.
|
||||||
/// Note: Currently only Arrays are supported.
|
/// Note: Currently only Arrays are supported.
|
||||||
/// TODO: Expand this to support sequences and other array-like objects
|
/// TODO: Expand this to support sequences and other array-like objects
|
||||||
|
|
|
@ -9,8 +9,8 @@ use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderi
|
||||||
use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextMethods;
|
use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextMethods;
|
||||||
use dom::bindings::codegen::UnionTypes::ImageDataOrHTMLImageElementOrHTMLCanvasElementOrHTMLVideoElement;
|
use dom::bindings::codegen::UnionTypes::ImageDataOrHTMLImageElementOrHTMLCanvasElementOrHTMLVideoElement;
|
||||||
use dom::bindings::conversions::{ArrayBufferViewContents, ConversionResult, FromJSValConvertible, ToJSValConvertible};
|
use dom::bindings::conversions::{ArrayBufferViewContents, ConversionResult, FromJSValConvertible, ToJSValConvertible};
|
||||||
use dom::bindings::conversions::{array_buffer_view_data, array_buffer_view_data_checked, array_buffer_view_to_vec};
|
use dom::bindings::conversions::{array_buffer_to_vec, array_buffer_view_data, array_buffer_view_data_checked};
|
||||||
use dom::bindings::conversions::array_buffer_view_to_vec_checked;
|
use dom::bindings::conversions::{array_buffer_view_to_vec, array_buffer_view_to_vec_checked};
|
||||||
use dom::bindings::error::{Error, Fallible};
|
use dom::bindings::error::{Error, Fallible};
|
||||||
use dom::bindings::inheritance::Castable;
|
use dom::bindings::inheritance::Castable;
|
||||||
use dom::bindings::js::{JS, LayoutJS, MutNullableHeap, Root};
|
use dom::bindings::js::{JS, LayoutJS, MutNullableHeap, Root};
|
||||||
|
@ -883,7 +883,13 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
|
||||||
return Ok(self.webgl_error(InvalidValue));
|
return Ok(self.webgl_error(InvalidValue));
|
||||||
}
|
}
|
||||||
|
|
||||||
let data_vec = try!(unsafe { fallible_array_buffer_view_to_vec::<u8>(data) });
|
let data_vec = unsafe {
|
||||||
|
match array_buffer_to_vec::<u8>(data) {
|
||||||
|
Some(data) => data,
|
||||||
|
// Not an ArrayBuffer object, maybe an ArrayBufferView?
|
||||||
|
None => try!(fallible_array_buffer_view_to_vec::<u8>(data)),
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
let bound_buffer = match target {
|
let bound_buffer = match target {
|
||||||
constants::ARRAY_BUFFER => self.bound_buffer_array.get(),
|
constants::ARRAY_BUFFER => self.bound_buffer_array.get(),
|
||||||
|
@ -915,7 +921,13 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
|
||||||
return Ok(self.webgl_error(InvalidValue));
|
return Ok(self.webgl_error(InvalidValue));
|
||||||
}
|
}
|
||||||
|
|
||||||
let data_vec = try!(unsafe { fallible_array_buffer_view_to_vec::<u8>(data) });
|
let data_vec = unsafe {
|
||||||
|
match array_buffer_to_vec::<u8>(data) {
|
||||||
|
Some(data) => data,
|
||||||
|
// Not an ArrayBuffer object, maybe an ArrayBufferView?
|
||||||
|
None => try!(fallible_array_buffer_view_to_vec::<u8>(data)),
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
let bound_buffer = match target {
|
let bound_buffer = match target {
|
||||||
constants::ARRAY_BUFFER => self.bound_buffer_array.get(),
|
constants::ARRAY_BUFFER => self.bound_buffer_array.get(),
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue