use super::painter::Painter;
use super::text_renderer::TextRenderer;
use super::text_metrics::TextMetrics;
use super::masking::Masking;
use super::effects::Effects;
use super::shape_helpers::ShapeHelpers;
use super::batch_painter::BatchPainter;
use super::gradient::GradientPainter;
use super::ui_effects::UiEffectHelpers;
use super::image_painter::ImagePainter;
use super::offscreen::{OffscreenTarget, OffscreenTargetDesc, OffscreenTargetId};
use crate::core::types::Rect;
pub trait RenderContext:
Painter
+ TextRenderer
+ TextMetrics
+ Masking
+ Effects
+ ShapeHelpers
+ BatchPainter
+ GradientPainter
+ UiEffectHelpers
{
fn dpr(&self) -> f64;
fn image_painter(&mut self) -> Option<&mut dyn ImagePainter> {
None
}
fn supports_offscreen_targets(&self) -> bool {
false
}
fn push_offscreen_target(&mut self, _desc: OffscreenTargetDesc) -> OffscreenTarget {
None
}
fn pop_offscreen_target(&mut self) {}
fn draw_cached_target(&mut self, _id: OffscreenTargetId, _dst_rect: Rect) -> bool {
false
}
fn resize_offscreen_target(&mut self, _id: OffscreenTargetId, _desc: OffscreenTargetDesc) -> bool {
false
}
fn free_offscreen_target(&mut self, _id: OffscreenTargetId) {}
}
pub trait RenderContextExt: RenderContext {
type BlurImage: Clone;
fn set_blur_image(&mut self, _image: Option<Self::BlurImage>, _width: u32, _height: u32) {}
fn set_use_convex_glass_buttons(&mut self, _use_convex: bool) {}
}
#[cfg(test)]
mod tests {
use super::*;
struct NoImageContext;
impl crate::render::Painter for NoImageContext {
fn save(&mut self) {}
fn restore(&mut self) {}
fn translate(&mut self, _x: f64, _y: f64) {}
fn rotate(&mut self, _angle: f64) {}
fn scale(&mut self, _x: f64, _y: f64) {}
fn set_fill_color(&mut self, _color: &str) {}
fn set_global_alpha(&mut self, _alpha: f64) {}
fn set_stroke_color(&mut self, _color: &str) {}
fn set_stroke_width(&mut self, _width: f64) {}
fn set_line_dash(&mut self, _pattern: &[f64]) {}
fn set_line_cap(&mut self, _cap: &str) {}
fn set_line_join(&mut self, _join: &str) {}
fn begin_path(&mut self) {}
fn move_to(&mut self, _x: f64, _y: f64) {}
fn line_to(&mut self, _x: f64, _y: f64) {}
fn close_path(&mut self) {}
fn rect(&mut self, _x: f64, _y: f64, _w: f64, _h: f64) {}
fn arc(&mut self, _cx: f64, _cy: f64, _r: f64, _s: f64, _e: f64) {}
fn ellipse(&mut self, _cx: f64, _cy: f64, _rx: f64, _ry: f64, _rot: f64, _s: f64, _e: f64) {}
fn quadratic_curve_to(&mut self, _cpx: f64, _cpy: f64, _x: f64, _y: f64) {}
fn bezier_curve_to(&mut self, _cp1x: f64, _cp1y: f64, _cp2x: f64, _cp2y: f64, _x: f64, _y: f64) {}
fn stroke(&mut self) {}
fn fill(&mut self) {}
}
impl crate::render::TextRenderer for NoImageContext {
fn set_font(&mut self, _font: &str) {}
fn set_text_align(&mut self, _align: crate::render::TextAlign) {}
fn set_text_baseline(&mut self, _baseline: crate::render::TextBaseline) {}
fn fill_text(&mut self, _text: &str, _x: f64, _y: f64) {}
fn stroke_text(&mut self, _text: &str, _x: f64, _y: f64) {}
}
impl crate::render::TextMetrics for NoImageContext {
fn measure_text(&self, _text: &str) -> f64 {
0.0
}
fn text_bounds(&self, _text: &str, _font: &str) -> crate::render::TextBounds {
crate::render::TextBounds { x: 0.0, y: 0.0, w: 0.0, h: 0.0, ascent: 0.0, descent: 0.0 }
}
}
impl crate::render::Masking for NoImageContext {
fn clip(&mut self) {}
}
impl crate::render::Effects for NoImageContext {}
impl crate::render::ShapeHelpers for NoImageContext {
fn fill_rect(&mut self, _x: f64, _y: f64, _w: f64, _h: f64) {}
fn stroke_rect(&mut self, _x: f64, _y: f64, _w: f64, _h: f64) {}
}
impl crate::render::GradientPainter for NoImageContext {}
impl crate::render::UiEffectHelpers for NoImageContext {}
impl crate::render::BatchPainter for NoImageContext {}
impl RenderContext for NoImageContext {
fn dpr(&self) -> f64 {
1.0
}
}
#[test]
fn image_painter_default_is_none_for_a_backend_that_never_overrides_it() {
let mut ctx = NoImageContext;
let dyn_ctx: &mut dyn RenderContext = &mut ctx;
assert!(dyn_ctx.image_painter().is_none());
}
}