Commit Graph

6203 Commits

Author SHA1 Message Date
Moulins c496f81f13 avm1: remove AvmString::as_str usage in activation.rs and movie_clip.rs 2021-11-27 11:20:47 -07:00
Moulins 87400b829d core: use WStrings for display object's frame and scene labels 2021-11-27 11:20:47 -07:00
Moulins 84b4e33036 core: implement FromWStr for various enum types 2021-11-27 11:20:47 -07:00
Moulins b894d0c97f avm1: adapt parseInt, escape & unescape to use WStr API 2021-11-27 11:20:47 -07:00
Moulins c2349ae012 xml: use AvmString in xml code
This has the nice side-effect of reducing string cloning, because we can
just pass AvmStrings around instead.
2021-11-27 11:20:47 -07:00
Moulins 5db23ddbf3 avm2: use WStr in date parsing logic 2021-11-27 11:20:47 -07:00
Moulins f49ce49d28 core: add FromWStr trait and WStr::parse 2021-11-27 11:20:47 -07:00
Moulins 8863b54db0 avm1: don't use &str for activation's path & variable logic 2021-11-27 11:20:47 -07:00
Moulins 1d9d7e6942 avm1: don't use &str methods when parsing enum parameters in MovieClip 2021-11-27 11:20:47 -07:00
Moulins d850085d2b avm1: partially rewrite Value::primitive_as_number 2021-11-27 11:20:47 -07:00
Moulins 4a09088d42 avm2: rewrite regexp module to not rely on AvmString::as_str
This is a little tricky, because we have to map the utf8 indices
returned by the regex engine to utf16 indices usable by Ruffle.

To limit the impact on performance, the regex, the string we're
currently matching on, and the last known (utf8, utf16) positions
are cached, avoiding extra utf8 conversions in common use cases
where a single string is repeatedly searched with increasing
`lastIndex`.
2021-11-27 11:20:47 -07:00
Moulins 23cbe4c2fd core: Add `string::Pattern` trait, based on `std::str::Pattern`
This allows `Str::{find, rfind, split}` to accept multiple types
2021-11-27 11:20:47 -07:00
Moulins 110f568aa4 core: Remove some useless utf8<->utf16 conv. in {avm1,avm2}/activation.rs 2021-11-27 11:20:47 -07:00
Moulins 8885175550 core: Replace string::utils *_ignore_case functions by methods on WStr 2021-11-27 11:20:47 -07:00
Moulins 79d47a9863 avm1: Requires a WStr<'_> to access PropertyMap 2021-11-27 11:20:47 -07:00
Moulins 7f4af210b8 core: Reimplement AVM string methods using our UCS2 API
This generally means that methods are more efficient, as we
don't need to encode to UTF16 on-the-fly to have correct indices.

This also fix some bugs:
 - charCode now properly handle surrogate pairs
 - calling lastIndexOf with the empty pattern and an OoB index now
properly returns the string length

Still missing is AVM2's String.match
2021-11-27 11:20:47 -07:00
Moulins 32fa20b857 core: Make AvmString "two-headed" by storing a UTF8 and an UCS2 string
This is only temporary; once all code paths use the ruffle `WString` API
instead of dereferencing to a string, the UTF8 `String` will be removed.
2021-11-27 11:20:47 -07:00
Moulins 3d20c4acc7 core: Add owned string::WString type 2021-11-27 11:20:47 -07:00
Moulins c1ccd3a3ac core: Introduce `WStr` and `WStrMut` types, for representing Flash strings
These types represent an UCS2 string (UTF-16 with unpaired surrogates).

The string is stored either as a sequence of u8s (Bytes) or u16s (Wide);
the type of string is tracked by setting the high bit of the length of
its fat pointer.
2021-11-27 11:20:47 -07:00
relrelb b32ec3cf6c audio: Calculate sound transform values using 30-bit integers
The fix in #5218 wasn't sufficient; 30-bit arithmetic should be used
along all the way when calculating an effective sound transform.

For example, a sound transform composited by volumes `-0x80000000` and
`25` should end up as effectively 0, whereas previously it would have
been calculated as `-0x80000000 * 25 / 100 = -0x20000000`, which is a
30-bit integer that hasn't been truncated.

Fixes #5655.
2021-11-27 12:09:33 +02:00
relrelb e2b821e92f chore: Replace `min` + `max` with `clamp`
`clamp` is a bit more efficient, in both runtime and size terms.
2021-11-26 20:54:48 +02:00
relrelb 41eb215b02 chore: Avoid using `std::char`
Use the `char` primitive type instead.
2021-11-26 10:45:30 +02:00
relrelb dc6d4804ff core: Avoid odd import 2021-11-26 10:45:30 +02:00
relrelb 0a3ede31dc core: Remove unused `Downcast` 2021-11-26 10:45:30 +02:00
relrelb 79a0ba31ae avm1: Use `.unwrap_or(&Value::Undefined)` in more places 2021-11-26 10:45:30 +02:00
Adrian Wielgosik f35b2666a3 build: Use the 'union' SmallVec feature for minor memory savings 2021-11-26 00:45:09 +01:00
Chris Midgley 8ac19e9807
web: update everything (#5731)
* web: update everything

* chore: apply new lint corrections
2021-11-25 23:21:43 +02:00
relrelb 79deba87f3 avm1: Small cleanup in `start_drag` 2021-11-25 07:35:33 +02:00
relrelb a2aeadf9e1 core: Small cleanups in `Player::handle_event`
* Use `match` for AVM debug key combos.
* Remove redundant `if let Some(button_event)` inside an `if button_event.is_some()`.
2021-11-25 07:35:33 +02:00
relrelb 0e3168f99e desktop: Small event-related cleanups
* Use `match state` for `MouseInput` events.
* Remove `ReceivedCharacter` handling from `DesktopUiBackend::handle_event`.
2021-11-25 07:35:33 +02:00
relrelb a4b2e38f4d web: Track `keys_down` by `KeyCode`
This makes `WebUiBackend::is_key_down` a simple one-line check.
2021-11-25 07:35:33 +02:00
relrelb cbce91365c desktop: Track `keys_down` by `KeyCode`
This makes `DesktopUiBackend::is_key_down` a simple one-line check.
Also unify the handling code of `ElementState::Pressed` and `ElementState::Released`,
which had a lot of common code.
2021-11-25 07:35:33 +02:00
Adrian Wielgosik da4ed75bc8 avm2: Compare QNames by local name first 2021-11-22 17:59:00 -07:00
Adrian Wielgosik c2d521df41 avm2: refactor: Merge has-setter-and-no-getter into one lookup 2021-11-22 17:59:00 -07:00
Adrian Wielgosik 370186dc3c avm2: refactor: Make trait lookups return a single item 2021-11-22 17:59:00 -07:00
Chris Midgley cf1d0e7624 web: remove firefox extension version restriction 2021-11-22 21:47:37 +02:00
TÖRÖK Attila 0e4d2d48f5 video/vp6: Don't throw an error on skip frames, reuse the last frame instead 2021-11-22 17:08:31 +01:00
Adrian Wielgosik a305b80789 swf: Support font layout without swf-v7 fields 2021-11-20 22:48:36 +01:00
relrelb ff2ef47159 canvas: Fill using the even-odd rule
Flash always uses the even-odd fill rule, whereas canvas defaults to
nonzero.
Specify the fill rule explicitly in both `swf_shape_to_canvas_commands`
and `swf_shape_to_svg`.
2021-11-20 22:48:37 +02:00
relrelb 8fb77b34d6 tests: Add `bitmap_data_compare` 2021-11-20 14:11:14 +02:00
relrelb 56b5183262 avm1: Refactor and fix `BitmapData::compare` 2021-11-20 14:11:14 +02:00
bbb651 687069ba7d avm1: Added BitmapData::compare 2021-11-20 14:11:14 +02:00
relrelb 3760e0e275 core: De-duplicate `round_to_even` function
Put a single implementation in `ecma_conversions.rs`.
Need to consider what to do with the similar implementation in `matrix.rs`.
2021-11-20 13:36:06 +02:00
relrelb 7c6d006862 avm2: Correct `TextFormat` properties coercion 2021-11-20 13:36:06 +02:00
relrelb 10b7c69719 avm1: Correct `TextFormat` properties coercion 2021-11-20 13:36:06 +02:00
David Wendt 068e7acc6f avm2: Remove the need for `lazy_static` 2021-11-19 20:43:53 -07:00
David Wendt dda8a73899 avm2: Refactor so we don't need to rebox and unbox the numbers into values.
Also, use an actual constant table for the ellipsises.
2021-11-19 20:43:53 -07:00
David Wendt 4665a6c210 avm2: None of `Graphics`' methods need to be `pub`. 2021-11-19 20:43:53 -07:00
David Wendt c719e69693 avm2: Also implement `drawEllipse` using `drawRoundRect`. 2021-11-19 20:43:53 -07:00
David Wendt ef46d780ba avm2: Implement `Graphics.drawCircle` using `drawRoundRect` 2021-11-19 20:43:53 -07:00