1use 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#[derive(Debug)]
41pub struct Rga;
42
43impl Rga {
44 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 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 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 pub fn csc(&self, src: &RgaInfo, dst: &mut RgaInfo) -> Result<(), io::Error> {
85 self.blit(src, dst, None)
86 }
87
88 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 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 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#[repr(i32)]
138pub enum RgaRop {
139 SrcAndDest = 0x88,
141 SrcOrDest = 0xee,
143 NotDest = 0x55,
145 NotSrc = 0x33,
147 SrcXorDest = 0xf6,
149 NotSrcXorDest = 0xf9,
151}
152
153#[repr(i32)]
155pub enum RgaTransform {
156 FlipH = ffi::HAL_TRANSFORM_FLIP_H as i32,
158 FlipHV = ffi::HAL_TRANSFORM_FLIP_H_V as i32,
160 FlipV = ffi::HAL_TRANSFORM_FLIP_V as i32,
162 Rot90 = ffi::HAL_TRANSFORM_ROT_90 as i32,
164 Rot180 = ffi::HAL_TRANSFORM_ROT_180 as i32,
166 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::*;