From f140e7a14b379993625b07524c4453ae98592384 Mon Sep 17 00:00:00 2001 From: sleepycatcoding <131554884+sleepycatcoding@users.noreply.github.com> Date: Sat, 30 Sep 2023 01:46:54 +0300 Subject: [PATCH] core: Place jpegxr texture support behind feature flag (#13348) --- core/Cargo.toml | 3 ++- .../flash/display3D/textures/texture.rs | 18 +++++++++++++++--- desktop/Cargo.toml | 2 +- tests/Cargo.toml | 2 +- .../output.expected.png | Bin 21764 -> 21887 bytes .../avm2/stage3d_texture_bytearray/test.toml | 3 +++ web/Cargo.toml | 2 +- 7 files changed, 23 insertions(+), 7 deletions(-) diff --git a/core/Cargo.toml b/core/Cargo.toml index 539b11cd1..42f26e4e2 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -56,7 +56,7 @@ egui_extras = { git = "https://github.com/emilk/egui", rev = "98087029e020a1b2d7 png = { version = "0.17.10", optional = true } flv-rs = { path = "../flv" } async-channel = "1.9.0" -jpegxr = { git = "https://github.com/ruffle-rs/jpegxr", branch = "ruffle" } +jpegxr = { git = "https://github.com/ruffle-rs/jpegxr", branch = "ruffle", optional = true } image = { version = "0.24.7", default-features = false, features = ["tiff"] } [target.'cfg(not(target_family = "wasm"))'.dependencies.futures] @@ -78,6 +78,7 @@ audio = ["dasp"] known_stubs = ["linkme"] default_compatibility_rules = [] egui = ["dep:egui", "dep:egui_extras", "png"] +jpegxr = ["dep:jpegxr"] [build-dependencies] build_playerglobal = { path = "build_playerglobal" } diff --git a/core/src/avm2/globals/flash/display3D/textures/texture.rs b/core/src/avm2/globals/flash/display3D/textures/texture.rs index a36378140..6da52e606 100644 --- a/core/src/avm2/globals/flash/display3D/textures/texture.rs +++ b/core/src/avm2/globals/flash/display3D/textures/texture.rs @@ -1,7 +1,4 @@ -use std::io::Cursor; - use gc_arena::GcCell; -use ruffle_render::atf::ATFTexture; use ruffle_render::backend::Context3DTextureFormat; use crate::avm2::object::TextureObject; @@ -69,6 +66,18 @@ pub fn do_copy<'gc>( Ok(()) } +#[cfg(not(feature = "jpegxr"))] +pub(super) fn do_compressed_upload<'gc>( + _: &mut Activation<'_, 'gc>, + _: TextureObject<'gc>, + _: Object<'gc>, + _: usize, + _: bool, +) -> Result<(), Error<'gc>> { + Err("Support for compressed textures not compiled in.".into()) +} + +#[cfg(feature = "jpegxr")] pub(super) fn do_compressed_upload<'gc>( activation: &mut Activation<'_, 'gc>, texture: TextureObject<'gc>, @@ -76,6 +85,9 @@ pub(super) fn do_compressed_upload<'gc>( byte_array_offset: usize, is_cube: bool, ) -> Result<(), Error<'gc>> { + use ruffle_render::atf::ATFTexture; + use std::io::Cursor; + let atf_texture = ATFTexture::from_bytes(&data.as_bytearray().unwrap().bytes()[byte_array_offset..]) .expect("Failed to parse ATF texture"); diff --git a/desktop/Cargo.toml b/desktop/Cargo.toml index 45135ea8b..cbb7a5573 100644 --- a/desktop/Cargo.toml +++ b/desktop/Cargo.toml @@ -53,7 +53,7 @@ embed-resource = "2" vergen = { version = "8.2.5", features = ["build", "git", "gitcl", "cargo"] } [features] -default = ["software_video"] +default = ["software_video", "ruffle_core/jpegxr"] # core features avm_debug = ["ruffle_core/avm_debug"] diff --git a/tests/Cargo.toml b/tests/Cargo.toml index de4e351f7..7b122396e 100644 --- a/tests/Cargo.toml +++ b/tests/Cargo.toml @@ -23,7 +23,7 @@ url = "2.4.1" # Enable running image comparison tests. This is off by default, # since the images we compare against are generated on CI, and may # not match your local machine's Vulkan version / image output. -imgtests = ["ruffle_video_software"] +imgtests = ["ruffle_video_software", "ruffle_core/jpegxr"] lzma = ["ruffle_core/lzma"] [dev-dependencies] diff --git a/tests/tests/swfs/avm2/stage3d_texture_bytearray/output.expected.png b/tests/tests/swfs/avm2/stage3d_texture_bytearray/output.expected.png index 5bc1afec6b59495908099d09c53a917cf167567c..a5f704be3cc35ddb7621a4949a78d99b02876284 100644 GIT binary patch literal 21887 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 literal 21764 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 X^s!mqo$z*3oXyUCJF>SO4g3E90C>iJ diff --git a/tests/tests/swfs/avm2/stage3d_texture_bytearray/test.toml b/tests/tests/swfs/avm2/stage3d_texture_bytearray/test.toml index 5f56a779e..4f58da2ea 100644 --- a/tests/tests/swfs/avm2/stage3d_texture_bytearray/test.toml +++ b/tests/tests/swfs/avm2/stage3d_texture_bytearray/test.toml @@ -1,4 +1,7 @@ num_frames = 1 +[image_comparisons.output] +tolerance = 2 + [player_options] with_renderer = { optional = true, sample_count = 1 } \ No newline at end of file diff --git a/web/Cargo.toml b/web/Cargo.toml index e392b8718..9671b503d 100644 --- a/web/Cargo.toml +++ b/web/Cargo.toml @@ -13,7 +13,7 @@ publish = false # This crate is useless alone, people should use the npm package crate-type = ["cdylib", "rlib"] [features] -default = ["canvas", "console_error_panic_hook", "webgl", "wgpu-webgl"] +default = ["canvas", "console_error_panic_hook", "webgl", "wgpu-webgl", "ruffle_core/jpegxr"] # core features avm_debug = ["ruffle_core/avm_debug"]