Commit Graph

6277 Commits

Author SHA1 Message Date
Nathan Adams aaf9ecfa32 core: Add AVM1 values to debug UI 2023-06-21 18:27:12 +02:00
Nathan Adams afdd617d29 avm1: Add include_hidden: bool to get_keys() 2023-06-21 18:27:12 +02:00
Nathan Adams 310b03b570 core: Add searching to DO debug children list 2023-06-21 18:27:12 +02:00
Nathan Adams c5a1ca0e57 core: Show invalid bounds + selfbounds/scrollrect on DO debug info 2023-06-21 18:27:12 +02:00
Nathan Adams c8a41e327a core: Add character info to DO debug window 2023-06-21 18:27:12 +02:00
Nathan Adams b24cc60a5d core: Add swf info to debug menu 2023-06-21 18:27:12 +02:00
Nathan Adams cb2349e33a core: Store character name<->id map, not name<->character, so we can query id for name 2023-06-21 18:27:12 +02:00
Adrian Wielgosik b3c40ecda1 avm2: Optimize coerce_to_primitive for boxed primitives 2023-06-21 00:20:03 +02:00
Crowdin Bot 67a5a2923f chore: Update translations from Crowdin 2023-06-20 23:52:03 +02:00
Nathan Adams 6b76af2d40 core: Fix avm2button bounding box 2023-06-20 23:22:53 +02:00
Toad06 18fb5064d3 avm1: Correct `matrix::object_to_matrix_or_default` 2023-06-19 21:09:06 +03:00
relrelb a8f9033091 avm1: Make `DisplayPropertyMap` immutable 2023-06-18 07:50:10 +03:00
Toad06 22ae6bfec3 avm1: Correct `WaitForFrame` and `WaitForFrame2` actions 2023-06-17 19:23:18 -05:00
Lord-McSweeney b02d8900c5 avm2: Remove or validate some uses of coerce_to_object 2023-06-17 22:40:14 +02:00
Adrian Wielgosik 6ccb6e7fdd Revert "avm2: Throw TypeError when 'astype' receives a null/undefined class"
This reverts commit ce0ba7795c.
2023-06-17 22:40:14 +02:00
Crowdin Bot ca549e482c chore: Update translations from Crowdin 2023-06-17 19:25:33 +02:00
renovate[bot] 7a21756ddb chore(deps): lock file maintenance rust dependencies 2023-06-17 11:00:52 -05:00
Nathan Adams 6208c50273 core: Simplify TDisplayObject::swf_version(), we don't need to iterate the heirarchy 2023-06-17 10:37:13 +02:00
Aaron Hill 69fce3f7f8
wpgu: Initial implementation of PixelBender shader execution (#11441)
* wpgu: Initial implementation of PixelBender shader execution

The implementation is split across four crates:
* `ruffle_render` now holds the main PixelBender bytecode parsing
   implementation (previously, this was in `ruffle_core`).
* `ruffle_core` holds some helper functions for converting between
   AVM2 `Value`s and the PixelBender vector types.
* `naga-pixelbender` (newly created) constructs a Naga `Module`
  from parsed PixelBender bytecode
* `ruffle_render_wgpu` sets up the render pipeline for the shader
  constructed by `naga-pixelbender`, and actually executes the shader.

The Actionscript-side shader parameters are passed in through uniforms.
This allows us to cache the compiled `naga::Module` and associated
wgpu types inside `ShaderData`, when it's first created. Each invocation
of a `ShaderJob` only needs to create a bind group and render pass.

Limitations:

* Only a few of the PixelBender opcodes are implemented - however, this is
enough to get Stemlands cannon rotation working, as well as a cool
"donut" shader that I found and included as a test.
* PixelBender matrix types are not supported.
* Only BitmapData is supported as an input/output type - Flash Player
  also supports using Vector and ByteArray
* ShaderJob execution is always synchronous.

* Adjust comments

* Address review comments
2023-06-15 22:50:24 +00:00
Lord-McSweeney b998fc0197 avm2: Minimal stub of ShaderFilter 2023-06-15 16:42:12 -05:00
renovate[bot] fc933f485f fix(deps): update wasm-bindgen 2023-06-15 20:50:04 +02:00
Aaron Hill f257979b86 avm2: Use a separate domain for playerglobals
We create a separate child domain, which is accessible
from the Stage and the root movieclip.

This prevents ActionScript from loading classes into the
special playerglobals domain (Domain.parentDomain is modified
to return null instead of the playerglobals domain when applicable),
so the native method lookup logic will never run for user code.
2023-06-15 12:57:39 -05:00
Aaron Hill ad97322807 avm2: Implement ErrorObject.display without using Activation
This lets us print the full error message and stack stacke
in contexts where an Activation is not available, including
the `Debug` impl.

The 'name' and 'error' fields are accessed using hardcodd slot
ids. This is pretty hacky, but will work until we have better
handling of slot properties.
2023-06-15 09:31:36 -05:00
Aaron Hill 87850abd19 avm2: Improve support for deleting XML attributes and children
We now support deleting named children, as well as attributes.
Additionally, I've fixed our handling of `XML.parent()` - we now
properly set the parent when a child is created, and clear the parent
when `delete` is used.
2023-06-15 09:02:09 -05:00
Lord-McSweeney b4b726d7ab avm2: nit: Add error number in error message for BitmapData.drawWithQuality 2023-06-14 20:32:06 -05:00
Aaron Hill cd2c7f6f2f tests: Enable tracing_subscriber in tests
Previously, we weren't displaying any Ruffle logs when running tests.
2023-06-14 17:15:31 -05:00
AllinolCP e4d86ec9e7
core: implement screen resolution for capabilities (#11156) 2023-06-14 20:49:13 +00:00
Lord-McSweeney f649344f64 avm2: nit: Fix warning message in Avm2::peek 2023-06-14 19:16:08 +02:00
Lord-McSweeney 6006aa82c2 avm2+tests: Support primitives besides null in MovieClip.addFrameScript; add test 2023-06-14 18:16:39 +02:00
nosamu 202fe2f1bb core: Add options to set and force the stage alignment 2023-06-14 16:04:14 +02:00
Nathan Adams 0b86c02c5c desktop: Fix interaction between egui and ruffle cursors 2023-06-14 13:43:17 +02:00
Lord-McSweeney f5528aab75 avm2+tests: Implement Object.length and Object.init; add test for Object.length 2023-06-14 12:37:00 +02:00
Lord-McSweeney 10a8acb166 avm2: Stub NetConnection.addHeader 2023-06-13 20:51:08 -05:00
nosamu 60d3788466 avm2: Improve PerspectiveProjection stub 2023-06-13 19:31:18 -05:00
Adrian Wielgosik 128416cccd avm2: Support Array(...) without new 2023-06-14 00:34:13 +02:00
Aaron Hill 40318f905e avm2: Implement call handler for XMLList
This delegates to the XMLList constructor, just as
the XML call handler delegates to the XML constructor.
2023-06-13 17:20:11 -05:00
nosamu 61f1cf88a5 avm2: Throw AVM error in Array constructor 2023-06-13 23:54:13 +02:00
Mike Welsh c4e4eba63f avm2: Implement BitmapData.setVector 2023-06-12 18:34:51 -05:00
Aaron Hill a006e96a44 avm2: Set named field in parent to null when child is removed
If a child named 'foo' is removed by the timeline (without
having been previous added/removed from the timeline by ActionScript),
then the 'foo' field in the parent will be set to null. This occurs
even if the 'foo' field in the parent is not currently set to
the child 'foo' (e.g. 'this.foo = someOtherObject' was executed by
ActionScript).
2023-06-12 17:33:02 -05:00
Moulins d04fc61bb5 core: slightly simplify string interner by using new hashbrown APIs
- we can now get a `&RawTable` from a `&HashSet`, meaning we can store a
`HashSet` directly in the interner;
- `RawTable::iter_hash` now allows the removal of already-yielded
elements during iteration, which simplifies `WeakSet::entry`
2023-06-12 22:58:20 +02:00
relrelb 1dc28d898e avm1: Migrate `Transform` to `NativeObject` 2023-06-12 20:16:45 +03:00
Aaron Hill 2dfc0bac5b core: Log url when movie fetch fails 2023-06-12 10:55:13 -05:00
Crowdin Bot 834297f110 chore: Update translations from Crowdin 2023-06-12 12:28:05 +02:00
Aaron Hill ce0ba7795c avm2: Throw TypeError when 'astype' receives a null/undefined class 2023-06-12 02:31:03 -05:00
Aaron Hill 7e56c20973 avm2: Implement KeyboardEvent.updateAfterEvent 2023-06-12 01:44:46 -05:00
Aaron Hill 6b808a9a9d avm2: Stub Matrix3D-related methods on Transform
This allows verification to succeed on classes that override these
methods.
2023-06-12 01:17:39 -05:00
Lord-McSweeney b7088695fe avm2: Stub undocumented TextField.insertXMLText 2023-06-11 11:17:21 -05:00
relrelb 226a2be2bd core: Fix drag constraint with `lockCenter` set to `false`
Previously `last_mouse_position` was updated irrespectively of
whether the dragged object was inside or outside the constraint
box. Change it follow mouse deltas, after clamping is performed.

Fixes #11254.
2023-06-11 07:34:14 +03:00
Lord-McSweeney dced6445ee avm2: Stub flash.net.getClassByAlias and improve flash.net.registerClassAlias stub 2023-06-10 16:09:57 -05:00
Lord-McSweeney 4d8feeab2e avm2+tests: Fix String.substr with negative second value, add tests 2023-06-10 15:48:45 -05:00
Aaron Hill cfb23d1f97 avm2: Implement AMF serialization of XML objects 2023-06-10 12:13:07 -05:00
relrelb dcb6bbe50b avm1: Migrate `GradientGlowFilter` to `NativeObject` 2023-06-10 12:46:22 +03:00
Nathan Adams 75979b561a avm1: Rename try_resolve_level -> get_level, resolve_level -> get_or_create_level 2023-06-10 10:37:15 +02:00
Nathan Adams 38a3f67000 avm1: Don't create _levelN for unloadMovieNum(N) 2023-06-10 10:37:15 +02:00
AllinolCP 44ff49aa53
core: Fix status code implementation for AVM1 and implement HTTPStatusEvent.HTTP_STATUS for avm2 (#11360) 2023-06-10 03:06:26 +00:00
renovate[bot] a621472336 chore(deps): lock file maintenance rust dependencies 2023-06-09 20:17:25 +03:00
Aaron Hill a387476de7 core: Unify loader event handler and AVM2 data into MovieLoaderVMData
`AVM2Data` was always provided with
`MovieLoaderEventHandler::Avm2LoaderInfo`, so we can unify
them into a single enum.
2023-06-09 11:47:11 -05:00
Toad06 2894f01d50 avm1: Implement `MovieClip.lineGradientStyle` 2023-06-09 17:36:34 +02:00
Toad06 181aac46b0 avm1: Don't fail if base clip is invalid in `GetProperty`/`SetProperty` 2023-06-09 16:59:27 +02:00
Nathan Adams 137986c384 core: Add PlayerBuilder::with_external_interface 2023-06-09 13:03:46 +02:00
Aaron Hill 59b219cda6 avm2: Run 'nested goto frame' for entire Stage and orphans
When we run a 'goto', a weird "nested frame" gets triggered.
Previously, we were only calling `construct_frame` on the target
MovieClip as part of this "nested frame". However, Flash Player
seems to treat this (in some ways) like a normal frame - *all*
objects on the Stage (and orphans) have `construct_frame` called.

In particular, `gotoAndStop`/`gotoAndPlay` is called during
an "enterFrame" event handler, then unrelated objects on the Stage
will have their children constructed during the execution of
`gotoAndStop`/`gotoAndPlay`. The same logic holds for frame scripts.

This fixes a bug in Steamlands, which relies on children on the main
timeline being constructed immediately following a call to `gotoAndStop`
on an orphan (originally triggered from an "enterFrame" handler).
2023-06-08 22:17:27 -05:00
Lord-McSweeney 455b96710e avm2: Fix MouseCursorData.frameRate stubs 2023-06-07 22:39:41 -05:00
Aaron Hill 9d8ac81b58 avm2: Use WeakObject in `broadcast_list`
This ensures that we don't keep the underlying listener
object alive after all event listeners (including broadcast
listeners) have been unregistered.
2023-06-07 21:15:26 -05:00
EmperorBale 4815ca5e90 avm2: Implement WeakObject
This also adds a new required function to TObject called `downgrade`, that will convert the `Object` to a `WeakObject`.
2023-06-07 17:51:26 -07:00
EmperorBale 5e20b079d9 avm2: Add weak variant of every object 2023-06-07 17:51:26 -07:00
Toad06 8ce8b775a7 avm1: Fix coercion order in SWFv4 actions 2023-06-08 01:33:08 +02:00
Moulins 3f1bcecfbb avm1: Add version gate for `{MovieClip, Button}.blendMode`
Theses properties are only available on SWF >= 8
2023-06-08 01:18:06 +02:00
Moulins b71b8f9de5 avm1: fix coercions for the `blendMode` property of display objects
`mc.blendMode = 3` is a valid way of modifying the blend mode of a DO;
on the other hand, booleans and objects *shouldn't* be coerced.
2023-06-08 01:18:06 +02:00
Crowdin Bot 93f5869005 chore: Update translations from Crowdin 2023-06-08 00:57:49 +02:00
Aaron Hill 0e0399963e avm2: Throw exception when ExternalInterface is not available 2023-06-07 17:24:25 -05:00
Aaron Hill b240f05390 avm2: Stub Graphics.beginShaderFill 2023-06-07 17:06:33 -05:00
Aaron Hill 1efcd584c2 avm2: Wrap orphan list in an `Rc` for correct iteration behavior
When we iterate over the orphan list to run frame lifecyle methods,
the orphan list may be modified (e.g. an event listener creates a new
orphan object). To ensure that we iterate over all of the orphans
originally present, this commit wraps the orphan list in an `Rc`
(just like we do for the render list). Modifications to the list use
`Rc::make_mut`, and iteration operates on a clone of the `Rc`.
2023-06-07 16:23:06 -05:00
Aaron Hill d2999a2572 core: Fix parsing of PixelBender sampleNearest and sampleLinear
This fixes a panic on startup for Sniper Team
2023-06-07 15:59:31 -05:00
Aaron Hill ccb5027de0 avm2: Preserve MultinameFlags::ATTRIBUTE when filling a lazy Multiname 2023-06-07 14:08:10 -05:00
Aaron Hill 638471fc2d avm2: Stub flash.printing.PrintJob 2023-06-07 03:47:29 -05:00
Aaron Hill 5fd7dc2c9b core: Correctly handle '.' and '<' in obfuscated QNames
QName can contain characters like '.' and '<' as part of the
package or class name (though this requires editing the SWF
or using a nonstandard compiler). This broke our attempt to parse
generic type paramters by looking for '.<'

Instead, our 'Vector' special casing now operates on the unparsed
'AVMString' name, instead of attempting to construct a 'QName'.
This means that we don't need to handle generic paramters at
all for obfuscated names (which will never start with '__AS3__'
or 'Vector.<')

This fixes a bug in Red Ball 4v3, which has an obfuscated class
'!D.<H'
2023-06-06 18:12:58 -05:00
Aaron Hill 0d5ead4c02 core: Ignore newer PlaceObject tag in same frame with duplicate depth
If we have two PlaceObject tags in the same frame with the same depth,
only the first one actually places an object. The second one is ignored
(Flash Player logs a warning).
2023-06-06 14:50:07 -05:00
Aaron Hill d037038170 avm2: Make `caller_domain` an `Option`, and call `expect` when actually needed
There are only a few places where we actually need to use the
`caller_domain`, so we don't actually need it available for most native
method calls. This means that `Activation::from_nothing` can be used
in the vast majority of cases without causing a panic later on.
2023-06-06 21:05:19 +02:00
Nathan Adams 10134467c9 avm2: Don't error on removeChildren() for empty containers - fixes #11382 2023-06-05 18:30:08 -05:00
renovate[bot] f1fe998869 chore(deps): lock file maintenance rust dependencies 2023-06-04 22:53:18 -05:00
relrelb 9c8e212641 avm1: Migrate `GradientBevelFilter` to `NativeObject` 2023-06-03 21:33:12 +03:00
Nathan Adams 136417c58c core: Make debug windows scrollable 2023-06-03 09:11:06 +02:00
Nathan Adams 85f6fd3889 core: Add movie clip info to debug menu 2023-06-03 09:11:06 +02:00
Nathan Adams a26a64d88f core: Format Rectangle to 2 decimal places 2023-06-03 09:11:06 +02:00
Nathan Adams c9d0a08863 core: Move debug children list's button into header 2023-06-03 09:11:06 +02:00
Nathan Adams 9f384df27b core: Don't have dynamic_root in UpdateContext unless egui feature is enabled 2023-06-03 09:11:06 +02:00
Nathan Adams a641c564de core: Show debug rect on hovering stuff 2023-06-03 09:11:06 +02:00
Nathan Adams 16ce9aa437 core: Add debug rects to debugger 2023-06-03 09:11:06 +02:00
Nathan Adams a6b8883acd core: Add mask/masker/clip info to debug UI 2023-06-03 09:11:06 +02:00
Nathan Adams 59eceb8b7a core: Add AVM1 path to debug UI 2023-06-03 09:11:06 +02:00
Nathan Adams 77bd1cd1c8 core: Add depth and color transform to debug ui 2023-06-03 09:11:06 +02:00
Nathan Adams e12e2a2e54 core: Initial Debug UI 2023-06-03 09:11:06 +02:00
Nathan Adams eb70a4f361 core: Update gc_arena to 63dab12871321e0e5ada10ff1f1de8f4cf1764f9 2023-06-03 09:11:06 +02:00
Aaron Hill 2cd518013c
wgpu: Don't skip alpha/erase blend modes for BitmapData.draw (#11323)
We can skip these when we're drawing to a fresh buffer, but not when we're blending over an existing BitmapData texture.
2023-06-02 21:16:05 +00:00
relrelb e5da68c1df avm1: Migrate `ConvolutionFilter` to `NativeObject` 2023-06-02 23:39:02 +03:00
Aaron Hill 21429cc205 avm2: Add PixelBender bytecode parsing to ShaderData
We now parse PixelBender bytecode, and populate the parameters
from the bytecode on `ShaderData`. This is enough to progress
Steamlands, which needs to access dynamically set properties
on `ShaderData`

Bytecode execution is not implemented yet.
2023-06-02 15:23:32 -05:00
Aaron Hill 999e2f5b71 wgpu: Implement Context3D.setScissorRectangle 2023-06-02 14:56:14 -05:00
relrelb abb0e33431 chore: Use Rust's `OnceCell`/`OnceLock`
They were stabilized in Rust 1.70.0, which was released yesterday.
This removes the `once_cell` dependency.
2023-06-02 22:21:38 +03:00
Lord-McSweeney 5fdbfe2fd4 avm2: Partial implementation of Loader.unload 2023-05-31 21:03:18 -05:00
Aaron Hill 8b257ef6da avm2: Always run `construct_frame` in `initialize_for_allocator`
When we create a DisplayObject from ActionScript, we should always
run `construct_frame` on it, regardless of what frame phase we
are currently in.

This fixes a regression in Fancy Pants World 4 Part 1, where entering
the first door produced an error.
2023-05-31 17:33:25 -05:00
Crowdin Bot 6dc3743f4b chore: Update translations from Crowdin 2023-05-30 23:21:28 +02:00
relrelb c952106ee3 avm1: Correct `ActionCloneSprite` and `duplicateMovieClip()`
* `ActionCloneSprite` coerces `depth` before `target`.
* `duplicateMovieClip()` coerces `name` before `depth`.
* `duplicateMovieClip()` returns `undefined` on SWF<6.
2023-05-30 23:10:36 +03:00
Nathan Adams 0c10e2a7b7 desktop: Add advanced open dialog 2023-05-29 22:12:56 +02:00
TÖRÖK Attila b8fc64df6f core/avm1: Accept Value as smaller than 16 bytes on 32 bit platforms. 2023-05-29 07:58:53 -05:00
renovate[bot] 847dece735 chore(deps): lock file maintenance rust dependencies 2023-05-28 23:54:33 -05:00
Aaron Hill 0955ab40e6 avm2: Fix rounding behavior in BitmapData rectangle operations
Flash Player performs `x + width` and `y + height` as floating
point operations before `round_to_even`. This affects the extent
covered by a `Rectangle` in various BitmapData methods, as the sum
of two values might be large enough to be rounded up to a larger
value (when rounding `x` and `width` individually would have
produced a smaller overall extent).
2023-05-28 18:46:55 -05:00
Aaron Hill 2ae15b05e8 core: Store Color as an u32 instead of a i32
This is a packed ARGB value, so it doesn't make sense for it to be
signed.
2023-05-28 16:52:09 -05:00
Aaron Hill 3f93abffd5 avm2: Allow replacing and deleting XML attributes 2023-05-28 15:52:57 -05:00
Aaron Hill 14c6d1d959 avm2: Implement URLRequest.requestHeaders
These are directly set on the underlying navigator's HTTP
request type, and get printed out in our test navigator backend.

No validation of the header names is performed - on web, this will be
enforced by the browser.
2023-05-28 12:07:37 -05:00
relrelb ee30646745 avm1: Migrate `DisplacementMapFilter` to `NativeObject` 2023-05-27 23:08:42 +03:00
Lord-McSweeney 420643b045 avm2: Stub Worker 2023-05-27 00:58:34 -05:00
Nathan Adams aeb089ac0f avm2: Move DisplayObject assignment into an initializer 2023-05-26 22:06:20 -05:00
Aaron Hill cf4ca543bd core: Use clone-on-write behavior for render list iteration
When we iterate over a render list (in order to call
`enter_frame`, `construct_frame, etc.) we need to be sure
that we iterate over all of the original `DisplayObjects`
in the list, even if the list is modified during iteration
(e.g. some ActionScript code calls `parent.addChildAt`).

Previously, `RenderIter` would repeatedly call `child_by_index`
on the original `DisplayObjectContainer`, up to the original
child count. If new DisplayObjects were inserted into the list
during iteration, we could miss some of the original DisplayObjects
in the list (as they are now at a greater position in the list).

To solve this, we now store the render list as an `Rc<Vec>`,
and use `Rc::make_mut` to modify it. See the comments
for more details.
2023-05-26 21:42:06 -05:00
Crowdin Bot e98230c988 chore: Update translations from Crowdin 2023-05-27 00:34:44 +02:00
Aaron Hill 9fad8ddd9d core: Fix nightly clippy lints 2023-05-26 17:06:28 -05:00
Aaron Hill e98ff6a6d7 avm2: Add legacy handling for configureBackBuffer with SWF version < 30
With SWF version < 30, Context3D.configureBackBuffer throws
an error with a less informative message when the width/height
are out of range. Additionally, it seems to special case
the case width=0, height=0, antiAlias=0. enableDepthAndStencil=false,
and does *not* throw an error. This is relied on by Sniper Team.
2023-05-24 18:15:30 -05:00
Adrian Wielgosik a1797a351d avm2: Avoid a function call on every push() 2023-05-24 23:33:09 +02:00
Aaron Hill 9a1a21ef3a avm2: Implement Stage3D.visible 2023-05-24 14:20:40 -05:00
MartySVK 3be933d7c2
avm2: Stub ContextMenu.builtInItems setter (#11187) 2023-05-24 01:50:03 +00:00
iwannabethedev 1e0714aaa1 core: Fix serialization of arrays with dynamic properties. 2023-05-23 19:46:24 -05:00
iwannabethedev 83520d0daf avm2: Minor refactoring of duplicated code. 2023-05-24 02:30:52 +02:00
Aaron Hill 358beabf5a avm2: Add Matrix3D.[recompose,decompose,copyColumnTo,invert,determinant]
The Flash Player 'Matrix3D.recompose' method throws exceptions under
certain circumstances with the "quaternion" orientation style.
I haven't yet figured this out yet, so I've marked that case as a stub.

All of the implementations are based on the OpenFL code, with some
tweaks to match Flash Player's behavior.
2023-05-23 18:51:46 -05:00
Aaron Hill c53a903d35 avm2: Suppress events for selectable was_static TextFields
TextFields have a very unusual behavior - if they are selectable
and have `was_static`, they *block* the dispatch of mouse events when
they're targeted (not even the Stage will receive the event).
This only occurs when the TextField is actually targeted
(which requires mouseEnabled=true). With mouseEnabled=false,
the event will be dispatched with an ancestor as the target,
following the usual logic.

Also, TextFields now properly propagate mouse picks to
their parent if mouseEnabled=false. Previously, setting
mouseEnabled=false for a TextField made all mouse picks
cause a miss on it. This was the cause of the Turbo Kids
regression.

Fixes #10245
2023-05-23 17:57:06 -05:00
Nathan Adams afa78ebdfe avm1: Correctly send onUnload events for movies unloaded with GetURL2 - fixes #2422 2023-05-22 23:41:41 +02:00
Aaron Hill ace87861ce avm2: Make ByteArray.readMultiByte cut string off at null byte
We already had this behavior in `readUTF` and `readUTFBytes`,
but we need it in `readMultiByte` as well.
2023-05-22 16:01:50 -05:00
Aaron Hill b94f9f3043 avm2: Coerce function return value to declared return type
This can actually affect runtime behavior - if the return type is
declared as 'int', then an instance of a custom class will get
coerced to 0 when returned by the function.
'Plants vs Zombies Demo' relies on this - it has a function which
incorrectly returns an object instead of an array index, but the
value gets silently coerced to 0 under Flash Player.
2023-05-22 13:47:32 -05:00
renovate[bot] 5d2477fe98 chore(deps): lock file maintenance rust dependencies 2023-05-22 19:12:08 +03:00
nosamu bb15c90d82 avm2: Implement XML.hasSimpleContent and hasComplexContent 2023-05-22 06:17:37 -05:00
Aaron Hill 6ac4e5256d avm2: Check parent domain in export_class
The `export_class` function mirrors `export_definition`, and needs
to avoid exporting something already defined in a parent domain.
2023-05-21 17:37:54 -05:00
relrelb c230dcf0f8 avm1: Migrate `BitmapData` to `NativeObject` 2023-05-21 21:02:14 +03:00
nosamu 7dfc36c6fc web: Support pasting from clipboard 2023-05-21 15:26:42 +02:00
nosamu ee956927b7 core: Fix TextField.maxChars handling and address other reviews 2023-05-21 15:26:42 +02:00
nosamu 4e579b7e68 core: Move left/right arrow handling to `text_control_input` 2023-05-21 15:26:42 +02:00
nosamu 0dbb4c46e4 core: Move `Delete` and `Backspace` handling to `text_control_input()`
Co-authored-by: jmckiern <jmckiern@tcd.ie>
2023-05-21 15:26:42 +02:00
nosamu fab72ac01c core: Implement handling of text control input
Co-authored-by: jmckiern <jmckiern@tcd.ie>
2023-05-21 15:26:42 +02:00
jmckiern 67d74047a9 core: Add clipboard_content getter 2023-05-21 15:26:42 +02:00
Aaron Hill 95b0b29310 avm2: Initial implementation of URLStream
This is based on URLLoader, and doesn't actualy 'stream' data -
it all becomes available once the request finishes. However, this
is good enough to get Sniper Team working.
2023-05-21 15:00:08 +02:00
TÖRÖK Attila 65117499fd chore: Bump regress and toml dependencies 2023-05-21 14:42:01 +02:00
Aaron Hill 54cf9065fb core: Don't create a fake root clip when instantiating Stage
AVM2 can handle a missing root movie, and AVM1 doesn't seem
to rely on having a root movie during Stage initialization.
2023-05-21 08:11:11 +03:00
Lord-McSweeney 7c9b0378f6 nit: avm2: Fix stub message in Socket 2023-05-21 07:31:50 +03:00
iwannabethedev 7b12cb882f core: Fix error message in 'pixelDissolve()'. 2023-05-21 01:47:06 +02:00
iwannabethedev 0f30b378b0 core: Re-arrange internal implementation of 'pixelDissolve()'. 2023-05-21 01:47:06 +02:00
iwannabethedev deae231176 core: Clean up TODOs in 'pixelDissolve()'. 2023-05-21 01:47:06 +02:00
iwannabethedev 6f98d39c25 core: Implement 'pixelDissolve()' for AVM1. 2023-05-21 01:47:06 +02:00
iwannabethedev 40c40f278c core: 'pixelDissolve()' bug fix and clean-up. 2023-05-21 01:47:06 +02:00
iwannabethedev 1bd9f82496 core: Implements `BitmapData.pixelDissolve()` for AVM2.
The changes have automated tests for them.

The implementation has not been implemented or tested for AVM1 yet.
2023-05-21 01:47:06 +02:00
Aaron Hill ad77cb0209 core: Refactor Loader to properly load images
We now run all of the completion logic (including adding
the new DisplayObject as a child) in `Loader::movie_loader_complete`.
Previously, some of this logic was run from `Loader::preload_tick`,
which meant that loaded images did not have the logic run.

Also, `BitmapData` and `Bitmap` instances (with corresponding AVM2
objects) are now properly constructed for loaded images.
2023-05-20 18:35:10 -05:00
Toad06 b88e19ef6c avm1: Filter buttons that use a `keyPress` event 2023-05-21 01:13:26 +02:00
Aaron Hill 5d62ef90f2 wgpu: Use intermediate buffer for Context3DCommand::CopyBitmapToTexture
In a previous PR, I introduced an optimization that used
`copy_texture_to_texture` to copy directly from a BitmapData GPU
texture to a Stage3D GPU texture.

Unfortunately, this optimization is incorrect. A BitmapData GPU
texture can be modified at any time by normal AVM2 code - in
particular, in might be modified before we submit the encoded
`copy_texture_to_texture` command. This shows up in Sniper Team,
which re-uses BitmapData objects for multiple distinct textures.
The previous 'optimization' resulted in the wrong BitmapData contents
getting uploaded to a texture (since it was changed before the copy
command was submitted).
2023-05-20 17:38:26 -05:00
Aaron Hill 0864853d44 avm2: Allow passing `null` to `Context3D.setProgram`
This clears the vertex and fragment shader programs
(bringing the Context3D back to its initial state).
2023-05-20 16:23:03 -05:00
EmperorBale 53acdee979 avm2: Remove NOPMD comments 2023-05-20 13:59:12 -07:00
EmperorBale 78c8aa2a0d core: Remove linter code 2023-05-20 13:59:12 -07:00
Tom Schuster 2af58dc832 avm2: Support set on XMLList with a single child
XMLList with a single child should behave like an XML object.
2023-05-19 20:10:47 -05:00
Lord-McSweeney 0948bf7bbd avm2: Implement Capabilities.playerType and Capabilities.version (and mark the other Capabilities getters as stubs) 2023-05-19 16:54:46 -05:00
Aaron Hill 6025878aab avm2: Respect SKIP_INVISIBLE for DisplayObject
Previously, we allowed mouse picks of certain invisible
DisplayObjects, even when HitTestOptions::SKIP_INVISIBLE
was set.
2023-05-19 08:12:00 -05:00
Aaron Hill 5c68bceb7b avm2: Set 'bubbles' to 'false' for rollOut and rollOver events
This matches the Flash Player documentation. Since we were
manually traversing the displayobject hierarching when firing
the event, we ended up firing duplicate events to parents
because bubbling was enabled.
2023-05-18 19:01:55 -05:00
Aaron Hill 7004e98b23 avm2: Don't validate Context3DVertexBufferFormat when buffer is null
This matches Flash Player's behavior - some SWFS try to pass in 'null'
for both the buffer and format.
2023-05-18 15:14:29 -05:00
renovate[bot] f969bdce71 fix(deps): update wasm-bindgen 2023-05-17 06:44:50 +03:00
Aaron Hill 75569e1311 avm2: Throw error for invalid Stage3D back buffer size 2023-05-16 17:36:22 -05:00
Aaron Hill 12e815d383 core: Take 'self' instead of '&mut self' in `replace_with_movie` 2023-05-15 20:01:02 +03:00
renovate[bot] 5b26d1b2ee fix(deps): update wasm-bindgen 2023-05-15 10:00:49 +03:00
Lord-McSweeney b24fc7c07f avm2: Improve Shader stub 2023-05-15 09:40:43 +03:00
iwannabethedev d0f8061c85 core: documentation changes. 2023-05-15 00:51:54 +02:00
iwannabethedev 8c92cecb60 core: Add documentation to Color. 2023-05-15 00:51:54 +02:00
iwannabethedev 9de2abe8b8 core: Fix wrong color form used. 2023-05-15 00:51:54 +02:00
relrelb 4a26ceb14b render: Use `swf::Point<Twips>` in more places 2023-05-14 22:48:41 +03:00
relrelb 220f8cd1cf render: Use `swf::Point<Twips>` in `shape_hit_test()` 2023-05-14 22:48:41 +03:00
relrelb 598c8cde0e render: Use `swf::Point<Twips>` in `DrawCommand::CurveTo` 2023-05-14 22:48:41 +03:00
relrelb 544e445d2f render: Use `swf::Point<Twips>` in `DrawCommand::LineTo` 2023-05-14 22:48:41 +03:00
relrelb e5c7d70f3f render: Use `swf::Point<Twips>` in `DrawCommand::MoveTo` 2023-05-14 22:48:41 +03:00
Lord-McSweeney 3079ae30a5 avm2: Stub SharedObject.setProperty 2023-05-14 19:01:24 +03:00
Nathan Adams a9ba46594f chore: Updated translations from Crowdin 2023-05-14 13:31:32 +02:00
Lord-McSweeney 017a44084f avm2: nit: Provide error number (2025) in error message for validate_remove_operation 2023-05-13 21:30:47 +03:00
Aaron Hill 729d5a2c65 avm2: Don't overwrite existing entry in `export_class`
This makes the behavior consistent with `export_definition`
2023-05-13 11:15:54 +03:00
Aaron Hill 3c6820c6e1 avm2: Check length and copy vector in Matrix3D constructor 2023-05-13 11:00:31 +03:00
iwannabethedev 476ff4aeef core: Fix drawing on cpu with color transform.
Taken directly from this commit, credits to Dinnerbone:
9b76090e1f
2023-05-12 22:42:44 +02:00
Toad06 2e972b8f32 avm1: `button.useHandCursor` can hold any value 2023-05-12 01:13:28 +03:00
iwannabethedev 93450b28b0 avm2: Add 'static length' for most types. 2023-05-11 22:16:55 +02:00
relrelb 660acac427 swf: Use `PointDelta<Twips>` in `ShapeRecord` 2023-05-11 08:55:44 +03:00
relrelb b93a32af0f swf: Use `Point<Twips>` in `StyleChangeData::move_to`
No functionality change.
2023-05-11 08:55:44 +03:00
Aaron Hill e488cc9f7a wgpu: Allow unaligned writes to IndexBuffer3D
wgpu requires buffer copy sizes and offsets to be 4-byte aligned.
Unfortunately, ActionScript can perform 2-byte aligned uploads
into an IndexBuffer3D.

To support this, we now keep a copy of the IndexBuffer3D on the CPU.
When performing an upload to the buffer, we round the offset down
and the size up to the nearest 4-byte aligned value. The cpu buffer
is used to fill out the write with existing data, so that we don't
corrupt the contents of the GPU buffer.

To avoid introducing a new RefCell, I've changed IndexBuffer3D
to use a `Box` instead of an `Rc` to store the trait object.
This allows us to pass a mutable reference down to the backend.
2023-05-10 18:20:29 -05:00
Huw Pritchard b79b192a58 avm2: Implement PrintJobOptions 2023-05-09 20:51:44 -05:00
Nathan Adams fc96fdf1cc chore: Update translations from Crowdin 2023-05-10 00:29:13 +02:00
Nathan Adams fd5a7cdbc2 core: Rename text to core_text just to avoid confusion if used from another crate with its own text methods 2023-05-09 00:06:49 +02:00
Nathan Adams e6ea074a3f core: Made context menu items translatable 2023-05-09 00:06:49 +02:00
Nathan Adams 229c301e18 core: Add i18n module using Fluent 2023-05-09 00:06:49 +02:00
Aaron Hill 1908d85f65 avm2: Initialize `Object` instance vtable before other classes
Early class construction is tricky - `Object` defines properties
that need to get copied into subclass instance vtables, but `Class`
defines `prototype`, which needs to be copied into the *class* vtable
of `Object`.

To accomplish this, I've split out instance vtable initialization
into a separate `init_instance_vtable`. We call
`object_class.init_instance_vtable` before
`class_class.init_instance_vtable`, but do things in the opposite
order for `into_finished_class` (`class_class.into_finished_class` is
called before `object_class.into_finished_class`)
2023-05-07 07:46:30 -05:00
iwannabethedev 724df48186 avm2: Add AS 'length()' to XML. 2023-05-06 12:02:06 -05:00
Lord-McSweeney 4b9430c2cb avm2: Stub flash.system.fscommand 2023-05-06 09:52:30 +03:00
Toad06 8377fe0233 web: Support copying to clipboard 2023-05-05 21:58:41 +02:00
nosamu 0633b4cdfe core: Improve compatibility rule for Kongregate 2023-05-05 10:44:57 +03:00
friedkeenan bfe84c3685 Rename 'name_array' to 'name_vector'.
The '_array' suffix was from a previous iteration as I tried to figure out how to return a vector.
2023-05-04 19:51:04 -05:00
friedkeenan 24e0e0102c avm2: Implement ApplicationDomain::getQualifiedDefinitionNames 2023-05-04 19:51:04 -05:00
Tom Schuster f6c0685992 avm2: Allow setting XML methods as properties 2023-05-04 19:34:14 -05:00
Lord-McSweeney f78ce82f90
avm2: Socket should implement IDataOutput and IDataInput 2023-05-05 00:13:45 +03:00
friedkeenan c484d44226
avm2: Stub rest of Socket's methods 2023-05-04 17:03:52 +00:00
relrelb 891d1dce7e core: Don't duplicate `ButtonAction`s
Previously, a separate `ButtonAction` was stored for each
`ButtonActionCondition`. However, this can be eliminated using
`bitflags`.
2023-05-03 23:12:20 +03:00
Nathan Adams dc44c1c797 core: Use MutationContext instead of UpdateContext for copy_on_cpu 2023-05-03 21:15:48 +02:00
Nathan Adams 243d82770d core: Use copy_from_slice for whole-BMD-replacement 2023-05-03 21:15:48 +02:00
Nathan Adams 53c6927b6f core: Clarify comment when we can skip alpha premultiplication 2023-05-03 21:15:48 +02:00
Nathan Adams c5293bd981 core: Don't actually apply a filter if it's unsupported, just copy 2023-05-03 21:15:48 +02:00
Nathan Adams 5ff804f5c2 core: Add a method for BitmapData.draw() with color transform on cpu 2023-05-03 21:15:48 +02:00
Nathan Adams 7b20003c6a core: Treat copy_pixels_with_alpha_source as copy_pixels if alpha source is same as source 2023-05-03 21:15:48 +02:00
Nathan Adams fe3d8c10b1 core: Added an efficient copy method that does cpu or gpu copy depending on what's best situationally 2023-05-03 21:15:48 +02:00
Nathan Adams adabb81804 core: Introduce PixelRegion::clamp_with_intersection and made most operations with two overlapping regions use it 2023-05-03 21:15:48 +02:00
Lord-McSweeney d66d216917 avm2: Date related fixes
1. Date should have a call handler.
2. Date should have a static length property.
2023-05-03 20:04:59 +02:00
Aaron Kaluszka 472fe7068f avm2: Implement BitmapData.compare 2023-05-03 11:32:20 +02:00
Kornelius Rohrschneider fe56f8d212 core: Implement suggested changes in PR to documentation & code
- Documentation has been added, improved and clarified.
- The code of a string concatenation has been improved.
2023-05-02 17:13:42 +02:00
Kornelius Rohrschneider 27738a492e web: Implement suggested changes in PR to navigate_to_url handling
The suggested changes to the navigate_to_url handling in the feedback to
the pull request have been implemented.
Therefore, this commit consists of multiple smaller changes:

1. The allow_javascript_calls variable has been removed (as a CLI
argument and in the navigator). Javascript calls are now always denied
on desktop. This is because setting the argument was useless; no
javascript was executed in any case, at most, just a browser tab opened.
Therefore, it makes no sense to include this option.
2. The NavigateWebsiteHandlingMode default value has been provisionally
changed from Confirm to Allow. In the future (after a GUI toolkit has
been added), the default confirmation windows should include a "Save
this preference" checkbox.
3. The NetworkingRestrictionMode enum has been renamed to
NetworkingAccessMode since the previous naming was counter-intuitive.
4. The NavigateWebsiteHandlingMode enum (and variables related to it)
have been renamed to OpenURLMode to simplify the name.
5. The documentation has been improved.
2023-05-02 17:13:42 +02:00
Kornelius Rohrschneider 809a9f6907 web: Add and partially implement networking API restrictions
The networking API restrictions imposed by the allowNetworking parameter
& attribute have been added and partially implemented.

A new NetworkingRestrictionMode enum has been added to Ruffle (in Rust
and Typescript). It contains the values "All", "Internal" and "None" and
models the possible values of the allowNetworking parameter / attribute.
All means that all networking APIs are permitted in the SWF file,
Internal means that the SWF file may not call browser navigation or
browser interaction APIs and None means the same and that the SWF file
cannot use any SWF-to-SWF communication APIs either.
A respective allowNetworking variable has been added to the JS config.
Its default value is All.
Ruffle now recognises the allowNetworking parameter and attribute in the
SWF HTML object and parses it and sets the config variable
correspondingly if it's recognised.
Only if the variable is set to All, the external interface (responsible
for javascript calls in AS3) is created. Additionally, the variable is
given to the WebNavigatorBackend and saved in it. The navigator denies
all navigate_to_url calls if the variable hasn't been set to All.
Therefore, the API restrictions imposed by setting allowNetworking to
internal or none have been partially implemented.

Formatting has been improved.
2023-05-02 17:13:42 +02:00
Kornelius Rohrschneider 44ef22f646 core: Add navigate_to_url call configuration options
New configuration options (changing the navigate_to_url call handling)
have been added. The default behaviour has been changed as well.

A NavigateWebsiteHandlingMode enum has been added to Ruffle (in Rust and
Typescript). It contains the values "Allow", "Confirm" and "Deny" and
describes how navigate_to_url website calls should be handled. Allow
means that all website calls are allowed, Confirm means that a
confirmation window opens with each website call and Deny means that all
website calls are denied.
A respective navigate_website_handling_mode variable has been added to
the desktop CLI and to the JS config. The default value is "Confirm" in
each. The variable is given to the navigator (ExternalNavigatorBackend
or WebNavigatorBackend, depending on the platform) and is saved in it.
On each navigate_to_url website call, the respective navigator is now
checking navigate_website_handling_mode and acts correspondingly (allows
it, opens a confirmation window or denies it).
This changes the default behaviour of Ruffle from allowing all website
calls to opening a confirmation window with each website call.
On Safari, the confirm window can cause the background music to stop,
but this seems to be an issue with Safari.
Closes #838.

Additionally, an allow_javascript_calls variable (which defaults to
false) has been added to the desktop CLI. The variable is given to the
desktop navigator and is saved in it.
If a navigate_to_url javascript call is executed on desktop, the
navigator is now checking allow_javascript_calls and acts
correspondingly (allows it or denies it).
This changes the default behaviour of Ruffle on desktop to not allowing
javascript calls.
Closes #9316.
2023-05-02 17:13:42 +02:00
Toad06 ee7403952a avm1: Allow `button.enabled` to hold any value 2023-04-30 21:08:27 +03:00
Toad06 86c27078d3 avm1: `button.enabled = undefined` doesn't disable the button 2023-04-30 21:08:27 +03:00
Lord-McSweeney 822c845d83 avm2: Stub Socket.connected 2023-04-30 20:16:24 +03:00
Tom Schuster 791081051f avm2: Alternative implementation of XML hasOwnProperty @attribute 2023-04-29 16:34:10 -05:00
Lord-McSweeney d1e4cccabb avm2: Stub flash.net.Socket 2023-04-29 22:18:06 +03:00
relrelb 5eb14572ac core: Fix moving objects while being dragged
`startDrag()` used to capture the offset between the mouse cursor
and dragged object. This is buggy when the dragged object position
is changed *while* being dragged, as the original offset no longer
holds.

Change the dragging mechanism to be based purely on mouse deltas,
eliminating said offset completely.

Fixes #10775.
2023-04-28 11:55:33 +03:00
relrelb e5808b14a8 core: Use `Twips` in `DisplayObject::{,set_}{x,y}`
Instead of `f64`.
2023-04-28 11:55:33 +03:00
relrelb 60ffe07ae7 chore: Use `swf::Point` in many places
Convert nearly all instances of `(Twips, Twips)` (maybe besides in
`shape_utils.rs`) to `swf::Point<Twips>`.
2023-04-27 22:14:03 +03:00
Lord-McSweeney ba5a456d11 avm2: Implement XMLDocument.createElement 2023-04-27 13:16:00 -05:00
Moulins e5caf0fda8 core: use unified repr for non-static `AvmString`s, interned and not
This shrinks the size of `AvmString` back from 3 to 2 usizes.
2023-04-27 00:17:31 +02:00
Moulins 2868333c05 avm2: require AvmAtom in Namespaces 2023-04-27 00:17:31 +02:00
Moulins 68fc567f7f core: add `AvmAtom` to represent interned strings
Makes `AvmString`s grow from 2 to 3 usizes, but this
will be reverted later.
2023-04-27 00:17:31 +02:00
Moulins 011cdd96ba core: don't keep strong references to interned strings in the interner.
This is done by implementing a simple WeakSet which clears its stale
entries during tracing.
2023-04-27 00:17:31 +02:00
Moulins 889a9bd009 avm2: Intern strings in constant pools
Strings belonging to multinames are interned too, but
the multinames themselves aren't.
2023-04-27 00:17:31 +02:00
Moulins 09c729074c avm1: Intern strings in constant pools 2023-04-27 00:17:31 +02:00
Moulins 27521e145c avm1: Thread GcContext through all globals initialization 2023-04-27 00:17:31 +02:00
Moulins c40fd2b17a core: Add (very) simple AvmString interner
Pass it to AVM1/2 initilization functions *via* the new `GcContext` type.
2023-04-27 00:17:31 +02:00
Moulins cfde53cde2 core: replace `string::decode_swf_str` by a `SwfStrExt` extention trait 2023-04-26 23:49:18 +02:00
Moulins 34f2c45441 core: add `string::decode_swf_str` for SwfStr -> WString conversions 2023-04-26 23:49:18 +02:00
Nathan Adams b12db0ac3a avm2: Support data, method and content-type in URLLoader by reusing code from Loader 2023-04-26 13:44:46 -05:00
relrelb 1c0c25b521 avm1: Make `AsBroadcaster` a function
Previously, `AsBroadcaster` was defined as a plain object. However,
it seems like in Flash it is defined as an empty function instead.
This means expressions like `new AsBroadcaster()` should return a
newly-created object. This is in opposition to the documentation
that says there is no constructor function for the `AsBroadcaster`
class.

Fixes #10673.
2023-04-26 21:21:57 +03:00
Lord-McSweeney 4a50f9f31e avm2: Add make_error_2008() function and use it 2023-04-26 18:49:35 +03:00
Nathan Adams cc731a78ee avm2: Respect data, method and contentType in Loader.load() 2023-04-26 12:46:23 +02:00
Lord-McSweeney f412f62127 avm2/tests: use try_get_object in JSON/Add test for undefined receiver 2023-04-26 00:17:44 +02:00
Lord-McSweeney 319886587d avm2: Use ParametersExt in JSON 2023-04-26 00:17:44 +02:00
Lord-McSweeney 58212ec280 avm2: Throw AVM errors for JSON operations (and add tests) 2023-04-26 00:17:44 +02:00
Aaron Hill 6eba8d07ee avm2: Implement MorphShape class and use it for MorphShape displayobject 2023-04-25 18:43:43 +02:00
Toad06 45795c9d24 desktop/web: Add a mouse enter event 2023-04-25 18:01:49 +02:00
Toad06 1ca1435dc7 core: Detect when the mouse moves out of the stage 2023-04-25 18:01:49 +02:00
Toad06 ad4dc943fa avm1: Fix some issues with buttons 2023-04-25 17:50:25 +02:00
Aaron Hill 4432c45eb3 avm2: Mark 'callee' property as non-enumerable on 'arguments' array
Some SWFs iterate over the 'arguments' array, and the 'callee' property
should not get enumerated.
2023-04-25 17:29:20 +02:00
relrelb ff7c458739 core: Accept borrowed strings in `NavigatorBackend::navigate_to_url`
This avoids some unnecessary clones.
2023-04-24 22:06:47 +03:00
nosamu 3cde3482f4 core: Add frame rate config option 2023-04-24 14:01:37 +02:00
relrelb 808a0fd26e core: Clamp various `BitmapData` thresholds to `u8` 2023-04-24 08:35:59 +03:00
Tom Schuster 886244478e avm2: Complete the implementation of XML abstract equality 2023-04-23 22:07:54 -05:00
renovate[bot] 3b3c08a354 chore(deps): lock file maintenance rust dependencies 2023-04-24 01:22:07 +02:00
Aaron Hill 15af946cf1 avm2: Stop after first frame when movieclip doesn't extend MovieClip
It's possible to have a DefineSprite tag with multiple frames,
but with a corresponding SymbolClass that directly extends
`Sprite` (and therefore does *not* extend `MovieClip`). When this
happens, Flash Player stops after the first frame.
2023-04-23 16:48:38 -05:00
Aaron Hill 33e9713279 avm2: Fix get_super and set_super with normal methods
Doing `super.someNonGetter` gives you back a function object.
We were previously attempting to call normal methods as though
they were getters. Additionally, we were failing to properly
get the property from the superclass vtable.
2023-04-23 16:28:59 -05:00
Lord-McSweeney 292e068e48 avm2: Take a MutationContext instead of an...
...Activation in ClassObject.install_class_vtable_and_slots
2023-04-22 20:21:16 +03:00
Lord-McSweeney 3c2ce683fb avm2: Take a MutationContext instead of an Activation in PropertyClass::name 2023-04-22 17:38:19 +02:00
relrelb 1e2139a3e4 core: Use `BitFlags::iter`
Instead of manually shifting bits.
2023-04-22 12:42:51 +02:00
Lord-McSweeney 8fd6224d90 avm2: Add flash.display.GraphicsShaderFill class 2023-04-22 08:16:08 +02:00
Lord-McSweeney 932aa8cd90 avm2: Make TObject.install_instance_slots take a MutationContext instead of an Activation 2023-04-22 08:04:52 +02:00
Lord-McSweeney 34156cc6d1
avm2: Throw AVM error for invalid frame labels 2023-04-22 08:52:19 +03:00
Lord-McSweeney bc0bbeca92 avm2: Throw AVM error for validate_remove_operation...
...in DisplayObjectContainer.
2023-04-21 17:15:43 +02:00
Moulins 60f34f8056 avm1: put an assert to ensure that `avm::Value`'s size doesn't grow again 2023-04-21 16:59:55 +02:00
Moulins bb08d356b1 avm1: shrink `Value` by boxing `MovieClipReference`s
This doesn't actually cost an extra allocation as we can replace an inner
`Gc<Vec<_>>` by a `Box<[_]>` directly.
2023-04-21 16:59:55 +02:00
Aaron Hill 22040552b8 avm2: Take UpdateContext instead of Activation in Object::is_of_type 2023-04-21 16:41:06 +02:00
Toad06 36e71882e7 core: Fix avm2 code interfering with avm1 2023-04-21 15:38:21 +02:00
Lord-McSweeney 5702b272db avm2: Add flash.text.engine stubs 2023-04-21 15:16:02 +02:00
Moulins be67761a22 chore: appease (beta) clippy 2023-04-21 14:44:15 +02:00
Adrian Wielgosik 4e9cdc338f avm2: Support `newcatch` with finally-scopes 2023-04-18 22:15:57 +02:00
Lord-McSweeney 2bab9022b4 avm2: Show detailed error message...
...while loading ABC files.
2023-04-18 21:28:38 +02:00
Aaron Hill 78b386d775 avm2: Stub URLLoader.close 2023-04-17 15:58:46 -07:00
Lord-McSweeney f25398898a
avm2: stageWidth/Height should be of int type (#10712) 2023-04-16 21:58:32 +02:00
AllinolCP d367f38eb4
avm2: stub xml.normalize() (#10709)
* avm2: stub xml.normalize()
2023-04-16 12:41:52 -04:00
Lord-McSweeney fef7eeed90 avm2: Stub TextField.useRichTextClipboard 2023-04-13 22:09:11 +02:00
nosamu a6c659945e core: Allow focusing selectable EditText fields 2023-04-13 21:48:40 +02:00
Tom Schuster aca4329dbf avm2: Implement XMLList.child 2023-04-11 14:49:32 -04:00
Nathan Adams 35f3a21110 core: Fix bitmapdata.floodFill() replacing X with X + test. Fixes #10642 2023-04-11 10:40:57 -04:00
Mike Welsh 7cfd4470b1 avm2: Use proper scale for `Graphics.beginBitmapFill` (fix #10628) 2023-04-11 11:36:49 +02:00
Toad06 aef3ed2fcb avm1: Correct `MovieClip.focusEnabled` 2023-04-09 14:11:24 -07:00
Tom Schuster baf9bda9e9 avm2: Partially implement XML/XMLList abstract equality 2023-04-09 12:02:20 -07:00
AllinolCP 0643426b84 avm2: stub URLRequest.requestHeaders 2023-04-08 18:31:02 -07:00
Mike Welsh 7d7fe1bfdd core: Implement `Display` for `NavigationMethod` 2023-04-08 13:37:25 -07:00
Mike Welsh 711a012fea avm1: Exclude shape children from `StageObject::get_keys`
Non-interactive children such as shapes are not returned when
iterating over the keys of a stage object in AVM1.
2023-04-08 13:37:25 -07:00
Mike Welsh 3716422b37 avm1: Grab correct variables for `MovieClip.loadVariables` and `loadMovie`
The request was being populated with parameters from the local
function scope, not the movieclip that is doing the loading.
2023-04-08 13:37:25 -07:00
relrelb 93a0fd43d6 avm1: Migrate `ColorMatrixFilter` to `NativeObject` 2023-04-08 13:40:32 +03:00
relrelb 3dcf246870 avm1: Migrate `DropShadowFilter` to `NativeObject` 2023-04-08 13:40:32 +03:00
relrelb 814cb00821 avm1: Migrate `GlowFilter` to `NativeObject` 2023-04-08 13:40:32 +03:00
relrelb b74f515c34 avm1: Refactor `BevelFilter` 2023-04-08 13:40:32 +03:00
relrelb cdffc00e94 avm1: Refactor `BlurFilter` 2023-04-08 13:40:32 +03:00
Tom Schuster d9e69563d3 avm2: Implement XMLList.copy 2023-04-07 12:29:49 -05:00
Udeshya 54a8672390
avm2: Trim xml text nodes when being parsed (#10341) 2023-04-06 22:41:46 -05:00
Lord-McSweeney 60ae2edf92 avm2: Use AVM error for invalid bitmapdata error 2023-04-06 11:53:56 -05:00
Aaron Hill 6844d1bf19 avm2: Call 'AS3::concat' in ColorMatrixFilter
This ensures that we call the normal Array concat method
(or a method that overrides it). Some SWFs may define a *public*
concat method in an Array subclass, with a different signature.

Fixes #10552
2023-04-05 22:48:12 -07:00
Aaron Hill 962cf92223 avm2: Implement Context3D.setSamplerStateAt
This fixes pixelated backgrounds in Fancy Pants World 4 Part 3
2023-04-05 16:44:07 -07:00
Toad06 5e165a0682 avm1: Fix some issues with `Selection.getFocus()` and `setFocus()` 2023-04-05 15:53:18 -07:00
Mike Welsh 792cfd82c7 avm2: Implement `Context3D.setColorMask` 2023-04-05 12:22:13 -07:00
Toad06 76b9ed80ba core: Support `maxlength` attribute in EditText 2023-04-05 11:59:17 -07:00
onkrot 19284cb1be avm2: Add more flash.accessibility members 2023-04-05 11:10:46 -07:00
Mike Welsh 37bf6b39e6 core: Remove `RenderContext::allow_mask`
This is now handled by `CommandList::maskers_in_progress`, so core
code does not have to worry about whether or not it can draw a
mask.
2023-04-04 13:10:45 -07:00
Lord-McSweeney 8d527ceed2 avm2: Array-related fixes
1. toString and toLocaleString should only be defined on the prototype.
2. concat should only be defined as an as3 and proto property, not as an instace property.
3. Array doesn't have a valueOf defined directly on it.
2023-04-04 00:43:46 -07:00
TÖRÖK Attila 493971ab8a render: Make RenderBackend::update_texture() take a Bitmap (like register_bitmap()) 2023-04-04 00:15:07 -07:00
TÖRÖK Attila 5f94476b2a render: Add BitmapFormat::Yuv420p and BitmapFormat::Yuva420p 2023-04-04 00:15:07 -07:00
nosamu 315a7c87e5 core: Focus EditText fields only if editable 2023-04-03 23:27:18 -07:00
Mike Welsh bde9765864 avm2: Implement `Matrix3D.transformVector` and `deltaTransformVector` 2023-04-03 17:09:16 -07:00
Nathan Adams 3a297f8adc core: Iterate y then x in bitmapdata operations 2023-04-03 18:25:20 +02:00
Nathan Adams 2a9288870a core: Made operations take in MutationContext instead of &mut UpdateContext where possible 2023-04-03 18:25:20 +02:00
Nathan Adams 4477d65331 core: Made overwrite_cpu_pixels_from_gpu take in MutationContext instead of &mut UpdateContext 2023-04-03 18:25:20 +02:00
Nathan Adams e62e2a94e8 core: Move dummy() from BitmapData to BitmapDataWrapper 2023-04-03 18:25:20 +02:00
Nathan Adams f9a9c05863 avm2: Made fill_bitmap_data_from_symbol return a BitmapDataWrapper, instead of taking in a BitmapData 2023-04-03 18:25:20 +02:00
Nathan Adams ab534bab87 core: Rename BitmapData (of the stage variety) to BitmapGraphicData to separate it from BitmapData of the editable data variety 2023-04-03 18:25:20 +02:00
Nathan Adams e1e4a01f13 avm2: Make BitmapDataObject::from_bitmap_data take BitmapDataWrapper 2023-04-03 18:25:20 +02:00
Nathan Adams 103158101a avm2: Make Object::init_bitmap_data take in BitmapDataWrapper 2023-04-03 18:25:20 +02:00
Nathan Adams a80a1422b0 avm2: Renamed bitmap_data_wrapper into bitmap_data 2023-04-03 18:25:20 +02:00
Nathan Adams 0f81d60db2 avm1: Removed BitmapDataObject::bitmap_data() as it's no longer used (or recommended to use) 2023-04-03 18:25:20 +02:00
Nathan Adams 7ffdcccf8a avm1: Don't sync in BitmapData.loadBitmap() 2023-04-03 18:25:20 +02:00
Nathan Adams f8ef01d2ef avm1: Don't sync a bitmapdata to read its width or height 2023-04-03 18:25:20 +02:00
Nathan Adams c037e014c2 avm1: Don't sync in new Bitmap(x) 2023-04-03 18:25:20 +02:00
Nathan Adams e593541309 avm1: Don't sync bitmapdata when disposing it 2023-04-03 18:25:20 +02:00
Nathan Adams f7da335083 avm2: Renamed as_bitmap_data_wrapper into as_bitmap_data 2023-04-03 18:25:20 +02:00
Nathan Adams 1521c7b6ee avm2: Removed Object::as_bitmap_data() as it's no longer used (or recommended to use) 2023-04-03 18:25:20 +02:00
Nathan Adams b1f7fecacb avm2: Don't sync in new Bitmap(x) 2023-04-03 18:25:20 +02:00
Nathan Adams 444e256708 avm2: Made Bitmap.bitmapData not recreate a new BitmapDataWrapper every time its called 2023-04-03 18:25:20 +02:00
Tom Schuster b0576c2155 avm2: Improve the Sound::extract stub 2023-04-03 00:22:23 -07:00
onkrot d047ecb130 avm2: Add X509 certificate classes 2023-04-02 23:59:37 -07:00
renovate[bot] cd3ad90d61 chore(deps): lock file maintenance rust dependencies 2023-04-02 22:00:49 -07:00
Lord-McSweeney d1b8ec7a7e avm2: Stub Shader 2023-04-02 19:56:14 -07:00
Lord-McSweeney c19031a6fc avm2: Stub ShaderData 2023-04-02 19:56:14 -07:00
Aaron Hill a2fa362091 wgpu: Implement double buffering for Context3D
This matches the Context3D docs. Calling 'present' swaps
the buffers.

I wasn't certain if we actually need a double-buffered depth
texture, but I included one just to be safe.
2023-04-02 19:24:23 -07:00
Aaron Hill 671ebdfa8f wgpu: Execute Context3D commands immediately
Now that most of the complicated Context3D methods have been
implemented, we can simplify the overall design. Instead of queueing
up commands and having `present` execute them in a loop, we
can execute each command immediately. The key insight is that
a `RenderPass` is only needed for `DrawTriangles`, so we don't
have to store it in `Context3D` and deal with complicated lifetime
issues.

The old behavior gave us implicit double-buffering behavior,
since nothing would get rendered until a 'present' call.
Now that a 'drawTriangles' call will immediately submit
a draw command, we need to implement actual double buffering.
This is done in the next commit.
2023-04-02 19:24:23 -07:00
Moulins 9441182b7d avm2: move event dispatch error handling in a single place
The `Avm2::{dispatch, broadcast}_event` methods now log and swallow any
AVM2 error occuring during the dispatch, instead of repeating the
handling code for each caller.

This also introduces some behavioral changes:
- Errors messages are more consistent;
- For consistency with `broadcast_event`, `dispatch_event` panics if
  given a non-event object to dispatch.
2023-04-02 16:52:42 -07:00
Udeshya 34775965ea
avm2: Implement `Transform.pixelBounds` 2023-04-02 23:25:10 +00:00
AllinolCP f0a8e50be1 avm2: implement decodeURI 2023-04-02 14:49:07 -07:00
Tom Schuster 5a18a409f7 avm2: Only reject a single explicit namespace in XML 2023-04-02 16:09:03 -05:00
Toad06 35528913bf core: Make `ExternalInterface` support undefined values 2023-04-02 13:48:14 -07:00
Toad06 5e14aabed6 core: Make `ExternalInterface` support undefined values in browsers 2023-04-02 13:48:14 -07:00
Lord-McSweeney 4777c13528 avm2: ByteArray should have toJSON defined on...
...its prototype.
2023-04-01 17:17:48 -07:00
Lord-McSweeney 58cbc38983 avm2: Use RegExp.valueOf in RegExp.toString
This fixes flag ordering issues
2023-04-01 13:49:41 -07:00
Lord-McSweeney 17ebb8c5bc avm2: Add RegExp.prototype.toString 2023-04-01 13:49:41 -07:00
Lord-McSweeney ab6d5006b4 avm2: Make sure RegExp prototype is not enumerable 2023-04-01 13:49:41 -07:00
Lord-McSweeney 18bff18d0b avm2: Fix QName's prototype 2023-04-01 13:49:41 -07:00
Tom Schuster 86395f194f avm2: Strip BOM in ByteArray::toString 2023-04-01 12:48:22 -07:00
Aaron Hill 6ce6fd1681 avm2: Use custom_unescape wherever we unescape XML
When we were using a fork of quick-xml, we modified the actual
unescape method. Now that we're using the crates.io release again,
we need to go through our `custom_unescape` function.
2023-04-01 02:25:24 -05:00
Aaron Hill 18f5ba18e9 core: Don't overwrite font descriptor with a duplicate
If a SWF contains multiple DefineFont tags with the same
font name (but different font IDs), the first tag will win
when a font is looked up by *name*. This affects the behavior
of EditText objects, which can have embedded HTML like
`<font face="MyFontName">` which performs a font lookup by name.

This fixes Fancy Pants World 4 Part 3, which contains two
DefineFont3 tags with the name FancyFont. The second font is
missing many glyphs, so using it causes us to be unable to
render the squiggle and life count text.
2023-03-31 22:47:00 -07:00
Mike Welsh 4c13da8fcb avm2: Unstub `BitmapData.lock` and `BitmapData.unlock`
These functions are intentionally no-ops in Ruffle because it has
no concept of a player dirty region, so unmark them as stubs.

The only observable difference is that Flash Player will sometimes
not re-render a `Bitmap` instance on the stage immediately if it's
`BitmapData` is locked and changed, but this is only temporary and
depends on the redraw behavior of the Flash Player.
2023-03-31 22:13:28 -07:00
Nathan Adams 1c6aaba57a core: Use actual clone() method when cloning bitmap 2023-03-31 21:56:41 -07:00
Nathan Adams 62d30251f2 core: Move clone to bitmapdata operations 2023-03-31 21:56:41 -07:00
Nathan Adams b07bf84da5 core: Skip a gpu->cpu sync in set_pixels_from_byte_array if we're filling the whole bmd 2023-03-31 21:32:15 -07:00
Nathan Adams fcaf462423 core: Fix set_pixels_from_byte_array respecting the bytearray position + tests 2023-03-31 21:32:15 -07:00
Nathan Adams 445912e760 core: Move set_pixels_from_byte_array out from avm2 to bmd operations 2023-03-31 21:32:15 -07:00
Aaron Hill 7f6cb99b08 avm2: Convert QName to ActionScript 2023-03-31 22:05:18 -05:00
Aaron Hill 27092ecb76 avm2: Convert RegExp to ActionScript 2023-03-31 17:08:21 -07:00
Mike Welsh b62040884c core: Make `DisplayObject::global_to_local` fallible
* `global_to_local` returns `None` if the object has zero scale.
 * Adjust AVM `globalToLocal` methods to return the untransformed
   point on failure.
 * Add `DisplayObject::mouse_to_local` to handle AVM `mouseX`
   and `mouseY` coordinates. For zero scale objects, these end up
   returning values based on the twips-to-pixels scale,
   divided by 20.
2023-03-31 16:26:11 -07:00
Mike Welsh 664b168d3d core: Make `DisplayObject::global_to_local_matrix` fallible
This will return `None` if the object is zero scale, and callers
can handle this appropriately.
2023-03-31 16:26:11 -07:00
Mike Welsh 54b7094c16 render: Make `Matrix::inverse` fallible
* Add `Matrix::determinant`.
 * Rename `Matrix::invert` to `inverse`.
 * `Matrix::inverse` return an `Option`, with `None` returned
    for non-invertible matrices.
 * AMV `Matrix::invert` duplicates the code as the behavior is
   different (works in f64 and not twips, etc.)
2023-03-31 16:26:11 -07:00
Nathan Adams 6f7493f16a avm2: Don't sync BitmapData when getting .rect 2023-03-31 21:07:38 +02:00
Nathan Adams c51ba098f6 render: Rename PixelRegion's (min|max)_(x|y) to (x|y)_(min|max) 2023-03-31 16:57:52 +02:00
Nathan Adams cfb18718a1 core: Remove debug output 2023-03-31 16:57:52 +02:00
Nathan Adams fd702dabcc core: Remove disposed checks from operations, it's responsibility of avm1 and avm2 to handle it their own way 2023-03-31 16:57:52 +02:00
Nathan Adams 66e2eb77e5 core: Rename bitmap_data_operations to just operations 2023-03-31 16:57:52 +02:00
Nathan Adams 94e5aa8f34 core: Fix calculating dirty area of BitmapData.draw() with rotation 2023-03-31 16:57:52 +02:00
Nathan Adams c85910b46d wgpu: Fixed panic when rendering texture to itself, by always rendering to an intermediary 2023-03-31 16:57:52 +02:00
Nathan Adams 68343369a3 core: Don't sync cpu->gpu in overwrite_cpu_pixels_from_gpu 2023-03-31 16:57:52 +02:00
Nathan Adams cae8f89c9b core: Remove clone from copy_pixels_with_alpha_source and don't sync if copying outside dirty region 2023-03-31 16:57:52 +02:00
Nathan Adams d7b0a6f611 core: Remove clone from copy_pixels and don't sync if copying outside dirty region 2023-03-31 16:57:52 +02:00
Nathan Adams f5501b57da core: Remove clone from merge and don't sync if copying outside dirty region 2023-03-31 16:57:52 +02:00
Nathan Adams 44c35a5b50 core: Made palette_map not sync if copying outside of dirty region 2023-03-31 16:57:52 +02:00
Nathan Adams b1b3eef283 core: Remove clone from threshold and don't sync if copying outside dirty region 2023-03-31 16:57:52 +02:00
Nathan Adams 2b84e926ec core: Remove clone from copy_channel and don't sync if copying outside dirty region 2023-03-31 16:57:52 +02:00
Nathan Adams 966f5bc816 core: Skip bitmapdata.draw which will affect 0 pixels 2023-03-31 16:57:52 +02:00
Nathan Adams e6d36ade7f core: Make get_pixels_as_byte_array not sync if the pixel is outside a dirty region 2023-03-31 16:57:52 +02:00
Nathan Adams fd0ba4a753 core: Make get_vector not sync if the pixel is outside a dirty region 2023-03-31 16:57:52 +02:00
Nathan Adams 864ee1c6df core: Make hit test methods not sync if the pixel is outside a dirty region 2023-03-31 16:57:52 +02:00
Nathan Adams 8fc1b0d48e core: Make get_pixel and get_pixel32 not sync if the pixel is outside a dirty region 2023-03-31 16:57:52 +02:00
Nathan Adams e1f76bf135 core: Use map instead of and_then for MovieLibrarySource::bitmap_handle 2023-03-31 16:57:52 +02:00
Nathan Adams b035c7f24e core: noise and perlin_noise shouldn't perform a gpu->cpu sync 2023-03-31 16:57:52 +02:00
Nathan Adams 2b483a5953 core: Ensure MovieLibrarySource::bitmap_handle updates the bitmap handle 2023-03-31 16:57:52 +02:00
Nathan Adams d44bdc16a8 avm2: Ensure Graphics.lineBitmapStyle updates the bitmap handle 2023-03-31 16:57:52 +02:00
Nathan Adams 7e2382d804 avm2: Ensure DisplacementMapFilter.mapBitmap updates the bitmap handle 2023-03-31 16:57:52 +02:00
Nathan Adams 29ad46daf5 avm1: Ensure MovieClip.beginBitmapFill updates the bitmap handle 2023-03-31 16:57:52 +02:00
Nathan Adams c364deb545 avm2: Ensure Graphics.beginBitmapFill updates the bitmap handle 2023-03-31 16:57:52 +02:00
Nathan Adams 9e5c56fc4f core: BitmapData.transparent (in both avm1 and 2) shouldn't sync the whole bmd 2023-03-31 16:57:52 +02:00
Nathan Adams e62e05cd09 core: Move get_pixels from BitmapData to bitmap_data_operations 2023-03-31 16:57:52 +02:00
Nathan Adams 89c2fc841e core: Move get_vector from BitmapData to bitmap_data_operations 2023-03-31 16:57:52 +02:00
Nathan Adams e4caedcc12 core: Move draw from BitmapData to bitmap_data_operations 2023-03-31 16:57:52 +02:00
Nathan Adams 57648b6380 core: Move apply_filter from BitmapData to bitmap_data_operations 2023-03-31 16:57:52 +02:00
Nathan Adams 8bb02c38c0 core: Move copy_pixels from BitmapData to bitmap_data_operations 2023-03-31 16:57:52 +02:00
Nathan Adams eb04738b73 core: Move set_pixel from BitmapData to bitmap_data_operations 2023-03-31 16:57:52 +02:00
Nathan Adams a41a797b4a core: Move merge from BitmapData to bitmap_data_operations 2023-03-31 16:57:52 +02:00
Nathan Adams 60a157224f core: Move color_bounds_rect from BitmapData to bitmap_data_operations 2023-03-31 16:57:52 +02:00
Nathan Adams 62b90c6c8e core: Move hit test methods from BitmapData to bitmap_data_operations 2023-03-31 16:57:52 +02:00
Nathan Adams 2c65f23eb8 core: Move compare from BitmapData to bitmap_data_operations 2023-03-31 16:57:52 +02:00
Nathan Adams 8a0cb4685e core: Move palette_map from BitmapData to bitmap_data_operations 2023-03-31 16:57:52 +02:00
Nathan Adams b1b0394101 core: Move scroll from BitmapData to bitmap_data_operations 2023-03-31 16:57:52 +02:00
Nathan Adams 4510eb305b core: Move threshold from BitmapData to bitmap_data_operations 2023-03-31 16:57:52 +02:00
Nathan Adams f476968693 core: Move color_transform from BitmapData to bitmap_data_operations 2023-03-31 16:57:52 +02:00
Nathan Adams 43716bbdc7 core: Move copy_channel from BitmapData to bitmap_data_operations 2023-03-31 16:57:52 +02:00
Nathan Adams ea6fb1a3d4 core: Move perlin_noise from BitmapData to bitmap_data_operations 2023-03-31 16:57:52 +02:00
Nathan Adams ffe6828e9c core: Move noise from BitmapData to bitmap_data_operations 2023-03-31 16:57:52 +02:00
Nathan Adams 285122a1fa core: Move flood_fill from BitmapData to bitmap_data_operations 2023-03-31 16:57:52 +02:00
Nathan Adams c2af7b92c0 core: Move get_pixel from BitmapData to bitmap_data_operations 2023-03-31 16:57:52 +02:00
Nathan Adams 758d8f1492 core: Move get_pixel32 from BitmapData to bitmap_data_operations 2023-03-31 16:57:52 +02:00
Nathan Adams 31f46c6acf core: Move set_pixel32 from BitmapData to bitmap_data_operations, fixed set_pixels to no longer use it 2023-03-31 16:57:52 +02:00
Nathan Adams 1024fc8be5 core: Optimise fill_rect when replacing entire region after a draw call 2023-03-31 16:57:52 +02:00
Nathan Adams e614265c17 core: Move fill_rect from BitmapData to bitmap_data_operations, fixed a bug when using non-standard values, and added better tests for fill_rect showing the bug 2023-03-31 16:57:52 +02:00
Nathan Adams 033ab34c14 core: Extract bitmap_data_operations for common avm operations 2023-03-31 16:57:52 +02:00
Nathan Adams 311a165149 wgpu: Reintroduce texture promoting; only preassign buffer when the texture is frequently written/&read 2023-03-31 16:57:52 +02:00
Nathan Adams 579f046122 core: Don't mark anything dirty in an invalid drawRect call 2023-03-31 16:57:52 +02:00
Nathan Adams 68c87c7485 core: When drawing display objects to bitmapdatas, use their minimum bounds 2023-03-31 16:57:52 +02:00
Nathan Adams 6e859891af render: Take in dirty region in update_texture, only upload those pixels 2023-03-31 16:57:52 +02:00
Nathan Adams 137593b6a6 render: Extract (u32, u32, u32, u32) to PixelRegion 2023-03-31 16:57:52 +02:00
Nathan Adams e0bd911f2f render: Only copy a possible dirty area for bitmapdata.draw & read 2023-03-31 16:57:52 +02:00
Gleb Piskunov ed282f016b
avm1: Exclude __proto__ prop from object props enumeration
---------

Co-authored-by: Gleb Piskunov <emgfc@ya.ru>
2023-03-31 10:14:33 +00:00
Toad06 c81460beb0 avm1: Support strings in `MovieClip.setMask(str)` 2023-03-31 02:39:39 -07:00
Tom Schuster 8a8071e6d5 avm2: Stub XMLNode.nodeName setter and XMLNode.appendChild 2023-03-31 00:11:52 -07:00
Tom Schuster ce4ddee792 avm2: Shim flash.xml.XMLNode using XML 2023-03-31 00:11:52 -07:00
Aaron Hill 3e97f0e223 core: Update to latest quick-xml
I've moved our special entity handling logic into
a `custom_unescape` function. This lets us move off
of our fork of `quick-xml` back onto the crates.io release
2023-03-30 22:25:24 -07:00
Gleb Piskunov b18d3a2645
avm2: Add AS3 implementation of BitmapData.paletteMap (#10344)
Co-authored-by: Gleb Piskunov <emgfc@ya.ru>
2023-03-30 17:39:05 +00:00
relrelb 236a97bf31 render: Replace `ColorTransform` with `swf::ColorTransform` 2023-03-29 23:27:20 -07:00
onkrot 5632ade09c avm2: Hookup `DisplayObject.opaqueBackground` 2023-03-29 23:11:01 -07:00
Aaron Hill 8fa00de8a8 avm2: Convert Font class to ActionScript 2023-03-29 22:46:27 -07:00
Tom Schuster 330bd37237 avm2: Stub flash.net.XMLSocket 2023-03-29 22:33:16 -07:00
EmperorBale ac626493dd avm2: Fix panic in regexp when a wide empty string is used 2023-03-29 18:00:07 -07:00
Aaron Hill 34e4cffeb0 avm2: Use global domain for timer Activation 2023-03-29 19:05:19 -05:00
relrelb d71617209a render: Remove `RenderBackend::register_glyph_shape`
Use just `RenderBackend::register_shape` instead.
2023-03-30 01:46:04 +03:00
Tom Schuster b1f253775a avm2: Implement XML.childIndex 2023-03-29 14:40:29 -05:00
Tom Schuster c0400af1de avm2: Implement XML.copy 2023-03-29 11:04:32 -05:00
Aaron Hill cdba704b4b avm2: Construct Activation with Domain when setting named child 2023-03-29 09:27:34 -05:00
Nathan Adams 3a49870689 avm2: Fix errors in LoaderInfo and stubbed remaining properties 2023-03-28 11:57:00 +02:00
TÖRÖK Attila 05e2b4c729 avm2: Stub Video.deblocking and Video.smoothing 2023-03-28 10:20:29 +03:00
TÖRÖK Attila 72802de20e nit: Fix typo: "recieve" -> "receive" 2023-03-28 10:06:08 +03:00
renovate[bot] 5052e942b5 chore(deps): lock file maintenance rust dependencies 2023-03-28 09:31:15 +03:00
Toad06 9c37c9cd34 core: Correct `swapDepths` 2023-03-28 00:24:48 -05:00
Adrian Wielgosik 4e84632609 avm2: Fix edge cases in RegExp constructor 2023-03-27 19:09:09 -05:00
Ikko Eltociear Ashimine fc4b51b20f chore: fix typo in display_object.rs
defualt -> default
2023-03-27 20:54:16 +03:00
Mike Welsh a7bd3737a6 avm2: Implement `SharedObject.clear` 2023-03-26 22:22:27 -05:00
Aaron Hill a52cb7461e wgpu: Implement MSAA support for Stage3D
When we receieve a nonzero 'antiAlias' parameter, we create
create a non-multisampled resolve buffer to use with WGPU.

Several tests were already requesting antialiasing, so their
output images are now anti-aliased without any changes to
the tests themselves.
2023-03-26 18:05:41 -07:00
Aaron Hill 1a352aa453 avm2: Implement ApplicationDomain constructor and fix parent handling
Previously, the `ApplicationDomain` constructor ignored its argument,
instead of constructing a new domain with the specified domain as
the parent.

Additionally, we were incorrectly executing code with
`Activation::from_nothing` in several places, causing
`ApplicationDomain.currentDomain` to return the system domain
instead of the correct parent domain. I've introduced a new method
`Activation::from_domain`, which allows explicitly passing in the
domain. Internally, we now store an `Option<Domain>`, and panic
when calling `caller_domain` with a `None` domain. Several places
in the codebase have been adjusted to pass in the correct domain.
2023-03-26 17:43:46 -07:00
Aaron Hill da6384b30e Warn instead of panicking 2023-03-26 17:22:52 -07:00
Aaron Hill d220cad3bf avm2: Allow duplicate (class, symbol) pairs in SymbolClass tags 2023-03-26 17:22:52 -07:00
Aaron Hill 7f829dd646 avm2: Don't overwrite symbol class entry with a different SwfMovie
If you use a `Loader` to load an SWF containing a class that shadows
an already-defined class, the class definition from the Loader SWF
will be ignoredin favor of the already-defined class. This commit
applies this log to symbol classes as well - the symbol registry for the class
should continue to point to the existing MovieClip in the parent.
This results in the child SWF instantiating the class from the parent
SWF when the child places the affected movie clip on the timeline.

This fixes a bug in Fancy Pants World 4 Part 3, where the sub-level
SWF was replacing the symbol class entry for the parent 'shipInteract'
class with the dummy clip provided in the sub-level SWF (instead
of continuing to use the correct clip from the parent SWF).
2023-03-26 17:22:52 -07:00
Aaron Hill cb9d02e3dd avm2: Fire soundComplete events immediately
Instead of queueing up these events in the `Activation`,
we can fire them immediately by making `AudioManager::update_sounds`
a freestanding method that takes in an `UpdateContext`
2023-03-26 14:43:07 -07:00
Gleb Piskunov 6f7e491bc5
core: Fix ChildContainer.replace_at_depth() panic
Avoid panic in ChildContainer.replace_at_depth() panic when previous child is not in render list.

---------

Co-authored-by: Gleb Piskunov <emgfc@ya.ru>
2023-03-26 19:47:07 +00:00
Lord-McSweeney 3b7172de8d nit: Add error code in error message 2023-03-26 11:39:07 -07:00
yoganlava ab263b8c6a avm2: Handle undefined arg in XML.elements() 2023-03-25 23:12:51 -07:00
yoganlava 847465cb86 avm2: don't coerce to string before undefined check in name_to_multiname 2023-03-25 23:12:51 -07:00
yoganlava 447ada0929 avm2: Clean up XML.elements() by using name_to_multiname
name_to_multiname now resolves "undefined" to Multiname::any
2023-03-25 23:12:51 -07:00
yoganlava 9bf66ae3c3 chore: Fix fmt 2023-03-25 23:12:51 -07:00
yoganlava da0b245fb8 avm2: Fully implement XML.elements() 2023-03-25 23:12:51 -07:00
Aaron Hill 9530da22e2 avm2: Convert SoundTransform and SoundMixer to ActionScript classes
Co-authored-by: Mike Welsh <mwelsh@gmail.com>
2023-03-25 22:28:14 -07:00
EmperorBale 7a4a4f7c9a avm2: Fix function double borrow panic 2023-03-25 21:57:04 -07:00
Tom Schuster 53d9118834 avm2: Implement XML set for simple element cases 2023-03-25 20:40:44 -07:00
Lord-McSweeney 3bfa2deb5c
avm2: Log error message instead of error object 2023-03-26 02:20:18 +00:00
Aaron Hill b140029e95 render: Fix BitmapData.applyFilter with non-full sourceRect
Previously, we were scaling down the source image to fit into
the smaller sourceRect, instead of cropping at the original scale.
This broke the background textures in Fancy Pants World 4 Part 2,
as the scaled-down output image resulted in a smaller rectangle
being returned from 'getColorBoundsRect'

We now crop the image by properly constructing the UV-coordinate
transformation matrix. We were also using the wrong value for the
'destPoint' y coordinate, which I fixed.

This slightly changes the image output of two tests - the new images
now more closely match the Flash output.
2023-03-25 18:44:01 -07:00
David Wendt 65d2fca7bd chore: Rename `NetStream.toggle_pause` to match `StreamManager::toggle_paused` 2023-03-25 15:30:02 -06:00
David Wendt 6689b547f8 chore: Re-alphabetize `globals.as` 2023-03-25 15:30:02 -06:00
David Wendt 66efb02f46 chore: `NetStreamInfo.as` formatting 2023-03-25 15:30:02 -06:00
David Wendt 0fd6fbc6d6 chore: Explicitly type `NetStream` constants as `String` 2023-03-25 15:30:02 -06:00
David Wendt d9dcc49bc1 core: If a timeline video gets a `NetStream` attached to it, timeline seeking should be a no-op. 2023-03-25 15:30:02 -06:00
David Wendt afb0cd3b5e avm1,avm2: Implement `pause`/`resume` based methods.
For AVM1, `pause` handles three different functions; while AVM2 splits that into `pause`, `resume`, and `togglePause`.
2023-03-25 15:30:02 -06:00
David Wendt 6217397482 avm1,avm2: Implement `NetStream.play`.
So far this just sticks the stream into the playback list and kicks off a download; we do not actually support decoding, seeking, or any of the other things that we expect `play` to do.
2023-03-25 15:30:02 -06:00
David Wendt 273b0a4a76 core: `NetStream` should be a self-owning pointer type. 2023-03-25 15:30:02 -06:00
David Wendt c104413e85 core: Implement `bytesLoaded`/`bytesTotal` for streams.
This treats the buffer as both the loaded and total size. Future changes to allow, e.g., streaming fetch would need this code to change.
2023-03-25 15:30:02 -06:00
David Wendt fb7ad56bca avm2: Implement `Video.attachNetStream`. 2023-03-25 15:30:02 -06:00
David Wendt 77404de850 avm1: Implement `Video.attachVideo` 2023-03-25 15:30:02 -06:00
David Wendt 9c13232aa3 core: Add a type to hold playing streams.
Calling `StreamManager::tick` advances all streams to the appropriate time. This is an unlocked timestep to support things like non-stage-FPS video and the like.
2023-03-25 15:30:02 -06:00
David Wendt 6729c31623 avm2: Stub all `flash.net.NetStream` methods and related classes. 2023-03-25 15:30:02 -06:00
David Wendt 35ebdd5e97 avm2: Add stub impl of `NetStream` class & object type 2023-03-25 15:30:02 -06:00
David Wendt ca2f5257f3 avm1: Stub implementation of the NetStream class that allows us to create streams. 2023-03-25 15:30:02 -06:00
David Wendt 38ed0dada4 core: Stub implementation of NetStream loading.
The actual use cases for `NetStream` almost certainly require streaming download but I'm not ready to implement that just yet.
2023-03-25 15:30:02 -06:00
David Wendt db7ff77c4e core: Add a stub implementation of `NetStream` videos. 2023-03-25 15:30:02 -06:00
Gleb Piskunov 2cb32e88df
avm2: Fix bad Graphics.drawRoundRectComplex() stub (#10368)
Co-authored-by: Gleb Piskunov <emgfc@ya.ru>
2023-03-25 18:30:18 +00:00
relrelb 7cdac78321 chore: Remove `static_assertions` dependency
`static_assertions` seems unmaintained, and anyway `assert!()` is
usable in `const` contexts since Rust 1.57.0:
https://blog.rust-lang.org/2021/12/02/Rust-1.57.0.html#panic-in-const-contexts
So simply use the suggested method instead.

Also the `rustversion` dependency is no longer needed because
https://github.com/rust-lang/rust/pull/94075 already landed in stable.
2023-03-25 15:14:36 +03:00
Mike Welsh e1b24712cf avm2: Throw AVM error on calling undefined function 2023-03-24 18:21:32 -07:00
Nathan Adams eb44cc5395 render: Made ShapeHandle an Arc of an internal, droppable mesh 2023-03-23 01:44:27 -07:00
Nathan Adams cc8ac4fde1 render: Remove RenderBackend::replace_shape 2023-03-23 01:44:27 -07:00
Toad06 ab71370cb7 avm1: Minimal implementation of `XML.getBytesTotal` and `XML.getBytesLoaded` 2023-03-22 17:51:42 -07:00
Mike Welsh 123f9e088c avm2: Fix null parameter error message 2023-03-22 17:13:36 -07:00
EmperorBale b2c79f9ea2 avm2: Make `resolve_parameters` throw an AVM error 2023-03-22 16:35:48 -07:00
Adrian Wielgosik d77cf83e07 avm2: Fix si8/si16 opcodes 2023-03-22 22:55:43 +01:00
EmperorBale fe54fb15f7 avm2: Show AS3 stack traces when logging level is `INFO` 2023-03-22 14:29:42 -07:00
EmperorBale a63ee977fa avm2: Reduce size of `CallNode` from 56 bytes to 24 2023-03-22 14:29:42 -07:00
Mike Welsh 1d12fc6169 render: Fix types depending on `tessellator` feature 2023-03-22 20:30:39 +01:00
Marty_SVK de44c5494e avm2: Stub Mouse.registerCursor and Mouse.unregisterCursor 2023-03-22 20:15:53 +01:00
Lord-McSweeney 98c19cc199 avm2: Stub NetConnection.close 2023-03-21 23:47:03 -07:00
yoganlava 2dee8338c8 avm2: Fix double borrow when setting local XMLList property 2023-03-21 19:21:18 -07:00
renovate[bot] d7c842a139 chore(deps): lock file maintenance rust dependencies 2023-03-21 14:27:27 +01:00
Nathan Adams edbdf224ae avm2: Skip BOM when reading utf8 from ByteArrays 2023-03-21 12:20:43 +01:00
renovate[bot] 7c280fc171 fix(deps): update rust dependencies
`syn` breaking changes:
 * `Method` renamed to `Fn`
 * `extra-traits` feature necessary for `Debug` impls
2023-03-20 06:35:08 +01:00
Nathan Adams bd6c3536e1 core: Fix add with overflow in BitmapData::copy_channel 2023-03-20 05:52:27 +01:00
Nathan Adams a9ed47407d core: Replaced all BitmapData::get_pixel_raw().unwrap() with get_pixel32_raw() 2023-03-20 05:52:27 +01:00
Nathan Adams 860a34d6e6 core: Use get_pixel32_raw in BitmapData::color_transform 2023-03-20 05:52:27 +01:00
Nathan Adams 885a7a22ca core: Made BitmapData::get_pixel32 take u32 and use raw access 2023-03-20 05:52:27 +01:00
Nathan Adams dc1380ef8b core: Made BitmapData::hit_test_point use get_pixel32_raw 2023-03-20 05:52:27 +01:00
Nathan Adams 50238f2600 core: Made BitmapData::get_pixel take u32 and use raw access 2023-03-20 05:52:27 +01:00
Nathan Adams 4bd1a5b9f8 core: Remove BitmapData::set_transparency, it can only be set at creation 2023-03-20 05:52:27 +01:00
Nathan Adams 483afc4f9a core: Made BitmapData::set_pixel32 use set_pixel32_raw 2023-03-20 05:52:27 +01:00
Nathan Adams 2e487b0661 core: Made BitmapData::set_pixel use set_pixel32_raw 2023-03-20 05:52:27 +01:00
Nathan Adams ec0434a2bb core: Optimized BitmapData::copy_channel 2023-03-20 05:52:27 +01:00
Nathan Adams 48cebdbbc0 core: Make BitmapData::fill_rect use set_pixel32_raw 2023-03-20 05:52:27 +01:00
Nathan Adams 69721c06a8 core: Make BitmapData::set_pixel32_raw inline 2023-03-20 05:52:27 +01:00
Nathan Adams aa17ef695c core: Remove set_cpu_dirty from BitmapData::set_pixel32_raw 2023-03-20 05:52:27 +01:00
renovate[bot] f6f646a756 chore(deps): lock file maintenance rust dependencies 2023-03-19 19:45:30 -07:00
Toad06 e2415be734 core: Store correct data for loaded images 2023-03-20 01:36:04 +01:00
Huw Pritchard 645ff76bcd
avm2: Add 11 AS3 classes (#10003) 2023-03-20 00:19:31 +00:00
AllinolCP 19b38da394 avm2: implement XML.parent() 2023-03-19 16:06:01 -07:00
Mike Welsh 3f7ea0b07f avm2: Implement `updateAfterEvent`
Implement `updateAfterEvent` for `MouseEvent`, `TimerEvent` and
`TouchEvent`.
2023-03-19 14:39:17 -07:00
Dejan Varmedja fca4bfde25 avm2: Add AVM2 keyboard constants (close #10248) 2023-03-19 12:16:31 +01:00
Mike Welsh 2d6d8ea0f4 core: Fix BitmapData.colorTransform
* Pixels with 0 alpha are not affected by color transforms.
 * Color channels should be clamped to the 0-255 range.
 * A color transform with only an alpha multiplier of >1 has no
   effect.
2023-03-19 09:59:13 +01:00
Lord-McSweeney c48dfb4a72 Fix ordering of flash.xml classes. 2023-03-19 09:44:17 +01:00
Lord-McSweeney acc05f377f avm2: Add XMLDocument to globals 2023-03-19 09:44:17 +01:00
Lord-McSweeney 8ce16901ee avm2: Stub flash.xml.XMLDocument 2023-03-19 09:44:17 +01:00
Lord-McSweeney 6b2dcad7f3 avm2: Implement flash.xml.XMLNode 2023-03-19 09:44:17 +01:00
Lord-McSweeney 16c2317455 avm2: Implement flash.xml.XMLNodeType 2023-03-19 09:44:17 +01:00
Nathan Adams b5cf5bc707 avm2: Fix comment for dispatch_event 2023-03-19 09:15:42 +01:00
Nathan Adams e94861a8ad avm2: Convert errors to error messages at root level 2023-03-19 09:15:42 +01:00
Nathan Adams 8b5f6c3691 core: Log when an error is encountered perfoming avm2 callbacks 2023-03-19 09:15:42 +01:00
Nathan Adams b7c061a7a2 avm2: Implement LocalConnection.domain getter 2023-03-19 09:05:00 +01:00
Nathan Adams ea424f3d1e avm2: Fix panic when constructing custom BitmapData from timeline 2023-03-19 07:47:40 +01:00
Nathan Adams 9cfd37cab2 core: Respect use_device_font for bullets 2023-03-19 06:55:07 +01:00
Nathan Adams 0f66f7bcb2 core: Fallback font lookup by any font with the same name 2023-03-19 06:55:07 +01:00
Nathan Adams 27f28fb547 avm2: Don't create new texts/sprites/buttons with an empty movie 2023-03-19 06:55:07 +01:00
Lord-McSweeney e5f75ff126 avm2: Fix TextField.getTextFormat arguments
These are used in the Rust handler, but were not correctly set in the AS bindings, leading to errors such as "Attempted to call flash::text::TextField::getTextFormat with 2 arguments (more than 0 is prohibited)"
2023-03-18 21:59:41 -07:00
Mike Welsh ea75dd3739 avm1: Implement BitmapData.hitTest 2023-03-18 19:47:39 -07:00
Nicholas Cioli 9876e03ece core: Fix endless loop in `process_swf5_references`
This commit fixes an issue where ruffle locks up while trying to
resolve an item with non-MovieClip parents.
2023-03-18 19:25:16 -07:00
Nathan Adams 60a3765be2 core: Store winding rule in Drawing 2023-03-18 19:14:08 -07:00
Nathan Adams 6987c81623 render: Respect HAS_FILL_WINDING_RULE 2023-03-18 19:14:08 -07:00
Tom Schuster e9e342fe23 avm2: Implement String call handler 2023-03-18 17:51:22 -07:00
Tom Schuster 5aac938e86 avm2: Implement XMLList.text() 2023-03-18 12:18:24 -07:00
Tom Schuster c285c1eb75 avm2: Implement XML.text 2023-03-18 11:12:15 -05:00
Nathan Adams b46f511326 avm2: Implement GraphicsTrianglePath 2023-03-18 06:27:49 +01:00
Nathan Adams 96bb0b8e2e avm2: Lazily create commands and data in GraphicsPath 2023-03-18 06:27:49 +01:00
Nathan Adams de8958c40b avm2: Implement GraphicsStroke 2023-03-18 06:27:49 +01:00
Nathan Adams 2eaaa9b573 avm2: Implement GraphicsSolidFill 2023-03-18 06:27:49 +01:00
Nathan Adams fe327dc3de avm2: Implement GraphicsPath 2023-03-18 06:27:49 +01:00
Nathan Adams 2567bd2f42 avm2: Implement GraphicsGradientFill 2023-03-18 06:27:49 +01:00
Nathan Adams 7f7fbc2091 avm2: Implement GraphicsEndFill 2023-03-18 06:27:49 +01:00
Nathan Adams 3e84da036f avm2: Implement GraphicsBitmapFill 2023-03-18 06:27:49 +01:00
David Wendt 47f594d108 avm2: Stub `flash.media.Microphone` and depended classes 2023-03-17 20:39:45 -06:00
Aaron Hill 1e973af747 avm2: Implement Context3D.setRenderToTexture/setRenderToBackBuffer
In the process, I fixed a bug where we were clearing the depth
and stencil buffers with the incorrect value.

This makes Fancy Pants World 4 Part 1 playable to completion
(though there are still some rendering issues that need
to be fixed).
2023-03-17 20:11:59 -05:00
David Wendt fe0cbc4cb8 avm2: Stub `flash.media.Camera` 2023-03-17 18:27:45 -06:00
Nathan Adams 3a353e15d1 avm2: Convert transform to use ParametersExt 2023-03-17 20:40:33 +01:00
Nathan Adams 218b621ae3 avm2: Convert external_interface to use ParametersExt 2023-03-17 20:40:33 +01:00
Nathan Adams 2513292566 avm2: Convert event_dispatcher to use ParametersExt 2023-03-17 20:40:33 +01:00
Nathan Adams fda3390aa1 avm2: Convert event to use ParametersExt 2023-03-17 20:40:33 +01:00
Nathan Adams 8db6375c4c avm2: Convert display_object_container to use ParametersExt 2023-03-17 20:40:33 +01:00
Nathan Adams 37f3ea7077 avm2: Convert interactive_object to use ParametersExt 2023-03-17 20:40:33 +01:00
Nathan Adams 82fc05667c avm2: Convert loader to use ParametersExt 2023-03-17 20:40:33 +01:00
Nathan Adams ed9257ee39 avm2: Convert (some of) movie_clip to use ParametersExt 2023-03-17 20:40:33 +01:00
Nathan Adams bc118109e4 avm2: Convert simple_button to use ParametersExt 2023-03-17 20:40:33 +01:00
Nathan Adams 652a8f86d6 avm2: Convert sprite to use ParametersExt 2023-03-17 20:40:33 +01:00
Nathan Adams b19ddbe0fc avm2: Convert stage to use ParametersExt 2023-03-17 20:40:33 +01:00
Tom Schuster 750291c993 avm2: Stub XML settings 2023-03-17 14:25:19 -05:00
Aaron Hill 9ff6ee21df avm2: Handle early class lookup during parameter resolution
This factors out the early-resolution logic I added in `op_coerce`,
making it useable during paramter resolution as well. This lets
a static initializer reference the containing class in parameter
types, even though the ClassObject hasn't yet been initialized.
2023-03-17 13:23:14 -05:00
Aaron Hill ba88b52167 avm2: Correctly apply 'skip_next_enter_frame' to Loader
We were missing the initial 'set_skip_next_enter_frame(true)'
call, and we weren't properly clearing it in `enter_frame`.
Loaders appear to have the same behavior as MovieClips.

This makes us correctly run the first framescript for the loaded
SWF.
2023-03-17 12:44:56 -05:00
nosamu 33f585fa6c avm2: Stub TextField.mouseWheelEnabled 2023-03-17 18:05:14 +01:00
Tom Schuster b791c402d2 avm2: Stub flash.net.sendToURL 2023-03-17 17:49:53 +01:00
Aaron Hill 605b5fe09a avm2: Correctly declare Array.removeAt as an AS3/prototype method
It was incorrectly declared as public method, which lead to
spurious 'missing override' errors in classes extending Array
that define a 'removeAt' method.
2023-03-17 17:00:47 +01:00
MrCheeze 8c180f97b6 core: Allow duplicate frame and scene labels (close #9943) 2023-03-17 12:54:16 +01:00
Aaron Hill 1edcbe438d core: Avoid several BitmapData GPU -> CPU sync
We don't need to perform a sync when getting the width/height,
getting or setting the 'disposed' status, or uploading to
a Context3D texture.

The Context3D change (using `copy_texture_to_texture` instead
of relying on the CPU pixels) has the added advantage of avoiding
a validation error when our source image row length isn't aligned
to `COPY_BYTES_PER_ROW_ALIGNMENT`

This dramatically speeds up the Fancy Pants World 4 loading time
(on a branch with my XML prs merged). Without this change, my
machine spends around 10 seconds on a blank white screen after
clicking 'Play'. With this change, the time spent on that screen
is reduced to around 1-2 seconds.
2023-03-17 04:56:03 -05:00
EmperorBale dd33a8a698 avm2: Make `get_lex` & `find_prop_strict` throw AVM Errors 2023-03-16 22:33:23 -07:00
Mike Welsh 0c38f9a2e1 avm2: Update `SoundChannelObject::position` on read (fix #9952)
`SoundChannel.position` was being updated by the audio manager each
tick, but the Flash Player only updates and caches the position
when `SoundChannel.position` is accessed. In contrast, an AVM1
`Sound` will constantly update its position.

This means accessing `position` only once after a sound has
finished playing will return 0.

Fixes #9952.
2023-03-16 21:25:41 -07:00
Aaron Hill c73f68207b avm2: Add support for orphan Loader instances
Despite not being MovieClips, Loader instances appear to get
the same kind of orphan handling - you can instantiate a
Loader and call 'Loader.load' without ever adding it
to a parent, and the loader will still run.

I've changed the movie code to work with a new `DisplayObjectWeak`
enum. Currently, this just supports `MovieClip` and `Loader`,
but it can easily be extended if we ever need other weak display
objects.

This also fixes a bug where we were adding the loaded MovieClip
as a child of the Loader slightly too early.
2023-03-16 20:55:06 -05:00
Aaron Hill 32f8330199 avm2: Implement xml descendants operator, and XMLList.toXMLString
This includes the 'GetDescendants' opcode, which is used by the
the 'xml..elementName' syntax. The 'XMLList.toXMLString()
impl makes it much easier to write tests for this.
2023-03-16 18:00:20 -05:00
Aaron Hill 53c6011ade render: Support more Context3D texture formats
None of these formats can currently be implemented
correctly with wgpu, so we just use Rgba8Unorm instead.

The handling of opaque compressed textures is a little
sketchy - it should work for 'normal' SWFs that upload
an opaque BitmapData, but we might need to manually
adjust the alpha values if
2023-03-16 17:40:41 -05:00
Aaron Hill 8d40734482 avm2: Convert Sound and SoundChannel to ActionScript classes 2023-03-16 23:20:59 +01:00
Nathan Adams 74c28723e5 avm2: Use object_to_matrix in new Graphics methods 2023-03-16 23:06:22 +01:00
Nathan Adams 7069cf6219 chore: Appease the as style checker 2023-03-16 23:06:22 +01:00
Nathan Adams 933dadea24 avm2: Implement Graphics.lineGradientStyle and Graphics.beginGradientFill 2023-03-16 23:06:22 +01:00
Nathan Adams 70cdf1686d avm2: Implement Graphics.lineBitmapStyle and Graphics.beginBitmapFill 2023-03-16 23:06:22 +01:00
Nathan Adams 65b9b20237 avm2: Stub various Graphics methods 2023-03-16 23:06:22 +01:00
Nathan Adams a1fc140ee1 avm2: Implement IGraphicsPath 2023-03-16 23:06:22 +01:00
Nathan Adams 878c58c7c9 avm2: Implement IGraphicsFill 2023-03-16 23:06:22 +01:00
Nathan Adams 4e98898ff9 avm2: Implement IGraphicsData 2023-03-16 23:06:22 +01:00
Nathan Adams 3071020309 avm2: Implement IGraphicsStroke 2023-03-16 23:06:22 +01:00
Tom Schuster 28b5c9051c avm22: Stub Namespace.prefix and Namespace.uri 2023-03-16 16:52:37 -05:00
Tom Schuster d2754bc599 avm2: Stub XML.namespace 2023-03-16 16:52:37 -05:00
Nathan Adams 8a2d440323 avm2: Fix BitmapData.hitTest for out-of-bounds values 2023-03-16 22:31:55 +01:00
Nathan Adams a010bd0f7a avm2: Implement BitmapData.hitTest 2023-03-16 22:31:55 +01:00
Aaron Hill 04babed66c avm2: Implement XML.appendChild for XML objects
This adds a reference to the passed-in XML object to
the children list. The object will compare === with
'parent.children()[newChildIndex]`
2023-03-16 15:48:36 -05:00
Aaron Hill 24c7ca838b avm2: Implement IndexBuffer3D.uploadFromByteArray 2023-03-16 15:22:07 -05:00
Aaron Hill 8b92b2cf7c avm2: Implement adding attribute to XML object
We only support values that are neither XML nor XMLList,
since we can't yet properly stringify those.

Attempting to modify an existing attribute throws an error.
2023-03-16 14:41:01 -05:00
EmperorBale 3412833ee2 avm2: Implement Namespace constructor 2023-03-16 12:04:29 -07:00
Nathan Adams d22b07167c avm2: Implement XML.nodeKind 2023-03-16 07:34:20 +01:00
Tom Schuster acd160674a avm2: Stub CurrencyFormatter constructor
Fixes #9729
2023-03-16 06:30:16 +01:00
Lord-McSweeney ee35dbb36e avm2: Stub DisplayObject.accessibilityProperties 2023-03-16 06:17:44 +01:00
Lord-McSweeney 352d0df71f avm2: Stub DisplayObject.accessibilityProperties 2023-03-16 06:17:44 +01:00
Aaron Hill 3232690c8e avm2: Add DoAbc2 tag name to GlobalInit call stack node
This can help determine which DoAbc2 file contains the script
initializer that appears in a stack trace (though the name
can be empty).
2023-03-16 05:57:04 +01:00
Nathan Adams 19aee77570 avm2: Replaced args.get((d+)).cloned().unwrap_or(Value::Undefined).coerce_to_string(activation) with args.get_string(activation, \d) 2023-03-16 05:43:48 +01:00
Nathan Adams 791cb4c2a8 avm2: Replaced args.get(0).unwrap_or(&Value::Undefined).coerce_to_i32(activation) with args.get_i32(activation, 0) 2023-03-16 05:43:48 +01:00
Nathan Adams 8e1097c31e avm2: Replaced args.get(0).unwrap_or(&Value::Undefined).coerce_to_u32(activation) with args.get_u32(activation, 0) 2023-03-16 05:43:48 +01:00
Nathan Adams 52f020a35e avm2: Replaced args.get(0).unwrap_or(&Value::Undefined).coerce_to_string(activation) with args.get_string(activation, 0) 2023-03-16 05:43:48 +01:00
Nathan Adams 641162d4c7 avm2: Replaced args.get((d+)).cloned().unwrap_or(Value::Undefined).coerce_to_boolean() with args.get_bool(\d) 2023-03-16 05:43:48 +01:00
Nathan Adams 7e3665d12c avm2: Simplify parameter usage in graphics 2023-03-16 05:43:48 +01:00
Nathan Adams 50cf7df15d avm2: Simplify parameter usage in display_object 2023-03-16 05:43:48 +01:00
Nathan Adams dbd3e6c4ab avm2: Simplify parameter usage in bitmap 2023-03-16 05:43:48 +01:00
Aaron Hill b140ce6d97 avm2: Implement XML construction from XML and XMLList objects 2023-03-16 05:04:26 +01:00
TÖRÖK Attila 79dfeaf715 core/avm2: Use an actual FFT library in computeSpectrum 2023-03-16 04:42:42 +01:00
TÖRÖK Attila 96d1f19e6c
chore: Port to bitflags 2.0.0
* Bump bitflags to 2.0.0
* Sprinkle Clone, Copy, Eq, PartialEq, and Debug derives where needed
* Call `bits` on bitflags, as it is now a method
* Switch from `from_bits_truncate` to `from_bits_retain` on bitflags where needed
* Bump h263-rs for the bitflags 2.0.0 dependency

As part of porting to bitflags 2.0.0, see:
https://kodraus.github.io/rust/2022/10/07/bitflags2.html#upgrading-to-2x
2023-03-15 20:06:10 -07:00
Nathan Adams 2549990e2e avm2: Implement String.prototype methods + valueOf 2023-03-16 03:43:37 +01:00
Aaron Hill 16ff2a17e3 avm2: Stub TextureBase.dispose 2023-03-15 21:13:01 -05:00
Aaron Hill acbc802c94 avm2: Fix VertexBuffer3D.uploadDataFromByteArray size calculation
We were ignoreing 'data32PerVertex'.
To make the code clearer, I've renamed the variable to
'data32_per_vertex', and made it a 'u8' (as it has a maximum of 64)
2023-03-15 19:52:09 -05:00
nosamu 6eeb2de213 avm2: Stub flash.text.TextFormat.display getter and setter 2023-03-15 16:51:58 -07:00
nosamu 9a7b8c7e6a avm2: Add flash.text.TextFormatDisplay class 2023-03-15 16:51:58 -07:00
Nathan Adams 9c0e199fa4 avm2: Throw AVM error for null arg in removeChild() 2023-03-16 00:14:22 +01:00
Aaron Hill 92d6d652b4 avm2: Stub generateFilterRect, setStencilReferenceValue, and setSamplerStateAt
These are needed by Fancy Pants World 4
2023-03-15 17:53:07 -05:00
nosamu 0ac697059f avm2: Stub Loader.unloadAndStop 2023-03-15 15:08:13 -07:00
Aaron Hill 4618511771 avm2: Add custom call handlers and implement it for XML
The XML call handler is implemented as 'new XML(arg)',
so we get all of the related string coercions for free.

Our various native tables are starting to get somewhat wasteful -
if we add any more, we might want to consider a more compact
representation.
2023-03-15 16:47:32 -05:00
Tom Schuster d7f99527db avm2: Partly implement XML.toString 2023-03-15 16:18:35 -05:00
Bale bb2d88b1d8 chore: Fix typo in comment 2023-03-15 13:57:58 -07:00
Aaron Hill ccf263fdf4 avm2: Implement Array.removeAt 2023-03-15 14:45:57 -05:00
Aaron Hill ef719c323e avm2: Add several more Matrix3D methods
These implementations are ported from the MIT-licensed OpenFL
code.
2023-03-15 11:02:27 -05:00
Jay Sackwild 4707a6b0e9
core: Enable click events on non-selectable text fields (#10005) 2023-03-15 11:01:33 +00:00
Nathan Adams 9e6a1f3234 core: Slightly neater way to get root_mc in context_menu.rs 2023-03-15 10:18:32 +01:00
Nathan Adams c116f29821 core: Run avm2 timers when rootless 2023-03-15 10:18:32 +01:00
Nathan Adams a87bbfb40e core: Don't panic flushing AVM1 sharedobjects if there's no root movie 2023-03-15 10:18:32 +01:00
Nathan Adams 75bf002fc6 core: Make Stage::root_clip() return Option 2023-03-15 10:18:32 +01:00
Nathan Adams 853a2cdcc1 avm2: Implement BitmapData.threshold 2023-03-15 01:24:20 -07:00
Aaron Hill 6bf17158cf avm2: Skip running enter_frame for children as well
When we skip running a frame for a MovieCilp, we skip all
of its children as well. However, this skip 'counts' as
a skip for any children that already wanted to skip their next
frame. For example, say  we create three objects in ActionScript,
and arrange them like 'obj1 -> obj2 -> obj3'.
The first 'obj1.enter_frame' call will not run a new frame
for any of the objects, but next time, 'obj1.enter_frame'
will run a new frame for all of the objects.

This fixes jacksmith, which was missing a frame1-framescript
due to 'enter_frame' getting incorrectly run for a deeply
nested child.
2023-03-14 23:19:53 -07:00
Aaron Hill c004101bfe core: Cache 'width' and 'height' in Bitmap when BitmapData is set
If you call 'BitmapData.dispose()', any Bitmap objects using it will
continue to report the original 'width' and 'height' values to
ActionScript. The values only refresh if you explicitly do
'Bitmap.bitmapData = bitmapDataObject' (including with the same
object).

Fancy Pants Adventure World 4 relies on this - it calls
BitmapData.dispose(), and then uses the width and height from
a previously-constructed Bitmap object.
2023-03-14 23:00:08 -07:00
Tom Schuster 1f8dccf5a2 avm2: Support wildcard/any name in XMLList get_property_local
This is similar to #10018. Improves #8330.
2023-03-14 20:00:05 -05:00
Lord-McSweeney a00af10182 avm2: Fix stub type for Responder 2023-03-14 08:18:56 +01:00
Nathan Adams 74d424e82f avm2: Add ParamtersExt::get_value 2023-03-14 07:35:52 +01:00
Nathan Adams df29536197 avm2: Document ParametersExt and replace get() with [] 2023-03-14 07:35:52 +01:00
Nathan Adams fb0c9fd481 avm2: Make ParametersExt expect() values to always exist from AS 2023-03-14 07:35:52 +01:00
Nathan Adams 85f1b5b428 avm2: Replace get_object_of_class with get_object as coercion already happens in AS definition 2023-03-14 07:35:52 +01:00
Nathan Adams 4fd0db2791 avm2: Introduce ParametersExt and use it inside bitmapdata 2023-03-14 07:35:52 +01:00
EmperorBale b880cfec7e core: Update regress to version 0.5 2023-03-14 07:14:17 +01:00
nosamu e1c6fc33e9 avm2: Implement URLVariables.decode 2023-03-13 16:49:43 -07:00
Aaron Hill 97d6de1a46
avm2: Improve handling of timeline-removed orphans (#9928)
When a DisplayObject is removed from its parent by a RemoveTag, it still runs its framescript for the current frame (but with 'this.parent == null'). It then stops executing entirely, unlike ActionScript-removed orphans, which continue to execute indefinitely.

Additionally, objects created by ActionScript during a frame skip their next 'enterFrame' logic (but still receive an enterFrame event). This results in the currentFrame lagging one frame behind objects that were placed by the timeline during the same frame.

The combination of these two changes lets us greatly simplify frame lifecycle handling for orphan movies. Most of the orphan stages were unencessary, and the remaining ones run in the same phase as the normal Stage-descendant objects.
2023-03-13 23:37:11 +00:00
Tom Schuster 5646e93b0c avm2: XML child/attribute should support the wildcard 2023-03-13 18:13:53 -05:00
Aaron Hill fea885f3af render: Implement Context3DTextureFormat.BGRA using an RGBA texture
Webgl doesn't support BGRA textures, so this lets us use
Stage3D textures on the web backend. As a bonus, this speeds up
uploading an BitmapData to a Context3dTextureFormat.BGRA texture,
since we no longer need to change the format before copying.

This makes Solarmax2 playable on the web backend.
2023-03-13 13:30:15 -05:00
Adrian Wielgosik 38c585a8f9 avm2: Store the activation class on method 2023-03-13 10:23:08 -05:00
Aaron Hill 66aad3ebc5 core: Use a separate matrix for stage alignment and HiDPI scaling
The stage alignment settings viewport_scale_factor should *not* be
applied to `Stage.transform.matrix`, which is only ever changed
as a result of explicit modification from ActionScript. Instead,
alignment and scaling are performed a separate step, which is
transparent to ActionScript.

I've implemented this through a new `viewport_matrix` field,
which is used during stage rendering and mouse coordinate
transformation.

This makes Stage3D instances properly scale - previously, they
would render unscaled. The linux standalone Flash Player doesn't
seem to use HiDPI mode, so I didn't realize that this was a bug
until now.

In the process of implementing this, I discovered and fixed a bug
with how we handle changing the viewport size under winit.
Calling `self.window.set_inner_size` does not immediately take
effect (at least on X11) - calling `self.window.inner_size()`
will report the old size until the next resize event.
Since build our Stage matrices from `self.window.inner_size()`
(and start running the SWF) immediately after `RuffleEvent::OnMetadata`,
we would run a few SWF frames with an incorrect viewport size. This
is visible to SWFs that have the scale mode set to "noScale", and
could break SWFs that expect the initial viewport size to be
the movie size. I've fixed this by delaying SWF execution until
we get a Resize event (if `self.window.inner_size()` does not
immediately report the size we set).
2023-03-13 02:02:40 -05:00
Nathan Adams b527054a1e
render: Make retrieve_offscreen_texture pass the raw buffer (#9936) 2023-03-13 00:00:42 +00:00
Aaron Hill de8448e00a
avm2: Implement Stage3D depth test, blend factors, and fix bugs (#9845) 2023-03-12 23:43:58 +00:00
Tom Schuster 3d29b81a8c avm2: Support any name in XML get_property_local
Fixes #9999
2023-03-12 18:32:11 -05:00
Tom Schuster f53c83cfa4 Partly implement XML child and elements
This makes #3294 (rollercoaster-creator-2) fully playable.

Missing is any (*) matching for child()/elements() and the existing attributes() method.
Also missing is support for number indexes with child().
2023-03-12 18:06:13 -05:00
Jay Sackwild 1deebc87e8
Support click events on movie clips containing text fields (#9995)
Remove code that prevents click events from working on text fields within movie clips
2023-03-11 22:19:48 +00:00
Lord-McSweeney 120f24b2ba avm2: Implement flash.text.CSMSettings 2023-03-11 12:27:28 -06:00
Marty_SVK 8668d83ea6 progresses Resort Empire
now it is blocked by unimplemented BitmapData.threshold
2023-03-11 15:41:46 +01:00
nosamu be153b2417 avm2: Stub Stage.fullScreenWidth and fullScreenHeight 2023-03-11 15:02:03 +01:00
Aaron Hill 7b932ca84b avm2: Implement special XML/XMLList method calling behavior
When an XML object has simple content, you can call non-XML
methods directly on it - it will internally be stringified,
and the method will be called on the resulting string.
This lets `new XML("<p>Some content</p>".split(' ')` work.

Similarly, an XMLList object with a single XML child will
forward non-XML method calls to that object.

This PR implements this logic (based heavily on avmplus)
2023-03-11 00:51:45 -06:00
Aaron Hill a8198c0fab avm2: Remove `run_frame_avm2` and FramePhase::Update
These were unused for all AVM2 objects.
I've renamed the `run_frame` method to `run_frame_avm1`,
as it's only used for AVM1-specific logic.
2023-03-10 19:37:19 -07:00
Aaron Hill 80b98a055e avm2: Stub NetConnection and Responder
These are needed for BTD5
2023-03-10 16:58:15 -06:00
Lord-McSweeney 522e781e3c avm2: Fix stub types for Font 2023-03-10 20:55:54 +01:00
Aaron Hill 8c91c734c3 core: Only apply 'unload' and 'removed' logic to AVM1
I've also renamed these methods to 'avm1_unload' and
'avm1_removed', to make it clear that they don't
apply to AVM2.

This was causing us to incorrectly skip mouse picks,
and remove masks.
2023-03-09 12:34:16 -06:00
Aaron Hill fc223e959b avm2: Implement avmplus.getQualifiedClassName
This appears to be the same function as
'flash.utils.getQualifiedClassName'
2023-03-08 16:59:40 -06:00
Aaron Hill 8ac64289b3 avm2: Handle coercing to a class while it's being initialized
I think this might have been broken by
https://github.com/ruffle-rs/ruffle/pull/9506, but we didn't have
proper test coverage.

If we execute a 'coerce' opcode for a class while it's being
initialized (which can happen by running a method from a static
initializer), we'll be unable to resolve the ClassObject using
`resolve_type`.

This is the only case where this can happen - any
superinterfaces/superclass will already be fully initialized
when we're running a class initializer. Therefore, we can
try to lookup the class from the `Domain`, and check if it
directly matches the class of the object we're coercing
(ignoring superclasses and interfaces).
2023-03-08 16:38:24 -06:00
Aaron Hill c6c021f7f6 core: Fix setting certain DisplayObject properties to NaN
This doesn't perfectly match Flash's behavior - I haven't been
able to reproduce the values produces when the DisplayObject
starts out with certain 'Matrix' values (a non-zero 'b' or 'd').

Howver, when the 'b' and 'd' matrix values are both 0, setting
'dobj.rotation = NaN' has no effect on the matrix, while
'dobj.scaleX = NaN' and 'dobj.scaleY = NaN' both treat 'NaN'
as 0 for the purposes of updating the matrix.

This fixes the tack shooter in Bloons Tower Defense 3, which
tries to set 'rotation = NaN' for spawned tacks.
2023-03-08 16:17:38 -06:00
Aaron Hill 2c1936db18 avm2: Fix QName::from_qualified_name for Vector.<some_ns::Type>
We weren't handling names like
`__AS3__.vec::Vector.<rs.ruffle.CustomClass>`
2023-03-08 15:15:55 -06:00
EmperorBale 683f6cc890 avm2: Implement `unescape` 2023-03-07 23:49:55 -08:00
EmperorBale cbb2d81240 avm2: Add Mutex.isSupported property 2023-03-07 23:38:24 -08:00
Aaron Hill 7ab7c31bb6 avm2: Run orphan framescripts that didn't get a chance to run
This is necessary to make Steambirds get past the preloader screen.
All of the previous tests continue to pass with this change.

This commit modifies the existing test to start from within
the symbol_class constructor, instead of a frame script. In
this situation, a freshly-created orphan with a framescript will
run directly after the constructor returns, *before* an enterFrame
handler for the same orphan. I've verified that this modified test
fails without my change.
2023-03-07 18:29:23 -06:00
Aaron Hill 93834b63de avm2: Don't allow mouse picking to hit a mask
Masks restrict the region where the maskee can be hit,
but the mask cannot itself be the target of a mouse click
(assuming that it's on the stage).
2023-03-07 17:34:06 -06:00
Aaron Hill b27bcf367c avm2: Fix handling of completed timers
It's possible to call 'start()' on a timer
that has currentCount >= repeatCount. This will
cause the timer to tick exactly once, and then stop agian.

We were incorrectly reporting 'timer.running' in such a scenario:
'running' should be reported as 'true' up until just before the
'TimerEvent.TIMER_COMPLETE' is fired.

This fixes gaining money from bloon popping / level completion
in BTD5.
2023-03-07 16:56:29 -06:00
Aaron Hill 92776645b8 avm2: Initialize LoaderStream and Loader child before catchup_display_object_to_frame
Depending on when loading completes, calling
`catchup_display_object_to_frame` might trigger an
`addedToStageEvent` inside the loaded SWF. The event listener
will expect the SWF content to have 'DisplayObject.stage' accessible,
so we need to make sure that we've added our loaded content as
a child of the `Loader` *before* any event handlers run.

I've been unable to come up with a self-contained test for this,
but it's necessary for Bloons Tower Defense 5
2023-03-07 16:36:21 -06:00
Aaron Hill b8f0de8171
avm2: Export Vector classes in public __AS3__.vec namespace (#9879)
Previously, the Vector$ classes were only exported in the internal 'AS3.vec' namespace, which is used by older ActionScript code. However, newer ActionScript code can also access these classes through the public 'AS3.vec' namespace, via 'getDefintionByName'.

We now export these classes in both namespaces. In the public 'AS3.vec' namespace, they are exported like 'Vector.' instead of 'Vector$uint'
2023-03-07 22:22:24 +00:00
Jesse Talavera-Greenberg 17688dd652
core: Derive Clone and Copy in PlayerEvent (#9882) 2023-03-07 16:37:56 +00:00
Nathan Adams b15463d3fd avm2: Stub BitmapData.hitTest 2023-03-07 09:10:26 -06:00
Aaron Hill 1a7022c30b avm2: Consider noninteractive child/drawing when mouseEnabled=false
We still want to propagate these hits to the parent, which may
be able to handle them. My existing tests missed this case,
since all of the parent objects had content which was
behind the child content. When the only clickable content
comes from a child with 'mouseEnabled=false', we should
still fire an event targeting the parent (when applicable
based on the parent's flags).

This fixes dragging on the background (without any scenery present)
in Steambirds.
2023-03-07 08:14:22 -06:00
Lord-McSweeney 046af7bc4a avm2: Add EventPhase to globals.as
This was missed
2023-03-06 23:13:12 -06:00
Aaron Hill d72a8e7125 core: Run frames for 'orphan' AVM2 MovieClips
When a MovieClip is an 'orphan' (it has no parent),
it still has frames run (including frame scripts). Some SWFS
like SteamBirds and 'This is the Only Level TOO' rely on this behavior,
so we need to implement it.

The overall idea is straightforward - we keep a global list of
orphan movies, which we add to whenever we unset the parent for a movie.
This list stores weak references for consistency with Flash.
When we run a frame, we process entries in the root movie list,
in addition to the normal recursive processing from the `Stage`.

However, exactly matching Flash's output turned out to be quite tricky.
The particular sequence of calls I make in `run_all_phases_avm2` makes Ruffle
pass two complicated test cases, but there could still be lurking bugs.

This is enough to get SteamBirds to the first level (which doesn't
render due to a different error).
2023-03-06 20:53:35 -06:00
Aaron Hill fde46a72a4 avm2: Fix mouse picking on MovieClip in 'button mode'
We were previously performing a redundant 'self.hit_test_shape'
call in 'avm2_mouse_pick'. All of the logic in that function
is handled in `avm2_mouse_pick.` Additionally, this call happened
before we tested out children, which would result in us targeting
a parent's drawing instead of aa child.
2023-03-06 15:57:46 -06:00
Adrian Wielgosik be2d5faa6f avm2: Implement proxy.isAttribute() 2023-03-06 19:48:23 +01:00
Lord-McSweeney 3cb307bfb0
avm2: Implement String.toString (#9872)
Some SWFs use this property
2023-03-06 05:57:02 +00:00
EmperorBale 2b1918316d avm2: Require multinames to be passed explicitly to QNameObject 2023-03-05 21:32:40 -08:00
EmperorBale ac9106ccb4 chore: Cleanup multiname creation in XML 2023-03-05 21:32:40 -08:00
EmperorBale f95599b816 avm2: Store Multiname instead of QName in QNameObject
avm2: Fix QName constructor
2023-03-05 21:32:40 -08:00
renovate[bot] 130144a76d fix(deps): update rust dependencies 2023-03-05 20:43:46 -06:00
Aaron Hill bb5e568333 avm2: Stop after the first DisplayObject-linked class in the chain
Surprisingly, Flash allows mutliple classes in an inheritance chain
to hav a linked `class_symbol`. When we instantiate a `DisplayObject`,
we need to stop at the first such `class_symbol` we find. This means
that any fields set from named children will *only* be set in the
first class we find, not in any of the parent classes (as their
corresponding library symbol will not be instantiated).

Previously, we would continue looping even after we found a
`class_symbol`, resulting in the furthest ancestor *winning*
the `set_object2` call.
2023-03-05 18:04:02 -06:00
Lord-McSweeney b919889174 avm2: Stub DisplayObject.scale9Grid 2023-03-04 19:29:11 -08:00
Aaron Hill e6bbb627d7 avm2: Implement KeyboardEvent.keyLocation getter/setter 2023-03-04 18:30:12 -06:00
relrelb 83c15b8033 render: Replace `BoundingBox` with `swf::Rectangle` 2023-03-04 21:54:23 +02:00
relrelb 5756c847cd swf: Make `Twips::new` a `const fn` 2023-03-04 21:54:23 +02:00
Aaron Hill 3c03a769dc avm2: Format Matrix3D.as 2023-03-03 18:32:04 -06:00
Aaron Hill a4c8f27743 avm2: Implement Matrix3D.appendScale
This is based off the the MIT-licensed OpenFL code, which
just needed a few tweaks to convert it from Haxe to ActionScript.
2023-03-03 18:32:04 -06:00
Aaron Hill 1ef539e31b avm2: Implement Capabilities.isDebugger and stub System.disposeXML
These are needed for Solarmax 2
2023-03-03 16:51:54 -06:00
Aaron Hill 2748b95c86 avm2: Improve Stage3D support for textures, register types, and opcodes
This is a very large diff, but most of it comes from test files and
output.

This PR ads partial support for the following Stage3D shader features:
* Normal (square), rectangle, and cube textures
* Varying and temporary registers
* Lots of opcodes

The combination of these allows us to get a raytracing program
fully working in Ruffle. I've included it as image test.
Currently, this test is very slow (about 90 seconds on my machine),
as the code I'm using (https://github.com/saharan/OGSL) includes
its own shader language and compiler. THe raytracing demo
first compiles its own shader language to AGAL, and then starts
rendering the scene.

Limitations:
* Many opcodes are still unimplemented
* Most non-default texture options (e.g. mipmaps) are not implemented
2023-03-03 15:58:46 -06:00
Aaron Hill 1d883688e0 avm2: Correctly check when toJSON is missing, and use vtable properties
We were previously calling `get_property` to determine if a `toJSON`
property exists, but that produces an error if the method is missing
on a sealed class.

Additionally, JSON serialization wasn't taking into account properties
from the vtable. All public properties (including fields, const fields,
and getter methods) get serialized.

Unfortunately, our vtable property order currently doesn't match
Flash's. I've hand-edited the test output for now (all of the actual
properties are there, just in a different order), and added a note
2023-03-03 15:34:26 -06:00
Adrian Wielgosik 1ba3ec0bf0 avm2: Implement BitmapData.getVector 2023-03-03 12:47:54 +01:00
Aaron Hill a07ff36726 avm2: Implement describeType
This includes all of the XML elements described in 'describeType' docs.
Unfortunately, the order of elements produced by Flash depends on
the iteration order of internal hashtables. As a result, the test
manually stringifies an XML object, sorting the stringified children,
to produce consistent output between Flash and Ruffle.
2023-03-02 20:37:59 -06:00
Lord-McSweeney a2150cbbbf avm2: Implement IExternalizable interface 2023-03-02 01:32:43 -06:00
Nathan Adams fcaa17308c avm2: Workaround haxe calling addChild(this) before super() 2023-03-02 00:38:24 +01:00
Nathan Adams bcc4e63144 core: Inline to_un_multiplied_alpha_accurate 2023-03-01 23:24:35 +01:00
Nathan Adams 6bcb64e52a core: Use slightly more accurate to_un_multiplied_alpha version in copy_pixels to fix tests 2023-03-01 23:24:35 +01:00
Nathan Adams 6e5e8b13fc core: Use a lookup table in Color::to_un_multiplied_alpha to match Flash's output 2023-03-01 23:24:35 +01:00
CUB3D ceda614add avm1: Don't use stack_push when the pushed value can't be an Object 2023-03-01 22:36:39 +01:00
CUB3D 4723c0414b avm1: Remove resolved todos, add comment and test about known reference launder issue 2023-03-01 22:36:39 +01:00
CUB3D af9810c22e avm1: More scope fixes 2023-03-01 22:36:39 +01:00
CUB3D 6a5eb43274 avm1: Fix getVariable when path is an object+var and object is a clip 2023-03-01 22:36:39 +01:00
CUB3D ca0e2488cb avm1: Dont double borrow the cache, update test output 2023-03-01 22:36:39 +01:00
CUB3D ae9538c3c7 avm1: Fix beta clippy 2023-03-01 22:36:39 +01:00
CUB3D 6d4c04c1c3 avm1: Cleanup todos, add even more tests 2023-03-01 22:36:39 +01:00
CUB3D 0d5258fa2a avm1: Remove some mc todos 2023-03-01 22:36:39 +01:00
CUB3D 6ba75d6045 avm1: Refactor movieclip path logic 2023-03-01 22:36:39 +01:00
CUB3D 693e29a82d avm1: Fix test failures 2023-03-01 22:36:39 +01:00
CUB3D d1d38091ff avm1: Fixup clippy lints and formatting 2023-03-01 22:36:39 +01:00
CUB3D c6ff8a801b avm1: Fallback to resolving properties on _root when the are not in the current scope 2023-03-01 22:36:39 +01:00
CUB3D 3d3f279160 avm1: In swfv5, resolving a non MovieClip path, should resolve to the first MovieClip parent 2023-03-01 22:36:39 +01:00
CUB3D 611c86df94 avm1: Temporary fix, block events when clips are removed 2023-03-01 22:36:39 +01:00
CUB3D a282d06ab7 avm1: Locals on removed DisplayObjects can't be accessed, should be undef 2023-03-01 22:36:39 +01:00
CUB3D a67976f601 avm1: Fix add2 coerce 2023-03-01 22:36:39 +01:00
CUB3D 1fdd8f1a82 avm1: Timers attached to clips don't fire when the clip is removed 2023-03-01 22:36:39 +01:00
CUB3D 9b850e7615 avm1: Correctly invalidate cache on clip removal 2023-03-01 22:36:39 +01:00
CUB3D cb3d9f99a7 avm1: Cache MovieClips in Value::MovieClip, this is required to correctly handle changing DO._name and for perf 2023-03-01 22:36:39 +01:00
CUB3D 6a9e13814a avm1: Don't convert SuperObjects to Value::MovieClip, or you break classes 2023-03-01 22:36:39 +01:00