36 lines
1.0 KiB
Rust
36 lines
1.0 KiB
Rust
use std::io::{BufWriter, Write, Result};
|
|
|
|
use crate::types_defined::Color;
|
|
|
|
pub struct PPMWriter<W: Write> {
|
|
writter: BufWriter<W>
|
|
}
|
|
|
|
impl<W: Write> PPMWriter<W> {
|
|
/// 创建新的 PPM 写入器
|
|
///
|
|
/// 参数:
|
|
/// writer: 实现 Write 的目标
|
|
/// width: 图像宽度
|
|
/// height: 图像高度
|
|
pub fn new(mut inner: W, width: i32, height: i32) -> Result<Self> {
|
|
// 写入 PPM 头 (P6 二进制格式)
|
|
let header = format!("P6\n{} {}\n255\n", width, height);
|
|
inner.write_all(header.as_bytes())?;
|
|
|
|
Ok(PPMWriter { writter: BufWriter::new(inner) })
|
|
}
|
|
|
|
/// 写入单个像素 (高性能实现)
|
|
#[inline]
|
|
pub fn write(&mut self, color: Color) -> Result<()> {
|
|
// 直接写入字节数组避免额外内存分配
|
|
let bytes = [color.x as u8, color.y as u8, color.z as u8];
|
|
self.writter.write_all(&bytes)
|
|
}
|
|
|
|
/// 完成写入并刷新缓冲区
|
|
pub fn finish(mut self) -> Result<()> {
|
|
self.writter.flush()
|
|
}
|
|
} |