Commit Graph

338 Commits

Author SHA1 Message Date
relrelb b0b0e55c24 swf: Extract read/write of filters to separate functions
Also unify the identical `GradientGlowFilter` and `GradientBevelFilter`
structs into `GradientFilter`.
2022-10-14 02:27:49 +03:00
relrelb f5dcbb883e swf: Extract filters to separate files
For better code organization.
2022-10-12 21:20:07 +03:00
dependabot[bot] ce3a8440e6 build(deps): bump simple_asn1 from 0.4.1 to 0.6.2
Bumps [simple_asn1](https://github.com/acw/simple_asn1) from 0.4.1 to 0.6.2.
- [Release notes](https://github.com/acw/simple_asn1/releases)
- [Commits](https://github.com/acw/simple_asn1/commits)

---
updated-dependencies:
- dependency-name: simple_asn1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-11 01:05:10 +03:00
EmperorBale 35c9597032 chore: Appease clippy 2022-10-10 12:48:35 -07:00
EmperorBale 5c9bf3ffc0 swf: Support SWZ files 2022-10-10 12:48:35 -07:00
relrelb 84533e278d swf: De-duplicate code in `count_sbits_twips()`
Re-use `count_sbits()`, as already done in `count_fbits()`.
2022-10-09 14:18:50 +05:45
relrelb 2b9f0a6280 swf: Optimize `count_ubits()`
Use `u32::leading_zeros()` instead of manually counting bits.
2022-10-09 14:18:50 +05:45
relrelb bf0ace0b88 chore: Appease clippy 2022-10-09 13:46:28 +05:45
Adrian Wielgosik 0f30278e48 Add missing comment 2022-10-04 20:02:14 +03:00
Adrian Wielgosik 52f7736436 swf: treat empty gradients as solid black color 2022-10-03 20:18:30 +02:00
relrelb e1d01b0a5e swf: Extract `Rectangle` to a separate file
And make it generic, as a first step towards making it a general-purpose
data structure for the whole codebase. Some potential replacements are:
* `BoundingBox` in `render/src/bounding_box.rs`.
* `BoxBounds` in `core/src/html/dimensions.rs`.
* Parameters to a bunch of `BitmapData` methods in
  `core/src/bitmap/bitmap_data.rs`.
2022-09-25 10:37:56 +03:00
relrelb b2dc72a923 swf: Remove `impl Default for FunctionFlags`
Simply use `FunctionFlags::empty()` directly.
2022-09-22 23:29:34 +03:00
Aaron Hill 1d6b3b6f57 chore: Fix Clippy lints and allow `clippy::bool_to_int_with_if`
In several cases, the current code seems preferable to the
code required by `clippy::bool_to_int_with_if`. Let's suppress
this for now to get the build passing, and decide later if this
is something that we want to enable.
2022-09-11 13:31:46 +02:00
Mike Welsh de114f0a3d swf: Read font height in DefineEditText when HasFontClass is set
The SWF19 specs incorrectly state DefineEditText tag only contains
font height if the HasFont flag is set. The tag also contains
the height if the HasFontClass flag is set. This indicates that a
font is used via runtime sharing.
2022-09-06 20:02:23 -07:00
Mike Welsh b1404edfdc swf: Use bitflags for EditText 2022-09-06 20:02:23 -07:00
relrelb 3b752cc600 swf: Merge `read_color_transform_no_alpha` into `read_color_transform`
Differentiate between the cases using a new `has_alpha` boolean
parameter.
2022-09-03 13:24:12 -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
relrelb efd449dc0d swf: Extract `DefineMorphShapeFlag` 2022-09-02 18:21:13 -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 5c29da6707 avm1: Implement `MovieClip.scrollRect`
The core functionality and AVM2 bindings were implemented in #7739.
2022-08-28 22:18:33 -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 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
Mike Welsh bca9b596b9 swf: Implement Display and FromStr for BlendMode 2022-08-18 16:38:17 -07:00
Aaron Hill f7205a02a9 render: Add BlendMode infrastructure and implement BlendMode.ADD
Each render backend keeps track of a stack of BlenModes,
which are pushed and popped by 'core' as we render objects
in the displaay tree. For now, I've just implemented BlendMode.ADD,
which maps directly onto blend mode supported by each backend.

All other blend modes (besides 'NORMAL') will produce a warning
when we try to render using them. This may produce a very large amount
of log output, but it's simpler than emitting each warning only once,
and will help to point developers in the right direction when they
get otherwise inexplicable rendering issues (due to a blend mode
not being implemented).

The wgpu implementation is by far the most complicated, as we need
to construct a `RenderPipeline` for each possible
`(BlendMode, MaskState)`. I haven't been able to find any documentation
about the maximum supported number of (simultaneous) WebGPU render
pipelines - if this becomes an issue, we may need to register them
on-demand when a particular blend mode is requested.
2022-08-18 16:38:17 -07:00
relrelb a3476e7400 swf: Remove `#[allow(clippy::derive_partial_eq_without_eq)`
https://github.com/rust-lang/rust-clippy/issues/8867 is fixed, and
a false positive is no longer reported.
2022-08-16 16:24:21 -07:00
Mike Welsh e0c72f4c9a swf: Bump version to 0.2 2022-08-16 12:59:20 -07:00
Aaron Hill adf6653807 swf: Write a non-zero 'index' value for true/false/undefined/null default values
A zero 'index' does not have a subsequent 'kind' field in the
written SWF. The 'index' field is not actually used for
true/false/undefined/null, so it can be anything as long
as it's non-zero.
2022-08-15 12:30:10 -07:00
dowgird 31ed697acd Fixes from review 2022-08-10 01:34:08 +02:00
dowgird 26b41199fb avm2: Implemented newcatch and basic exception handling 2022-08-10 01:34:08 +02:00
CUB3D 05bfa3770e chore: Fix warnings with cargo doc 2022-08-08 20:20:18 +03:00
Calvin304 01a0d702af avm2: Fix parsing of methods with more than 127 arguments
this change follows section 4.5 of https://www.adobe.com/content/dam/acom/en/devnet/pdf/avm2overview.pdf (dead link, use an archive)
2022-07-30 16:52:56 -07:00
Mike Welsh d092861c15 chore: Appease clippy
Fix `assertions_on_result_states` lints.
2022-07-29 19:32:41 -07:00
relrelb 8d30833d02 core: Don't use `saturating_sub` for `width` / `height`
Use regular subtraction, since it should never overflow.
Also remove `swf::Twips::saturating_sub`, which is now unused.
2022-07-23 10:33:12 -07:00
relrelb e78bf30d58 swf: Extract `Color` to a separate file 2022-07-23 08:43:02 +03:00
relrelb 78ebf06f55 avm2: Extract `MethodFlags` enum 2022-07-09 20:34:53 +03:00
relrelb 981fa0568c chore: `derive(Default)` for enums
It's available since stable Rust 1.62.0.
2022-07-02 09:23:04 -07:00
relrelb 9b9301fbaf chore: Appease clippy 2022-07-02 09:22:18 -07:00
relrelb 06752646b8 swf: Extract `Twips` to a separate file 2022-06-22 09:49:32 +03:00
dependabot[bot] b8cdd59877 build(deps): bump bitstream-io from 1.3.0 to 1.5.0
Bumps [bitstream-io](https://github.com/tuffy/bitstream-io) from 1.3.0 to 1.5.0.
- [Release notes](https://github.com/tuffy/bitstream-io/releases)
- [Commits](https://github.com/tuffy/bitstream-io/compare/v1.3.0...v1.5.0)

---
updated-dependencies:
- dependency-name: bitstream-io
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-13 23:54:10 +03:00
Aaron Hill bb5c9a1de5 swf: Handle incorrect 'PlaceObject3' tag
Fixes #7098

Some SWF appear to have a PlaceObject3 tag with
`HAS_CACHE_AS_BITMAP` set, but the tag ends without
including the corresponding 'is_bitmap_cached' byte.
2022-06-10 16:56:08 +03:00
relrelb ec23a64a13 swf: Mark some `Fixed` functions as `const` 2022-05-29 23:35:03 +03:00
relrelb 60a1dbfb07 swf: Mark some `Matrix` functions as `const` 2022-05-29 21:33:53 +03:00
Aaron Hill 2104216415
swf: Write out tag header for `DebugId` tag
The implementation of `write_debug_id` was previously
not writing the header, causing a malformed SWF to be produced
whenever a `DebugId` tag was included.
2022-05-23 19:16:26 -07:00
Mike Welsh 32bf7e1412 chore: Appease clippy 2022-05-22 02:34:18 -07:00
relrelb cab49ae6e1 swf: Introduce `Color::WHITE`
And use it where possible, to improve code readablity.
2022-05-12 12:12:06 -07:00
relrelb 0b0f8a1a7a swf: Introduce `Color::BLACK`
And use it where possible, to improve code readablity.
2022-05-12 12:12:06 -07:00
relrelb 84b865018d swf: Mark some `SwfStr` functions as const 2022-05-10 09:34:57 +03:00
relrelb 781d091d42 swf: Return concrete data types in `Reader` methods
Where possible, return the specific data type instead of the generic
`Tag` type. Most reader methods do this already, so this brings the
rest in-line.
2022-05-09 14:59:38 -07:00
Mike Welsh 402e072707 swf: Implement Default for BlendMode 2022-05-06 11:33:52 -07:00
relrelb f6153ff7c1 chore: Appease clippy 2022-05-06 10:36:38 -07:00
Mike Welsh 146b8adc68 swf: Clean up LineStyle
* Remove LineStyle::color, instead using fill_style with
   FillStyle::Color to indicate solid color.
 * Store `flags` in the struct instead of separate bools/values.
 * Add getters/setters for ease of use.
 * Add builder-style methods for setting LineStyle properties.
 * Fix misnamed ALLOW_CLOSE flag to NO_CLOSE.
2022-04-11 22:50:40 -07:00
Mike Welsh 478f970fc8 chore: Appease clippy 2022-04-09 18:23:51 -07:00
dependabot[bot] 860c2e313f build(deps): bump encoding_rs from 0.8.30 to 0.8.31
Bumps [encoding_rs](https://github.com/hsivonen/encoding_rs) from 0.8.30 to 0.8.31.
- [Release notes](https://github.com/hsivonen/encoding_rs/releases)
- [Commits](https://github.com/hsivonen/encoding_rs/compare/v0.8.30...v0.8.31)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-08 10:40:26 -07:00
Mike Welsh ac765bd187 chore: Update copyright
I (Michael R. Welsh) assign to Ruffle LLC all rights, title, and
interest to copyrights of my personal contributions to Ruffle,
effective March 26, 2022.
2022-03-26 18:13:14 -07:00
relrelb 9234336dfc swf: Rename `PlaceFlag::IS_IMAGE` to `PlaceFlag::HAS_IMAGE`
To match the SWF19 spec.
2022-03-26 11:33:26 -07:00
relrelb 094da8f1a4 swf: Organize clippy attributes
Move them to specific places as possible.
2022-03-26 11:33:26 -07:00
relrelb 71b0a6e32e swf: Use bitflags for `FontInfoFlag` 2022-03-26 11:33:26 -07:00
relrelb fd06fa0537 swf: Use bitflags for `LineStyleFlag` 2022-03-26 11:33:26 -07:00
relrelb e88c7102f5 swf: Use bitflags for `PlaceFlag` 2022-03-26 11:33:26 -07:00
relrelb 6d2005c2fe swf: Simplify `read_str_with_len`
Read the length in the function itself rather than receiving it as
an argument.
2022-03-26 11:33:26 -07:00
relrelb 1230b5e713 swf: Use bitflags for `FontFlag` 2022-03-26 11:33:26 -07:00
relrelb 71a1757d29 swf: Make `Glyph::advance` non-`Option`
Simply use `0` instead of `None`.
2022-03-26 11:33:26 -07:00
relrelb 984342abf3 swf: Avoid some `Vec::resize` usages
Use the `vec![]` macro instead.
2022-03-26 11:33:26 -07:00
dependabot[bot] da613a6fc5 build(deps): bump libflate from 1.1.2 to 1.2.0
Bumps [libflate](https://github.com/sile/libflate) from 1.1.2 to 1.2.0.
- [Release notes](https://github.com/sile/libflate/releases)
- [Commits](https://github.com/sile/libflate/compare/1.1.2...1.2.0)

---
updated-dependencies:
- dependency-name: libflate
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-26 11:20:34 -07:00
dependabot[bot] f9e361ddae build(deps): bump bitstream-io from 1.2.0 to 1.3.0
Bumps [bitstream-io](https://github.com/tuffy/bitstream-io) from 1.2.0 to 1.3.0.
- [Release notes](https://github.com/tuffy/bitstream-io/releases)
- [Commits](https://github.com/tuffy/bitstream-io/commits)

---
updated-dependencies:
- dependency-name: bitstream-io
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-26 10:52:26 -07:00
relrelb e9167cf43c swf: Add minimal offset table enforcement in `DefineFont2/3`
Previously, the offset table and code table offset were completely
ignored. But as it seems, Flash does look into these offsets in
order to avoid exceedingly reading glyph shapes. For now, avoid
exceedingly reading empty and 1-byte glyph shapes, and add debug
assertions that verify the correctness of the offset table and code
table offset, to help diagnosing related bugs in the future.
2022-03-14 22:50:24 +02:00
Jean Marchand 9969e0ce5a avm2: Fix invalid option 2022-02-12 23:35:32 +02:00
Mike Welsh 55da3cd7d0 chore: Add .cargo/config.toml for workspace-level lint config
Currently it is not directly possible to configure lints for the
entire workspace via TOML, which forced us to repeat `#![allow]`
blocks in each crate.

embark pointed out this workaround to configure lints at the
workspace level via RUSTFLAGS:

https://github.com/EmbarkStudios/rust-ecosystem/issues/22#issuecomment-947011395

Remove the common `#![allow]` blocks and switch to this method for
global lint config.

Temporarily allow `needless_borrow` lint, buggy pending this fix:
https://github.com/rust-lang/rust-clippy/pull/8355
2022-01-29 14:22:44 -08:00
Mike Welsh b181debff6 swf: Use bitflags for `avm1::GetUrl2` 2022-01-17 21:35:57 -08:00
Mike Welsh 4c3e14eae5 core: Clean up `DefineFunction` action
* Have `DefineFunction` and `DefineFunction2` go through the same
   code path by implementing `From<DefineFunction>` for
   `DefineFunction2`.
 * Change `register` to a `Option<NonZeroU8>` for size optimization.
 * Add `function::Param` to store param info instead of a tuple.
2022-01-17 21:35:57 -08:00
Mike Welsh 2b2346b65e swf: Add `avm1::Action::End`
Returning an `Action::End` instead of `None` when reading the end
of an action.
2022-01-17 21:35:57 -08:00
Mike Welsh d5862809c7 swf: Remove extraneous ? in avm1::Writer 2022-01-17 21:35:57 -08:00
Mike Welsh 265bcc278a swf: Add avm1::Writer::write_small_action
Convenience method for writing zero-length actions.
2022-01-17 21:35:57 -08:00
Mike Welsh 9141451ca1 swf: Use structs for avm1 `Action` variants
Use a struct for all variants of `avm1::Action`.
This makes the style more consistent instead of using a mix of
struct and tuple variants, and allows the data to be easily passed
around.
2022-01-17 21:35:57 -08:00
Adrian Wielgosik 22a0711d85 avm2: Use TU's method cache for callstatic, newfunction opcodes 2021-12-17 21:09:40 -07:00
David Wendt 2aee3555ab chore: Fix all new clippy lints added in latest Rust nightly 2021-12-17 20:53:26 -07:00
dependabot[bot] ef679d25c7 build(deps): bump encoding_rs from 0.8.29 to 0.8.30
Bumps [encoding_rs](https://github.com/hsivonen/encoding_rs) from 0.8.29 to 0.8.30.
- [Release notes](https://github.com/hsivonen/encoding_rs/releases)
- [Commits](https://github.com/hsivonen/encoding_rs/compare/v0.8.29...v0.8.30)

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

Signed-off-by: dependabot[bot] <support@github.com>
2021-12-13 23:22:28 +02:00
Adrian Wielgosik 685911a77c swf: Box ShapeRecord::StyleChange variant 2021-12-08 22:14:17 +01:00
relrelb da4b5986b1 chore: Appease clippy 2021-12-08 22:36:55 +02:00
relrelb 0b6cd45415 swf: Fix reserved gradient values handling
* Map 3 to `GradientSpread::Pad`
* Map 2 and 3 to `GradientInterpolation::Rgb`

Fix #1505.
2021-12-04 21:32:47 +02:00
Adrian Wielgosik a305b80789 swf: Support font layout without swf-v7 fields 2021-11-20 22:48:36 +01:00
relrelb 34d1fa5226 avm1: Introduce `TextFormatObject`
`TextFormat` objects differ from regular objects in that
`TextField.setTextFormat` and `TextField.setNewTextFormat` accept
only the former, and ignore the latter.

Also, `TextFormat.prototype` has native accessors that coerce the
values on get/set.
2021-10-30 10:03:36 -07:00
Adrian Wielgosik 8cc00f32bb chore: Stop using traits available in prelude 2021-10-21 10:24:05 -07:00
Adrian Wielgosik bc82a4f705 build: Bump Rust edition to 2021 2021-10-21 10:24:05 -07:00
dependabot[bot] 5cab790bd7 build(deps): bump encoding_rs from 0.8.28 to 0.8.29
Bumps [encoding_rs](https://github.com/hsivonen/encoding_rs) from 0.8.28 to 0.8.29.
- [Release notes](https://github.com/hsivonen/encoding_rs/releases)
- [Commits](https://github.com/hsivonen/encoding_rs/compare/v0.8.28...v0.8.29)

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

Signed-off-by: dependabot[bot] <support@github.com>
2021-10-18 14:01:23 -07:00
relrelb d069b8dcd6 swf: Avoid one usage of `Reader::pos` 2021-10-08 13:22:45 -07:00
relrelb 693f49904f swf: Extract `BitReader::new` 2021-10-08 13:22:45 -07:00
relrelb 281455be6d swf: Improve `ActionTry` read/write
* Use `TryFlags` instead of hard-coded binary literals.
* Rename `try_length`, `catch_length`, `finally_length` to `try_size`,
`catch_size`, `finally_size` to match SWF19 namings.
* Refactor write and fix a few bugs there:
    * The actions length should not include the try, catch, finally
    bodies, only the metadata of `flags`, `try_size`, `catch_size`,
    `finally_size` and catch variable (either as `u8` or `SwfStr`).
    * A placeholder byte should be written in place of the catch variable
    when there is no catch clause.
2021-10-02 23:01:32 +03:00
relrelb d49ea10267 swf: Rename `TryBlock` fields
* `try_actions` -> `try_body`
* `catch` -> `catch_body`
* `finally` -> `finally_body`

This aligns with the names used in SWF19, and is more consistent.
2021-10-02 23:01:32 +03:00
relrelb d2908d8fcd swf: Fix write of With opcode
The actions length should be written as an additional u16.
2021-10-02 23:01:32 +03:00
TÖRÖK Attila a1ee508ff8
chore: Fix nightly clippy lint: clippy::if_then_panic (#5400)
* chore: Fix nightly clippy lint: clippy::if_then_panic

* chore: Fix nightly clippy lint: clippy::if_then_panic in swf tests too

* Address review notes
2021-10-02 16:14:53 +03:00
Giles Cope 42c2b40052 unused deps 2021-09-18 15:28:24 +02:00
Chris Midgley 2dd83c23e8 avm2: add more opcodes
Taken from https://jindrapetrik.github.io/as3_pcode_instructions.en.html
2021-09-16 02:51:04 -07:00
Chris Midgley d52a350b9b avm2: reorder opcodes to be alphabetical 2021-09-16 02:51:04 -07:00
David Wendt 535f4fba58 swf: Pre-allocate the parameters when parsing a `TypeName` 2021-09-02 17:57:58 -06:00
David Wendt 62be772649 chore: Compliance with current clippy beta/nightly 2021-09-02 17:57:58 -06:00
David Wendt 9dafddc1ae swf: Decode and encode the `applytype` op. 2021-09-02 17:57:58 -06:00
David Wendt 47e3b2229a swf: Add support for the `TypeName` multiname type. 2021-09-02 17:57:58 -06:00