1- use std:: ffi:: { CStr , CString } ;
2- use std:: os:: raw:: { c_char, c_ulong, c_void} ;
3- use canvas_webgl:: utils;
4- use canvas_webgl:: utils:: gl:: bytes_per_pixel;
51use crate :: buffers:: U32Buffer ;
62use crate :: c2d:: CanvasRenderingContext2D ;
73use crate :: image_asset:: ImageAsset ;
8- use crate :: ImageData ;
94use crate :: webgl:: gl:: { WebGLActiveInfo , WebGLResult , WebGLState } ;
5+ use crate :: ImageData ;
6+ use canvas_webgl:: utils;
7+ use canvas_webgl:: utils:: gl:: bytes_per_pixel;
8+ use std:: ffi:: { CStr , CString } ;
9+ use std:: os:: raw:: { c_char, c_ulong, c_void} ;
1010
1111pub struct WebGLSync ( canvas_webgl:: webgl2:: GLSync ) ;
1212
@@ -258,6 +258,69 @@ pub extern "C" fn canvas_native_webgl2_client_wait_sync(
258258 )
259259}
260260
261+ #[ no_mangle]
262+ pub extern "C" fn canvas_native_webgl2_compressed_tex_image3d_none (
263+ target : u32 ,
264+ level : i32 ,
265+ internalformat : u32 ,
266+ width : i32 ,
267+ height : i32 ,
268+ depth : i32 ,
269+ border : i32 ,
270+ image_size : i32 ,
271+ offset : usize ,
272+ state : * mut WebGLState ,
273+ ) {
274+ assert ! ( !state. is_null( ) ) ;
275+ let state = unsafe { & mut * state } ;
276+ canvas_webgl:: webgl2:: canvas_native_webgl2_compressed_tex_image3d_none (
277+ target,
278+ level,
279+ internalformat,
280+ width,
281+ height,
282+ depth,
283+ border,
284+ image_size,
285+ offset,
286+ state. get_inner_mut ( ) ,
287+ )
288+ }
289+
290+ #[ no_mangle]
291+ pub extern "C" fn canvas_native_webgl2_compressed_tex_image3d (
292+ target : u32 ,
293+ level : i32 ,
294+ internalformat : u32 ,
295+ width : i32 ,
296+ height : i32 ,
297+ depth : i32 ,
298+ border : i32 ,
299+ src : * const u8 ,
300+ size : usize ,
301+ src_offset : usize ,
302+ src_length_override : usize ,
303+ state : * mut WebGLState ,
304+ ) {
305+ assert ! ( !state. is_null( ) ) ;
306+ let src = unsafe { std:: slice:: from_raw_parts ( src, size) } ;
307+ let state = unsafe { & mut * state } ;
308+ canvas_webgl:: webgl2:: canvas_native_webgl2_compressed_tex_image3d (
309+ target,
310+ level,
311+ internalformat,
312+ width,
313+ height,
314+ depth,
315+ border,
316+ src,
317+ src_offset,
318+ src_length_override,
319+ state. get_inner_mut ( ) ,
320+ )
321+ }
322+
323+
261324#[ no_mangle]
262325pub extern "C" fn canvas_native_webgl2_compressed_tex_sub_image3d_none (
263326 target : u32 ,
@@ -270,7 +333,7 @@ pub extern "C" fn canvas_native_webgl2_compressed_tex_sub_image3d_none(
270333 depth : i32 ,
271334 format : u32 ,
272335 image_size : i32 ,
273- offset : i32 ,
336+ offset : usize ,
274337 state : * mut WebGLState ,
275338) {
276339 assert ! ( !state. is_null( ) ) ;
@@ -426,6 +489,15 @@ pub extern "C" fn canvas_native_webgl2_delete_sampler_with_sampler(
426489 )
427490}
428491
492+ #[ no_mangle]
493+ pub extern "C" fn canvas_native_webgl2_sync_destroy (
494+ sync : * const WebGLSync ,
495+ ) {
496+ if !sync. is_null ( ) {
497+ let _ = unsafe { Box :: from_raw ( sync as * mut WebGLSync ) } ;
498+ }
499+ }
500+
429501#[ no_mangle]
430502pub extern "C" fn canvas_native_webgl2_delete_sync_with_sync (
431503 sync : * const WebGLSync ,
@@ -1104,7 +1176,6 @@ pub extern "C" fn canvas_native_webgl2_tex_image3d_canvas2d(
11041176 let canvas = unsafe { & mut * canvas } ;
11051177
11061178
1107-
11081179 // let (width, height) = (canvas.context.width(), canvas.context.height());
11091180 // let snapshot = canvas.context.as_data();
11101181
@@ -1138,6 +1209,57 @@ pub extern "C" fn canvas_native_webgl2_tex_image3d_canvas2d(
11381209 )
11391210}
11401211
1212+
1213+ #[ no_mangle]
1214+ pub extern "C" fn canvas_native_webgl2_tex_image3d_webgl (
1215+ target : u32 ,
1216+ level : i32 ,
1217+ internalformat : i32 ,
1218+ _width : i32 ,
1219+ _height : i32 ,
1220+ depth : i32 ,
1221+ border : i32 ,
1222+ format : u32 ,
1223+ type_ : u32 ,
1224+ webgl : * mut WebGLState ,
1225+ state : * mut WebGLState ,
1226+ ) {
1227+ assert ! ( !state. is_null( ) ) ;
1228+ assert ! ( !webgl. is_null( ) ) ;
1229+ let state = unsafe { & mut * state } ;
1230+ let webgl = unsafe { & mut * webgl } ;
1231+
1232+
1233+
1234+ let ( width, height, bytes) = canvas_webgl:: webgl:: canvas_native_webgl_read_webgl_pixels (
1235+ & mut webgl. 0 ,
1236+ & mut state. 0 ,
1237+ internalformat,
1238+ format as i32 ,
1239+ ) ;
1240+
1241+ // todo handle pre-multipied
1242+ // let premultiply = state.get_inner().get_premultiplied_alpha();
1243+
1244+ // let buf = source_ctx.read_pixels_with_alpha_premultiply(&snapshot, format as i32, premultiply);
1245+
1246+ state. 0 . make_current ( ) ;
1247+
1248+ canvas_webgl:: webgl2:: canvas_native_webgl2_tex_image3d (
1249+ target,
1250+ level,
1251+ internalformat,
1252+ width as i32 ,
1253+ height as i32 ,
1254+ depth,
1255+ border,
1256+ format,
1257+ type_,
1258+ bytes. as_slice ( ) ,
1259+ state. get_inner_mut ( ) ,
1260+ )
1261+ }
1262+
11411263#[ no_mangle]
11421264pub extern "C" fn canvas_native_webgl2_tex_image3d (
11431265 target : u32 ,
@@ -1404,6 +1526,59 @@ pub extern "C" fn canvas_native_webgl2_tex_sub_image3d_canvas2d(
14041526 ) ;
14051527}
14061528
1529+ #[ no_mangle]
1530+ pub extern "C" fn canvas_native_webgl2_tex_sub_image3d_webgl (
1531+ target : u32 ,
1532+ level : i32 ,
1533+ xoffset : i32 ,
1534+ yoffset : i32 ,
1535+ zoffset : i32 ,
1536+ _width : i32 ,
1537+ _height : i32 ,
1538+ depth : i32 ,
1539+ format : u32 ,
1540+ type_ : u32 ,
1541+ webgl : * mut WebGLState ,
1542+ state : * mut WebGLState ,
1543+ ) {
1544+ assert ! ( !state. is_null( ) ) ;
1545+ let state = unsafe { & mut * state } ;
1546+ let webgl = unsafe { & mut * webgl } ;
1547+
1548+ let ( width, height, bytes) = canvas_webgl:: webgl:: canvas_native_webgl_read_webgl_pixels (
1549+ & mut webgl. 0 ,
1550+ & mut state. 0 ,
1551+ gl_bindings:: RGBA as _ ,
1552+ gl_bindings:: RGBA as _ ,
1553+ ) ;
1554+
1555+
1556+ // canvas.make_current();
1557+ // let (width, height) = (canvas.context.width(), canvas.context.height());
1558+ // let data = canvas.context.as_data();
1559+
1560+ // let premultiply = state.get_inner().get_premultiplied_alpha();
1561+
1562+ // let buf = source_ctx.read_pixels_with_alpha_premultiply(&snapshot, format as i32, premultiply);
1563+
1564+ state. 0 . make_current ( ) ;
1565+
1566+ canvas_webgl:: webgl2:: canvas_native_webgl2_tex_sub_image3d (
1567+ target,
1568+ level,
1569+ xoffset,
1570+ yoffset,
1571+ zoffset,
1572+ width,
1573+ height,
1574+ depth,
1575+ format,
1576+ type_,
1577+ bytes. as_slice ( ) ,
1578+ state. get_inner_mut ( ) ,
1579+ ) ;
1580+ }
1581+
14071582#[ no_mangle]
14081583pub extern "C" fn canvas_native_webgl2_tex_sub_image3d_offset (
14091584 target : u32 ,
@@ -1930,7 +2105,6 @@ pub extern "C" fn canvas_native_webgl2_tex_image2d_webgl(
19302105}
19312106
19322107
1933-
19342108#[ no_mangle]
19352109pub extern "C" fn canvas_native_webgl2_tex_image2d_canvas2d (
19362110 target : i32 ,
@@ -2004,8 +2178,8 @@ pub extern "C" fn canvas_native_webgl2_tex_image2d_canvas2d(
20042178 let integers = match format as u32 {
20052179 gl_bindings:: RGBA_INTEGER => Some ( canvas_core:: image_asset:: ImageAsset :: rgba_to_rgba_integer ( bytes. as_slice ( ) , source_width as usize , source_height as usize ) ) ,
20062180 gl_bindings:: RGB_INTEGER => Some ( canvas_core:: image_asset:: ImageAsset :: rgba_to_rgb_integer ( bytes. as_slice ( ) , source_width as usize , source_height as usize ) ) ,
2007- gl_bindings:: RED_INTEGER =>Some ( canvas_core:: image_asset:: ImageAsset :: rgba_to_red_integer ( bytes. as_slice ( ) , source_width as usize , source_height as usize ) ) ,
2008- gl_bindings:: RG_INTEGER =>Some ( canvas_core:: image_asset:: ImageAsset :: rgba_to_rg_integer ( bytes. as_slice ( ) , source_width as usize , source_height as usize ) ) ,
2181+ gl_bindings:: RED_INTEGER => Some ( canvas_core:: image_asset:: ImageAsset :: rgba_to_red_integer ( bytes. as_slice ( ) , source_width as usize , source_height as usize ) ) ,
2182+ gl_bindings:: RG_INTEGER => Some ( canvas_core:: image_asset:: ImageAsset :: rgba_to_rg_integer ( bytes. as_slice ( ) , source_width as usize , source_height as usize ) ) ,
20092183 _ => None ,
20102184 } ;
20112185
@@ -2171,8 +2345,8 @@ pub extern "C" fn canvas_native_webgl2_tex_image2d_image_data(
21712345 let integers = match format as u32 {
21722346 gl_bindings:: RGBA_INTEGER => Some ( canvas_core:: image_asset:: ImageAsset :: rgba_to_rgba_integer ( bytes, source_width as usize , source_height as usize ) ) ,
21732347 gl_bindings:: RGB_INTEGER => Some ( canvas_core:: image_asset:: ImageAsset :: rgba_to_rgb_integer ( bytes, source_width as usize , source_height as usize ) ) ,
2174- gl_bindings:: RED_INTEGER =>Some ( canvas_core:: image_asset:: ImageAsset :: rgba_to_red_integer ( bytes, source_width as usize , source_height as usize ) ) ,
2175- gl_bindings:: RG_INTEGER =>Some ( canvas_core:: image_asset:: ImageAsset :: rgba_to_rg_integer ( bytes, source_width as usize , source_height as usize ) ) ,
2348+ gl_bindings:: RED_INTEGER => Some ( canvas_core:: image_asset:: ImageAsset :: rgba_to_red_integer ( bytes, source_width as usize , source_height as usize ) ) ,
2349+ gl_bindings:: RG_INTEGER => Some ( canvas_core:: image_asset:: ImageAsset :: rgba_to_rg_integer ( bytes, source_width as usize , source_height as usize ) ) ,
21762350 _ => None ,
21772351 } ;
21782352
0 commit comments