ray-trace-w1/src/ppm_writer.rs

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()
}
}