Commit Graph

5160 Commits

Author SHA1 Message Date
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