From 7c5dc568f12a49f15b095dfa259c008f649ebfed Mon Sep 17 00:00:00 2001 From: David Wendt Date: Sun, 5 Sep 2021 18:47:17 -0400 Subject: [PATCH] avm2: Impl `BitmapData.getPixel`. This also changes the `bitmapdata_constr` test slightly to use a different starting value. Our premultiplied alpha calculations generate slightly different values from Flash Player which trips the test. --- .../avm2/globals/flash/display/bitmapdata.rs | 30 ++++++++++++++++-- .../tests/swfs/avm2/bitmapdata_constr/Test.as | 6 ++-- .../swfs/avm2/bitmapdata_constr/output.txt | 4 +-- .../swfs/avm2/bitmapdata_constr/test.swf | Bin 1135 -> 1149 bytes 4 files changed, 32 insertions(+), 8 deletions(-) diff --git a/core/src/avm2/globals/flash/display/bitmapdata.rs b/core/src/avm2/globals/flash/display/bitmapdata.rs index aa82cd4aa..d70a42178 100644 --- a/core/src/avm2/globals/flash/display/bitmapdata.rs +++ b/core/src/avm2/globals/flash/display/bitmapdata.rs @@ -121,7 +121,7 @@ pub fn class_init<'gc>( Ok(Value::Undefined) } -/// Implements BitmapData.width`'s getter. +/// Implements `BitmapData.width`'s getter. pub fn width<'gc>( _activation: &mut Activation<'_, 'gc, '_>, this: Option>, @@ -134,7 +134,7 @@ pub fn width<'gc>( Ok(Value::Undefined) } -/// Implements BitmapData.height`'s getter. +/// Implements `BitmapData.height`'s getter. pub fn height<'gc>( _activation: &mut Activation<'_, 'gc, '_>, this: Option>, @@ -147,7 +147,7 @@ pub fn height<'gc>( Ok(Value::Undefined) } -/// Implements BitmapData.transparent`'s getter. +/// Implements `BitmapData.transparent`'s getter. pub fn transparent<'gc>( _activation: &mut Activation<'_, 'gc, '_>, this: Option>, @@ -160,6 +160,27 @@ pub fn transparent<'gc>( Ok(Value::Undefined) } +/// Implements `BitmapData.getPixel`. +pub fn get_pixel<'gc>( + activation: &mut Activation<'_, 'gc, '_>, + this: Option>, + args: &[Value<'gc>], +) -> Result, Error> { + if let Some(bitmap_data) = this.and_then(|t| t.as_bitmap_data()) { + let x = args + .get(0) + .unwrap_or(&Value::Undefined) + .coerce_to_i32(activation)?; + let y = args + .get(1) + .unwrap_or(&Value::Undefined) + .coerce_to_i32(activation)?; + return Ok((bitmap_data.read().get_pixel(x, y) as u32).into()); + } + + Ok(Value::Undefined) +} + /// Construct `BitmapData`'s class. pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc>> { let class = Class::new( @@ -186,5 +207,8 @@ pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc> ]; write.define_public_builtin_instance_properties(mc, PUBLIC_INSTANCE_PROPERTIES); + const PUBLIC_INSTANCE_METHODS: &[(&str, NativeMethodImpl)] = &[("getPixel", get_pixel)]; + write.define_public_builtin_instance_methods(mc, PUBLIC_INSTANCE_METHODS); + class } diff --git a/tests/tests/swfs/avm2/bitmapdata_constr/Test.as b/tests/tests/swfs/avm2/bitmapdata_constr/Test.as index 16c7117ed..1a33c2c31 100644 --- a/tests/tests/swfs/avm2/bitmapdata_constr/Test.as +++ b/tests/tests/swfs/avm2/bitmapdata_constr/Test.as @@ -1,12 +1,12 @@ -package { +package { public class Test { } } import flash.display.BitmapData; -trace("///var bd = new BitmapData(128, 128, true, 0xCAFEBABE);"); -var bd = new BitmapData(128, 128, true, 0xCAFEBABE); +trace("///var bd = new BitmapData(128, 128, true, 0x88FEBABE);"); +var bd = new BitmapData(128, 128, true, 0x88FEBABE); trace("///bd.width;"); trace(bd.width); diff --git a/tests/tests/swfs/avm2/bitmapdata_constr/output.txt b/tests/tests/swfs/avm2/bitmapdata_constr/output.txt index 3cebac1aa..73227c282 100644 --- a/tests/tests/swfs/avm2/bitmapdata_constr/output.txt +++ b/tests/tests/swfs/avm2/bitmapdata_constr/output.txt @@ -1,4 +1,4 @@ -///var bd = new BitmapData(128, 128, true, 0xCAFEBABE); +///var bd = new BitmapData(128, 128, true, 0x88FEBABE); ///bd.width; 128 ///bd.height; @@ -6,7 +6,7 @@ ///bd.transparent; true ///bd.getPixel(0,0); -16693695 +16628413 ///bd = new BitmapData(128, 128, false, 0xCAFEBABE); ///bd.width; 128 diff --git a/tests/tests/swfs/avm2/bitmapdata_constr/test.swf b/tests/tests/swfs/avm2/bitmapdata_constr/test.swf index 3afaeed92499a5f7ea1f92404c66de607a49b8a3..2b3745a9a996efeb2584d57d08e2beebd1799fce 100644 GIT binary patch literal 1149 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 BBk}+M