ra2_shp/frames/
mod.rs

1use ra2_pal::Palette;
2use ra2_types::{Ra2Error, Rgba, RgbaImage};
3
4// 帧头结构体
5#[derive(Clone, Debug, Default)]
6pub struct ShpFrame {
7    pub x: u16,             // 水平位置 (0,0)
8    pub y: u16,             // 垂直位置 (0,0)
9    pub width: u16,         // 帧宽度
10    pub height: u16,        // 帧高度
11    pub flags: u8,          // 特殊标志
12    pub reserved1: [u8; 3], // 对齐 (3 字节)
13    pub color: u32,         // 颜色 (可以是透明色)
14    pub reserved2: [u8; 4], // 保留字2 (未使用)
15    pub offset: u32,        // 帧数据在文件中的偏移量
16    pub buffer: Vec<u8>,
17}
18
19impl ShpFrame {
20    pub fn render(&self, palette: &Palette, width: u32, depth: u32) -> Result<RgbaImage, Ra2Error> {
21        let mut image = RgbaImage::new(width, depth);
22        let mut index = 0;
23        for dy in 0..self.height {
24            for dx in 0..self.width {
25                let pixel = image.get_pixel_mut((self.x + dx) as u32, (self.y + dy) as u32);
26                let color = self.buffer[index];
27                if color == 0 {
28                    *pixel = Rgba([0, 0, 0, 0]);
29                }
30                else {
31                    *pixel = palette.get_color(color)?.into();
32                }
33                index += 1;
34            }
35        }
36        Ok(image)
37    }
38}