diff --git a/src/gles_render/primitives.rs b/src/gles_render/primitives.rs index 343c022..1feee13 100644 --- a/src/gles_render/primitives.rs +++ b/src/gles_render/primitives.rs @@ -491,10 +491,9 @@ impl GlesCanvas self.gl.draw_arrays( glow::TRIANGLES, 0, 6 ); self.gl.bind_vertex_array( None ); - // Restore the pipeline default. if !matches!( shadow.blend, BlendMode::Normal ) { - self.gl.blend_func( glow::ONE, glow::ONE_MINUS_SRC_ALPHA ); + self.apply_composite(); } } } diff --git a/src/render/mod.rs b/src/render/mod.rs index 188c5c1..e4ed522 100644 --- a/src/render/mod.rs +++ b/src/render/mod.rs @@ -497,6 +497,15 @@ impl Canvas } } + /// How the following draws, blits included, combine with the canvas. GPU canvases only; a software canvas always composites src-over. + pub fn set_composite_mode( &mut self, mode: crate::types::CompositeMode ) + { + if let Canvas::Gles( c ) = self + { + c.set_composite_mode( mode ); + } + } + /// Shared font handle. Exposed so widgets that need raw face /// access (e.g. `Text` for ascent/descent) do not have to go /// through wrappers for every metric they read. diff --git a/src/types.rs b/src/types.rs index 62370c0..813e42f 100644 --- a/src/types.rs +++ b/src/types.rs @@ -286,6 +286,30 @@ pub enum PathCmd Close, } +/// How a draw combines with what the canvas already holds: the Porter-Duff +/// operators plus the separable modes with an exact premultiplied form. Set +/// with [`Canvas::set_composite_mode`](crate::Canvas::set_composite_mode). +#[ derive( Clone, Copy, Debug, Default, PartialEq, Eq ) ] +pub enum CompositeMode +{ + #[ default ] + SrcOver, + Clear, + Src, + Dst, + DstOver, + SrcIn, + DstIn, + SrcOut, + DstOut, + SrcAtop, + DstAtop, + Xor, + Plus, + Multiply, + Screen, +} + /// A stable widget identifier used for focus management. /// /// Assign an id to a widget with `.id( WidgetId("my_widget") )`, then request