Commit Graph

4364 Commits

Author SHA1 Message Date
= fd7086adef video: Moved EncodedFrame, DecodedFrame and FrameDependency from core to video 2022-09-04 17:46:58 -07:00
= b7cf800f88 video: Made ruffle_video crate, moved core video Error to it 2022-09-04 17:46:58 -07:00
= 72da1535b7 core: Made video::Error not depend on invidiaul codecs 2022-09-04 17:46:58 -07:00
Adrian Wielgosik acdb767862 avm2: Swap Multiname flags to bitflags 2022-09-04 16:56:32 -07:00
Adrian Wielgosik 782f670c39 avm2: Store uninitialized Multinames in txunit, behind Gc 2022-09-04 16:56:32 -07:00
Adrian Wielgosik c28549ed9e avm2: Store multi-namespaces behind Gc And single namespaces directly 2022-09-04 16:56:32 -07:00
EmperorBale dd2bc1ea78
avm2: Add automatic linting for AS3 playerglobals 2022-09-04 16:33:35 -07:00
= ce0752c225 avm1: Removed export of SystemPrototypes and SharedObject 2022-09-04 12:27:29 -07:00
= 6ed1dd5942 avm1: Replace avm1::AvmString with string::AvmString 2022-09-04 12:27:29 -07:00
= ddaee950f8 avm1: Removed all public access into Avm1 modules, export only what's needed 2022-09-04 12:27:29 -07:00
= 7d7309d165 avm1: Moved start_drag from Avm1 root to activation module 2022-09-04 12:27:29 -07:00
= f2c9ae7c50 avm1: Moved root_error_handler from avm1 root to runtime module 2022-09-04 12:27:29 -07:00
= 7645c84980 avm1: Moved skip_actions from avm1 root to runtime module 2022-09-04 12:27:29 -07:00
= 2d24ed539e avm1: Moved Avm1 struct into its own file, fixing field access as needed 2022-09-04 12:27:29 -07:00
Adrian Wielgosik 9cf6f64d06 avm2: Guarantee that int+/-int makes an int 2022-09-04 08:57:18 +03:00
Adrian Wielgosik cc6abab72f avm2: Remove Value::Unsigned, add minimal implicit int->float conversion 2022-09-04 08:57:18 +03:00
TÖRÖK Attila 2b681e85b2 avm2: Remove unnecessary `extends Object` from some class stubs
As it's implicit.
2022-09-03 10:43:33 -07:00
TÖRÖK Attila 27b67d01d0 avm2: `Vector` -> `Vector.<Number>` in `ShaderEvent` 2022-09-03 10:43:33 -07:00
TÖRÖK Attila 92a2b6206e avm2: Fix the stub for `Vector` 2022-09-03 10:43:33 -07:00
relrelb 32c55dda22 core: Avoid some clones of `Matrix` and `ColorTransform`
Change `set_matrix` and `set_color_transform` to accept owned structs,
instead of references. This allows callers that already have an owned
struct to pass it directly, thus saving an unnecessary borrow + clone.

This also aligns with other methods, such as `set_sound_transform`,
which currently accepts an owned struct.
2022-09-03 09:36:51 -07:00
TÖRÖK Attila 2e3fad9165 core: Log errors coming from timer callbacks 2022-09-02 22:22:03 -07:00
TÖRÖK Attila 89434d65e8 core: Don't panic when an error occurs in an AVM2 timer callback 2022-09-02 22:22:03 -07:00
TÖRÖK Attila f75eee389a core/mp3: More lenient MP3 buffer underrun detection 2022-09-02 20:38:24 -07:00
relrelb fb39bb2b71 swf: Remove `Copy` from `Rectangle`
Use `.clone()` explicitly where needed.
2022-09-02 18:21:13 -07:00
relrelb 299da43c16 swf: Extract `ShapeFlag` 2022-09-02 18:21:13 -07:00
Aaron Hill ae452d29b8 avm2: Stub DisplayObject.mask getter/setter
This allows the loaded ArmorGames API swf to run in
'This is the only level too'
2022-09-02 17:12:18 -07:00
relrelb af006a3053 avm1: Introduce `NativeObject`
The existing `Object` enum representation is problematic for inherited
native objects, since "regular" `ScriptObject`s cannot be turned into
native objects, but rather a completely new native object needs to be
created. `TObject::create_bare_object` is an attempt to aid this
situation, but it works only for `ActionExtends` inheritance, and not
when the user manually wires up `prototype`/`__proto__` (#701).

In Flash, it seems like derived constructors initially have a "regular"
`this` object. But once the `super()` constructor is invoked, the same
`this` object becomes a native object.

To allow this in Ruffle, introduce a new `NativeObject` enum, and
store it as a member in `ScriptObject`. For a start, move `TextFormatObject`
from the `Object` enum to `NativeObject`. The plan is to gradually
move all `Object` enum variants to `NativeObject`, except for `ScriptObject`.
2022-09-02 16:41:27 -07:00
golfinq 08917b49cb
avm2: Add actionscript event classes 2022-09-02 14:35:01 -07:00
Aaron Hill 7a7ea87679 avm2: Implement Sprite.startDrag and Sprite.stopDrag
For now, I've left 'dropTarget' unimplemented - unlike in
AVM1, the drop target can be non-interactive objects like `Shape`,
so we'll need additional refactoring to implement it.

This allows 'This is the only level too' to be playable
2022-09-02 13:03:14 -07:00
relrelb d2a463b08f core: Remove unused parameter of `MovieClip::show_frame` 2022-09-02 10:42:09 -07:00
relrelb 16a1b7b832 swf: Remove `length` parameter of `read_frame_label`
Use `unwrap_or_default()` to optionally read a byte.
Also remove unused `context` parameter of `MovieClip::frame_label`.
2022-09-02 10:42:09 -07:00
relrelb 9ec3137891 swf: Remove `tag_length` parameter of `read_define_button_cxform`
It was not needed since `Reader` accounts for it internally.
2022-09-02 10:42:09 -07:00
relrelb 3da3567365 core: Avoid some allocations on JPEG tags
Read a slice instead of allocating a new `Vec`.
2022-09-02 10:42:09 -07:00
relrelb cc166439d8 avm2: `Activation::is_of_type` is infallible 2022-09-02 10:10:40 -07:00
relrelb ce5bf557f5 avm2: `ExternalValue::from_avm2` is infallible 2022-09-02 10:10:40 -07:00
relrelb c2e78ffead chore: Appease clippy
Resolve 2 instances of `only_used_in_recursion`.
2022-09-02 10:10:40 -07:00
relrelb 0d6462cfab render: Remove `gc-arena` dependency
It was only used to make structs `#[derive(gc_arena::Collect)]`, and
generally it doesn't make much sense that `render` needs to be GC-aware.
So instead annotate `render` fields in `core` with `#[collect(require_static)]`.
2022-09-02 09:49:18 -07:00
Aaron Hill cc9e283191 avm2: Improve Debug impl for EventObject 2022-08-30 09:35:20 -05:00
Aaron Hill 1a7c5339a7 avm2: Implement DisplayObject.localToGlobal and DisplayObject.globalToLocal
While writing tests for these methods, I discovered and fixed some
issues with how 'scrollRect' interacted with 'dobj.transform.matrix'
2022-08-29 23:12:40 -05:00
relrelb 3645061910 core: Simplify `DisplayObjectContainer::highest_depth`
The `less_than` parameter remained just `Depth::MAX` since #7199,
which makes it useless. As such it can be removed.
2022-08-29 17:26:15 -06:00
Aaron Hill e9697439de avm2: Skip over holes during array enumeration
This brings us closer to matching the Flash Player
enumeration behavior. Unfortunately, the precise enumeration
order for ScriptObject properties depends on the precise
order in the internal avmplus hashmap. This order is deterministic,
but adding/removing a property effectively randomizes it. Hopefully
there aren't any SWFS that depend on the *exact* order.
2022-08-29 15:53:44 -07:00
dependabot[bot] 802de0e7d1 build(deps): bump futures from 0.3.23 to 0.3.24
Bumps [futures](https://github.com/rust-lang/futures-rs) from 0.3.23 to 0.3.24.
- [Release notes](https://github.com/rust-lang/futures-rs/releases)
- [Changelog](https://github.com/rust-lang/futures-rs/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rust-lang/futures-rs/compare/0.3.23...0.3.24)

---
updated-dependencies:
- dependency-name: futures
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-29 23:38:43 +03:00
Toad06 c4e64c5e26 avm1: Function calls in SWF4 bump the version to 5 2022-08-29 02:17:09 -07:00
TÖRÖK Attila e86efd5c63 avm2: Add flash.utils.[set|clear][Timeout|Interval](...) 2022-08-29 01:44:57 -07:00
relrelb 5c29da6707 avm1: Implement `MovieClip.scrollRect`
The core functionality and AVM2 bindings were implemented in #7739.
2022-08-28 22:18:33 -07:00
= f180183ec5 core: Add audio feature, made dasp optional 2022-08-28 21:10:05 -07:00
= c6c22cebc9 core: Make nellymoser optional, enable on desktop and web 2022-08-28 21:10:05 -07:00
= f5245d72da core: Make core not use minimp3 by default - only desktop uses it 2022-08-28 21:10:05 -07:00
relrelb 81f803d77e avm1: Remove `DisplayObject::prev_avm1_clip`
It is no longer needed.
2022-08-28 19:21:03 -06:00
relrelb de6163569e avm1: Simplify frame execution logic
Handle removed clips inline in `Avm1::run_frame`, such that
`DisplayObject::prev_avm1_clip` is no longer used. Thus it can be
removed in a follow-up commit.
2022-08-28 19:21:03 -06:00
relrelb 0b7d8ea007 avm1: Move frame lifecycle logic to `Avm1::run_frame`
This allows better encapsulation of AVM1.
2022-08-28 19:21:03 -06:00
Aaron Hill 397de91a2a core: Do not run sounds on no-op goto.
When we run a 'goto' where the initial and target frame are the same,
we need to skip triggering any sounds in the target frame.
Some games like 'This is the only level too' rely on this behavior:
they repeatedly run 'movieClip.gotoAndStop(current_frame_id)',
where 'current_frame_id' is the id of a frame that starts playing
a sound. Without this change, the sound will restart every frame
intead of playing exactly once.
2022-08-28 18:55:29 -06:00
David Wendt e353553835 core: When reporting errors in the AVM2 constructor from MovieClip, also report the name of the class being constructed. 2022-08-28 18:17:57 -06:00
David Wendt 4b9ee55b56 avm2: The failsafe for self-referencing class properties should allow the use of `null` and `undefined`. 2022-08-28 17:54:22 -06:00
Aaron Hill ae8e5b2f33 avm2: Don't error when executing 'null as SomeType'
We previously used 'coerce_to_object', which produced
an error with `Value::Null`. Instead, we can just ues
`value.as_type_of`, which will correctly handle `null`
2022-08-28 16:33:15 -05:00
Aaron Hill c531994b1c avm2: Fire KeyboardEvent.KEY_UP and KeyboardEvent.KEY_DOWN
The 'charCode' and 'keyCode' properties are now implemented
on `KeyboardEvent`

The input injection code we use does not support keyboard events,
so we can't yet write a regression test for this. However,
both 'You need to burn the rope' and 'This is the Only Level TOO'
now properly handle keyboard events with this PR.
2022-08-28 14:15:57 -05:00
Aaron Hill e3e0488ed4 avm2: Delete enumerant when property is deleted 2022-08-28 12:03:19 -05:00
Aaron Hill 1296121dc5 avm2: Make 'set_local_property_is_enumerable` infallible
We always returned `Ok(())`
2022-08-28 12:03:19 -05:00
EmperorBale f8289b47d8
avm2: Implement call stack & stack traces (#7564)
* avm2: Implement call stack

* avm2: Class traits should have a special prefix

* avm2: Stack tracebacks should also contain error message

* avm2: Move method naming to Executable

* avm2: Handle getter and setter methods in tracebacks

* chore: Formatting

* chore: Add comments

* avm2: Make full_name write to a string, instead of creating a new one

* core: Make GcArena publicly accessible

* core: Add Deref impl for Either type

* desktop: Add AVM2 call stack to panic message

* avm2: Prefix native methods with a `/`

* chore: Appease clippy

* avm2: Check if method actually contains bytecode instead of unwrapping

* web: Add AVM2 stack trace to panic message

* chore: Formatting

* chore: Clippy

* avm2: Fix stack traces for free standing functions

* core: Remove global data from context

* core: Rename GcGlobalData to GcCallstack

* core: Introduce StaticCallstack, make GcArena private again

Co-authored-by: Adrian Wielgosik <4729533+adrian17@users.noreply.github.com>
2022-08-28 18:30:20 +02:00
Aaron Hill 6a01fa93c5 avm2: Implement `String.toLowerCase` and `String.toUpperCase`
These are implemented in the same way as in AVM1. Testing
in Flash Player shows that the behavior is the same.
2022-08-28 01:32:53 -05:00
Aaron Hill 576c35a768 avm2: Declare 'Array.concat' as a public method
Previously, it was only declared in the AS3 namespace. However,
some SWFs look it up as a public method.
2022-08-27 20:20:19 -05:00
relrelb 2f106da04c avm2: Port toplevel constants to ActionScript
Declare `NaN`, `Infinity` and `undefined` in ActionScript, similarly
to how `avmplus` does in its `actionscript.lang.as`.

Note that `null` is only removed, without an ActionScript declaration,
as it seems like `avmplus` neither declares it. Probably `null` is
only usable as a compile-time constant.
2022-08-26 15:45:36 -07:00
Callum Thomson 046514eeb9
avm1: Enumerate should push Undefined if the target isn't an object 2022-08-26 14:01:42 -07:00
Aaron Hill 249648674c Fix bounds computation 2022-08-26 13:04:01 -07:00
Aaron Hill 5fb95e6961 Use round-to-even for scrollRect 2022-08-26 13:04:01 -07:00
Aaron Hill fa0c843a4d avm2: Implement DisplayObject.scrollRect
This property causes a DisplayObject to be both translated
and cropped.
2022-08-26 13:04:01 -07:00
relrelb 72d8c152b9 core: Make `Player::load_device_font` infallible
It is always called with the same known data, which should parse
successfully.
2022-08-26 12:24:15 -07:00
relrelb ad84c2bbcb avm2: Rename `Avm2::load_abc` to `Avm2::do_abc`
This aligns with the name of `DoAbc` tags.
2022-08-26 11:37:04 -07:00
relrelb ad91992cb5 swf: Simplify `DoAbc` tag handling
Extract `swf::Reader::read_do_abc()` which, as the name suggests,
reads a `DoAbc` tag, and use it before calling to `Avm2::load_abc`.
Finally, introduce `DoAbcFlag` using `bitflags`.
This greatly simplifies the ABC loading code.
2022-08-26 11:37:04 -07:00
EmperorBale 18bd7879e5 core: Add better error message when java could not be found 2022-08-26 10:11:35 +02:00
Aaron Hill c4157fd0ce Miscellaneous stubs
This gets Solarmax to the main level select screen
(once BitmapData.draw support is added)
2022-08-25 19:57:03 -07:00
Aaron Hill 61d0f73fdb core: Use catchup_display_object_to_frame in Loader 2022-08-25 19:24:56 -06:00
David Wendt 2c93da9a70 docs: Add comments documenting subtle points of AS3 loop & tag queueing behavior 2022-08-25 19:24:56 -06:00
David Wendt 074f2ff76f core: Replace `Vec` of queued tags with a more restrictive enum that enforces our queueing invariants 2022-08-25 19:24:56 -06:00
David Wendt 59623a8452 core: Fix a potential stack overflow caused by gotos triggering frame scripts on one another. 2022-08-25 19:24:56 -06:00
David Wendt 05caa0fceb core: Explicit gotos drain the tag queue of any prior operations.
This is in keeping with the whole idea of a "recursive frame": gotos run the entire frame lifecycle on the target clip, including broadcasts for `frameConstructed` and `exitFrame`.
2022-08-25 19:24:56 -06:00
David Wendt 6f0de246ed core: Clear queued tags if AS3 attempts a goto in the middle of a loop. 2022-08-25 19:24:56 -06:00
David Wendt ed28578c12 core: Fast-forwarding gotos should run frame scripts on all removed children 2022-08-25 19:24:56 -06:00
David Wendt bcb1030883 core: Only `Construct` and `Enter` phases want forced script frames on gotos 2022-08-25 19:24:56 -06:00
David Wendt 3677a0107b core: Only force-queue frame scripts if the goto is not a no-op. 2022-08-25 19:24:56 -06:00
David Wendt ac2b82f26e core: Gotos *always* queue the target frame's scripts on the target clip, even if we already executed that script beforehand. 2022-08-25 19:24:56 -06:00
David Wendt 9bff6406d1 core: Allow queueing both a remove and a place tag at the same depth, in that order only. 2022-08-25 19:24:56 -06:00
David Wendt 2929681a93 core: No-op gotos should be treated as rewinding. 2022-08-25 19:24:56 -06:00
David Wendt 7a09bbfaab core: In AVM2, run removals before frame advance.
We still retain the queue system as events are fired at removal time, and those events can trigger more gotos. If such a goto happens, AS3 code will hit a clip still in the old state rather than an inconsistent one. I don't have test coverage for this exact scenario just yet.
2022-08-25 19:24:56 -06:00
David Wendt d691543c4c core: Child removals appear to resolve in reverse render order. 2022-08-25 19:24:56 -06:00
David Wendt 8feb3fc7b0 core: Fast-forward removals as the result of a goto happen before the frame number advances. 2022-08-25 19:24:56 -06:00
David Wendt 66c24ff188 core: Queue new object placement at loop time on the tag queue. 2022-08-25 19:24:56 -06:00
David Wendt 0353d176e4 core: Movie clip rewinds should not remove any children until after the new timeline position has been set. 2022-08-25 19:24:56 -06:00
David Wendt 99003643ac core: Same-frame gotos should only proceed on AVM2. 2022-08-25 19:24:56 -06:00
David Wendt cdfc6f5eae core: Explicit gotos must run even if they are no-ops. 2022-08-25 19:24:56 -06:00
David Wendt cb86340fb1 core: `frameConstructed` during a goto fires after the goto commands have fully completed. 2022-08-25 19:24:56 -06:00
David Wendt 51401ae660 core: Remove AVM2 compatibility hacks surrounding place frame.
They are no longer needed, frame advance happens at enterframe time.
2022-08-25 19:24:56 -06:00
David Wendt 1eef8a47c9 core: Movie clips run all their tags at `enter_frame`, and place/remove actions are queued until later.
This prevents repeated place/remove actions at the same depth from resulting in repeated event dispatches.
2022-08-25 19:24:56 -06:00
David Wendt 963144e59c core: Centralize all the various calls to `enter_frame`/`construct_frame` into a single method, `catchup_display_object_to_frame`.
The rationale for the catch-up logic is as follows:

 * We must always enter-frame and construct objects, even if those respective display events haven't happened yet.
 * Display objects created in event handlers still need to run catchup phases, otherwise they will tag-stream desync
 * Frame scripts are never triggered by catchup phases
 * `exit_frame` is not a catchup phase as it is *only* an event broadcast currently
2022-08-25 19:24:56 -06:00
David Wendt 0400d4dee4 core: `Player` should start in the `Idle` phase 2022-08-25 19:24:56 -06:00
David Wendt f0ef8adb42 core: Add a new frame phase to represent non-frame work such as input event handlers. 2022-08-25 19:24:56 -06:00
David Wendt ae530b5d6b core: Track what part of the frame processing loop we're in 2022-08-25 19:24:56 -06:00
David Wendt ee2454e09f core: Frame actions should start with `enterFrame`; not `exitFrame`. 2022-08-25 19:24:56 -06:00
David Wendt 1f0b8bdda4 core: In AVM2, movie clips process `RemoveObject` before any other frame actions are done. 2022-08-25 19:24:56 -06:00
David Wendt 318b018da8 core: `enter_frame` should be an event that all display objects get and can respond to 2022-08-25 19:24:56 -06:00