avm1: Implement Button.filters
This commit is contained in:
parent
7346f9f6cb
commit
38b4357f59
|
@ -2,7 +2,9 @@
|
||||||
|
|
||||||
use crate::avm1::activation::Activation;
|
use crate::avm1::activation::Activation;
|
||||||
use crate::avm1::error::Error;
|
use crate::avm1::error::Error;
|
||||||
|
use crate::avm1::globals::bitmap_filter;
|
||||||
use crate::avm1::property_decl::{define_properties_on, Declaration};
|
use crate::avm1::property_decl::{define_properties_on, Declaration};
|
||||||
|
use crate::avm1::ArrayObject;
|
||||||
use crate::avm1::{globals, Object, ScriptObject, TObject, Value};
|
use crate::avm1::{globals, Object, ScriptObject, TObject, Value};
|
||||||
use crate::context::GcContext;
|
use crate::context::GcContext;
|
||||||
use crate::display_object::{Avm1Button, TDisplayObject};
|
use crate::display_object::{Avm1Button, TDisplayObject};
|
||||||
|
@ -40,6 +42,7 @@ const PROTO_DECLS: &[Declaration] = declare_properties! {
|
||||||
"useHandCursor" => bool(true);
|
"useHandCursor" => bool(true);
|
||||||
"getDepth" => method(globals::get_depth; DONT_DELETE | READ_ONLY | VERSION_6);
|
"getDepth" => method(globals::get_depth; DONT_DELETE | READ_ONLY | VERSION_6);
|
||||||
"blendMode" => property(button_getter!(blend_mode), button_setter!(set_blend_mode); DONT_DELETE | VERSION_8);
|
"blendMode" => property(button_getter!(blend_mode), button_setter!(set_blend_mode); DONT_DELETE | VERSION_8);
|
||||||
|
"filters" => property(button_getter!(filters), button_setter!(set_filters); DONT_DELETE | DONT_ENUM | VERSION_8);
|
||||||
};
|
};
|
||||||
|
|
||||||
pub fn create_proto<'gc>(
|
pub fn create_proto<'gc>(
|
||||||
|
@ -82,3 +85,37 @@ fn set_blend_mode<'gc>(
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn filters<'gc>(
|
||||||
|
this: Avm1Button<'gc>,
|
||||||
|
activation: &mut Activation<'_, 'gc>,
|
||||||
|
) -> Result<Value<'gc>, Error<'gc>> {
|
||||||
|
Ok(ArrayObject::new(
|
||||||
|
activation.context.gc_context,
|
||||||
|
activation.context.avm1.prototypes().array,
|
||||||
|
this.filters()
|
||||||
|
.into_iter()
|
||||||
|
.map(|filter| bitmap_filter::filter_to_avm1(activation, filter)),
|
||||||
|
)
|
||||||
|
.into())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn set_filters<'gc>(
|
||||||
|
this: Avm1Button<'gc>,
|
||||||
|
activation: &mut Activation<'_, 'gc>,
|
||||||
|
value: Value<'gc>,
|
||||||
|
) -> Result<(), Error<'gc>> {
|
||||||
|
let mut filters = vec![];
|
||||||
|
if let Value::Object(value) = value {
|
||||||
|
for index in value.get_keys(activation, false).into_iter().rev() {
|
||||||
|
let filter_object = value.get(index, activation)?.coerce_to_object(activation);
|
||||||
|
if let Some(filter) =
|
||||||
|
bitmap_filter::avm1_to_filter(filter_object, &mut activation.context)
|
||||||
|
{
|
||||||
|
filters.push(filter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.set_filters(activation.context.gc_context, filters);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue