swf: Move num_colors into BitmapFormat::ColorMap8

This commit is contained in:
relrelb 2021-06-06 00:29:55 +03:00 committed by Mike Welsh
parent 53cc9f38fc
commit b8eae51888
5 changed files with 18 additions and 24 deletions

View File

@ -440,12 +440,12 @@ pub fn decode_define_bits_lossless(
}
decoded_data
}
(1, swf::BitmapFormat::ColorMap8) => {
(1, swf::BitmapFormat::ColorMap8 { num_colors }) => {
let mut i = 0;
let padded_width = (swf_tag.width + 0b11) & !0b11;
let mut palette = Vec::with_capacity(swf_tag.num_colors as usize + 1);
for _ in 0..=swf_tag.num_colors {
let mut palette = Vec::with_capacity(num_colors as usize + 1);
for _ in 0..=num_colors {
palette.push(Color {
r: decoded_data[i],
g: decoded_data[i + 1],
@ -476,12 +476,12 @@ pub fn decode_define_bits_lossless(
}
out_data
}
(2, swf::BitmapFormat::ColorMap8) => {
(2, swf::BitmapFormat::ColorMap8 { num_colors }) => {
let mut i = 0;
let padded_width = (swf_tag.width + 0b11) & !0b11;
let mut palette = Vec::with_capacity(swf_tag.num_colors as usize + 1);
for _ in 0..=swf_tag.num_colors {
let mut palette = Vec::with_capacity(num_colors as usize + 1);
for _ in 0..=num_colors {
palette.push(Color {
r: decoded_data[i],
g: decoded_data[i + 1],

View File

@ -2554,19 +2554,17 @@ impl<'a> Reader<'a> {
pub fn read_define_bits_lossless(&mut self, version: u8) -> Result<DefineBitsLossless<'a>> {
let id = self.read_character_id()?;
let format = match self.read_u8()? {
3 => BitmapFormat::ColorMap8,
let format = self.read_u8()?;
let width = self.read_u16()?;
let height = self.read_u16()?;
let format = match format {
3 => BitmapFormat::ColorMap8 {
num_colors: self.read_u8()?,
},
4 if version == 1 => BitmapFormat::Rgb15,
5 => BitmapFormat::Rgb32,
_ => return Err(Error::invalid_data("Invalid bitmap format.")),
};
let width = self.read_u16()?;
let height = self.read_u16()?;
let num_colors = if format == BitmapFormat::ColorMap8 {
self.read_u8()?
} else {
0
};
let data = self.read_slice_to_end();
Ok(DefineBitsLossless {
version,
@ -2574,7 +2572,6 @@ impl<'a> Reader<'a> {
format,
width,
height,
num_colors,
data,
})
}

View File

@ -165,7 +165,6 @@ pub fn tag_tests() -> Vec<TagTestData> {
format: BitmapFormat::Rgb32,
width: 8,
height: 8,
num_colors: 0,
data: &[
120, 218, 251, 207, 192, 240, 255, 255, 8, 198, 0, 4, 128, 127, 129,
],
@ -183,7 +182,6 @@ pub fn tag_tests() -> Vec<TagTestData> {
format: BitmapFormat::Rgb32,
width: 8,
height: 8,
num_colors: 0,
data: &[
120, 218, 107, 96, 96, 168, 107, 24, 193, 24, 0, 227, 81, 63, 129,
],

View File

@ -1408,13 +1408,12 @@ pub struct DefineBitsLossless<'a> {
pub format: BitmapFormat,
pub width: u16,
pub height: u16,
pub num_colors: u8,
pub data: &'a [u8],
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum BitmapFormat {
ColorMap8,
ColorMap8 { num_colors: u8 },
Rgb15,
Rgb32,
}

View File

@ -555,7 +555,7 @@ impl<W: Write> Writer<W> {
Tag::DefineBitsLossless(ref tag) => {
let mut length = 7 + tag.data.len();
if tag.format == BitmapFormat::ColorMap8 {
if let BitmapFormat::ColorMap8 { .. } = tag.format {
length += 1;
}
// TODO(Herschel): Throw error if RGB15 in tag version 2.
@ -567,15 +567,15 @@ impl<W: Write> Writer<W> {
self.write_tag_header(tag_code, length as u32)?;
self.write_character_id(tag.id)?;
let format_id = match tag.format {
BitmapFormat::ColorMap8 => 3,
BitmapFormat::ColorMap8 { .. } => 3,
BitmapFormat::Rgb15 => 4,
BitmapFormat::Rgb32 => 5,
};
self.write_u8(format_id)?;
self.write_u16(tag.width)?;
self.write_u16(tag.height)?;
if tag.format == BitmapFormat::ColorMap8 {
self.write_u8(tag.num_colors)?;
if let BitmapFormat::ColorMap8 { num_colors } = tag.format {
self.write_u8(num_colors)?;
}
self.output.write_all(tag.data)?;
}