Fixed decoding with wrong-size buffer

This commit is contained in:
G2-Games 2025-05-29 14:53:49 -05:00
parent ea952b2c24
commit f5e1e7b05b
2 changed files with 25 additions and 5 deletions

View file

@ -7,6 +7,7 @@ use crate::picture::Error;
/// A DPF file header. This must be included at the beginning /// A DPF file header. This must be included at the beginning
/// of a valid DPF file. /// of a valid DPF file.
#[derive(Debug, Clone, Copy)]
pub struct Header { pub struct Header {
/// Identifier. Must be set to "dangoimg". /// Identifier. Must be set to "dangoimg".
pub magic: [u8; 8], pub magic: [u8; 8],

View file

@ -1,8 +1,6 @@
//! Functions and other utilities surrounding the [`SquishyPicture`] type. //! Functions and other utilities surrounding the [`SquishyPicture`] type.
use std::{fs::File, io::{self, BufWriter, Read, Write}, path::Path}; use std::{fs::File, io::{self, BufWriter, Read, Write}, path::Path};
use byteorder::{ReadBytesExt, WriteBytesExt};
use integer_encoding::VarInt; use integer_encoding::VarInt;
use thiserror::Error; use thiserror::Error;
@ -146,7 +144,7 @@ impl SquishyPicture {
/// Encode the image into anything that implements [`Write`]. /// Encode the image into anything that implements [`Write`].
/// ///
/// Returns the number of bytes written. /// Returns the number of bytes written.
pub fn encode<O: Write + WriteBytesExt>(&self, mut output: O) -> Result<usize, Error> { pub fn encode<O: Write>(&self, mut output: O) -> Result<usize, Error> {
let mut count = 0; let mut count = 0;
// Write out the header // Write out the header
@ -205,14 +203,14 @@ impl SquishyPicture {
} }
/// Decode the image from anything that implements [`Read`] /// Decode the image from anything that implements [`Read`]
pub fn decode<I: Read + ReadBytesExt>(mut input: I) -> Result<Self, Error> { pub fn decode<I: Read>(mut input: I) -> Result<Self, Error> {
let header = Header::read_from(&mut input)?; let header = Header::read_from(&mut input)?;
let compression_info = CompressionInfo::read_from(&mut input); let compression_info = CompressionInfo::read_from(&mut input);
let pre_bitmap = decompress(&mut input, &compression_info); let pre_bitmap = decompress(&mut input, &compression_info);
let bitmap = match header.compression_type { let mut bitmap = match header.compression_type {
CompressionType::None => pre_bitmap, CompressionType::None => pre_bitmap,
CompressionType::Lossless => { CompressionType::Lossless => {
add_rows( add_rows(
@ -235,6 +233,8 @@ impl SquishyPicture {
}, },
}; };
bitmap.truncate(header.width as usize * header.height as usize * header.color_format.pbc());
Ok(Self { header, bitmap }) Ok(Self { header, bitmap })
} }
@ -242,6 +242,25 @@ impl SquishyPicture {
pub fn as_raw(&self) -> &Vec<u8> { pub fn as_raw(&self) -> &Vec<u8> {
&self.bitmap &self.bitmap
} }
/// Get the underlying raw buffer
pub fn into_raw(self) -> Vec<u8> {
self.bitmap
}
/// The width of the image in pixels
pub fn width(&self) -> u32 {
self.header.width
}
/// The height of the image in pixels
pub fn height(&self) -> u32 {
self.header.height
}
pub fn color_format(&self) -> ColorFormat {
self.header.color_format
}
} }
/// Decode a stream encoded as varints. /// Decode a stream encoded as varints.