use model::error::{RdpResult, Error, RdpError, RdpErrorKind};
use num_enum::TryFromPrimitive;
use codec::rle::{rle_32_decompress, rle_16_decompress, rgb565torgb32};
pub struct BitmapEvent {
pub dest_left: u16,
pub dest_top: u16,
pub dest_right: u16,
pub dest_bottom: u16,
pub width: u16,
pub height: u16,
pub bpp: u16,
pub is_compress: bool,
pub data: Vec<u8>
}
impl BitmapEvent {
pub fn decompress(self) -> RdpResult<Vec<u8>> {
match self.bpp {
32 => {
Ok(
if self.is_compress {
let mut result = vec![0 as u8; self.width as usize * self.height as usize * 4];
rle_32_decompress(&self.data, self.width as u32, self.height as u32, &mut result)?;
result
} else {
self.data
}
)
},
16 => {
let result_16bpp = if self.is_compress {
let mut result = vec![0 as u16; self.width as usize * self.height as usize * 2];
rle_16_decompress(&self.data, self.width as usize, self.height as usize, &mut result)?;
result
} else {
let mut result = vec![0 as u16; self.width as usize * self.height as usize];
for i in 0..self.height {
for j in 0..self.width {
let src = (((self.height - i - 1) * self.width + j) * 2) as usize;
result[(i * self.width + j) as usize] = (self.data[src + 1] as u16) << 8 | self.data[src] as u16;
}
}
result
};
Ok(rgb565torgb32(&result_16bpp, self.width as usize, self.height as usize))
},
_ => Err(Error::RdpError(RdpError::new(RdpErrorKind::NotImplemented, &format!("Decompression Algorithm not implemented for bpp {}", self.bpp))))
}
}
}
#[repr(u8)]
#[derive(Eq, PartialEq, TryFromPrimitive, Copy, Clone)]
pub enum PointerButton {
None = 0,
Left = 1,
Right = 2,
Middle = 3
}
pub struct PointerEvent {
pub x: u16,
pub y: u16,
pub button: PointerButton,
pub down: bool
}
pub struct KeyboardEvent {
pub code: u16,
pub down: bool
}
pub enum RdpEvent {
Bitmap(BitmapEvent),
Pointer(PointerEvent),
Key(KeyboardEvent)
}