#2d-graphics #winit #graphics #2d

wcanvas

基于winit的2D图形库

1个不稳定版本

0.0.1 2023年8月10日

#64 in #winit

自定义许可

41KB
776

wcanvas

这是一个Rust包,它提供了一个用于与winit一起使用的2D图形库。

请参阅文档以了解如何使用该库。

注意:该包目前正在开发中。


lib.rs:

wcanvas

这是一个基于winit的Rust 2D图形库。它目前使用WebGPU作为底层实现。

入门指南

winit包提供了一个跨平台的窗口操作API,但故意不支持创建任何图形上下文。这是因为用户可能想要使用各种图形API,如OpenGL或WebGPU,它们与窗口创建和操作是分开的。

wcanvas包与winit接口,并提供一个2D图形上下文。您可以从创建一个事件循环和窗口开始

#[tokio::main]
async fn main() {
    let event_loop = EventLoop::new();
    let window = WindowBuilder::new()
        .with_title("wcanvas - Getting started")
        .with_inner_size(LogicalSize::new(600, 600))
        .build(&event_loop)
        .unwrap();

    // ...
}

接下来,需要为窗口创建一个“画布”。这个画布拥有窗口的所有权,您可以使用window()方法稍后借用它。

use wcanvas::canvas::CanvasBackend;
let mut canvas = window.create_canvas().await.unwrap();

最后,我们将运行事件循环,并获取重绘事件

event_loop.run(move |event, _, control_flow| {
    *control_flow = ControlFlow::Wait;

    match event {
        Event::RedrawRequested(window_id) if window_id == canvas.window().id() => {
            // Redraw requested! We will draw here...
        }
    }
});

最后,我们可以通过调用canvas.draw_frame()方法来处理重绘请求。此方法接受一个回调,并将“图形上下文”传递给它。然后,这个图形上下文允许我们进行绘图。例如,我们可以画一个绿色的方块

canvas.draw_frame(|context| {
    context.set_brush(&Brush::solid(&(0, 255, 0).into()));      // color = green
    context.fill_rect(&(20, 20, 200, 200).into());              // at (20, 20), size 200x200
});

依赖项

~19–56MB
~686K SLoC