rkrga/
lib.rs

1//! Raster Graphic Acceleration
2//!
3//! Rockchip RGA 是一个独立的二维光栅图形加速单元。
4//! 它加速了二维图形操作,例如点/线绘制、图像缩放、旋转、位图、图像合成等。
5//!
6//! 当前基于 Rockchip RGA v1.2+ 应用接口接口实现。
7//!
8//! # Examples
9//! ```
10//! use rkrga::{Rga, RgaBuffer, RgaInfoBuilder, RgaRectBuilder, RgaTransform};
11//! use std::sync::Arc;
12//!
13//! // 初始化 RGA 模块
14//! let rga = Arc::new(Rga::new().unwrap());
15//!
16//! // 设定输入、输出图像信息
17//! let src_rect = RgaRectBuilder::new().size(1280, 720).format(RgaPixelFormat::Rgba8888).build();
18//! let dst_rect = RgaRectBuilder::new().size(720, 1280).format(RgaPixelFormat::Rgba8888).build();
19//!
20//! // 分配输入、输出内存缓冲区
21//! let src_bo = RgaBuffer::with_rect_mapped(Arc::clone(&rga), &src_rect).unwrap();
22//! let dst_bo = RgaBuffer::with_rect_mapped(Arc::clone(&rga), &dst_rect).unwrap();
23//!
24//! // 生成 RGA 操作信息
25//! let src_info = RgaInfoBuilder::new().bo(&src_bo).rect(&src_rect).build();
26//! let mut dst_info = RgaInfoBuilder::new().bo(&dst_bo).rect(&dst_rect).build();
27//!
28//! // 执行旋转操作
29//! rga.rotate(&src_info, &mut dst_info, RgaTransform::Rot90).unwrap();
30//! ```
31use std::io;
32use std::sync::Arc;
33
34pub use rkrga_sys as ffi;
35
36pub type RgaInfo = ffi::rga_info_t;
37pub type RgaRect = ffi::rga_rect_t;
38
39/// 一个描述 RGA 模块的类型。
40#[derive(Debug)]
41pub struct Rga;
42
43impl Rga {
44    /// 创建一个 RGA 对象实例。
45    pub fn new() -> Result<Self, io::Error> {
46        unsafe {
47            match ffi::c_RkRgaInit() {
48                0 => Ok(Self),
49                err => Err(io::Error::from_raw_os_error(err)),
50            }
51        }
52    }
53
54    /// 分配一个内存缓冲对象。
55    pub fn alloc_buffer(
56        self: &Arc<Self>,
57        width: i32,
58        height: i32,
59        bpp: i32,
60    ) -> Result<RgaBuffer, io::Error> {
61        RgaBuffer::new(Arc::clone(self), width, height, bpp)
62    }
63
64    /// 对象图像进行比特操作。
65    pub fn blit(
66        &self,
67        src: &RgaInfo,
68        dst: &mut RgaInfo,
69        extra_src: Option<&mut RgaInfo>,
70    ) -> Result<(), io::Error> {
71        unsafe {
72            let mut src = *src;
73            let extra_src = extra_src
74                .map(|x| x as *mut RgaInfo)
75                .unwrap_or(std::ptr::null_mut());
76            match ffi::c_RkRgaBlit(&mut src, dst, extra_src) {
77                0 => Ok(()),
78                err => Err(io::Error::from_raw_os_error(err)),
79            }
80        }
81    }
82
83    /// 对象图像进行色彩空间转换操作。
84    pub fn csc(&self, src: &RgaInfo, dst: &mut RgaInfo) -> Result<(), io::Error> {
85        self.blit(src, dst, None)
86    }
87
88    /// 使用指定颜色填充图像。
89    pub fn fill(&self, dst: &RgaInfo, color: u32) -> Result<(), io::Error> {
90        unsafe {
91            let mut dst = RgaInfo {
92                color: color as i32,
93                ..*dst
94            };
95            match ffi::c_RkRgaColorFill(&mut dst) {
96                0 => Ok(()),
97                err => Err(io::Error::from_raw_os_error(err)),
98            }
99        }
100    }
101
102    /// 对象图像进行旋转操作。
103    pub fn rotate(
104        &self,
105        src: &RgaInfo,
106        dst: &mut RgaInfo,
107        trans: RgaTransform,
108    ) -> Result<(), io::Error> {
109        let src = RgaInfo {
110            rotation: trans as i32,
111            ..*src
112        };
113        self.blit(&src, dst, None)
114    }
115
116    /// 对象图像进行缩放操作。
117    pub fn scale(&self, src: &RgaInfo, dst: &mut RgaInfo) -> Result<(), io::Error> {
118        self.blit(src, dst, None)
119    }
120}
121
122impl Default for Rga {
123    fn default() -> Self {
124        Self::new().expect("Rga::new() failed")
125    }
126}
127
128impl Drop for Rga {
129    fn drop(&mut self) {
130        unsafe {
131            ffi::c_RkRgaDeInit();
132        }
133    }
134}
135
136/// 一个描述 RGA 位操作的枚举。
137#[repr(i32)]
138pub enum RgaRop {
139    /// DEST=(SRC AND DEST).
140    SrcAndDest = 0x88,
141    /// DEST=(SRC OR DEST).
142    SrcOrDest = 0xee,
143    /// DEST=NOT(DEST).
144    NotDest = 0x55,
145    /// DEST=NOT(SRC).
146    NotSrc = 0x33,
147    /// DEST=(SRC XOR DEST).
148    SrcXorDest = 0xf6,
149    /// DEST=NOT(SRC XOR DEST).
150    NotSrcXorDest = 0xf9,
151}
152
153/// 一个描述 RGA 旋转或翻转操作的枚举。
154#[repr(i32)]
155pub enum RgaTransform {
156    /// 水平翻转。
157    FlipH = ffi::HAL_TRANSFORM_FLIP_H as i32,
158    /// 水平及垂直翻转。
159    FlipHV = ffi::HAL_TRANSFORM_FLIP_H_V as i32,
160    /// 垂直翻转。
161    FlipV = ffi::HAL_TRANSFORM_FLIP_V as i32,
162    /// 旋转 90 度。
163    Rot90 = ffi::HAL_TRANSFORM_ROT_90 as i32,
164    /// 旋转 180 度。
165    Rot180 = ffi::HAL_TRANSFORM_ROT_180 as i32,
166    /// 旋转 270 度。
167    Rot270 = ffi::HAL_TRANSFORM_ROT_270 as i32,
168}
169
170mod bo;
171mod builder;
172mod pixfmt;
173
174pub use bo::*;
175pub use builder::*;
176pub use pixfmt::*;