From 110b9ec55180a725003b8c0fb665d12592aacbf5 Mon Sep 17 00:00:00 2001 From: CUB3D Date: Tue, 22 Sep 2020 23:07:47 +0100 Subject: [PATCH] core: Fix edge cases and implement rest of bevel filter --- core/src/avm1/globals/bevel_filter.rs | 178 +++++++++++++------ core/src/avm1/globals/bitmap_filter.rs | 53 +++++- core/src/avm1/globals/blur_filter.rs | 19 +- core/src/avm1/object/bevel_filter.rs | 15 +- core/tests/swfs/avm1/bevel_filter/output.txt | 10 ++ core/tests/swfs/avm1/bevel_filter/test.fla | Bin 5240 -> 5384 bytes core/tests/swfs/avm1/bevel_filter/test.swf | Bin 1338 -> 1421 bytes 7 files changed, 188 insertions(+), 87 deletions(-) diff --git a/core/src/avm1/globals/bevel_filter.rs b/core/src/avm1/globals/bevel_filter.rs index 06e138009..a2d8b4ce0 100644 --- a/core/src/avm1/globals/bevel_filter.rs +++ b/core/src/avm1/globals/bevel_filter.rs @@ -3,7 +3,7 @@ use crate::avm1::activation::Activation; use crate::avm1::error::Error; use crate::avm1::function::{Executable, FunctionObject}; -use crate::avm1::object::bevel_filter::{BevelFilterType, BevelFilterObject}; +use crate::avm1::object::bevel_filter::{BevelFilterObject, BevelFilterType}; use crate::avm1::{AvmString, Object, TObject, Value}; use enumset::EnumSet; use gc_arena::MutationContext; @@ -15,34 +15,48 @@ pub fn constructor<'gc>( ) -> Result, Error<'gc>> { let distance = args .get(0) - .unwrap_or(&4.into()) - .coerce_to_f64(activation) - .map(|x| x.max(0.0).min(255.0))?; + .unwrap_or(&4.0.into()) + .coerce_to_f64(activation)?; let angle = args .get(1) - .unwrap_or(&45.0.into()) - .coerce_to_f64(activation) - .map(|x| x.max(0.0).min(360.0))?; + .unwrap_or(&44.9999999772279.into()) + .coerce_to_f64(activation)?; + + let clamped_angle = if angle.is_sign_negative() { + -(angle.abs() % 360.0) + } else { + angle % 360.0 + }; - //TODO: range let highlight_color = args .get(2) - .unwrap_or(&0x000000.into()) + .unwrap_or(&0xFFFFFF.into()) .coerce_to_i32(activation)?; + let highlight_color_clamped = if highlight_color.is_negative() { + 0x1000000 - (highlight_color.abs() % 0x1000000) + } else { + highlight_color % (0x1000000) + }; + let highlight_alpha = args .get(3) .unwrap_or(&1.into()) .coerce_to_f64(activation) .map(|x| x.max(0.0).min(1.0))?; - //TODO: range let shadow_color = args .get(4) .unwrap_or(&0x000000.into()) .coerce_to_i32(activation)?; + let shadow_color_clamped = if shadow_color.is_negative() { + 0x1000000 - (shadow_color.abs() % 0x1000000) + } else { + shadow_color % (0x1000000) + }; + let shadow_alpha = args .get(5) .unwrap_or(&1.into()) @@ -87,10 +101,10 @@ pub fn constructor<'gc>( let bevel_filter = this.as_bevel_filter_object().unwrap(); bevel_filter.set_distance(activation.context.gc_context, distance); - bevel_filter.set_angle(activation.context.gc_context, angle); - bevel_filter.set_highlight_color(activation.context.gc_context, highlight_color); + bevel_filter.set_angle(activation.context.gc_context, clamped_angle); + bevel_filter.set_highlight_color(activation.context.gc_context, highlight_color_clamped); bevel_filter.set_highlight_alpha(activation.context.gc_context, highlight_alpha); - bevel_filter.set_shadow_color(activation.context.gc_context, shadow_color); + bevel_filter.set_shadow_color(activation.context.gc_context, shadow_color_clamped); bevel_filter.set_shadow_alpha(activation.context.gc_context, shadow_alpha); bevel_filter.set_blur_x(activation.context.gc_context, blur_x); bevel_filter.set_blur_y(activation.context.gc_context, blur_y); @@ -102,23 +116,14 @@ pub fn constructor<'gc>( Ok(Value::Undefined) } -pub fn clone<'gc>( - activation: &mut Activation<'_, 'gc, '_>, - this: Object<'gc>, - args: &[Value<'gc>], -) -> Result, Error<'gc>> { - Ok(Value::Undefined) -} - pub fn get_distance<'gc>( - activation: &mut Activation<'_, 'gc, '_>, + _activation: &mut Activation<'_, 'gc, '_>, this: Object<'gc>, - args: &[Value<'gc>], + _args: &[Value<'gc>], ) -> Result, Error<'gc>> { Ok(this.as_bevel_filter_object().unwrap().get_distance().into()) } -//TODO: check if int? pub fn set_distance<'gc>( activation: &mut Activation<'_, 'gc, '_>, this: Object<'gc>, @@ -137,9 +142,9 @@ pub fn set_distance<'gc>( } pub fn get_angle<'gc>( - activation: &mut Activation<'_, 'gc, '_>, + _activation: &mut Activation<'_, 'gc, '_>, this: Object<'gc>, - args: &[Value<'gc>], + _args: &[Value<'gc>], ) -> Result, Error<'gc>> { Ok(this.as_bevel_filter_object().unwrap().get_angle().into()) } @@ -151,21 +156,26 @@ pub fn set_angle<'gc>( ) -> Result, Error<'gc>> { let angle = args .get(0) - .unwrap_or(&45.0.into()) - .coerce_to_f64(activation) - .map(|x| x.max(0.0).min(360.0))?; + .unwrap_or(&44.9999999772279.into()) + .coerce_to_f64(activation)?; + + let clamped_angle = if angle.is_sign_negative() { + -(angle.abs() % 360.0) + } else { + angle % 360.0 + }; this.as_bevel_filter_object() .unwrap() - .set_angle(activation.context.gc_context, angle); + .set_angle(activation.context.gc_context, clamped_angle); Ok(Value::Undefined) } pub fn get_highlight_color<'gc>( - activation: &mut Activation<'_, 'gc, '_>, + _activation: &mut Activation<'_, 'gc, '_>, this: Object<'gc>, - args: &[Value<'gc>], + _args: &[Value<'gc>], ) -> Result, Error<'gc>> { Ok(this .as_bevel_filter_object() @@ -182,19 +192,25 @@ pub fn set_highlight_color<'gc>( let color = args .get(0) .unwrap_or(&0x000000.into()) - .coerce_to_i32(activation) - .map(|x| x.max(0x000000).min(0xFFFFFF))?; + .coerce_to_i32(activation)?; + + let col = if color.is_negative() { + 0x1000000 - (color.abs() % 0x1000000) + } else { + color % (0x1000000) + }; this.as_bevel_filter_object() .unwrap() - .set_highlight_color(activation.context.gc_context, color); + .set_highlight_color(activation.context.gc_context, col); - Ok(Value::Undefined)} + Ok(Value::Undefined) +} pub fn get_highlight_alpha<'gc>( - activation: &mut Activation<'_, 'gc, '_>, + _activation: &mut Activation<'_, 'gc, '_>, this: Object<'gc>, - args: &[Value<'gc>], + _args: &[Value<'gc>], ) -> Result, Error<'gc>> { Ok(this .as_bevel_filter_object() @@ -222,9 +238,9 @@ pub fn set_highlight_alpha<'gc>( } pub fn get_shadow_color<'gc>( - activation: &mut Activation<'_, 'gc, '_>, + _activation: &mut Activation<'_, 'gc, '_>, this: Object<'gc>, - args: &[Value<'gc>], + _args: &[Value<'gc>], ) -> Result, Error<'gc>> { Ok(this .as_bevel_filter_object() @@ -238,13 +254,28 @@ pub fn set_shadow_color<'gc>( this: Object<'gc>, args: &[Value<'gc>], ) -> Result, Error<'gc>> { + let color = args + .get(0) + .unwrap_or(&0x000000.into()) + .coerce_to_i32(activation)?; + + let col = if color.is_negative() { + 0x1000000 - (color.abs() % 0x1000000) + } else { + color % (0x1000000) + }; + + this.as_bevel_filter_object() + .unwrap() + .set_shadow_color(activation.context.gc_context, col); + Ok(Value::Undefined) } pub fn get_shadow_alpha<'gc>( - activation: &mut Activation<'_, 'gc, '_>, + _activation: &mut Activation<'_, 'gc, '_>, this: Object<'gc>, - args: &[Value<'gc>], + _args: &[Value<'gc>], ) -> Result, Error<'gc>> { Ok(this .as_bevel_filter_object() @@ -258,13 +289,23 @@ pub fn set_shadow_alpha<'gc>( this: Object<'gc>, args: &[Value<'gc>], ) -> Result, Error<'gc>> { + let alpha = args + .get(0) + .unwrap_or(&1.into()) + .coerce_to_f64(activation) + .map(|x| x.max(0.0).min(1.0))?; + + this.as_bevel_filter_object() + .unwrap() + .set_shadow_alpha(activation.context.gc_context, alpha); + Ok(Value::Undefined) } pub fn get_quality<'gc>( _activation: &mut Activation<'_, 'gc, '_>, this: Object<'gc>, - args: &[Value<'gc>], + _args: &[Value<'gc>], ) -> Result, Error<'gc>> { Ok(this.as_bevel_filter_object().unwrap().get_quality().into()) } @@ -288,11 +329,11 @@ pub fn set_quality<'gc>( } pub fn get_strength<'gc>( - activation: &mut Activation<'_, 'gc, '_>, + _activation: &mut Activation<'_, 'gc, '_>, this: Object<'gc>, - args: &[Value<'gc>], + _args: &[Value<'gc>], ) -> Result, Error<'gc>> { - Ok(Value::Undefined) + Ok(this.as_bevel_filter_object().unwrap().get_strength().into()) } pub fn set_strength<'gc>( @@ -300,15 +341,25 @@ pub fn set_strength<'gc>( this: Object<'gc>, args: &[Value<'gc>], ) -> Result, Error<'gc>> { + let strength = args + .get(0) + .unwrap_or(&1.into()) + .coerce_to_f64(activation) + .map(|x| x.max(0.0).min(255.0))?; + + this.as_bevel_filter_object() + .unwrap() + .set_strength(activation.context.gc_context, strength); + Ok(Value::Undefined) } pub fn get_knockout<'gc>( - activation: &mut Activation<'_, 'gc, '_>, + _activation: &mut Activation<'_, 'gc, '_>, this: Object<'gc>, - args: &[Value<'gc>], + _args: &[Value<'gc>], ) -> Result, Error<'gc>> { - Ok(Value::Undefined) + Ok(this.as_bevel_filter_object().unwrap().get_knockout().into()) } pub fn set_knockout<'gc>( @@ -316,13 +367,22 @@ pub fn set_knockout<'gc>( this: Object<'gc>, args: &[Value<'gc>], ) -> Result, Error<'gc>> { + let knockout = args + .get(0) + .unwrap_or(&false.into()) + .as_bool(activation.current_swf_version()); + + this.as_bevel_filter_object() + .unwrap() + .set_knockout(activation.context.gc_context, knockout); + Ok(Value::Undefined) } pub fn get_blur_x<'gc>( - activation: &mut Activation<'_, 'gc, '_>, + _activation: &mut Activation<'_, 'gc, '_>, this: Object<'gc>, - args: &[Value<'gc>], + _args: &[Value<'gc>], ) -> Result, Error<'gc>> { Ok(this.as_bevel_filter_object().unwrap().get_blur_x().into()) } @@ -346,9 +406,9 @@ pub fn set_blur_x<'gc>( } pub fn get_blur_y<'gc>( - activation: &mut Activation<'_, 'gc, '_>, + _activation: &mut Activation<'_, 'gc, '_>, this: Object<'gc>, - args: &[Value<'gc>], + _args: &[Value<'gc>], ) -> Result, Error<'gc>> { Ok(this.as_bevel_filter_object().unwrap().get_blur_y().into()) } @@ -374,7 +434,7 @@ pub fn set_blur_y<'gc>( pub fn get_type<'gc>( activation: &mut Activation<'_, 'gc, '_>, this: Object<'gc>, - args: &[Value<'gc>], + _args: &[Value<'gc>], ) -> Result, Error<'gc>> { let type_: &str = this.as_bevel_filter_object().unwrap().get_type().into(); Ok(AvmString::new(activation.context.gc_context, type_.to_string()).into()) @@ -387,7 +447,10 @@ pub fn set_type<'gc>( ) -> Result, Error<'gc>> { let type_: BevelFilterType = args .get(0) - .unwrap_or(&Value::String(AvmString::new(activation.context.gc_context, "full".to_string()))) + .unwrap_or(&Value::String(AvmString::new( + activation.context.gc_context, + "full".to_string(), + ))) .coerce_to_string(activation) .map(|s| s.as_str().into())?; @@ -403,9 +466,8 @@ pub fn create_proto<'gc>( fn_proto: Object<'gc>, ) -> Object<'gc> { let object = BevelFilterObject::empty_object(gc_context, Some(proto)); - let mut script_object = object.as_script_object().unwrap(); + let script_object = object.as_script_object().unwrap(); - script_object.force_set_function("clone", clone, gc_context, EnumSet::empty(), Some(proto)); script_object.add_property( gc_context, "distance", @@ -610,5 +672,5 @@ pub fn create_proto<'gc>( )), EnumSet::empty(), ); - script_object.into() + object.into() } diff --git a/core/src/avm1/globals/bitmap_filter.rs b/core/src/avm1/globals/bitmap_filter.rs index e4bc6f3d2..8dd3da877 100644 --- a/core/src/avm1/globals/bitmap_filter.rs +++ b/core/src/avm1/globals/bitmap_filter.rs @@ -2,7 +2,7 @@ use crate::avm1::activation::Activation; use crate::avm1::error::Error; -use crate::avm1::{Object, ScriptObject, Value}; +use crate::avm1::{Object, ScriptObject, TObject, Value}; use enumset::EnumSet; use gc_arena::MutationContext; @@ -15,10 +15,57 @@ pub fn constructor<'gc>( } pub fn clone<'gc>( - _activation: &mut Activation<'_, 'gc, '_>, - _this: Object<'gc>, + activation: &mut Activation<'_, 'gc, '_>, + this: Object<'gc>, _args: &[Value<'gc>], ) -> Result, Error<'gc>> { + if let Some(this) = this.as_blur_filter_object() { + let proto = activation.context.avm1.prototypes.blur_filter_constructor; + + let blur_x = this.get("blurX", activation)?; + let blur_y = this.get("blurY", activation)?; + let quality = this.get("quality", activation)?; + + let cloned = proto.construct(activation, &[blur_x, blur_y, quality])?; + return Ok(cloned.into()); + } + + if let Some(this) = this.as_bevel_filter_object() { + let proto = activation.context.avm1.prototypes.bevel_filter_constructor; + + let distance = this.get("distance", activation)?; + let angle = this.get("angle", activation)?; + let highlight_color = this.get("highlightColor", activation)?; + let highlight_alpha = this.get("highlightAlpha", activation)?; + let shadow_color = this.get("shadowColor", activation)?; + let shadow_alpha = this.get("shadowAlpha", activation)?; + let blur_x = this.get("blurX", activation)?; + let blur_y = this.get("blurY", activation)?; + let strength = this.get("strength", activation)?; + let quality = this.get("quality", activation)?; + let type_ = this.get("type", activation)?; + let knockout = this.get("knockout", activation)?; + + let cloned = proto.construct( + activation, + &[ + distance, + angle, + highlight_color, + highlight_alpha, + shadow_color, + shadow_alpha, + blur_x, + blur_y, + strength, + quality, + type_, + knockout, + ], + )?; + return Ok(cloned.into()); + } + Ok(Value::Undefined) } diff --git a/core/src/avm1/globals/blur_filter.rs b/core/src/avm1/globals/blur_filter.rs index 11b6e5ba6..2ff0b81e9 100644 --- a/core/src/avm1/globals/blur_filter.rs +++ b/core/src/avm1/globals/blur_filter.rs @@ -40,21 +40,6 @@ pub fn constructor<'gc>( Ok(Value::Undefined) } -pub fn clone<'gc>( - activation: &mut Activation<'_, 'gc, '_>, - this: Object<'gc>, - _args: &[Value<'gc>], -) -> Result, Error<'gc>> { - let proto = activation.context.avm1.prototypes.blur_filter_constructor; - - let blur_x = this.get("blurX", activation)?; - let blur_y = this.get("blurY", activation)?; - let quality = this.get("quality", activation)?; - - let cloned = proto.construct(activation, &[blur_x, blur_y, quality])?; - Ok(cloned.into()) -} - pub fn get_blur_x<'gc>( _activation: &mut Activation<'_, 'gc, '_>, this: Object<'gc>, @@ -139,9 +124,7 @@ pub fn create_proto<'gc>( fn_proto: Object<'gc>, ) -> Object<'gc> { let blur_filter = BlurFilterObject::empty_object(gc_context, Some(proto)); - let mut object = blur_filter.as_script_object().unwrap(); - - object.force_set_function("clone", clone, gc_context, EnumSet::empty(), Some(fn_proto)); + let object = blur_filter.as_script_object().unwrap(); object.add_property( gc_context, diff --git a/core/src/avm1/object/bevel_filter.rs b/core/src/avm1/object/bevel_filter.rs index 4e221f2d4..27991d7b3 100644 --- a/core/src/avm1/object/bevel_filter.rs +++ b/core/src/avm1/object/bevel_filter.rs @@ -47,7 +47,6 @@ pub struct BevelFilterData<'gc> { /// The underlying script object. base: ScriptObject<'gc>, - //TODO: is this an int angle: f64, blur_x: f64, blur_y: f64, @@ -104,7 +103,7 @@ impl<'gc> BevelFilterObject<'gc> { [set_shadow_alpha, get_shadow_alpha, shadow_alpha, f64], [set_shadow_color, get_shadow_color, shadow_color, i32], [set_strength, get_strength, strength, f64], - [set_type, get_type, type_, BevelFilterType], //TODO: type + [set_type, get_type, type_, BevelFilterType], ); pub fn empty_object(gc_context: MutationContext<'gc, '_>, proto: Option>) -> Self { @@ -112,17 +111,17 @@ impl<'gc> BevelFilterObject<'gc> { gc_context, BevelFilterData { base: ScriptObject::object(gc_context, proto), - angle: 45.0, + angle: 44.9999999772279, blur_x: 4.0, blur_y: 4.0, - distance: 4.0, // TODO: check if int + distance: 4.0, highlight_alpha: 1.0, - highlight_color: 0xFFFFFF.into(), //TODO: int? + highlight_color: 0xFFFFFF, knockout: false, - quality: 1, //TODO: must be int!! + quality: 1, shadow_alpha: 1.0, - shadow_color: 0x000000.into(), //TODO: is int? - strength: 1.0, // Int? + shadow_color: 0x000000, + strength: 1.0, type_: BevelFilterType::Inner, }, )) diff --git a/core/tests/swfs/avm1/bevel_filter/output.txt b/core/tests/swfs/avm1/bevel_filter/output.txt index 707921354..8d2cee918 100644 --- a/core/tests/swfs/avm1/bevel_filter/output.txt +++ b/core/tests/swfs/avm1/bevel_filter/output.txt @@ -28,6 +28,8 @@ false 1 // x.type inner +// x.angle (after set to 360) +0 // x.angle (after set to 361) 1 // x.blurX(after set to 100) @@ -36,6 +38,8 @@ inner 100 // x.distance (after set to 1000) 1000 +// x.distance (after set to 2.5) +2.5 // x.highlightAlpha (after set to 1.5) 1 // x.highlightColor (after set to 0x1000000) @@ -50,6 +54,8 @@ inner 0 // x.strength (after set to 256) 255 +// x.strength (after set to 1.5) +1.5 // x.angle (after set to -1) -1 // x.angle (after set to -366) @@ -64,6 +70,8 @@ inner 0 // x.highlightColor (after set to -1) 16777215 +// x.highlightColor (after set to -10) +16777206 // x.quality(after set to 2.5) 2 // x.quality(after set to -1) @@ -72,6 +80,8 @@ inner 0 // x.shadowColor (after set to -1) 16777215 +// x.shadowColor (after set to -0x11234567) +14465689 // x.strength (after set to -1) 0 // x.type (after set to "invalid") diff --git a/core/tests/swfs/avm1/bevel_filter/test.fla b/core/tests/swfs/avm1/bevel_filter/test.fla index fe49589264447bf47a6247e70189c9c4a917ef9c..9b287e00a280f86478e0cdff89aea1e4c6813a5d 100644 GIT binary patch delta 2331 zcmV+$3FP+pD2OVMihmE%t4%Tm007e(000jF002Z!O+;^Fb!}yCbS`*pY_*wfZ`(Ey z$KMy|ci^-)3D8(iwk)?+fGnA@07+`h#a5#&23e+UEwboIlppr#N9vgpX(<-gB1L@n zzaNiB@?^2&htJOs$ceVl$Kbg2{P5#3bS-Iv@$RE69}b7!L4WU|U@dEkqRL;NpJvVm zZtWY_53%h#P)efm2tVxEOSFJJ2W{o!%A;|nECDA90y4%IcMCn&hnA$0$d&g83_=(A zmZbGGA_}05QSj)mkR{zw448O!xB=4utzbx%wg>KKh6Hw=jaMkxTGF4czeI;n0{euO zM9=I!T!O_3lz%a)6sTHH0gK4>mY{EvM7H+dD9BS$NhY!LCE6}vU`esYhetefpbsCH zWFGFyr5-I#ng|OzE+G`k!oRh%b!aFDaoM~>~zXSBo7^h_m zGfQG7i8h$D>_F}3T!fQIRIHNc(f!%0J<#Ymf zhueiDacRW(r*HQUcVF(l?d<>@fkpPf0j%gw>aAQ4lWO*UfqUpp;tyBXpWeU2f$hL6 zNtR=6$$u*q-XkkK_8brS@anoO$!r2Cuq<%o>0?JV$oAJBWYn>xDqDC_@RgCp7M^Tg zlg+ELrJFX0vNAJP#T$3M@yHLp^L87X31MBrzj}2-hZ(A)L0ec(~eyQYM`Gvy98X>E3#Wb z2r{`*;5qK4E(Ppaqa$w~6Okq)Li)JK1mTOWVD+MVbn;Xte zt>4@N0Vx>acgMYCelKl5Fz0{bqx{+=w(^1GB#W0eIY@>P_)IWVSF zD{;QgHIDQ6^78BNtwxEJ7mT4avlR|C`Agrj5L)~dk(a)p@onoy{Q&5X!lso2YJaaY z70CF`SMw}0(S$h^G~ zlRNGW)zAdw!SH{ohN^TW>w=t>j%|Z{i4&3gU2`rSwF+75NEVzFZPc|IiptMfGfPi| zOUR=Uugu2CAg8b!*yLqQz{aQnJeF$@$M|`h{V&$-e^5&U1QY-Q2nYbHb~RC*eRjd~ z0ssJV5&!@d0000@MN~m8Nt3t*5Pw)*Z<{a_eb2A3=;H>qNgx3QDiT2J16$Qb+Fl)S z8dSb!lP2k3+rxg+{=y9TXvjyqk7}x>pd^Yf_nc$jV{WYUFBb&~?`a9f^e)aU>BqP4 z5{M&9`m6;gD28+ze|Ti{_VME=e7p~hNV>FJ{e`(mi zD1kbqytgE$x&gif*I<}43N)oHhX`Y!>k95@x{lui6=4-3@zQ17F*V&(yI_4uc1wKr zSu`BoASfG`v0jfQGd9#rI@j#c0URs zO=wE9k_&5a)0!wWCpk+=X_KNz;*eA-@F9!Vo=y_dhfhhbJzr6dAb5T!r71jypLFORBhl5wA%hA^nms%<0Z*Lx~7cuR{`bv&=PrQLxZ(0*dEXk#S#i&-C`IFR`ebMdGy?S^6XrnseFo6*gU zBtBX713-nTjW z0#Hi>1QY-Q2(x(z5eWo^h2t%gju9sb0ss~O7XSkQ1GBynJOK(1(yL7}1polk8j}PQ zGaQ|LcER%k0043l000#L000000000000000+Xa)b1s9WQ6Dk4$36qu+KLOm6))OTJ zg@xlSlm8PI0t^z97Zg7tm=XX0ZE0;~ba`-PP)h{{000002>=NIQ33z}*Af5#003{> BQ?CF3 delta 2194 zcmV;D2yOR>D)=anihpN_;702N006ld000jF002Z!O+;^Fb!}yCbS`*pY_*wfZ{kJ} z$KRiH-(l;%Nu&#Y01VvWNNG~kNJ%a#r}og@sWN5_Zj6`OYaaUPJL?DRwRgdZ)u2Q$ z^Pk_&j(5jiGQRu#ct@OgjRT7IYd?rS?jz4qR+Mf&s_JgH>woOJ9TF~8L(_Ei>*K@J zS>d&P@2^B1T$ghbZ%-y}SyqC+N$^C@1>acC)tCct|-b#Q?1 z7cdXc^_a&<5;=U{P>774;q3z<8%uF*Kf*QNv%SQT%sC0|HNJ6@&$;IM{X4{d#xyHi zlv`3WT)e!XD1dO7Hp>v{3a3lOFb2%9?l__zm>}b%?|)(14)F<0^yl7WGU-i@*U?gF z7{esIXo`L8P`t=25`H>}%jPIcflnqW2ZHN`_m-k5=mj4h$pSJP4UFN*QA(VwoKEO% zXtR(sE{hod^zHWU=F82utsSC0vS1DDkjqw5$Mt*))$II&x7eQ~A1*FGy?;kT+rbx# zswUc!SAQwIdtSKjI6evR#bsHN+aywCS!gfPCyr{69V~s!sS`_8HuvN3DkzN;jaQSu+M^3f-YB zI)6WcsNxNFa%B*sZyxcv!eUm*eotTLw)0hOH(#CI%tB7rG;1WVy`eD_Ddl~EOQ~sF z;4w21rfE|sP^Ff@(caV$3T&+(aPSuGKrlqUD#b%IZvaNIp^64zaGOce0EDQon!ebRIwAAFVmLU2XP?-w^bd&rYJ6HpK<$yZ z;yD#IlZMS?VfDw%nvc2iIg)LIDZ(w|14{m|dw6YN#t_c3aGVIL&arSvg2Xc{yMHb} z{rGV`R$p^w8>_EB=Z)di%D(f6)bpoNH9wA?Jlm=#54Q;Y%z+30uMks&!DxjP#4+md@SveuGp z8WM7U@IO^U*V>Z1lAN_++d3OEa<6U9hAAT(Eyrxj2cpHyz=L*|4+s))uU$79^@b9#(K6$1R}Aj=NA19x=znGc;GS`& z$&J<8?JKz>=Krg>{tr+~0|XQR0tg5It9CU}+kC)WssaE2S`PpK6#xJLO+{2eElEyB zFKuOXVPs)+VJ>)WZ0%P`Zrd;v-TM@TvTP-ailxMY?Z6|Fh1wu7&~9mxj)_R3O48%i zy6BO5g;Mem4|33?S#)8-Hh-+I|K212;{eug<{2i>OoJhN;%USB{qvUvIBi(p{K$>6 z4jc2^rDTuGF9WiCCN*l^G%NLaI8U;KX$>InE$*T)1V<$xU|Hkqm1g2SUWn)yVrXR%384#fT|oG;s_% zj{&g3aKd8>s@JFv4}Xzmq^xVcP0#gQ+pXCi8sw$&!s^v07lp37L$b;|;E0SZ6l+|@ zav6HwF3Vo-A&;PZwD>EQm&{H1;X(c1>kB1YTe69a3->93EM^HywKCSAeQPKQM?xl8 zH*uE5oZwsqPE)$}bQI${d`bG~{+e<`(d#oQNnjaL>E2Yoj(=2xMaJL*Q(__s>rG7s zE)M5q6q)WyK4r8oMN)J(!&0#v+ORfQ3zonHndC*i>o!fmp`3<2&qr-HaQpp!yVpYK zy4LM>`>meqdw#pu_6z&>p+~fLsnR$lY)#AGK)VAyqWvnl*~W1E54|p-IFh;L$}H7I zbI-71QarLB`+w2Ri@6aWGU2(tV003GK000#L000000000000000 zl#}8ULIQCJlO_~D0Zfx-6eR?YV{u!Pj}#UHd=ZnU6h9&e5&!^gX>Db6d2nS=O9ci1 U0000900{t50ssI<5&!@I0JGE?bN~PV diff --git a/core/tests/swfs/avm1/bevel_filter/test.swf b/core/tests/swfs/avm1/bevel_filter/test.swf index 547e5a6746959b4716a805dc26cdb1ab73375cbe..0151b3911dae1eda090e1bd13483d19d62ddb1b6 100644 GIT binary patch literal 1421 zcmV;81#Y#gVtEkin! z7t#RDaOf!3I@VN{TuF|d6IW)qamWm}p7{uT3O)cIfD@+X+Z(132sF?yb1TY^8<4(z_Sno7~M z!)`A~Yq=Rsw+~>ZWp~A)))VE7B>H&}RIWQv^K56&w$19gPYF#^b34M0W4EE}qV$?6 z)E^gwv~bWjOkK#W$Q6-~WOBg<`cxH3k?zr@Qy3sy9SMZn=Dk4|O^VL>w1*Prv9TWFUZ;8-^U1)hODzA*o ztGCK++v#dvRqORkqow%?#bMg**sW&+?FgpZeyJll#Hu7>&&8g~2z9L3KN7;0{)%S}`v*{?Cs^sOG zRFIm@X3fvGQff3B&2?4EEBTsQ3$ihxqinWg92&^qjf-cENg-gPh3hn~U395}d{#Lk zp`&aY(c+#r+Xh=)B5nVlawMjRwX{e#!Kwi2mrhSl@1p&2L0t=^&M{~yYu`Y z?>vI_;%-S5I}-S9&dJO*zx(!;`r|KmzIyrhKQGp%53d98!@b!@U>5W5cUB%VnH`Z zT|sbx<&JUKG113cH+vloaKkWCw@upt+z=zrEVOf=7as%{SbpBuOv5_{qcaxW4tlEx zBtLu2Op?s(HJS7rXdQYT5L{r{LvJ|1hjDF$C9RE0D!9-SJX^>Xq~%Go@-kD#@T4qB z%;bL3*TJ+rX);?VB=iA30wsy*T5{Gf4(p^?;kI1`N!$U75{X3 z5tH-yG_%M@030#9i>I$7PLt~mOkG_Z&s^KWgVz}8bt1jNNY{z{X+B+^@q zbc;xDGtxUmdY6&jBhqa~dY?!iFw%!anrEatMEZ!4?h;90pYdb{T#kABQm9*UJw9h(j0IE)ew98i&&Ee8P6e zUmQ_W3`RS)#I`5qQE1DS*_I_NOk4RW+sXu#w)jB^jou^0K4YDLv2gRKJJKO6eqoAc zcsrmUfu~VBh&=Ywzj2tvyN1g~T_f|Z;V|kNg?9~yQ7dFaR)}KM207ja97b)B=dr(H zu|mi#@m8gdDe}hR7N*!r$XHQ~nySP*g~O;*$~^Y-ufP8p#Xjc^#bu)|sj%CPe^}k- zgeohLptUoD9!7)KCkHWmeKfWf`YNCg!=9&;zjNv&1MAWTBT+}Hj6~bk9Bmb&*O5I> bSnvxH%`W&QBhdvn7zr&1e2e`DZBgnthq12o literal 1338 zcmV-A1;zS9S5psM5dZ*qoTXMxbK681-h4GJ1(H%e3Ir;g5E5EjABmkNsgTp7Y>{`$pFlp05JC&fCm#myEhL2_~!on3;-q9XsHKUT^MvM+f&hOE7SJM)GQBp)j$s$J9yRdzIkhQ(VOj*DcH0U*5v+J9VEd+D@)am(KnG7vE=yap9 zwwKcl=M?6ePDdQ*T~W?SVo(Q>)T#@0-*Jx|$13jxETL}cUR(Iubz0E#PU+0q* zNtHKLS!R=CT$=6}X6xcw$wQ`45;-NWr>)V9r0w=x3;Sg>MQFhew0#fBD`R<$rrL7c zj_#NBZr3uKdQeatWWBc2eA(B}VYU@WT@r`Hn{EkxS)(!D@J>ez*`9v@TjSZ@(M1=E z2hekRZWAK1uI_p;;BRHZgn*1!QBB+Pb-M|7wKB@inWmxE zl)PM#3R1mZuhe#Ad9$c#T79P`<&}J;R>_ydL~2;gaGJe9WLnMm57n5|u$tqVXC^w| z+RdwuC?Vj37T0O0U2>_-Voi|>mGw2PULCzuA~meGn-urD)pl8N3AF!zTc%k@>!_G6QxRC?D%>Dewbo=Dj$4`I! z;itjupWnXTp8EYR0N>d&H8249B7v4^`Ox)11)f8zjwe7A1snDS4jSZ|mSe+}Re<{# zBy4R71A^%GnFRr9F>q@2+~R65o zxGAQ*w9(6fEU>UxZhH{kFa3bp5GO1`j~u76e@7hEe8(%s3*>E=YS6mO#VSZ9)~Q94Adk&Y;l zk|V=Wa=Kp}W$YGGJc#1KW#D2N(>_NVGcv0HT~GAb(0O{o?%rPQ0MT)uN<+uOaZXQq zwm}}SXp)N_qd0UNhr*{JK%DbojbI!v5h2GhBrI?_32uYSJKz?ee*rMD5VVtfK|6I= z3cBfK%v`|T%rc(=aK^0z9G*=LlkqNQ-CiC>?(E^o8w_-pKyNb8TLgNWf#wJ_&p`JG z^bP~vC(yeL^d5oUXP^%V^nigrB+y3;^f7@J80ZrMeab)&2_&%JcsT=R%?SYZ6W{$A z``rP}05KZXBExDif=2aOWc3MXzfHwxRI?>kGh*0Z+aO+%YWX>a7y<7CSNh1dQ}|jXwrlMM_(b9fKr| z9)UdXD@UWg7I@~