core: Unify `define_bits_jpeg_3` and `define_bits_jpeg_4`

The only difference is the deblocking field, which is now read only
for DefineBitsJpeg4.
This commit is contained in:
relrelb 2021-12-04 14:33:08 +02:00 committed by relrelb
parent 00accf3e2a
commit 7f7ecda8a9
1 changed files with 9 additions and 40 deletions

View File

@ -276,11 +276,11 @@ impl<'gc> MovieClip<'gc> {
TagCode::DefineBitsJpeg3 => self
.0
.write(context.gc_context)
.define_bits_jpeg_3(context, reader, tag_len),
.define_bits_jpeg_3_or_4(context, reader, tag_len, 3),
TagCode::DefineBitsJpeg4 => self
.0
.write(context.gc_context)
.define_bits_jpeg_4(context, reader, tag_len),
.define_bits_jpeg_3_or_4(context, reader, tag_len, 4),
TagCode::DefineBitsLossless => self
.0
.write(context.gc_context)
@ -2401,7 +2401,7 @@ impl<'gc, 'a> MovieClipData<'gc> {
let bitmap_info = context
.renderer
.register_bitmap_png(&define_bits_lossless)?;
let bitmap = crate::display_object::Bitmap::new(
let bitmap = Bitmap::new(
context,
define_bits_lossless.id,
bitmap_info.handle,
@ -2607,7 +2607,7 @@ impl<'gc, 'a> MovieClipData<'gc> {
.library_for_movie_mut(self.movie())
.jpeg_tables(),
)?;
let bitmap = crate::display_object::Bitmap::new(
let bitmap = Bitmap::new(
context,
id,
bitmap_info.handle,
@ -2634,40 +2634,6 @@ impl<'gc, 'a> MovieClipData<'gc> {
let mut jpeg_data = Vec::with_capacity(data_len);
reader.get_mut().read_to_end(&mut jpeg_data)?;
let bitmap_info = context.renderer.register_bitmap_jpeg_2(&jpeg_data)?;
let bitmap = crate::display_object::Bitmap::new(
context,
id,
bitmap_info.handle,
bitmap_info.width,
bitmap_info.height,
);
context
.library
.library_for_movie_mut(self.movie())
.register_character(id, Character::Bitmap(bitmap));
Ok(())
}
#[inline]
fn define_bits_jpeg_3(
&mut self,
context: &mut UpdateContext<'_, 'gc, '_>,
reader: &mut SwfStream<'a>,
tag_len: usize,
) -> DecodeResult {
use std::io::Read;
let id = reader.read_u16()?;
let jpeg_len = reader.read_u32()? as usize;
let alpha_len = tag_len
.checked_sub(jpeg_len + 6)
.ok_or_else(|| std::io::Error::new(std::io::ErrorKind::Other, "Invalid jpeg length"))?;
let mut jpeg_data = vec![0; jpeg_len];
reader.get_mut().read_exact(&mut jpeg_data)?;
let mut alpha_data = vec![0; alpha_len];
reader.get_mut().read_exact(&mut alpha_data)?;
let bitmap_info = context
.renderer
.register_bitmap_jpeg_3_or_4(&jpeg_data, &alpha_data)?;
let bitmap = Bitmap::new(
context,
id,
@ -2683,16 +2649,19 @@ impl<'gc, 'a> MovieClipData<'gc> {
}
#[inline]
fn define_bits_jpeg_4(
fn define_bits_jpeg_3_or_4(
&mut self,
context: &mut UpdateContext<'_, 'gc, '_>,
reader: &mut SwfStream<'a>,
tag_len: usize,
version: u8,
) -> DecodeResult {
use std::io::Read;
let id = reader.read_u16()?;
let jpeg_len = reader.read_u32()? as usize;
let _deblocking = reader.read_u16()?;
if version == 4 {
let _deblocking = reader.read_u16()?;
}
let alpha_len = tag_len
.checked_sub(jpeg_len + 6)
.ok_or_else(|| std::io::Error::new(std::io::ErrorKind::Other, "Invalid jpeg length"))?;