avm1: Implement color matrix filter conversions
This commit is contained in:
parent
b3629669bd
commit
df6064b2e9
|
@ -4,6 +4,7 @@ use crate::avm1::activation::Activation;
|
|||
use crate::avm1::error::Error;
|
||||
use crate::avm1::globals::bevel_filter::BevelFilter;
|
||||
use crate::avm1::globals::blur_filter::BlurFilter;
|
||||
use crate::avm1::globals::color_matrix_filter::ColorMatrixFilter;
|
||||
use crate::avm1::object::NativeObject;
|
||||
use crate::avm1::property_decl::{define_properties_on, Declaration};
|
||||
use crate::avm1::{Attribute, Object, ScriptObject, TObject, Value};
|
||||
|
@ -70,6 +71,7 @@ pub fn avm1_to_filter(object: Object) -> Option<Filter> {
|
|||
match native {
|
||||
NativeObject::BevelFilter(filter) => Some(Filter::BevelFilter(filter.filter())),
|
||||
NativeObject::BlurFilter(filter) => Some(Filter::BlurFilter(filter.filter())),
|
||||
NativeObject::ColorMatrixFilter(filter) => Some(Filter::ColorMatrixFilter(filter.filter())),
|
||||
|
||||
// Invalid filters are silently dropped/ignored, no errors are thrown.
|
||||
_ => None,
|
||||
|
@ -92,6 +94,13 @@ pub fn filter_to_avm1<'gc>(activation: &mut Activation<'_, 'gc>, filter: Filter)
|
|||
)),
|
||||
activation.context.avm1.prototypes().blur_filter,
|
||||
),
|
||||
Filter::ColorMatrixFilter(filter) => (
|
||||
NativeObject::ColorMatrixFilter(ColorMatrixFilter::from_filter(
|
||||
activation.context.gc_context,
|
||||
filter,
|
||||
)),
|
||||
activation.context.avm1.prototypes().color_matrix_filter,
|
||||
),
|
||||
_ => {
|
||||
// Unrepresentable filters (eg Shader) will just return as Null.
|
||||
// Not sure there's a way to even get to that state though, they can only be added in avm2.
|
||||
|
|
|
@ -6,6 +6,7 @@ use crate::avm1::property_decl::{define_properties_on, Declaration};
|
|||
use crate::avm1::{Activation, ArrayObject, Error, Object, ScriptObject, TObject, Value};
|
||||
use crate::context::GcContext;
|
||||
use gc_arena::{Collect, GcCell, MutationContext};
|
||||
use std::ops::Deref;
|
||||
|
||||
#[derive(Clone, Debug, Collect)]
|
||||
#[collect(require_static)]
|
||||
|
@ -13,6 +14,22 @@ struct ColorMatrixFilterData {
|
|||
matrix: [f32; 4 * 5],
|
||||
}
|
||||
|
||||
impl From<&ColorMatrixFilterData> for swf::ColorMatrixFilter {
|
||||
fn from(filter: &ColorMatrixFilterData) -> swf::ColorMatrixFilter {
|
||||
swf::ColorMatrixFilter {
|
||||
matrix: filter.matrix,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl From<swf::ColorMatrixFilter> for ColorMatrixFilterData {
|
||||
fn from(filter: swf::ColorMatrixFilter) -> ColorMatrixFilterData {
|
||||
Self {
|
||||
matrix: filter.matrix,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Default for ColorMatrixFilterData {
|
||||
fn default() -> Self {
|
||||
Self {
|
||||
|
@ -42,6 +59,13 @@ impl<'gc> ColorMatrixFilter<'gc> {
|
|||
Ok(color_matrix_filter)
|
||||
}
|
||||
|
||||
pub fn from_filter(
|
||||
gc_context: MutationContext<'gc, '_>,
|
||||
filter: swf::ColorMatrixFilter,
|
||||
) -> Self {
|
||||
Self(GcCell::allocate(gc_context, filter.into()))
|
||||
}
|
||||
|
||||
pub(crate) fn duplicate(&self, gc_context: MutationContext<'gc, '_>) -> Self {
|
||||
Self(GcCell::allocate(gc_context, self.0.read().clone()))
|
||||
}
|
||||
|
@ -75,6 +99,10 @@ impl<'gc> ColorMatrixFilter<'gc> {
|
|||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn filter(&self) -> swf::ColorMatrixFilter {
|
||||
self.0.read().deref().into()
|
||||
}
|
||||
}
|
||||
|
||||
macro_rules! color_matrix_filter_method {
|
||||
|
|
|
@ -1,3 +1,6 @@
|
|||
// test.filters[0].matrix
|
||||
1.10561990737915,0.896963536739349,-1.15258347988129,0,28.2250022888184,-0.257689893245697,0.772316873073578,0.335373044013977,0,28.2250003814697,0.8850017786026,-0.860078454017639,0.825076699256897,0,28.2250003814697,0,0,0,1,0
|
||||
|
||||
// new ColorMatrixFilter
|
||||
[object Object]
|
||||
// x.clone()
|
||||
|
@ -6,6 +9,10 @@
|
|||
false
|
||||
// x.matrix
|
||||
1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0
|
||||
// test.filters = [x]
|
||||
// test.filters[0].matrix
|
||||
1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0
|
||||
|
||||
// x.matrix after set to [0]
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
// x.matrix after set to [1]
|
||||
|
|
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue