core: Produce an error when BitmapData.draw call is unsupported

This commit is contained in:
Aaron Hill 2023-02-23 11:58:08 -06:00
parent 93ce5e2328
commit 61a664fec6
3 changed files with 42 additions and 18 deletions

View File

@ -6,8 +6,8 @@ use crate::avm1::globals::color_transform::ColorTransformObject;
use crate::avm1::object::bitmap_data::BitmapDataObject;
use crate::avm1::property_decl::{define_properties_on, Declaration};
use crate::avm1::{Activation, Error, Object, TObject, Value};
use crate::bitmap::bitmap_data::IBitmapDrawable;
use crate::bitmap::bitmap_data::{BitmapData, ChannelOptions, Color};
use crate::bitmap::bitmap_data::{BitmapDataDrawError, IBitmapDrawable};
use crate::bitmap::is_size_valid;
use crate::character::Character;
use crate::display_object::TDisplayObject;
@ -551,7 +551,7 @@ pub fn draw<'gc>(
.bitmap_data_wrapper()
.overwrite_cpu_pixels_from_gpu(&mut activation.context);
let mut write = bmd.write(activation.context.gc_context);
write.draw(
match write.draw(
source,
Transform {
matrix,
@ -562,7 +562,15 @@ pub fn draw<'gc>(
None,
activation.context.stage.quality(),
&mut activation.context,
);
) {
Ok(()) => {}
Err(BitmapDataDrawError::Unimplemented) => {
avm_error!(
activation,
"Render backend does not support BitmapData.draw"
);
}
}
return Ok(Value::Undefined);
}
}

View File

@ -7,8 +7,8 @@ use crate::avm2::object::{BitmapDataObject, ByteArrayObject, Object, TObject};
use crate::avm2::value::Value;
use crate::avm2::Error;
use crate::avm2_stub_method;
use crate::bitmap::bitmap_data::IBitmapDrawable;
use crate::bitmap::bitmap_data::{BitmapData, ChannelOptions, Color};
use crate::bitmap::bitmap_data::{BitmapDataDrawError, IBitmapDrawable};
use crate::bitmap::is_size_valid;
use crate::character::Character;
use crate::display_object::Bitmap;
@ -794,7 +794,7 @@ pub fn draw<'gc>(
return Err(format!("BitmapData.draw: unexpected source {source:?}").into());
};
bitmap_data.draw(
match bitmap_data.draw(
source,
transform,
smoothing,
@ -802,7 +802,12 @@ pub fn draw<'gc>(
clip_rect,
activation.context.stage.quality(),
&mut activation.context,
);
) {
Ok(()) => {}
Err(BitmapDataDrawError::Unimplemented) => {
return Err("Render backend does not support BitmapData.draw".into());
}
}
}
Ok(Value::Undefined)
}
@ -892,7 +897,7 @@ pub fn draw_with_quality<'gc>(
activation.context.stage.quality()
};
bitmap_data.draw(
match bitmap_data.draw(
source,
transform,
smoothing,
@ -900,7 +905,12 @@ pub fn draw_with_quality<'gc>(
clip_rect,
quality,
&mut activation.context,
);
) {
Ok(()) => {}
Err(BitmapDataDrawError::Unimplemented) => {
return Err("Render backend does not support BitmapData.draw".into());
}
}
}
Ok(Value::Undefined)
}

View File

@ -47,6 +47,11 @@ impl LehmerRng {
#[collect(no_drop)]
pub struct Color(i32);
#[derive(Debug, Clone)]
pub enum BitmapDataDrawError {
Unimplemented,
}
impl Color {
pub fn blue(&self) -> u8 {
(self.0 & 0xFF) as u8
@ -1353,7 +1358,7 @@ impl<'gc> BitmapData<'gc> {
clip_rect: Option<Rectangle<Twips>>,
quality: StageQuality,
context: &mut UpdateContext<'_, 'gc>,
) {
) -> Result<(), BitmapDataDrawError> {
let bitmapdata_width = self.width();
let bitmapdata_height = self.height();
@ -1436,16 +1441,17 @@ impl<'gc> BitmapData<'gc> {
);
match image {
Some(sync_handle) => match self.dirty_state {
DirtyState::Clean => self.dirty_state = DirtyState::GpuModified(sync_handle),
DirtyState::CpuModified | DirtyState::GpuModified(_) => panic!(
"Called BitmapData.render while already dirty: {:?}",
self.dirty_state
),
},
None => {
tracing::warn!("BitmapData.draw: Not yet implemented")
Some(sync_handle) => {
match self.dirty_state {
DirtyState::Clean => self.dirty_state = DirtyState::GpuModified(sync_handle),
DirtyState::CpuModified | DirtyState::GpuModified(_) => panic!(
"Called BitmapData.render while already dirty: {:?}",
self.dirty_state
),
}
Ok(())
}
None => Err(BitmapDataDrawError::Unimplemented),
}
}
}