core: Add PlayerRuntime::{FlashPlayer, AIR} for Adobe AIR support
We've now had two different bug reports involving Adobe AIR SWFs, so I'm going to go ahead and start adding a framework for AIR support. This commit just adds a command-line option `--player-runtime <flash-player|air>` (defaulting to `flash-player`), and passes it along to the `Player`. The actual value is currently unused - in a follow-up PR, I'm going to implement namespace versioning for AIR.
This commit is contained in:
parent
d3b9d8a451
commit
993d8d9f9b
|
@ -69,7 +69,7 @@ pub use events::PlayerEvent;
|
||||||
pub use font::DefaultFont;
|
pub use font::DefaultFont;
|
||||||
pub use indexmap;
|
pub use indexmap;
|
||||||
pub use loader::LoadBehavior;
|
pub use loader::LoadBehavior;
|
||||||
pub use player::{Player, PlayerBuilder, StaticCallstack};
|
pub use player::{Player, PlayerBuilder, PlayerRuntime, StaticCallstack};
|
||||||
pub use ruffle_render::backend::ViewportDimensions;
|
pub use ruffle_render::backend::ViewportDimensions;
|
||||||
pub use swf;
|
pub use swf;
|
||||||
pub use swf::Color;
|
pub use swf::Color;
|
||||||
|
|
|
@ -250,6 +250,11 @@ pub struct Player {
|
||||||
/// Player can be enabled by setting a particular player version.
|
/// Player can be enabled by setting a particular player version.
|
||||||
player_version: u8,
|
player_version: u8,
|
||||||
|
|
||||||
|
/// The runtime we're emulating (Flash Player or Adobe AIR).
|
||||||
|
/// In Adobe AIR mode, additional classes are available
|
||||||
|
#[allow(unused)]
|
||||||
|
player_runtime: PlayerRuntime,
|
||||||
|
|
||||||
swf: Arc<SwfMovie>,
|
swf: Arc<SwfMovie>,
|
||||||
|
|
||||||
is_playing: bool,
|
is_playing: bool,
|
||||||
|
@ -2185,6 +2190,7 @@ pub struct PlayerBuilder {
|
||||||
spoofed_url: Option<String>,
|
spoofed_url: Option<String>,
|
||||||
compatibility_rules: CompatibilityRules,
|
compatibility_rules: CompatibilityRules,
|
||||||
player_version: Option<u8>,
|
player_version: Option<u8>,
|
||||||
|
player_runtime: PlayerRuntime,
|
||||||
quality: StageQuality,
|
quality: StageQuality,
|
||||||
sandbox_type: SandboxType,
|
sandbox_type: SandboxType,
|
||||||
page_url: Option<String>,
|
page_url: Option<String>,
|
||||||
|
@ -2231,6 +2237,7 @@ impl PlayerBuilder {
|
||||||
spoofed_url: None,
|
spoofed_url: None,
|
||||||
compatibility_rules: CompatibilityRules::default(),
|
compatibility_rules: CompatibilityRules::default(),
|
||||||
player_version: None,
|
player_version: None,
|
||||||
|
player_runtime: PlayerRuntime::default(),
|
||||||
quality: StageQuality::High,
|
quality: StageQuality::High,
|
||||||
sandbox_type: SandboxType::LocalTrusted,
|
sandbox_type: SandboxType::LocalTrusted,
|
||||||
page_url: None,
|
page_url: None,
|
||||||
|
@ -2390,6 +2397,12 @@ impl PlayerBuilder {
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Configures the player runtime (default is `PlayerRuntime::FlashPlayer`)
|
||||||
|
pub fn with_player_runtime(mut self, runtime: PlayerRuntime) -> Self {
|
||||||
|
self.player_runtime = runtime;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
/// Configures the security sandbox type (default is `SandboxType::LocalTrusted`)
|
/// Configures the security sandbox type (default is `SandboxType::LocalTrusted`)
|
||||||
pub fn with_sandbox_type(mut self, sandbox_type: SandboxType) -> Self {
|
pub fn with_sandbox_type(mut self, sandbox_type: SandboxType) -> Self {
|
||||||
self.sandbox_type = sandbox_type;
|
self.sandbox_type = sandbox_type;
|
||||||
|
@ -2547,6 +2560,7 @@ impl PlayerBuilder {
|
||||||
transform_stack: TransformStack::new(),
|
transform_stack: TransformStack::new(),
|
||||||
instance_counter: 0,
|
instance_counter: 0,
|
||||||
player_version,
|
player_version,
|
||||||
|
player_runtime: self.player_runtime,
|
||||||
is_playing: self.autoplay,
|
is_playing: self.autoplay,
|
||||||
needs_render: true,
|
needs_render: true,
|
||||||
self_reference: self_ref.clone(),
|
self_reference: self_ref.clone(),
|
||||||
|
@ -2669,3 +2683,11 @@ fn run_mouse_pick<'gc>(
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg_attr(feature = "clap", derive(clap::ValueEnum))]
|
||||||
|
#[derive(Default, Clone, Copy, Debug, Eq, PartialEq)]
|
||||||
|
pub enum PlayerRuntime {
|
||||||
|
#[default]
|
||||||
|
FlashPlayer,
|
||||||
|
AIR,
|
||||||
|
}
|
||||||
|
|
|
@ -3,7 +3,7 @@ use anyhow::Error;
|
||||||
use clap::Parser;
|
use clap::Parser;
|
||||||
use ruffle_core::backend::navigator::{OpenURLMode, SocketMode};
|
use ruffle_core::backend::navigator::{OpenURLMode, SocketMode};
|
||||||
use ruffle_core::config::Letterbox;
|
use ruffle_core::config::Letterbox;
|
||||||
use ruffle_core::{LoadBehavior, StageAlign, StageScaleMode};
|
use ruffle_core::{LoadBehavior, PlayerRuntime, StageAlign, StageScaleMode};
|
||||||
use ruffle_render::quality::StageQuality;
|
use ruffle_render::quality::StageQuality;
|
||||||
use ruffle_render_wgpu::clap::{GraphicsBackend, PowerPreference};
|
use ruffle_render_wgpu::clap::{GraphicsBackend, PowerPreference};
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
|
@ -119,6 +119,10 @@ pub struct Opt {
|
||||||
#[clap(long)]
|
#[clap(long)]
|
||||||
pub player_version: Option<u8>,
|
pub player_version: Option<u8>,
|
||||||
|
|
||||||
|
/// The runtime to emulate (Flash Player or Adobe AIR)
|
||||||
|
#[clap(long, default_value = "flash-player")]
|
||||||
|
pub player_runtime: PlayerRuntime,
|
||||||
|
|
||||||
/// Set and lock the player's frame rate, overriding the movie's frame rate.
|
/// Set and lock the player's frame rate, overriding the movie's frame rate.
|
||||||
#[clap(long)]
|
#[clap(long)]
|
||||||
pub frame_rate: Option<f64>,
|
pub frame_rate: Option<f64>,
|
||||||
|
|
|
@ -10,7 +10,9 @@ use crate::{CALLSTACK, RENDER_INFO, SWF_INFO};
|
||||||
use anyhow::anyhow;
|
use anyhow::anyhow;
|
||||||
use ruffle_core::backend::navigator::{OpenURLMode, SocketMode};
|
use ruffle_core::backend::navigator::{OpenURLMode, SocketMode};
|
||||||
use ruffle_core::config::Letterbox;
|
use ruffle_core::config::Letterbox;
|
||||||
use ruffle_core::{LoadBehavior, Player, PlayerBuilder, PlayerEvent, StageAlign, StageScaleMode};
|
use ruffle_core::{
|
||||||
|
LoadBehavior, Player, PlayerBuilder, PlayerEvent, PlayerRuntime, StageAlign, StageScaleMode,
|
||||||
|
};
|
||||||
use ruffle_render::backend::RenderBackend;
|
use ruffle_render::backend::RenderBackend;
|
||||||
use ruffle_render::quality::StageQuality;
|
use ruffle_render::quality::StageQuality;
|
||||||
use ruffle_render_wgpu::backend::WgpuRenderBackend;
|
use ruffle_render_wgpu::backend::WgpuRenderBackend;
|
||||||
|
@ -45,6 +47,7 @@ pub struct PlayerOptions {
|
||||||
pub letterbox: Letterbox,
|
pub letterbox: Letterbox,
|
||||||
pub spoof_url: Option<Url>,
|
pub spoof_url: Option<Url>,
|
||||||
pub player_version: u8,
|
pub player_version: u8,
|
||||||
|
pub player_runtime: PlayerRuntime,
|
||||||
pub frame_rate: Option<f64>,
|
pub frame_rate: Option<f64>,
|
||||||
pub open_url_mode: OpenURLMode,
|
pub open_url_mode: OpenURLMode,
|
||||||
pub dummy_external_interface: bool,
|
pub dummy_external_interface: bool,
|
||||||
|
@ -69,6 +72,7 @@ impl From<&Opt> for PlayerOptions {
|
||||||
letterbox: value.letterbox,
|
letterbox: value.letterbox,
|
||||||
spoof_url: value.spoof_url.clone(),
|
spoof_url: value.spoof_url.clone(),
|
||||||
player_version: value.player_version.unwrap_or(32),
|
player_version: value.player_version.unwrap_or(32),
|
||||||
|
player_runtime: value.player_runtime,
|
||||||
frame_rate: value.frame_rate,
|
frame_rate: value.frame_rate,
|
||||||
open_url_mode: value.open_url_mode,
|
open_url_mode: value.open_url_mode,
|
||||||
dummy_external_interface: value.dummy_external_interface,
|
dummy_external_interface: value.dummy_external_interface,
|
||||||
|
|
Loading…
Reference in New Issue