core: Load filters from PlaceObject tag
This commit is contained in:
parent
1408252ca3
commit
fc00ae8eb6
|
@ -36,6 +36,7 @@ use crate::tag_utils::{self, ControlFlow, DecodeResult, Error, SwfMovie, SwfSlic
|
||||||
use crate::vminterface::{AvmObject, Instantiator};
|
use crate::vminterface::{AvmObject, Instantiator};
|
||||||
use core::fmt;
|
use core::fmt;
|
||||||
use gc_arena::{Collect, Gc, GcCell, MutationContext};
|
use gc_arena::{Collect, Gc, GcCell, MutationContext};
|
||||||
|
use ruffle_render::filters::Filter;
|
||||||
use smallvec::SmallVec;
|
use smallvec::SmallVec;
|
||||||
use std::cell::{Ref, RefMut};
|
use std::cell::{Ref, RefMut};
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
@ -1540,7 +1541,13 @@ impl<'gc> MovieClip<'gc> {
|
||||||
.collect(),
|
.collect(),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
// TODO: Missing PlaceObject properties: amf_data, filters
|
if let Some(filters) = &place_object.filters {
|
||||||
|
child.set_filters(
|
||||||
|
context.gc_context,
|
||||||
|
filters.iter().map(Filter::from).collect(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
// TODO: Missing PlaceObject property: amf_data
|
||||||
|
|
||||||
// Run first frame.
|
// Run first frame.
|
||||||
child.post_instantiation(context, None, Instantiator::Movie, false);
|
child.post_instantiation(context, None, Instantiator::Movie, false);
|
||||||
|
|
|
@ -14,6 +14,37 @@ pub enum Filter {
|
||||||
GradientGlowFilter(GradientGlowFilter),
|
GradientGlowFilter(GradientGlowFilter),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl From<&swf::Filter> for Filter {
|
||||||
|
fn from(value: &swf::Filter) -> Self {
|
||||||
|
match value {
|
||||||
|
swf::Filter::DropShadowFilter(filter) => {
|
||||||
|
Filter::DropShadowFilter(DropShadowFilter::from(filter.as_ref()))
|
||||||
|
}
|
||||||
|
swf::Filter::BlurFilter(filter) => {
|
||||||
|
Filter::BlurFilter(BlurFilter::from(filter.as_ref()))
|
||||||
|
}
|
||||||
|
swf::Filter::GlowFilter(filter) => {
|
||||||
|
Filter::GlowFilter(GlowFilter::from(filter.as_ref()))
|
||||||
|
}
|
||||||
|
swf::Filter::BevelFilter(filter) => {
|
||||||
|
Filter::BevelFilter(BevelFilter::from(filter.as_ref()))
|
||||||
|
}
|
||||||
|
swf::Filter::GradientGlowFilter(filter) => {
|
||||||
|
Filter::GradientGlowFilter(GradientGlowFilter::from(filter.as_ref()))
|
||||||
|
}
|
||||||
|
swf::Filter::ConvolutionFilter(filter) => {
|
||||||
|
Filter::ConvolutionFilter(ConvolutionFilter::from(filter.as_ref()))
|
||||||
|
}
|
||||||
|
swf::Filter::ColorMatrixFilter(filter) => {
|
||||||
|
Filter::ColorMatrixFilter(ColorMatrixFilter::from(filter.as_ref()))
|
||||||
|
}
|
||||||
|
swf::Filter::GradientBevelFilter(filter) => {
|
||||||
|
Filter::GradientBevelFilter(GradientBevelFilter::from(filter.as_ref()))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl Default for Filter {
|
impl Default for Filter {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
// A default colormatrix is a filter that essentially does nothing,
|
// A default colormatrix is a filter that essentially does nothing,
|
||||||
|
@ -43,12 +74,12 @@ pub struct BevelFilter {
|
||||||
pub quality: u8,
|
pub quality: u8,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<swf::BevelFilter> for BevelFilter {
|
impl From<&swf::BevelFilter> for BevelFilter {
|
||||||
fn from(value: swf::BevelFilter) -> Self {
|
fn from(value: &swf::BevelFilter) -> Self {
|
||||||
let quality = value.num_passes();
|
let quality = value.num_passes();
|
||||||
Self {
|
Self {
|
||||||
shadow_color: value.shadow_color,
|
shadow_color: value.shadow_color.clone(),
|
||||||
highlight_color: value.highlight_color,
|
highlight_color: value.highlight_color.clone(),
|
||||||
blur_x: value.blur_x.to_f32(),
|
blur_x: value.blur_x.to_f32(),
|
||||||
blur_y: value.blur_y.to_f32(),
|
blur_y: value.blur_y.to_f32(),
|
||||||
angle: value.angle.to_f32(),
|
angle: value.angle.to_f32(),
|
||||||
|
@ -91,8 +122,8 @@ pub struct BlurFilter {
|
||||||
pub quality: u8,
|
pub quality: u8,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<swf::BlurFilter> for BlurFilter {
|
impl From<&swf::BlurFilter> for BlurFilter {
|
||||||
fn from(value: swf::BlurFilter) -> Self {
|
fn from(value: &swf::BlurFilter) -> Self {
|
||||||
Self {
|
Self {
|
||||||
blur_x: value.blur_x.to_f32(),
|
blur_x: value.blur_x.to_f32(),
|
||||||
blur_y: value.blur_y.to_f32(),
|
blur_y: value.blur_y.to_f32(),
|
||||||
|
@ -116,8 +147,8 @@ pub struct ColorMatrixFilter {
|
||||||
pub matrix: [f32; 20],
|
pub matrix: [f32; 20],
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<swf::ColorMatrixFilter> for ColorMatrixFilter {
|
impl From<&swf::ColorMatrixFilter> for ColorMatrixFilter {
|
||||||
fn from(value: swf::ColorMatrixFilter) -> Self {
|
fn from(value: &swf::ColorMatrixFilter) -> Self {
|
||||||
Self {
|
Self {
|
||||||
matrix: value.matrix.map(Fixed16::to_f32),
|
matrix: value.matrix.map(Fixed16::to_f32),
|
||||||
}
|
}
|
||||||
|
@ -149,14 +180,14 @@ pub struct ConvolutionFilter {
|
||||||
pub preserve_alpha: bool,
|
pub preserve_alpha: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<swf::ConvolutionFilter> for ConvolutionFilter {
|
impl From<&swf::ConvolutionFilter> for ConvolutionFilter {
|
||||||
fn from(value: swf::ConvolutionFilter) -> Self {
|
fn from(value: &swf::ConvolutionFilter) -> Self {
|
||||||
let preserve_alpha = value.is_preserve_alpha();
|
let preserve_alpha = value.is_preserve_alpha();
|
||||||
let clamp = value.is_clamped();
|
let clamp = value.is_clamped();
|
||||||
Self {
|
Self {
|
||||||
bias: value.bias.to_f32(),
|
bias: value.bias.to_f32(),
|
||||||
clamp,
|
clamp,
|
||||||
default_color: value.default_color,
|
default_color: value.default_color.clone(),
|
||||||
divisor: value.divisor.to_f32(),
|
divisor: value.divisor.to_f32(),
|
||||||
matrix: value.matrix.iter().map(|v| v.to_f32()).collect(),
|
matrix: value.matrix.iter().map(|v| v.to_f32()).collect(),
|
||||||
matrix_x: value.num_matrix_cols,
|
matrix_x: value.num_matrix_cols,
|
||||||
|
@ -238,13 +269,13 @@ pub struct DropShadowFilter {
|
||||||
pub strength: u8,
|
pub strength: u8,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<swf::DropShadowFilter> for DropShadowFilter {
|
impl From<&swf::DropShadowFilter> for DropShadowFilter {
|
||||||
fn from(value: swf::DropShadowFilter) -> Self {
|
fn from(value: &swf::DropShadowFilter) -> Self {
|
||||||
let inner = value.is_inner();
|
let inner = value.is_inner();
|
||||||
let knockout = value.is_knockout();
|
let knockout = value.is_knockout();
|
||||||
let quality = value.num_passes();
|
let quality = value.num_passes();
|
||||||
DropShadowFilter {
|
DropShadowFilter {
|
||||||
color: value.color,
|
color: value.color.clone(),
|
||||||
angle: value.angle.to_f32(),
|
angle: value.angle.to_f32(),
|
||||||
blur_x: value.blur_x.to_f32(),
|
blur_x: value.blur_x.to_f32(),
|
||||||
blur_y: value.blur_y.to_f32(),
|
blur_y: value.blur_y.to_f32(),
|
||||||
|
@ -286,13 +317,13 @@ pub struct GlowFilter {
|
||||||
pub strength: u8,
|
pub strength: u8,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<swf::GlowFilter> for GlowFilter {
|
impl From<&swf::GlowFilter> for GlowFilter {
|
||||||
fn from(value: swf::GlowFilter) -> Self {
|
fn from(value: &swf::GlowFilter) -> Self {
|
||||||
let inner = value.is_inner();
|
let inner = value.is_inner();
|
||||||
let knockout = value.is_knockout();
|
let knockout = value.is_knockout();
|
||||||
let quality = value.num_passes();
|
let quality = value.num_passes();
|
||||||
GlowFilter {
|
GlowFilter {
|
||||||
color: value.color,
|
color: value.color.clone(),
|
||||||
blur_x: value.blur_x.to_f32(),
|
blur_x: value.blur_x.to_f32(),
|
||||||
blur_y: value.blur_y.to_f32(),
|
blur_y: value.blur_y.to_f32(),
|
||||||
inner,
|
inner,
|
||||||
|
@ -330,11 +361,11 @@ pub struct GradientBevelFilter {
|
||||||
pub quality: u8,
|
pub quality: u8,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<swf::GradientFilter> for GradientBevelFilter {
|
impl From<&swf::GradientFilter> for GradientBevelFilter {
|
||||||
fn from(value: swf::GradientFilter) -> Self {
|
fn from(value: &swf::GradientFilter) -> Self {
|
||||||
let quality = value.num_passes();
|
let quality = value.num_passes();
|
||||||
Self {
|
Self {
|
||||||
colors: value.colors,
|
colors: value.colors.clone(),
|
||||||
blur_x: value.blur_x.to_f32(),
|
blur_x: value.blur_x.to_f32(),
|
||||||
blur_y: value.blur_y.to_f32(),
|
blur_y: value.blur_y.to_f32(),
|
||||||
angle: value.angle.to_f32(),
|
angle: value.angle.to_f32(),
|
||||||
|
@ -382,11 +413,11 @@ pub struct GradientGlowFilter {
|
||||||
pub quality: u8,
|
pub quality: u8,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<swf::GradientFilter> for GradientGlowFilter {
|
impl From<&swf::GradientFilter> for GradientGlowFilter {
|
||||||
fn from(value: swf::GradientFilter) -> Self {
|
fn from(value: &swf::GradientFilter) -> Self {
|
||||||
let quality = value.num_passes();
|
let quality = value.num_passes();
|
||||||
Self {
|
Self {
|
||||||
colors: value.colors,
|
colors: value.colors.clone(),
|
||||||
blur_x: value.blur_x.to_f32(),
|
blur_x: value.blur_x.to_f32(),
|
||||||
blur_y: value.blur_y.to_f32(),
|
blur_y: value.blur_y.to_f32(),
|
||||||
angle: value.angle.to_f32(),
|
angle: value.angle.to_f32(),
|
||||||
|
|
Loading…
Reference in New Issue