From 4410d666edd2903fd60e2937fa6595fe695576ad Mon Sep 17 00:00:00 2001 From: Nathan Adams Date: Wed, 5 Jul 2023 23:49:19 +0200 Subject: [PATCH] avm2: Implement Bitmap.pixelSnapping --- core/src/avm2/globals/flash/display/bitmap.rs | 32 +++++++--- core/src/display_object/bitmap.rs | 8 +++ render/src/bitmap.rs | 23 +++++++ .../swfs/avm2/bitmap_pixelsnapping/Test.as | 57 ++++++++++++++++++ .../avm2/bitmap_pixelsnapping/expected.png | Bin 0 -> 6591 bytes .../swfs/avm2/bitmap_pixelsnapping/output.txt | 2 + .../swfs/avm2/bitmap_pixelsnapping/test.fla | Bin 0 -> 6075 bytes .../swfs/avm2/bitmap_pixelsnapping/test.png | Bin 0 -> 1433 bytes .../swfs/avm2/bitmap_pixelsnapping/test.swf | Bin 0 -> 1454 bytes .../swfs/avm2/bitmap_pixelsnapping/test.toml | 8 +++ 10 files changed, 120 insertions(+), 10 deletions(-) create mode 100644 tests/tests/swfs/avm2/bitmap_pixelsnapping/Test.as create mode 100644 tests/tests/swfs/avm2/bitmap_pixelsnapping/expected.png create mode 100644 tests/tests/swfs/avm2/bitmap_pixelsnapping/output.txt create mode 100644 tests/tests/swfs/avm2/bitmap_pixelsnapping/test.fla create mode 100644 tests/tests/swfs/avm2/bitmap_pixelsnapping/test.png create mode 100644 tests/tests/swfs/avm2/bitmap_pixelsnapping/test.swf create mode 100644 tests/tests/swfs/avm2/bitmap_pixelsnapping/test.toml diff --git a/core/src/avm2/globals/flash/display/bitmap.rs b/core/src/avm2/globals/flash/display/bitmap.rs index c33b21bfe..61311c80a 100644 --- a/core/src/avm2/globals/flash/display/bitmap.rs +++ b/core/src/avm2/globals/flash/display/bitmap.rs @@ -6,12 +6,14 @@ use crate::avm2::globals::flash::display::display_object::initialize_for_allocat use crate::avm2::object::{BitmapDataObject, ClassObject, Object, TObject}; use crate::avm2::value::Value; use crate::avm2::Error; +use ruffle_render::bitmap::PixelSnapping; +use ruffle_wstr::WStr; +use crate::avm2::error::make_error_2008; use crate::avm2::parameters::ParametersExt; use crate::bitmap::bitmap_data::BitmapDataWrapper; use crate::character::Character; use crate::display_object::{Bitmap, TDisplayObject}; -use crate::{avm2_stub_getter, avm2_stub_setter}; pub fn bitmap_allocator<'gc>( class: ClassObject<'gc>, @@ -79,8 +81,9 @@ pub fn init<'gc>( let bitmap_data = args .try_get_object(activation, 0) .and_then(|o| o.as_bitmap_data()); - //TODO: Pixel snapping is not supported - let _pixel_snapping = args.get_string(activation, 1); + let Some(pixel_snapping) = PixelSnapping::from_wstr(&args.get_string(activation, 1)?) else { + return Err(make_error_2008(activation, "pixelSnapping")); + }; let smoothing = args.get_bool(2); if let Some(bitmap) = this.as_display_object().and_then(|dobj| dobj.as_bitmap()) { @@ -88,6 +91,7 @@ pub fn init<'gc>( bitmap.set_bitmap_data(&mut activation.context, bitmap_data); } bitmap.set_smoothing(activation.context.gc_context, smoothing); + bitmap.set_pixel_snapping(activation.context.gc_context, pixel_snapping); } else { unreachable!(); } @@ -138,21 +142,29 @@ pub fn set_bitmap_data<'gc>( /// Stub `Bitmap.pixelSnapping`'s getter pub fn get_pixel_snapping<'gc>( - activation: &mut Activation<'_, 'gc>, - _this: Object<'gc>, + _activation: &mut Activation<'_, 'gc>, + this: Object<'gc>, _args: &[Value<'gc>], ) -> Result, Error<'gc>> { - avm2_stub_getter!(activation, "flash.display.Bitmap", "pixelSnapping"); - Ok("auto".into()) + if let Some(bitmap) = this.as_display_object().and_then(|dobj| dobj.as_bitmap()) { + let value: &WStr = bitmap.pixel_snapping().into(); + return Ok(Value::String(value.into())); + } + Ok(Value::Undefined) } /// Stub `Bitmap.pixelSnapping`'s setter pub fn set_pixel_snapping<'gc>( activation: &mut Activation<'_, 'gc>, - _this: Object<'gc>, - _args: &[Value<'gc>], + this: Object<'gc>, + args: &[Value<'gc>], ) -> Result, Error<'gc>> { - avm2_stub_setter!(activation, "flash.display.Bitmap", "pixelSnapping"); + if let Some(bitmap) = this.as_display_object().and_then(|dobj| dobj.as_bitmap()) { + let Some(value) = PixelSnapping::from_wstr(&args.get_string(activation, 0)?) else { + return Err(make_error_2008(activation, "pixelSnapping")); + }; + bitmap.set_pixel_snapping(activation.context.gc_context, value); + } Ok(Value::Undefined) } diff --git a/core/src/display_object/bitmap.rs b/core/src/display_object/bitmap.rs index 5fd9b1c44..f8f59edb3 100644 --- a/core/src/display_object/bitmap.rs +++ b/core/src/display_object/bitmap.rs @@ -174,6 +174,14 @@ impl<'gc> Bitmap<'gc> { self.0.read().height as u16 } + pub fn pixel_snapping(self) -> PixelSnapping { + self.0.read().pixel_snapping + } + + pub fn set_pixel_snapping(self, mc: MutationContext<'gc, '_>, value: PixelSnapping) { + self.0.write(mc).pixel_snapping = value; + } + pub fn bitmap_data_wrapper(self) -> BitmapDataWrapper<'gc> { self.0.read().bitmap_data } diff --git a/render/src/bitmap.rs b/render/src/bitmap.rs index 8a7b40c81..19b4a2dd1 100644 --- a/render/src/bitmap.rs +++ b/render/src/bitmap.rs @@ -3,6 +3,7 @@ use std::fmt::Debug; use std::sync::Arc; use downcast_rs::{impl_downcast, Downcast}; +use ruffle_wstr::WStr; use swf::{Rectangle, Twips}; use crate::backend::RenderBackend; @@ -67,7 +68,29 @@ pub enum PixelSnapping { Never, } +impl From for &'static WStr { + fn from(value: PixelSnapping) -> &'static WStr { + match value { + PixelSnapping::Always => WStr::from_units(b"always"), + PixelSnapping::Auto => WStr::from_units(b"auto"), + PixelSnapping::Never => WStr::from_units(b"never"), + } + } +} + impl PixelSnapping { + pub fn from_wstr(str: &WStr) -> Option { + if str == b"always" { + Some(PixelSnapping::Always) + } else if str == b"auto" { + Some(PixelSnapping::Auto) + } else if str == b"never" { + Some(PixelSnapping::Never) + } else { + None + } + } + pub fn apply(&self, matrix: &mut Matrix) { match self { PixelSnapping::Always => { diff --git a/tests/tests/swfs/avm2/bitmap_pixelsnapping/Test.as b/tests/tests/swfs/avm2/bitmap_pixelsnapping/Test.as new file mode 100644 index 000000000..9a38c0be6 --- /dev/null +++ b/tests/tests/swfs/avm2/bitmap_pixelsnapping/Test.as @@ -0,0 +1,57 @@ +package { + + import flash.display.MovieClip; + import flash.display.Bitmap; + import flash.display.PixelSnapping; + + + public class Test extends MovieClip { + + + public function Test() { + addTest(PixelSnapping.NEVER, 1.0); + addTest(PixelSnapping.ALWAYS, 1.0); + addTest(PixelSnapping.AUTO, 1.0); + + addTest(PixelSnapping.NEVER, 0.99); + addTest(PixelSnapping.ALWAYS, 0.99); + addTest(PixelSnapping.AUTO, 0.99); + + addTest(PixelSnapping.NEVER, 1.01); + addTest(PixelSnapping.ALWAYS, 1.01); + addTest(PixelSnapping.AUTO, 1.01); + + addTest(PixelSnapping.NEVER, 2.0); + addTest(PixelSnapping.ALWAYS, 2.0); + addTest(PixelSnapping.AUTO, 2.0); + + addTest(PixelSnapping.NEVER, 2.5); + addTest(PixelSnapping.ALWAYS, 2.5); + addTest(PixelSnapping.AUTO, 2.5); + + try { + var bitmap = new Bitmap(new TestImage()); + bitmap.pixelSnapping = "test"; + } catch (err) { + trace(err); + } + + try { + var bitmap = new Bitmap(new TestImage(), "test"); + } catch (err) { + trace(err); + } + } + + function addTest(snapping: String, scale: Number) { + var bitmap = new Bitmap(new TestImage()); + bitmap.pixelSnapping = snapping; + bitmap.x = (numChildren % 3 * 100) + 10.5; + bitmap.y = (Math.floor(numChildren / 3) * 100) + 10.5; + bitmap.width *= scale; + bitmap.height *= scale; + addChild(bitmap); + } + } + +} diff --git a/tests/tests/swfs/avm2/bitmap_pixelsnapping/expected.png b/tests/tests/swfs/avm2/bitmap_pixelsnapping/expected.png new file mode 100644 index 0000000000000000000000000000000000000000..63af2c22ec5ac8ae8e323c755120f3742a10b305 GIT binary patch literal 6591 zcmeI1e{54#6vy9Sz?hCf5hlMk_U5!?Hj$)+z^p>M?EwMQ)|bde0b%^X>Vh~26MZll zvre+DOGUCk1OBtLrsYROLCs^j1eq?4e=KgP$#4lvrHh3O2#WN;i|rqBKF|B25VWSZxxm-6zWBJ;5?T2G}1HG-Rv5G#5_G|63&>lB<0 zbT!ABRmalXr@1emWOJN8sV`?_)%g>wlt*nn4)(6$LYECjwHAW&X5Y6)*XKjR^iWB^ zeOIeb8tyI9fet-@S?%Jx4zvc3UT*HN!OET@9bXnMO_NSzbDy*q?fN60c53dOkv)>R zV-Z&xHjQb*7tU=LW}{&*EJ!rDnvQjMKU^2?%!$spl&~l}`2c3eR%UjdD-+?nWPWgse?yP2v zq^DTN$ATC@eVU&2d`EEd~iESBFNkN2h$OT2!ZZcHkq zBv7T%ZSV4t%v}!?i%&^~qZ8^vVJ+-P@G=&ZsR#?(MVCe)8Kkkn78)0_6AEgDsT#M2 zIixW4*u&Kkw zf0fqu<$D+?Sc@Hq9y-e`cxb_=SZ3p6f%TJcfF*awAMB1~aQ;2Pv9M0T5Gt+e1`AT_ zBBIE!^~#V?z(wEcp`$-yD86OCVTAd(mrQ3S>MztG=bDb8nh56oP5m`;5<7y!8tMpK zvSNcJwZe=E`f2FO?C2UKB`TCLlFOF)+^@^7#kHI&x%@Rx)I#>dJgS<9brZTzlV^Ro zBbnt7V-5myqWKf}34gA?R=HHbnLHZ##_6x4j_p=br6++mBSV z%FD?o`EX`rH74rZYSD@pl0`CZq+}%iUu)vf9IhWl3{JkF=c3g_u6-)G=mC?pK#@!? zH|9n**w!s|lGC4~#85o#V5k^2R^JUH zL;Z>M)ET5>^(ohka<(fJ>iL-G)kO?B(D#jzl4IdE?YYQ>xN z{+QZpIAYrZ_U=#E!LYnD_cnJNxYT6}ZbXcY2D6=m<(SSDfBZVKjc}Kzht0}xam&;bp{Ayo2*e-EGksc)y1*j`rg2Jmc&XrpPFF zIs7$0DBvLjJ}E5oyoB&DO)n3PkMZa3d9JApg16CKSgdhJsKa;!2-C8QkLbZEv$Iej z5TnNyC9i*=!CCakbcI7>uFS;uG%h|Mxw|@!)A@wc7L~FJBT0AHNaVvItF(w>$j9z$ z#1%|5C@;L!CLai8VLJ{qSH&e(OGFEuOU2=Z564}9QV&y!T&ne_tWte5^&GjQo;qH5 zhlq#MKSo!=PR-fA>*z@^eq>aU3k@amfrJy#)fQDIyqUrSA$juYH@sq%vgCuL=4W=l zDHJWfsIp%h49+K=ZpvV0b3X-*(5!W8py1GI@Cr-DzcDRD$rGv8j;O4eZXrJuJ%ulen=;`l{$qyWESt^#bvtT*2UpCtxc~qF literal 0 HcmV?d00001 diff --git a/tests/tests/swfs/avm2/bitmap_pixelsnapping/output.txt b/tests/tests/swfs/avm2/bitmap_pixelsnapping/output.txt new file mode 100644 index 000000000..20c563eaf --- /dev/null +++ b/tests/tests/swfs/avm2/bitmap_pixelsnapping/output.txt @@ -0,0 +1,2 @@ +ArgumentError: Error #2008: Parameter pixelSnapping must be one of the accepted values. +ArgumentError: Error #2008: Parameter pixelSnapping must be one of the accepted values. diff --git a/tests/tests/swfs/avm2/bitmap_pixelsnapping/test.fla b/tests/tests/swfs/avm2/bitmap_pixelsnapping/test.fla new file mode 100644 index 0000000000000000000000000000000000000000..04368f5a0d4552e7641416ad94a3a7b4a1cc4be3 GIT binary patch literal 6075 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 I4e_fES}Uv01ONa4 literal 0 HcmV?d00001 diff --git a/tests/tests/swfs/avm2/bitmap_pixelsnapping/test.toml b/tests/tests/swfs/avm2/bitmap_pixelsnapping/test.toml new file mode 100644 index 000000000..64f6c1f0e --- /dev/null +++ b/tests/tests/swfs/avm2/bitmap_pixelsnapping/test.toml @@ -0,0 +1,8 @@ +num_frames = 1 +ignore = true # big differences across rendering backends :( + +[image_comparison] +tolerance = 0 + +[player_options] +with_renderer = { optional = false, sample_count = 1 } \ No newline at end of file