From 51e3a5414eefed5cfc2b466460a6f8285e709c39 Mon Sep 17 00:00:00 2001 From: Mohammad Alloush Date: Sun, 18 Oct 2026 13:36:30 +0400 Subject: [PATCH 1/3] core: Fix bitmap cache updates for animated masks --- core/src/display_object.rs | 5 + core/src/display_object/graphic.rs | 2 + .../animated_mask_filter_bounds/Test.as | 149 ++++++++++++++++++ .../frame11.expected.png | Bin 0 -> 1516 bytes .../frame19.expected.png | Bin 0 -> 1516 bytes .../frame35.expected.png | Bin 0 -> 1516 bytes .../animated_mask_filter_bounds/maskee.png | Bin 0 -> 224 bytes .../output.expected.png | Bin 0 -> 1516 bytes .../animated_mask_filter_bounds/output.txt | 53 +++++++ .../animated_mask_filter_bounds/test.swf | Bin 0 -> 11392 bytes .../animated_mask_filter_bounds/test.toml | 19 +++ 11 files changed, 228 insertions(+) create mode 100644 tests/tests/swfs/visual/cache_as_bitmap/animated_mask_filter_bounds/Test.as create mode 100644 tests/tests/swfs/visual/cache_as_bitmap/animated_mask_filter_bounds/frame11.expected.png create mode 100644 tests/tests/swfs/visual/cache_as_bitmap/animated_mask_filter_bounds/frame19.expected.png create mode 100644 tests/tests/swfs/visual/cache_as_bitmap/animated_mask_filter_bounds/frame35.expected.png create mode 100644 tests/tests/swfs/visual/cache_as_bitmap/animated_mask_filter_bounds/maskee.png create mode 100644 tests/tests/swfs/visual/cache_as_bitmap/animated_mask_filter_bounds/output.expected.png create mode 100644 tests/tests/swfs/visual/cache_as_bitmap/animated_mask_filter_bounds/output.txt create mode 100644 tests/tests/swfs/visual/cache_as_bitmap/animated_mask_filter_bounds/test.swf create mode 100644 tests/tests/swfs/visual/cache_as_bitmap/animated_mask_filter_bounds/test.toml diff --git a/core/src/display_object.rs b/core/src/display_object.rs index 0904753ca3e21..00a1295ec49e1 100644 --- a/core/src/display_object.rs +++ b/core/src/display_object.rs @@ -1446,6 +1446,11 @@ pub trait TDisplayObject<'gc>: if let Some(ctr) = self.as_container() { for child in ctr.iter_render_list() { + // Masks clip other children without contributing visible pixels. + // Their animation must not move the bitmap cache's origin. + if (child.clip_depth() > 0 && child.allow_as_mask()) || child.maskee().is_some() { + continue; + } let matrix = *matrix * child.base().matrix(); bounds = bounds.union(&child.render_bounds_with_transform(&matrix, true, view_matrix)); diff --git a/core/src/display_object/graphic.rs b/core/src/display_object/graphic.rs index 0ba54d1a77a6f..3a3dc01a30182 100644 --- a/core/src/display_object/graphic.rs +++ b/core/src/display_object/graphic.rs @@ -112,6 +112,8 @@ impl<'gc> Graphic<'gc> { } pub fn drawing_mut(&self) -> RefMut<'_, Drawing> { + // We're about to change graphics, so invalidate on the next frame. + self.invalidate_cached_bitmap(); self.0.drawing.get_or_init(Default::default).borrow_mut() } diff --git a/tests/tests/swfs/visual/cache_as_bitmap/animated_mask_filter_bounds/Test.as b/tests/tests/swfs/visual/cache_as_bitmap/animated_mask_filter_bounds/Test.as new file mode 100644 index 0000000000000..49f29e0534ecf --- /dev/null +++ b/tests/tests/swfs/visual/cache_as_bitmap/animated_mask_filter_bounds/Test.as @@ -0,0 +1,149 @@ +package { + import flash.display.Bitmap; + import flash.display.BlendMode; + import flash.display.MovieClip; + import flash.display.Shape; + import flash.display.Sprite; + import flash.display.StageAlign; + import flash.display.StageScaleMode; + import flash.events.Event; + import flash.filters.ColorMatrixFilter; + import flash.geom.Rectangle; + import flash.system.fscommand; + + [SWF(width="480", height="300", frameRate="30", backgroundColor="#A0A0A0")] + public class Test extends MovieClip { + [Embed(source="maskee.png")] + private var Maskee:Class; + + private var containers:Array = []; + private var bitmaps:Array = []; + private var masks:Array = []; + private var frame:int = 0; + + public function Test() { + stage.scaleMode = StageScaleMode.NO_SCALE; + stage.align = StageAlign.TOP_LEFT; + + trace("Animated mask / filter bounds"); + trace("Top row, left to right: ColorMatrix+HardLight, ColorMatrix, HardLight"); + trace("Bottom row: no effects, ColorMatrix+moving clipping edge, ColorMatrix+moving bitmap"); + + for (var i:int = 0; i < 6; i++) { + var container:Sprite = new Sprite(); + container.x = 40 + (i % 3) * 160; + container.y = 35 + int(i / 3) * 150; + addChild(container); + + var bitmap:Bitmap = new Maskee(); + bitmap.scaleX = bitmap.scaleY = 4; + container.addChild(bitmap); + + var maskShape:Shape = new Shape(); + container.addChild(maskShape); + bitmap.mask = maskShape; + drawMask(maskShape, -12, -12, 104, 104); + + if (i == 0 || i == 1 || i == 4 || i == 5) { + container.filters = [new ColorMatrixFilter([ + 0.8, 0, 0, 0, 12, + 0, 0.9, 0, 0, 6, + 0, 0, 0.7, 0, 18, + 0, 0, 0, 1, 0 + ])]; + } + + if (i == 0 || i == 2) { + container.blendMode = BlendMode.HARDLIGHT; + } + + + containers.push(container); + bitmaps.push(bitmap); + masks.push(maskShape); + } + + addEventListener(Event.ENTER_FRAME, onFrame); + } + + private function drawMask( + maskShape:Shape, + x:Number, + y:Number, + width:Number, + height:Number + ):void { + maskShape.graphics.clear(); + maskShape.graphics.beginFill(0x000000); + maskShape.graphics.drawRect(x, y, width, height); + maskShape.graphics.endFill(); + } + + private function bounds(rect:Rectangle):String { + return rect.x.toFixed(2) + "," + + rect.y.toFixed(2) + "," + + rect.width.toFixed(2) + "," + + rect.height.toFixed(2); + } + + private function onFrame(event:Event):void { + frame++; + + var phase:int = (frame - 1) % 40; + var controlPhase:int = int((frame - 1) / 2) % 4; + var delta:Number = phase * 0.05; + + for (var i:int = 0; i < 6; i++) { + var maskShape:Shape = masks[i]; + var bitmap:Bitmap = bitmaps[i]; + + if (i == 4) { + // Intentional visible clipping motion. + drawMask(maskShape, controlPhase * 10, 0, 40, 80); + } else { + // Changing mask bounds; bitmap remains fully covered. + drawMask( + maskShape, + -12 - delta, + -12 - delta, + 104 + delta * 2, + 104 + delta * 2 + ); + } + + if (i == 5) { + // Intentional bitmap motion. + bitmap.x = controlPhase * 2; + } + } + + if ( + frame == 1 || frame == 11 || frame == 19 || + frame == 35 || frame == 40 || frame == 60 || + frame == 123 + ) { + trace("frame=" + frame + " delta=" + delta.toFixed(2)); + + for (i = 0; i < 6; i++) { + trace( + "case=" + i + + " bitmap=" + + bounds(Bitmap(bitmaps[i]).getBounds(this)) + + " mask=" + + bounds(Shape(masks[i]).getBounds(this)) + + " container=" + + bounds(Sprite(containers[i]).getBounds(this)) + ); + } + } + + if (frame == 11 || frame == 19 || frame == 35) { + fscommand("captureImage", "frame" + frame); + } + if (frame == 123) { + trace("DONE"); + removeEventListener(Event.ENTER_FRAME, onFrame); + } + } + } +} diff --git a/tests/tests/swfs/visual/cache_as_bitmap/animated_mask_filter_bounds/frame11.expected.png b/tests/tests/swfs/visual/cache_as_bitmap/animated_mask_filter_bounds/frame11.expected.png new file mode 100644 index 0000000000000000000000000000000000000000..837c6c953fd12ab2c5ae45d4554a6f9502de0db1 GIT binary patch literal 1516 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 O(J$c;fd3CavrQY9Adx)) literal 0 HcmV?d00001 diff --git a/tests/tests/swfs/visual/cache_as_bitmap/animated_mask_filter_bounds/test.toml b/tests/tests/swfs/visual/cache_as_bitmap/animated_mask_filter_bounds/test.toml new file mode 100644 index 0000000000000..1eeadb79075b5 --- /dev/null +++ b/tests/tests/swfs/visual/cache_as_bitmap/animated_mask_filter_bounds/test.toml @@ -0,0 +1,19 @@ +num_frames = 124 + +[image_comparisons.frame11] +trigger = "fs_command" +tolerance = 1 + +[image_comparisons.frame19] +trigger = "fs_command" +tolerance = 1 + +[image_comparisons.frame35] +trigger = "fs_command" +tolerance = 1 + +[image_comparisons.output] +tolerance = 1 + +[player_options] +with_renderer = { optional = false, quality = "high" } From 449a40e537914072afa0b3f9f3216dd6e640ee0b Mon Sep 17 00:00:00 2001 From: Mohammad Alloush Date: Sun, 8 Nov 2026 22:18:47 +0400 Subject: [PATCH 2/3] tests: Isolate animated mask movement from graphics redraws --- core/src/display_object/graphic.rs | 2 - .../animated_mask_filter_bounds/Test.as | 19 +++--- .../animated_mask_filter_bounds/output.txt | 60 +++++++++--------- .../animated_mask_filter_bounds/test.swf | Bin 11392 -> 11395 bytes 4 files changed, 39 insertions(+), 42 deletions(-) diff --git a/core/src/display_object/graphic.rs b/core/src/display_object/graphic.rs index 3a3dc01a30182..0ba54d1a77a6f 100644 --- a/core/src/display_object/graphic.rs +++ b/core/src/display_object/graphic.rs @@ -112,8 +112,6 @@ impl<'gc> Graphic<'gc> { } pub fn drawing_mut(&self) -> RefMut<'_, Drawing> { - // We're about to change graphics, so invalidate on the next frame. - self.invalidate_cached_bitmap(); self.0.drawing.get_or_init(Default::default).borrow_mut() } diff --git a/tests/tests/swfs/visual/cache_as_bitmap/animated_mask_filter_bounds/Test.as b/tests/tests/swfs/visual/cache_as_bitmap/animated_mask_filter_bounds/Test.as index 49f29e0534ecf..9c53b905a614e 100644 --- a/tests/tests/swfs/visual/cache_as_bitmap/animated_mask_filter_bounds/Test.as +++ b/tests/tests/swfs/visual/cache_as_bitmap/animated_mask_filter_bounds/Test.as @@ -41,8 +41,12 @@ package { var maskShape:Shape = new Shape(); container.addChild(maskShape); + if (i == 4) { + drawMask(maskShape, 0, 0, 40, 80); + } else { + drawMask(maskShape, -12, -12, 104, 104); + } bitmap.mask = maskShape; - drawMask(maskShape, -12, -12, 104, 104); if (i == 0 || i == 1 || i == 4 || i == 5) { container.filters = [new ColorMatrixFilter([ @@ -99,16 +103,11 @@ package { if (i == 4) { // Intentional visible clipping motion. - drawMask(maskShape, controlPhase * 10, 0, 40, 80); + maskShape.x = controlPhase * 10; } else { - // Changing mask bounds; bitmap remains fully covered. - drawMask( - maskShape, - -12 - delta, - -12 - delta, - 104 + delta * 2, - 104 + delta * 2 - ); + // Move the mask while it still fully covers the bitmap. + maskShape.x = -delta; + maskShape.y = -delta; } if (i == 5) { diff --git a/tests/tests/swfs/visual/cache_as_bitmap/animated_mask_filter_bounds/output.txt b/tests/tests/swfs/visual/cache_as_bitmap/animated_mask_filter_bounds/output.txt index 27d9955dcb614..fc6c20bd74756 100644 --- a/tests/tests/swfs/visual/cache_as_bitmap/animated_mask_filter_bounds/output.txt +++ b/tests/tests/swfs/visual/cache_as_bitmap/animated_mask_filter_bounds/output.txt @@ -9,45 +9,45 @@ case=3 bitmap=40.00,185.00,80.00,80.00 mask=28.00,173.00,104.00,104.00 container case=4 bitmap=200.00,185.00,80.00,80.00 mask=200.00,185.00,40.00,80.00 container=200.00,185.00,80.00,80.00 case=5 bitmap=360.00,185.00,80.00,80.00 mask=348.00,173.00,104.00,104.00 container=348.00,173.00,104.00,104.00 frame=11 delta=0.50 -case=0 bitmap=40.00,35.00,80.00,80.00 mask=27.50,22.50,105.00,105.00 container=27.50,22.50,105.00,105.00 -case=1 bitmap=200.00,35.00,80.00,80.00 mask=187.50,22.50,105.00,105.00 container=187.50,22.50,105.00,105.00 -case=2 bitmap=360.00,35.00,80.00,80.00 mask=347.50,22.50,105.00,105.00 container=347.50,22.50,105.00,105.00 -case=3 bitmap=40.00,185.00,80.00,80.00 mask=27.50,172.50,105.00,105.00 container=27.50,172.50,105.00,105.00 +case=0 bitmap=40.00,35.00,80.00,80.00 mask=27.50,22.50,104.00,104.00 container=27.50,22.50,104.00,104.00 +case=1 bitmap=200.00,35.00,80.00,80.00 mask=187.50,22.50,104.00,104.00 container=187.50,22.50,104.00,104.00 +case=2 bitmap=360.00,35.00,80.00,80.00 mask=347.50,22.50,104.00,104.00 container=347.50,22.50,104.00,104.00 +case=3 bitmap=40.00,185.00,80.00,80.00 mask=27.50,172.50,104.00,104.00 container=27.50,172.50,104.00,104.00 case=4 bitmap=200.00,185.00,80.00,80.00 mask=210.00,185.00,40.00,80.00 container=200.00,185.00,80.00,80.00 -case=5 bitmap=362.00,185.00,80.00,80.00 mask=347.50,172.50,105.00,105.00 container=347.50,172.50,105.00,105.00 +case=5 bitmap=362.00,185.00,80.00,80.00 mask=347.50,172.50,104.00,104.00 container=347.50,172.50,104.00,104.00 frame=19 delta=0.90 -case=0 bitmap=40.00,35.00,80.00,80.00 mask=27.10,22.10,105.80,105.80 container=27.10,22.10,105.80,105.80 -case=1 bitmap=200.00,35.00,80.00,80.00 mask=187.10,22.10,105.80,105.80 container=187.10,22.10,105.80,105.80 -case=2 bitmap=360.00,35.00,80.00,80.00 mask=347.10,22.10,105.80,105.80 container=347.10,22.10,105.80,105.80 -case=3 bitmap=40.00,185.00,80.00,80.00 mask=27.10,172.10,105.80,105.80 container=27.10,172.10,105.80,105.80 +case=0 bitmap=40.00,35.00,80.00,80.00 mask=27.10,22.10,104.00,104.00 container=27.10,22.10,104.00,104.00 +case=1 bitmap=200.00,35.00,80.00,80.00 mask=187.10,22.10,104.00,104.00 container=187.10,22.10,104.00,104.00 +case=2 bitmap=360.00,35.00,80.00,80.00 mask=347.10,22.10,104.00,104.00 container=347.10,22.10,104.00,104.00 +case=3 bitmap=40.00,185.00,80.00,80.00 mask=27.10,172.10,104.00,104.00 container=27.10,172.10,104.00,104.00 case=4 bitmap=200.00,185.00,80.00,80.00 mask=210.00,185.00,40.00,80.00 container=200.00,185.00,80.00,80.00 -case=5 bitmap=362.00,185.00,80.00,80.00 mask=347.10,172.10,105.80,105.80 container=347.10,172.10,105.80,105.80 +case=5 bitmap=362.00,185.00,80.00,80.00 mask=347.10,172.10,104.00,104.00 container=347.10,172.10,104.00,104.00 frame=35 delta=1.70 -case=0 bitmap=40.00,35.00,80.00,80.00 mask=26.30,21.30,107.40,107.40 container=26.30,21.30,107.40,107.40 -case=1 bitmap=200.00,35.00,80.00,80.00 mask=186.30,21.30,107.40,107.40 container=186.30,21.30,107.40,107.40 -case=2 bitmap=360.00,35.00,80.00,80.00 mask=346.30,21.30,107.40,107.40 container=346.30,21.30,107.40,107.40 -case=3 bitmap=40.00,185.00,80.00,80.00 mask=26.30,171.30,107.40,107.40 container=26.30,171.30,107.40,107.40 +case=0 bitmap=40.00,35.00,80.00,80.00 mask=26.30,21.30,104.00,104.00 container=26.30,21.30,104.00,104.00 +case=1 bitmap=200.00,35.00,80.00,80.00 mask=186.30,21.30,104.00,104.00 container=186.30,21.30,104.00,104.00 +case=2 bitmap=360.00,35.00,80.00,80.00 mask=346.30,21.30,104.00,104.00 container=346.30,21.30,104.00,104.00 +case=3 bitmap=40.00,185.00,80.00,80.00 mask=26.30,171.30,104.00,104.00 container=26.30,171.30,104.00,104.00 case=4 bitmap=200.00,185.00,80.00,80.00 mask=210.00,185.00,40.00,80.00 container=200.00,185.00,80.00,80.00 -case=5 bitmap=362.00,185.00,80.00,80.00 mask=346.30,171.30,107.40,107.40 container=346.30,171.30,107.40,107.40 +case=5 bitmap=362.00,185.00,80.00,80.00 mask=346.30,171.30,104.00,104.00 container=346.30,171.30,104.00,104.00 frame=40 delta=1.95 -case=0 bitmap=40.00,35.00,80.00,80.00 mask=26.05,21.05,107.90,107.90 container=26.05,21.05,107.90,107.90 -case=1 bitmap=200.00,35.00,80.00,80.00 mask=186.05,21.05,107.90,107.90 container=186.05,21.05,107.90,107.90 -case=2 bitmap=360.00,35.00,80.00,80.00 mask=346.05,21.05,107.90,107.90 container=346.05,21.05,107.90,107.90 -case=3 bitmap=40.00,185.00,80.00,80.00 mask=26.05,171.05,107.90,107.90 container=26.05,171.05,107.90,107.90 +case=0 bitmap=40.00,35.00,80.00,80.00 mask=26.05,21.05,104.00,104.00 container=26.05,21.05,104.00,104.00 +case=1 bitmap=200.00,35.00,80.00,80.00 mask=186.05,21.05,104.00,104.00 container=186.05,21.05,104.00,104.00 +case=2 bitmap=360.00,35.00,80.00,80.00 mask=346.05,21.05,104.00,104.00 container=346.05,21.05,104.00,104.00 +case=3 bitmap=40.00,185.00,80.00,80.00 mask=26.05,171.05,104.00,104.00 container=26.05,171.05,104.00,104.00 case=4 bitmap=200.00,185.00,80.00,80.00 mask=230.00,185.00,40.00,80.00 container=200.00,185.00,80.00,80.00 -case=5 bitmap=366.00,185.00,80.00,80.00 mask=346.05,171.05,107.90,107.90 container=346.05,171.05,107.90,107.90 +case=5 bitmap=366.00,185.00,80.00,80.00 mask=346.05,171.05,104.00,104.00 container=346.05,171.05,104.00,104.00 frame=60 delta=0.95 -case=0 bitmap=40.00,35.00,80.00,80.00 mask=27.05,22.05,105.90,105.90 container=27.05,22.05,105.90,105.90 -case=1 bitmap=200.00,35.00,80.00,80.00 mask=187.05,22.05,105.90,105.90 container=187.05,22.05,105.90,105.90 -case=2 bitmap=360.00,35.00,80.00,80.00 mask=347.05,22.05,105.90,105.90 container=347.05,22.05,105.90,105.90 -case=3 bitmap=40.00,185.00,80.00,80.00 mask=27.05,172.05,105.90,105.90 container=27.05,172.05,105.90,105.90 +case=0 bitmap=40.00,35.00,80.00,80.00 mask=27.05,22.05,104.00,104.00 container=27.05,22.05,104.00,104.00 +case=1 bitmap=200.00,35.00,80.00,80.00 mask=187.05,22.05,104.00,104.00 container=187.05,22.05,104.00,104.00 +case=2 bitmap=360.00,35.00,80.00,80.00 mask=347.05,22.05,104.00,104.00 container=347.05,22.05,104.00,104.00 +case=3 bitmap=40.00,185.00,80.00,80.00 mask=27.05,172.05,104.00,104.00 container=27.05,172.05,104.00,104.00 case=4 bitmap=200.00,185.00,80.00,80.00 mask=210.00,185.00,40.00,80.00 container=200.00,185.00,80.00,80.00 -case=5 bitmap=362.00,185.00,80.00,80.00 mask=347.05,172.05,105.90,105.90 container=347.05,172.05,105.90,105.90 +case=5 bitmap=362.00,185.00,80.00,80.00 mask=347.05,172.05,104.00,104.00 container=347.05,172.05,104.00,104.00 frame=123 delta=0.10 -case=0 bitmap=40.00,35.00,80.00,80.00 mask=27.90,22.90,104.20,104.20 container=27.90,22.90,104.20,104.20 -case=1 bitmap=200.00,35.00,80.00,80.00 mask=187.90,22.90,104.20,104.20 container=187.90,22.90,104.20,104.20 -case=2 bitmap=360.00,35.00,80.00,80.00 mask=347.90,22.90,104.20,104.20 container=347.90,22.90,104.20,104.20 -case=3 bitmap=40.00,185.00,80.00,80.00 mask=27.90,172.90,104.20,104.20 container=27.90,172.90,104.20,104.20 +case=0 bitmap=40.00,35.00,80.00,80.00 mask=27.90,22.90,104.00,104.00 container=27.90,22.90,104.00,104.00 +case=1 bitmap=200.00,35.00,80.00,80.00 mask=187.90,22.90,104.00,104.00 container=187.90,22.90,104.00,104.00 +case=2 bitmap=360.00,35.00,80.00,80.00 mask=347.90,22.90,104.00,104.00 container=347.90,22.90,104.00,104.00 +case=3 bitmap=40.00,185.00,80.00,80.00 mask=27.90,172.90,104.00,104.00 container=27.90,172.90,104.00,104.00 case=4 bitmap=200.00,185.00,80.00,80.00 mask=210.00,185.00,40.00,80.00 container=200.00,185.00,80.00,80.00 -case=5 bitmap=362.00,185.00,80.00,80.00 mask=347.90,172.90,104.20,104.20 container=347.90,172.90,104.20,104.20 +case=5 bitmap=362.00,185.00,80.00,80.00 mask=347.90,172.90,104.00,104.00 container=347.90,172.90,104.00,104.00 DONE diff --git a/tests/tests/swfs/visual/cache_as_bitmap/animated_mask_filter_bounds/test.swf b/tests/tests/swfs/visual/cache_as_bitmap/animated_mask_filter_bounds/test.swf index 5cc81021c02994e7b3a88b9c60b8643a7661be77..289d6c31d0c5bd2ab4b7e2b72480a42f792272fa 100644 GIT binary patch literal 11395 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 R&%qx35)L5o{{fhJL%#}BdddI* literal 11392 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 O(J$c;fd3CavrQY9Adx)) From 56c27a1fdb1a3171c36c4d7e5ce6074a1ab0d881 Mon Sep 17 00:00:00 2001 From: Mohammad Alloush Date: Sun, 8 Nov 2026 23:37:03 +0400 Subject: [PATCH 3/3] tests: Cover bitmap cache jitter with timeline masks --- .../timeline_mask_cache_bounds/Test.as | 47 ++++++++++++++++++ .../frame01.expected.png | Bin 0 -> 530 bytes .../frame02.expected.png | Bin 0 -> 530 bytes .../frame03.expected.png | Bin 0 -> 530 bytes .../frame04.expected.png | Bin 0 -> 530 bytes .../timeline_mask_cache_bounds/output.txt | 6 +++ .../timeline_mask_cache_bounds/test.swf | Bin 0 -> 2258 bytes .../timeline_mask_cache_bounds/test.toml | 20 ++++++++ 8 files changed, 73 insertions(+) create mode 100644 tests/tests/swfs/visual/cache_as_bitmap/timeline_mask_cache_bounds/Test.as create mode 100644 tests/tests/swfs/visual/cache_as_bitmap/timeline_mask_cache_bounds/frame01.expected.png create mode 100644 tests/tests/swfs/visual/cache_as_bitmap/timeline_mask_cache_bounds/frame02.expected.png create mode 100644 tests/tests/swfs/visual/cache_as_bitmap/timeline_mask_cache_bounds/frame03.expected.png create mode 100644 tests/tests/swfs/visual/cache_as_bitmap/timeline_mask_cache_bounds/frame04.expected.png create mode 100644 tests/tests/swfs/visual/cache_as_bitmap/timeline_mask_cache_bounds/output.txt create mode 100644 tests/tests/swfs/visual/cache_as_bitmap/timeline_mask_cache_bounds/test.swf create mode 100644 tests/tests/swfs/visual/cache_as_bitmap/timeline_mask_cache_bounds/test.toml diff --git a/tests/tests/swfs/visual/cache_as_bitmap/timeline_mask_cache_bounds/Test.as b/tests/tests/swfs/visual/cache_as_bitmap/timeline_mask_cache_bounds/Test.as new file mode 100644 index 0000000000000..51b32c48126fe --- /dev/null +++ b/tests/tests/swfs/visual/cache_as_bitmap/timeline_mask_cache_bounds/Test.as @@ -0,0 +1,47 @@ +package { + import flash.display.MovieClip; + import flash.display.StageAlign; + import flash.display.StageQuality; + import flash.display.StageScaleMode; + import flash.events.Event; + import flash.system.fscommand; + + [SWF(width="160", height="160", frameRate="24", backgroundColor="#A0A0A0")] + public class Test extends MovieClip { + private var scene:MovieClip; + private var sampleFrame:int = 1; + private var holdFrames:int = 0; + + public function Test() { + stage.scaleMode = StageScaleMode.NO_SCALE; + stage.align = StageAlign.TOP_LEFT; + stage.quality = StageQuality.HIGH; + + addEventListener(Event.ENTER_FRAME, onFrame); + } + + private function onFrame(event:Event):void { + if (scene == null) { + // The build script adds the native timeline to the root frame. + if (numChildren == 0) { + return; + } + scene = MovieClip(getChildAt(0)); + trace("Timeline mask cache bounds"); + } + if (holdFrames > 0) { + holdFrames--; + return; + } + scene.gotoAndStop(sampleFrame); + holdFrames = 71; + trace("frame=" + scene.currentFrame); + fscommand("captureImage", "frame0" + sampleFrame); + if (sampleFrame == scene.totalFrames) { + removeEventListener(Event.ENTER_FRAME, onFrame); + trace("DONE"); + } + sampleFrame++; + } + } +} diff --git a/tests/tests/swfs/visual/cache_as_bitmap/timeline_mask_cache_bounds/frame01.expected.png b/tests/tests/swfs/visual/cache_as_bitmap/timeline_mask_cache_bounds/frame01.expected.png new file mode 100644 index 0000000000000000000000000000000000000000..143db719121c7bae45c563cdc958478b5a2fafb6 GIT binary patch literal 530 zcmeAS@N?(olHy`uVBq!ia0vp^3qY8I2}rW6{ZPfgzt(LNV-{01~)cz+eQBl16&AR7>zq5^P<-O;BXwtXxdtlM{ zn59qHVkj_nWZwDmvS7}FVdQ&MBb@0PP#vdH?_b literal 0 HcmV?d00001 diff --git a/tests/tests/swfs/visual/cache_as_bitmap/timeline_mask_cache_bounds/frame02.expected.png b/tests/tests/swfs/visual/cache_as_bitmap/timeline_mask_cache_bounds/frame02.expected.png new file mode 100644 index 0000000000000000000000000000000000000000..143db719121c7bae45c563cdc958478b5a2fafb6 GIT binary patch literal 530 zcmeAS@N?(olHy`uVBq!ia0vp^3qY8I2}rW6{ZPfgzt(LNV-{01~)cz+eQBl16&AR7>zq5^P<-O;BXwtXxdtlM{ zn59qHVkj_nWZwDmvS7}FVdQ&MBb@0PP#vdH?_b literal 0 HcmV?d00001 diff --git a/tests/tests/swfs/visual/cache_as_bitmap/timeline_mask_cache_bounds/frame03.expected.png b/tests/tests/swfs/visual/cache_as_bitmap/timeline_mask_cache_bounds/frame03.expected.png new file mode 100644 index 0000000000000000000000000000000000000000..143db719121c7bae45c563cdc958478b5a2fafb6 GIT binary patch literal 530 zcmeAS@N?(olHy`uVBq!ia0vp^3qY8I2}rW6{ZPfgzt(LNV-{01~)cz+eQBl16&AR7>zq5^P<-O;BXwtXxdtlM{ zn59qHVkj_nWZwDmvS7}FVdQ&MBb@0PP#vdH?_b literal 0 HcmV?d00001 diff --git a/tests/tests/swfs/visual/cache_as_bitmap/timeline_mask_cache_bounds/frame04.expected.png b/tests/tests/swfs/visual/cache_as_bitmap/timeline_mask_cache_bounds/frame04.expected.png new file mode 100644 index 0000000000000000000000000000000000000000..143db719121c7bae45c563cdc958478b5a2fafb6 GIT binary patch literal 530 zcmeAS@N?(olHy`uVBq!ia0vp^3qY8I2}rW6{ZPfgzt(LNV-{01~)cz+eQBl16&AR7>zq5^P<-O;BXwtXxdtlM{ zn59qHVkj_nWZwDmvS7}FVdQ&MBb@0PP#vdH?_b literal 0 HcmV?d00001 diff --git a/tests/tests/swfs/visual/cache_as_bitmap/timeline_mask_cache_bounds/output.txt b/tests/tests/swfs/visual/cache_as_bitmap/timeline_mask_cache_bounds/output.txt new file mode 100644 index 0000000000000..e6992cea22223 --- /dev/null +++ b/tests/tests/swfs/visual/cache_as_bitmap/timeline_mask_cache_bounds/output.txt @@ -0,0 +1,6 @@ +Timeline mask cache bounds +frame=1 +frame=2 +frame=3 +frame=4 +DONE diff --git a/tests/tests/swfs/visual/cache_as_bitmap/timeline_mask_cache_bounds/test.swf b/tests/tests/swfs/visual/cache_as_bitmap/timeline_mask_cache_bounds/test.swf new file mode 100644 index 0000000000000000000000000000000000000000..07265ff85fdb2f795f69e50d33c55151d0638e0b GIT binary patch literal 2258 zcmbVNO>Eo96&?;Ljr9{-vgO~z4ikIh{8%O}J3n$9MOw>rjCJg-QHo;7ZKHiD3aW)VtO5t`vpJr8U2y@@|_2yF$1xp`Dq#20PH4L3o0v}`fv zZ%R_H*IVtauX;gCS}T{!l3bEXr6M4T;Y*ikFN$usxLk=H)M=;(w$E(O6(fh*iPvF| zmY2`G8u}ZjekX8ZmxeA;hqkH9LTPPv4ICNzrs)N3ja4+?cWhmY+(|Erq2=k%ds>$k zO-Bo@E$IRnahS~xvIn#FAXPH%vEDZb?z)zj6|18aUhv8qIZP4-Sj(*BXsyhevhPAA=5f>#OJf z!f&B%e0qBNjWiFYBn%<<{F8O)5`?~g^GCnOelV_t%c8v0qxqfS1fImH_8%& z2;tcr_RLV~+F?g?Bt1IfrWQ6&Y}VF%iP>%H*e-2GE}BCtG@fgO47L6=nX6N8|=cuV1)t>GU&s74g zO;b^(QZyxEP$JZUopC$uZOe9yfV!!t9u#NWvHf(5vRGSV2^MHNojX1&ff$uQj7uO6 zOOUoa$A}|@nNVx{4vmFO%VS>6H5$zGlV+5_qpaQuAPgI(V}`odZfmY_mU;LRw$sk) zn$J1`-D^W3hdepMJf=Cr5EB7ydtLfg0fhSD!A>FGo*&p<=+VuyJqumWHl~}+me*un z)1ap9+R(kj{dHkr?0~e|BpRvl<)HErTZkoP2s8JRDS9@yt_*T3xrP) zOb8w!e2U;S!5PA53BE+|D8XYy$PqkFxCz2d5j;)!8G>gCo+I29!p#%BK(I&>*9d-x z;2Q+rBDhE}NAMaEN`zl0{08Cg68@fm5Qf`WK-}f*%~z9=L~e6;R$#2ckYLF7g$J7t zAC=2nmB-wjDrjold_I*#oG?~JdAQq?Rdj{pIj#WzG0)-A8p0gB44|8@bBGrbNda+O zD$V!h-B_K@?ERe|jP+$0duWhTIg?YdiA`P;2KiV@mN@jhG{5N=pw4YDUeP zS@Tlg991&-)?gAGVnIk}KIOpUbYK1(H;JYPGktSREZjzDFsJ6s+!884K7-4|t4*Sy@~G;N+~>=;b+YQF9mK=6K`JMkKnK@l&ivX9Y4tk_7X>{75ewb7^fXx1BLB!|>$s`8m4A`pZ!(;;V xf2@q3FaPjO;e7e~@BX6-px1d7<_O25nfJc