#![windows_subsystem = "windows"]
use std::error::Error;
use winit::{
application::ApplicationHandler,
event::WindowEvent,
event_loop::{ActiveEventLoop, EventLoop},
window::{Window, WindowId},
};
use x_graphics::{
brush::Brush,
canvas::Canvas,
device::DeviceContext,
font::{FontStyle, FontWeight},
gradient::Gradient,
paint::{self, DrawMode, TRANSPARENT},
text::TextAlignment,
DefaultDeviceContext,
};
struct GraphicsSample {
window: Option<Window>,
device_context: Option<DeviceContext<DefaultDeviceContext>>,
}
impl ApplicationHandler for GraphicsSample {
fn resumed(&mut self, event_loop: &ActiveEventLoop) {
if self.window.is_none() {
let mut window_attributes = Window::default_attributes().with_title("Graphics Sample");
#[cfg(target_os = "windows")]
{
window_attributes = window_attributes.with_transparent(true);
}
#[cfg(target_family = "wasm")]
{
use winit::platform::web::WindowAttributesExtWebSys;
window_attributes = window_attributes.with_append(true);
}
self.window = Some(event_loop.create_window(window_attributes).unwrap());
}
}
fn window_event(&mut self, event_loop: &ActiveEventLoop, _window_id: WindowId, event: WindowEvent) {
let window = match self.window.as_ref() {
Some(window) => window,
None => return,
};
match event {
WindowEvent::CloseRequested => {
let _ = self.window.take();
event_loop.exit();
}
WindowEvent::RedrawRequested => {
let canvas = Canvas::default_from_window(self.device_context.as_ref(), window);
if let Ok(mut canvas) = canvas {
canvas.set_smooth(true);
canvas.begin_draw();
canvas.clear(TRANSPARENT);
canvas.save();
canvas.set_opacity(0.5);
canvas.set_line_dash(&[5.0, 5.0], 1.0);
canvas.set_draw_mode(DrawMode::FillStroke);
canvas.set_brush(&Brush::new_solid(paint::RED));
canvas.draw_rounded_rect(50.0, 50.0, 200.0, 200.0, 5.0);
canvas.set_brush(&Brush::new_solid(paint::GREEN));
canvas.draw_rounded_rect(100.0, 100.0, 200.0, 200.0, 5.0);
canvas.set_brush(&Brush::new_solid(paint::BLUE));
canvas.draw_rounded_rect(150.0, 150.0, 200.0, 200.0, 5.0);
let mut gradient = Gradient::new_linear(200.0, 200.0, 400.0, 400.0);
gradient.add_color_stop(0.0, paint::RED);
gradient.add_color_stop(0.2, paint::YELLOW);
gradient.add_color_stop(0.4, paint::GREEN);
gradient.add_color_stop(0.6, paint::CYAN);
gradient.add_color_stop(0.8, paint::BLUE);
gradient.add_color_stop(1.0, paint::MAGENTA);
canvas.set_brush(&Brush::default_new_gradient(gradient));
canvas.draw_rounded_rect(200.0, 200.0, 200.0, 200.0, 5.0);
let mut gradient = Gradient::new_radial(350.0, 350.0, 350.0, 350.0, 100.0);
gradient.add_color_stop(0.0, paint::RED);
gradient.add_color_stop(0.2, paint::YELLOW);
gradient.add_color_stop(0.4, paint::GREEN);
gradient.add_color_stop(0.6, paint::CYAN);
gradient.add_color_stop(0.8, paint::BLUE);
gradient.add_color_stop(1.0, paint::MAGENTA);
canvas.set_brush(&Brush::default_new_gradient(gradient));
canvas.draw_rounded_rect(250.0, 250.0, 200.0, 200.0, 5.0);
canvas.set_text_alignment(TextAlignment::Center);
canvas.set_font_size(72.0);
canvas.set_font_weight(FontWeight::ExtraBold);
canvas.set_font_style(FontStyle::Italic | FontStyle::Underline);
canvas.set_text_color(paint::BLUE);
canvas.draw_text("Hello World\n你好🌏", canvas.bounds());
canvas.restore();
canvas.end_draw();
}
}
_ => (),
}
}
}
fn main() -> Result<(), impl Error> {
#[cfg(target_family = "wasm")]
console_error_panic_hook::set_once();
let event_loop = EventLoop::new().unwrap();
let mut sample = GraphicsSample {
window: None,
device_context: DeviceContext::default_new().ok(),
};
event_loop.run_app(&mut sample)
}