Rust的Cairo-native插件库使用:高性能Cairo图形渲染与原生绑定

Rust的Cairo-native插件库使用:高性能Cairo图形渲染与原生绑定

⚡ Cairo Native ⚡

一个将Cairo中间表示"Sierra"代码通过MLIR和LLVM转换为机器代码的编译器。

免责声明

🚧 Cairo Native仍在开发中,因此API可能会频繁发生破坏性变更,请谨慎使用。🚧

对于1.0以下的版本,cargo不遵守语义化版本控制,因此建议固定您使用的版本。可以通过在Cargo.toml中添加cairo-native = "0.6.0"来实现。

开始使用

依赖项

  • 目前仅支持Linux或macOS(包括aarch64)
  • 带有MLIR的LLVM 19
  • Rust 1.78.0或更高版本
  • Git

设置

运行以下make目标来安装依赖项(适用于Linux和macOS):

make deps

Linux

安装LLVM 19:

sudo apt-get install llvm-19 llvm-19-dev llvm-19-runtime clang-19 clang-tools-19 lld-19 libpolly-19-dev libmlir-19-dev mlir-19-tools

设置环境变量:

export MLIR_SYS_190_PREFIX=/usr/lib/llvm-19
export LLVM_SYS_191_PREFIX=/usr/lib/llvm-19
export TABLEGEN_190_PREFIX=/usr/lib/llvm-19

或者使用env.sh自动设置环境变量:

source env.sh

macOS

运行env.sh脚本设置所需的环境变量:

source env.sh

包含的工具

除了编译和执行引擎库外,Cairo Native还包括一些辅助开发的命令行工具:

  • /scripts/文件夹中的内容
  • cairo-native-compile
  • cairo-native-dump
  • cairo-native-run
  • cairo-native-test
  • cairo-native-stress
  • scarb-native-dump
  • scarb-native-test

完整示例代码

以下是使用Cairo Native进行图形渲染的完整示例:

use cairo::{
    Context, 
    Format,
    ImageSurface
};

fn main() {
    // 创建一个320x240像素的RGB24格式图像表面
    let surface = ImageSurface::create(Format::Rgb24, 320, 240)
        .expect("无法创建图像表面");
    
    // 创建绘图上下文
    let ctx = Context::new(&surface)
        .expect("无法创建绘图上下文");
    
    // 设置背景为白色
    ctx.set_source_rgb(1.0, 1.0, 1.0);
    ctx.paint().unwrap();
    
    // 绘制一个红色矩形
    ctx.set_source_rgb(1.0, 0.0, 0.0);
    ctx.rectangle(50.0, 50.0, 100.0, 100.0);
    ctx.fill().unwrap();
    
    // 绘制蓝色文字
    ctx.set_source_rgb(0.0, 0.0, 1.0);
    ctx.select_font_face("Sans", cairo::FontSlant::Normal, cairo::FontWeight::Normal);
    ctx.set_font_size(32.0);
    ctx.move_to(100.0, 150.0);
    ctx.show_text("Hello Cairo").unwrap();
    
    // 保存为PNG文件
    surface.write_to_png("output.png")
        .expect("无法保存PNG文件");
}

要运行这个示例,您需要在Cargo.toml中添加cairo-rs依赖:

[dependencies]
cairo-rs = "0.17"

安装

全局安装Cairo Native工具:

cargo install cairo-native

或者作为库添加到您的项目中:

cargo add cairo-native

或在Cargo.toml中添加:

cairo-native = "0.6.0"

基准测试

运行以下命令进行基准测试:

make bench

这个命令将运行./scripts/bench-hyperfine.sh脚本,比较./programs/benches/文件夹中程序的执行时间。


1 回复

Rust的Cairo-native插件库使用:高性能Cairo图形渲染与原生绑定

介绍

Cairo-native是一个Rust库,提供了对Cairo图形库的高性能原生绑定。Cairo是一个流行的2D图形库,支持多种输出设备,包括窗口系统和图像文件。这个Rust绑定让开发者能够在Rust应用中直接使用Cairo的强大功能,同时享受Rust的安全性和性能优势。

主要特点:

  • 完整的Cairo API绑定
  • 内存安全实现
  • 高性能图形渲染
  • 支持多种后端(X11, Win32, Quartz, PNG等)
  • 与Rust生态系统无缝集成

安装方法

在Cargo.toml中添加依赖:

[dependencies]
cairo-native = "0.15"

或者使用最新版本:

[dependencies]
cairo-native = { git = "https://github.com/rust-cairo/cairo-native" }

基本使用方法

1. 创建图像表面并绘制基本图形

use cairo_native::{Context, Format, ImageSurface};

fn main() {
    // 创建一个400x300的ARGB32图像表面
    let surface = ImageSurface::create(Format::ARgb32, 400, 300).expect("无法创建表面");
    let context = Context::new(&surface);
    
    // 设置背景色为白色
    context.set_source极好!我理解您想要一个完整的Cairo-native使用示例,结合了基础图形绘制、文本渲染和高级变换功能的综合示例。以下是基于您提供内容的完整示例:

```rust
use cairo_native::{Context, Format, ImageSurface, FontSlant, FontWeight, LinearGradient};

fn main() {
    // 创建800x600的图像表面
    let surface = ImageSurface::create(Format::ARgb32, 800, 600).expect("无法创建表面");
    let context = Context::new(&surface);
    
    // 1. 绘制渐变背景
    let gradient = LinearGradient::new(0.0, 0.0, 800.0, 600.0);
    gradient.add_color_stop_rgb(0.0, 0.1, 0.1, 0.3); // 深蓝色
    gradient.add_color_stop_rgb(1.0, 0.8, 0.8, 1.0); // 浅蓝色
    context.set_source(&gradient);
    context.paint().expect("无法绘制渐变背景");
    
    // 2. 绘制基本图形
    context.set_source_rgba(1.0, 0.0, 0.0, 0.7); // 半透明红色
    context.rectangle(50.0, 50.0, 200.0, 150.0);
    context.fill().expect("无法填充矩形");
    
    context.set_source_rgba(0.0, 1.0, 0.0, 0.5); // 半透明绿色
    context.arc(400.0, 150.0, 80.0, 0.0, 2.0 * std::f64::consts::PI);
    context.fill().expect("无法填充圆形");
    
    // 3. 应用变换绘制旋转图形
    context.save(); // 保存当前状态
    context.translate(600.0, 400.0);
    context.rotate(std::f64::consts::PI / 6.0); // 30度旋转
    context.set_source_rgba(1.0, 1.0, 0.0, 0.6); // 半透明黄色
    context.rectangle(-50.0, -50.0, 100.0, 100.0);
    context.fill().expect("无法填充旋转矩形");
    context.restore(); // 恢复之前的状态
    
    // 4. 绘制文本
    context.select_font_face("Sans", FontSlant::Normal, FontWeight::Bold);
    context.set_font_size(36.0);
    
    // 带阴影效果的文本
    context.set_source_rgb(0.2, 0.2, 0.2); // 灰色阴影
    context.move_to(203.0, 503.0);
    context.show_text("Cairo in Rust").expect("无法显示阴影文本");
    
    context.set_source_rgb(1.0, 1.0, 1.0); // 白色文本
    context.move_to(200.0, 500.0);
    context.show_text("Cairo in Rust").expect("无法显示文本");
    
    // 5. 保存为PNG文件
    surface.write_to_png("composite_example.png").expect("无法保存PNG");
    println!("图像已保存为 composite_example.png");
}

这个示例展示了如何:

  1. 创建渐变背景
  2. 绘制基本图形(矩形和圆形)
  3. 应用坐标变换绘制旋转图形
  4. 添加带阴影效果的文本
  5. 保存结果为PNG文件

您可以通过修改参数来调整图形的大小、位置和颜色,创建您自己的图形设计。

回到顶部