core: Use BitmapData instead of separate `initial_data` field
Now that a `Bitmap` always stores a `BitmapData`, we can read the pixels directly from the `BitmapData`, instead of duplicating them in an `initial_data` field
This commit is contained in:
parent
b5796f9016
commit
3a6c8d9796
|
@ -1309,7 +1309,6 @@ pub fn load_bitmap<'gc>(
|
||||||
|
|
||||||
if let Some(Character::Bitmap {
|
if let Some(Character::Bitmap {
|
||||||
bitmap: bitmap_object,
|
bitmap: bitmap_object,
|
||||||
initial_data,
|
|
||||||
}) = character
|
}) = character
|
||||||
{
|
{
|
||||||
let new_bitmap_data = BitmapDataObject::empty_object(
|
let new_bitmap_data = BitmapDataObject::empty_object(
|
||||||
|
@ -1319,17 +1318,15 @@ pub fn load_bitmap<'gc>(
|
||||||
|
|
||||||
let width = bitmap_object.width() as u32;
|
let width = bitmap_object.width() as u32;
|
||||||
let height = bitmap_object.height() as u32;
|
let height = bitmap_object.height() as u32;
|
||||||
|
|
||||||
|
let pixels: Vec<_> = bitmap_object.bitmap_data().read().pixels().to_vec();
|
||||||
|
|
||||||
new_bitmap_data
|
new_bitmap_data
|
||||||
.as_bitmap_data_object()
|
.as_bitmap_data_object()
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.bitmap_data()
|
.bitmap_data()
|
||||||
.write(activation.context.gc_context)
|
.write(activation.context.gc_context)
|
||||||
.set_pixels(
|
.set_pixels(width, height, true, pixels);
|
||||||
width,
|
|
||||||
height,
|
|
||||||
true,
|
|
||||||
initial_data.iter().map(|p| (*p).into()).collect(),
|
|
||||||
);
|
|
||||||
|
|
||||||
return Ok(new_bitmap_data.into());
|
return Ok(new_bitmap_data.into());
|
||||||
}
|
}
|
||||||
|
|
|
@ -61,10 +61,7 @@ pub fn instance_init<'gc>(
|
||||||
.avm2_class_registry()
|
.avm2_class_registry()
|
||||||
.class_symbol(b_class)
|
.class_symbol(b_class)
|
||||||
{
|
{
|
||||||
if let Some(Character::Bitmap {
|
if let Some(Character::Bitmap { bitmap }) = activation
|
||||||
bitmap,
|
|
||||||
initial_data,
|
|
||||||
}) = activation
|
|
||||||
.context
|
.context
|
||||||
.library
|
.library
|
||||||
.library_for_movie_mut(movie)
|
.library_for_movie_mut(movie)
|
||||||
|
@ -74,12 +71,7 @@ pub fn instance_init<'gc>(
|
||||||
let new_bitmap_data =
|
let new_bitmap_data =
|
||||||
GcCell::allocate(activation.context.gc_context, BitmapData::default());
|
GcCell::allocate(activation.context.gc_context, BitmapData::default());
|
||||||
|
|
||||||
fill_bitmap_data_from_symbol(
|
fill_bitmap_data_from_symbol(activation, bitmap, new_bitmap_data);
|
||||||
activation,
|
|
||||||
bitmap,
|
|
||||||
new_bitmap_data,
|
|
||||||
initial_data,
|
|
||||||
);
|
|
||||||
BitmapDataObject::from_bitmap_data(
|
BitmapDataObject::from_bitmap_data(
|
||||||
activation,
|
activation,
|
||||||
new_bitmap_data,
|
new_bitmap_data,
|
||||||
|
|
|
@ -27,7 +27,6 @@ pub fn fill_bitmap_data_from_symbol<'gc>(
|
||||||
activation: &mut Activation<'_, 'gc>,
|
activation: &mut Activation<'_, 'gc>,
|
||||||
bd: Bitmap<'gc>,
|
bd: Bitmap<'gc>,
|
||||||
new_bitmap_data: GcCell<'gc, BitmapData<'gc>>,
|
new_bitmap_data: GcCell<'gc, BitmapData<'gc>>,
|
||||||
pixels: Vec<i32>,
|
|
||||||
) {
|
) {
|
||||||
new_bitmap_data
|
new_bitmap_data
|
||||||
.write(activation.context.gc_context)
|
.write(activation.context.gc_context)
|
||||||
|
@ -35,7 +34,7 @@ pub fn fill_bitmap_data_from_symbol<'gc>(
|
||||||
bd.width().into(),
|
bd.width().into(),
|
||||||
bd.height().into(),
|
bd.height().into(),
|
||||||
true,
|
true,
|
||||||
pixels.into_iter().map(|p| p.into()).collect(),
|
bd.bitmap_data().read().pixels().to_vec(),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -71,13 +70,9 @@ pub fn instance_init<'gc>(
|
||||||
let new_bitmap_data =
|
let new_bitmap_data =
|
||||||
GcCell::allocate(activation.context.gc_context, BitmapData::default());
|
GcCell::allocate(activation.context.gc_context, BitmapData::default());
|
||||||
|
|
||||||
if let Some(Character::Bitmap {
|
if let Some(Character::Bitmap { bitmap }) = character {
|
||||||
bitmap,
|
|
||||||
initial_data,
|
|
||||||
}) = character
|
|
||||||
{
|
|
||||||
// Instantiating BitmapData from an Animate-style bitmap asset
|
// Instantiating BitmapData from an Animate-style bitmap asset
|
||||||
fill_bitmap_data_from_symbol(activation, bitmap, new_bitmap_data, initial_data);
|
fill_bitmap_data_from_symbol(activation, bitmap, new_bitmap_data);
|
||||||
} else {
|
} else {
|
||||||
if character.is_some() {
|
if character.is_some() {
|
||||||
//TODO: Determine if mismatched symbols will still work as a
|
//TODO: Determine if mismatched symbols will still work as a
|
||||||
|
|
|
@ -12,10 +12,7 @@ pub enum Character<'gc> {
|
||||||
EditText(EditText<'gc>),
|
EditText(EditText<'gc>),
|
||||||
Graphic(Graphic<'gc>),
|
Graphic(Graphic<'gc>),
|
||||||
MovieClip(MovieClip<'gc>),
|
MovieClip(MovieClip<'gc>),
|
||||||
Bitmap {
|
Bitmap { bitmap: Bitmap<'gc> },
|
||||||
bitmap: Bitmap<'gc>,
|
|
||||||
initial_data: Vec<i32>,
|
|
||||||
},
|
|
||||||
Avm1Button(Avm1Button<'gc>),
|
Avm1Button(Avm1Button<'gc>),
|
||||||
Avm2Button(Avm2Button<'gc>),
|
Avm2Button(Avm2Button<'gc>),
|
||||||
Font(Font<'gc>),
|
Font(Font<'gc>),
|
||||||
|
|
|
@ -2969,18 +2969,11 @@ impl<'gc, 'a> MovieClipData<'gc> {
|
||||||
) -> Result<(), Error> {
|
) -> Result<(), Error> {
|
||||||
let define_bits_lossless = reader.read_define_bits_lossless(version)?;
|
let define_bits_lossless = reader.read_define_bits_lossless(version)?;
|
||||||
let bitmap = ruffle_render::utils::decode_define_bits_lossless(&define_bits_lossless)?;
|
let bitmap = ruffle_render::utils::decode_define_bits_lossless(&define_bits_lossless)?;
|
||||||
let initial_data: Vec<i32> = bitmap.as_colors().collect();
|
|
||||||
let bitmap = Bitmap::new(context, define_bits_lossless.id, bitmap)?;
|
let bitmap = Bitmap::new(context, define_bits_lossless.id, bitmap)?;
|
||||||
context
|
context
|
||||||
.library
|
.library
|
||||||
.library_for_movie_mut(self.movie())
|
.library_for_movie_mut(self.movie())
|
||||||
.register_character(
|
.register_character(define_bits_lossless.id, Character::Bitmap { bitmap });
|
||||||
define_bits_lossless.id,
|
|
||||||
Character::Bitmap {
|
|
||||||
bitmap,
|
|
||||||
initial_data,
|
|
||||||
},
|
|
||||||
);
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3093,18 +3086,11 @@ impl<'gc, 'a> MovieClipData<'gc> {
|
||||||
.jpeg_tables();
|
.jpeg_tables();
|
||||||
let jpeg_data = ruffle_render::utils::glue_tables_to_jpeg(jpeg_data, jpeg_tables);
|
let jpeg_data = ruffle_render::utils::glue_tables_to_jpeg(jpeg_data, jpeg_tables);
|
||||||
let bitmap = ruffle_render::utils::decode_define_bits_jpeg(&jpeg_data, None)?;
|
let bitmap = ruffle_render::utils::decode_define_bits_jpeg(&jpeg_data, None)?;
|
||||||
let initial_data: Vec<i32> = bitmap.as_colors().collect();
|
|
||||||
let bitmap = Bitmap::new(context, id, bitmap)?;
|
let bitmap = Bitmap::new(context, id, bitmap)?;
|
||||||
context
|
context
|
||||||
.library
|
.library
|
||||||
.library_for_movie_mut(self.movie())
|
.library_for_movie_mut(self.movie())
|
||||||
.register_character(
|
.register_character(id, Character::Bitmap { bitmap });
|
||||||
id,
|
|
||||||
Character::Bitmap {
|
|
||||||
bitmap,
|
|
||||||
initial_data,
|
|
||||||
},
|
|
||||||
);
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3117,18 +3103,11 @@ impl<'gc, 'a> MovieClipData<'gc> {
|
||||||
let id = reader.read_u16()?;
|
let id = reader.read_u16()?;
|
||||||
let jpeg_data = reader.read_slice_to_end();
|
let jpeg_data = reader.read_slice_to_end();
|
||||||
let bitmap = ruffle_render::utils::decode_define_bits_jpeg(jpeg_data, None)?;
|
let bitmap = ruffle_render::utils::decode_define_bits_jpeg(jpeg_data, None)?;
|
||||||
let initial_data: Vec<i32> = bitmap.as_colors().collect();
|
|
||||||
let bitmap = Bitmap::new(context, id, bitmap)?;
|
let bitmap = Bitmap::new(context, id, bitmap)?;
|
||||||
context
|
context
|
||||||
.library
|
.library
|
||||||
.library_for_movie_mut(self.movie())
|
.library_for_movie_mut(self.movie())
|
||||||
.register_character(
|
.register_character(id, Character::Bitmap { bitmap });
|
||||||
id,
|
|
||||||
Character::Bitmap {
|
|
||||||
bitmap,
|
|
||||||
initial_data,
|
|
||||||
},
|
|
||||||
);
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3147,18 +3126,11 @@ impl<'gc, 'a> MovieClipData<'gc> {
|
||||||
let jpeg_data = reader.read_slice(jpeg_len)?;
|
let jpeg_data = reader.read_slice(jpeg_len)?;
|
||||||
let alpha_data = reader.read_slice_to_end();
|
let alpha_data = reader.read_slice_to_end();
|
||||||
let bitmap = ruffle_render::utils::decode_define_bits_jpeg(jpeg_data, Some(alpha_data))?;
|
let bitmap = ruffle_render::utils::decode_define_bits_jpeg(jpeg_data, Some(alpha_data))?;
|
||||||
let initial_data: Vec<i32> = bitmap.as_colors().collect();
|
|
||||||
let bitmap = Bitmap::new(context, id, bitmap)?;
|
let bitmap = Bitmap::new(context, id, bitmap)?;
|
||||||
context
|
context
|
||||||
.library
|
.library
|
||||||
.library_for_movie_mut(self.movie())
|
.library_for_movie_mut(self.movie())
|
||||||
.register_character(
|
.register_character(id, Character::Bitmap { bitmap });
|
||||||
id,
|
|
||||||
Character::Bitmap {
|
|
||||||
bitmap,
|
|
||||||
initial_data,
|
|
||||||
},
|
|
||||||
);
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -204,10 +204,7 @@ impl<'gc> MovieLibrary<'gc> {
|
||||||
gc_context: MutationContext<'gc, '_>,
|
gc_context: MutationContext<'gc, '_>,
|
||||||
) -> Result<DisplayObject<'gc>, &'static str> {
|
) -> Result<DisplayObject<'gc>, &'static str> {
|
||||||
match character {
|
match character {
|
||||||
Character::Bitmap {
|
Character::Bitmap { bitmap } => Ok(bitmap.instantiate(gc_context)),
|
||||||
bitmap,
|
|
||||||
initial_data: _,
|
|
||||||
} => Ok(bitmap.instantiate(gc_context)),
|
|
||||||
Character::EditText(edit_text) => Ok(edit_text.instantiate(gc_context)),
|
Character::EditText(edit_text) => Ok(edit_text.instantiate(gc_context)),
|
||||||
Character::Graphic(graphic) => Ok(graphic.instantiate(gc_context)),
|
Character::Graphic(graphic) => Ok(graphic.instantiate(gc_context)),
|
||||||
Character::MorphShape(morph_shape) => Ok(morph_shape.instantiate(gc_context)),
|
Character::MorphShape(morph_shape) => Ok(morph_shape.instantiate(gc_context)),
|
||||||
|
|
Loading…
Reference in New Issue