diff --git a/apps/demo/src/plugin-demos/audio-context.xml b/apps/demo/src/plugin-demos/audio-context.xml
index e12273386..76092d63d 100644
--- a/apps/demo/src/plugin-demos/audio-context.xml
+++ b/apps/demo/src/plugin-demos/audio-context.xml
@@ -13,7 +13,7 @@
-
+
diff --git a/apps/demo/src/plugin-demos/canvas-babylon.xml b/apps/demo/src/plugin-demos/canvas-babylon.xml
index b2b4948cd..715fe500a 100644
--- a/apps/demo/src/plugin-demos/canvas-babylon.xml
+++ b/apps/demo/src/plugin-demos/canvas-babylon.xml
@@ -5,7 +5,7 @@
-
+
diff --git a/apps/demo/src/plugin-demos/canvas-chartjs.xml b/apps/demo/src/plugin-demos/canvas-chartjs.xml
index 44514908b..263fbb280 100644
--- a/apps/demo/src/plugin-demos/canvas-chartjs.xml
+++ b/apps/demo/src/plugin-demos/canvas-chartjs.xml
@@ -4,6 +4,6 @@
-
+
\ No newline at end of file
diff --git a/apps/demo/src/plugin-demos/canvas-perf.xml b/apps/demo/src/plugin-demos/canvas-perf.xml
index ff37a8b20..7440d9541 100644
--- a/apps/demo/src/plugin-demos/canvas-perf.xml
+++ b/apps/demo/src/plugin-demos/canvas-perf.xml
@@ -3,7 +3,7 @@
-
+
diff --git a/apps/demo/src/plugin-demos/canvas-phaser-ce.xml b/apps/demo/src/plugin-demos/canvas-phaser-ce.xml
index 8dec42063..02b9b88a3 100644
--- a/apps/demo/src/plugin-demos/canvas-phaser-ce.xml
+++ b/apps/demo/src/plugin-demos/canvas-phaser-ce.xml
@@ -5,7 +5,7 @@
-
+
diff --git a/apps/demo/src/plugin-demos/canvas-phaser.xml b/apps/demo/src/plugin-demos/canvas-phaser.xml
index 55f500497..13e0d4f68 100644
--- a/apps/demo/src/plugin-demos/canvas-phaser.xml
+++ b/apps/demo/src/plugin-demos/canvas-phaser.xml
@@ -4,6 +4,6 @@
-
+
diff --git a/apps/demo/src/plugin-demos/canvas-pixi.xml b/apps/demo/src/plugin-demos/canvas-pixi.xml
index 8a7de8930..a69ff03c0 100644
--- a/apps/demo/src/plugin-demos/canvas-pixi.xml
+++ b/apps/demo/src/plugin-demos/canvas-pixi.xml
@@ -5,7 +5,7 @@
-
diff --git a/apps/demo/src/plugin-demos/canvas-spec.xml b/apps/demo/src/plugin-demos/canvas-spec.xml
index 7183a08af..43da6486e 100644
--- a/apps/demo/src/plugin-demos/canvas-spec.xml
+++ b/apps/demo/src/plugin-demos/canvas-spec.xml
@@ -6,7 +6,7 @@
-
+
diff --git a/apps/demo/src/plugin-demos/canvas-three.xml b/apps/demo/src/plugin-demos/canvas-three.xml
index 4a007682d..9896e621e 100644
--- a/apps/demo/src/plugin-demos/canvas-three.xml
+++ b/apps/demo/src/plugin-demos/canvas-three.xml
@@ -5,7 +5,7 @@
-
diff --git a/apps/demo/src/plugin-demos/canvas.xml b/apps/demo/src/plugin-demos/canvas.xml
index 3d3b9625a..4c0edde85 100644
--- a/apps/demo/src/plugin-demos/canvas.xml
+++ b/apps/demo/src/plugin-demos/canvas.xml
@@ -169,7 +169,7 @@ loaded="{{ rectLoaded }}"
-
+
@@ -188,10 +188,10 @@ loaded="{{ rectLoaded }}"
-
+
diff --git a/crates/canvas-2d/src/context/mod.rs b/crates/canvas-2d/src/context/mod.rs
index 362fb48e2..28d4e4001 100644
--- a/crates/canvas-2d/src/context/mod.rs
+++ b/crates/canvas-2d/src/context/mod.rs
@@ -236,6 +236,17 @@ pub struct Context {
pub(crate) font_color: Color,
}
+impl Drop for Context {
+ fn drop(&mut self) {
+ // GrDirectContext frees its GL objects on whichever context is current, which
+ // may be another canvas's; its names would then delete that canvas's objects.
+ #[cfg(feature = "gl")]
+ if let Some(ref context) = self.gl_context {
+ context.make_current();
+ }
+ }
+}
+
impl Context {
pub fn get_recording_context(&mut self) -> Option {
self.surface.recording_context()
@@ -471,6 +482,16 @@ impl Context {
ret
}
+ pub fn draw_pixels(&mut self, image: &Image) {
+ let canvas = self.surface.canvas();
+ canvas.save();
+ canvas.reset_matrix();
+ let mut paint = skia_safe::Paint::default();
+ paint.set_blend_mode(BlendMode::Src);
+ canvas.draw_image(image, (0., 0.), Some(&paint));
+ canvas.restore();
+ }
+
pub fn get_image_no_flush(&mut self) -> Option {
#[cfg(feature = "gl")]
{
diff --git a/crates/canvas-android/src/jni_compat/org_nativescript_canvas_NSCCanvas.rs b/crates/canvas-android/src/jni_compat/org_nativescript_canvas_NSCCanvas.rs
index ab5860ae0..7887f119c 100644
--- a/crates/canvas-android/src/jni_compat/org_nativescript_canvas_NSCCanvas.rs
+++ b/crates/canvas-android/src/jni_compat/org_nativescript_canvas_NSCCanvas.rs
@@ -69,23 +69,21 @@ pub extern "system" fn nativeInitWebGPU(
}
unsafe {
- let interface = env.get_native_interface();
- if let Some(window) = NativeWindow::from_surface(interface, surface) {
- let Some(ptr) = NonNull::new(window.ptr().as_ptr() as *mut c_void) else {
- return 0;
- };
- let instance: *mut CanvasWebGPUInstance = instance as _;
- let ret = canvas_c::webgpu::gpu_canvas_context::canvas_native_webgpu_context_create(
- instance,
- ptr.as_ptr(),
- width as u32,
- height as u32,
- );
-
- return ret as jlong;
- }
+ let window = if surface.is_null() {
+ None
+ } else {
+ NativeWindow::from_surface(env.get_native_interface(), surface)
+ };
+ let ptr = window
+ .as_ref()
+ .map_or(ptr::null_mut(), |window| window.ptr().as_ptr() as *mut c_void);
+ canvas_c::webgpu::gpu_canvas_context::canvas_native_webgpu_context_create(
+ instance as *mut CanvasWebGPUInstance,
+ ptr,
+ width as u32,
+ height as u32,
+ ) as jlong
}
- 0
}
#[no_mangle]
@@ -175,6 +173,7 @@ pub extern "system" fn nativeDetach2DSurface(_: JNIEnv, _: JClass, context: jlon
false,
false,
false,
+ false,
true,
false,
color_space,
@@ -431,6 +430,15 @@ pub extern "system" fn nativeUpdate2DSurface(
let context = context.get_context_mut();
let color_space = context.surface_data().color_space();
let alpha = !context.surface_data().is_opaque();
+ // A new EGL surface starts blank; resize() only clears on a size change.
+ let pixels = if context.gl_context.is_some()
+ && context.surface_data().width() as i32 == width
+ && context.surface_data().height() as i32 == height
+ {
+ context.get_image()
+ } else {
+ None
+ };
if let Some(context) = context.gl_context.as_mut() {
let mut attr = canvas_core::context_attributes::ContextAttributes::new(
alpha,
@@ -454,6 +462,9 @@ pub extern "system" fn nativeUpdate2DSurface(
context.set_window_surface(&mut attr, width, height, handle);
context.make_current();
}
+ if let Some(pixels) = pixels {
+ context.draw_pixels(&pixels);
+ }
if let Some(vulkan_context) = context.vulkan_context.as_mut() {
vulkan_context.set_view(
diff --git a/crates/canvas-c/src/webgpu/gpu_canvas_context.rs b/crates/canvas-c/src/webgpu/gpu_canvas_context.rs
index 39794de5d..14977adcb 100644
--- a/crates/canvas-c/src/webgpu/gpu_canvas_context.rs
+++ b/crates/canvas-c/src/webgpu/gpu_canvas_context.rs
@@ -50,13 +50,12 @@ pub struct ReadBackTexture {
pub struct CanvasGPUCanvasContext {
pub(crate) instance: Arc,
- pub(crate) surface: parking_lot::Mutex>,
+ pub(crate) surface: parking_lot::Mutex