Skip to content

Commit 09c2d48

Browse files
committed
core: return a Ref to avoid a copy in TDisplayObject::filters
1 parent f5074ff commit 09c2d48

File tree

7 files changed

+23
-25
lines changed

7 files changed

+23
-25
lines changed

core/src/avm1/globals/button.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,8 @@ fn filters<'gc>(
8989
Ok(ArrayBuilder::new(activation)
9090
.with(
9191
this.filters()
92-
.into_iter()
93-
.map(|filter| bitmap_filter::filter_to_avm1(activation, filter)),
92+
.iter()
93+
.map(|filter| bitmap_filter::filter_to_avm1(activation, filter.clone())),
9494
)
9595
.into())
9696
}
@@ -109,7 +109,7 @@ fn set_filters<'gc>(
109109
}
110110
}
111111
}
112-
this.set_filters(filters);
112+
this.set_filters(filters.into_boxed_slice());
113113
Ok(())
114114
}
115115

core/src/avm1/globals/movie_clip.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1765,8 +1765,8 @@ fn filters<'gc>(
17651765
Ok(ArrayBuilder::new(activation)
17661766
.with(
17671767
this.filters()
1768-
.into_iter()
1769-
.map(|filter| bitmap_filter::filter_to_avm1(activation, filter)),
1768+
.iter()
1769+
.map(|filter| bitmap_filter::filter_to_avm1(activation, filter.clone())),
17701770
)
17711771
.into())
17721772
}
@@ -1785,7 +1785,7 @@ fn set_filters<'gc>(
17851785
}
17861786
}
17871787
}
1788-
this.set_filters(filters);
1788+
this.set_filters(filters.into_boxed_slice());
17891789
Ok(())
17901790
}
17911791

core/src/avm1/globals/text_field.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -821,8 +821,8 @@ fn filters<'gc>(
821821
Ok(ArrayBuilder::new(activation)
822822
.with(
823823
this.filters()
824-
.into_iter()
825-
.map(|filter| bitmap_filter::filter_to_avm1(activation, filter)),
824+
.iter()
825+
.map(|filter| bitmap_filter::filter_to_avm1(activation, filter.clone())),
826826
)
827827
.into())
828828
}
@@ -841,7 +841,7 @@ fn set_filters<'gc>(
841841
}
842842
}
843843
}
844-
this.set_filters(filters);
844+
this.set_filters(filters.into_boxed_slice());
845845
Ok(())
846846
}
847847

core/src/avm2/globals/flash/display/display_object.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,7 @@ pub fn get_filters<'gc>(
293293
if let Some(dobj) = this.as_display_object() {
294294
let array = dobj
295295
.filters()
296-
.into_iter()
296+
.iter()
297297
.map(|f| f.as_avm2_object(activation))
298298
.collect::<Result<ArrayStorage<'gc>, Error<'gc>>>()?;
299299
return Ok(ArrayObject::from_storage(activation, array).into());
@@ -338,10 +338,10 @@ pub fn set_filters<'gc>(
338338
filter_vec.push(Filter::from_avm2_object(activation, filter_object)?);
339339
}
340340

341-
dobj.set_filters(filter_vec);
341+
dobj.set_filters(filter_vec.into_boxed_slice());
342342
}
343343
} else {
344-
dobj.set_filters(vec![]);
344+
dobj.set_filters(Default::default());
345345
}
346346
}
347347

core/src/debug_ui/display_object.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1249,7 +1249,7 @@ impl DisplayObjectWindow {
12491249
CollapsingHeader::new(format!("Filters ({})", filters.len()))
12501250
.id_salt(ui.id().with("filters"))
12511251
.show(ui, |ui| {
1252-
for filter in filters {
1252+
for filter in &*filters {
12531253
ui.label(format!("{filter:?}"));
12541254
}
12551255
});

core/src/display_object.rs

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,7 @@ pub struct DisplayObjectBase<'gc> {
255255

256256
#[derive(Clone)]
257257
struct DisplayObjectBaseMut {
258-
filters: Vec<Filter>,
258+
filters: Box<[Filter]>,
259259

260260
blend_shader: Option<PixelBenderShaderHandle>,
261261

@@ -550,11 +550,11 @@ impl<'gc> DisplayObjectBase<'gc> {
550550
unlock!(this, Self, name).set(Some(name));
551551
}
552552

553-
fn filters(&self) -> Vec<Filter> {
554-
self.cell.borrow().filters.clone()
553+
fn filters(&self) -> Ref<'_, [Filter]> {
554+
Ref::map(self.cell.borrow(), |c| &*c.filters)
555555
}
556556

557-
fn set_filters(&self, filters: Vec<Filter>) -> bool {
557+
fn set_filters(&self, filters: Box<[Filter]>) -> bool {
558558
let mut write = self.cell.borrow_mut();
559559
let changed = filters != write.filters;
560560
write.filters = filters;
@@ -849,7 +849,7 @@ pub fn render_base<'gc>(this: DisplayObject<'gc>, context: &mut RenderContext<'_
849849
&context.stage.view_matrix(),
850850
);
851851
let name = this.name();
852-
let mut filters: Vec<Filter> = this.filters();
852+
let mut filters: Vec<Filter> = this.filters().to_owned();
853853
let swf_version = this.swf_version();
854854
filters.retain(|f| !f.impotent());
855855

@@ -1237,8 +1237,7 @@ pub trait TDisplayObject<'gc>:
12371237
}
12381238

12391239
if include_own_filters {
1240-
let filters = self.filters();
1241-
for mut filter in filters {
1240+
for mut filter in self.filters().iter().cloned() {
12421241
filter.scale(view_matrix.a, view_matrix.d);
12431242
bounds = filter.calculate_dest_rect(bounds);
12441243
}
@@ -1582,11 +1581,11 @@ pub trait TDisplayObject<'gc>:
15821581
DisplayObjectBase::set_name(Gc::write(mc, self.base()), name)
15831582
}
15841583

1585-
fn filters(self) -> Vec<Filter> {
1586-
self.base().filters()
1584+
fn filters(self) -> Ref<'gc, [Filter]> {
1585+
Gc::as_ref(self.base()).filters()
15871586
}
15881587

1589-
fn set_filters(self, filters: Vec<Filter>) {
1588+
fn set_filters(self, filters: Box<[Filter]>) {
15901589
if self.base().set_filters(filters) {
15911590
self.invalidate_cached_bitmap();
15921591
}

core/src/display_object/avm2_button.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -615,8 +615,7 @@ impl<'gc> TDisplayObject<'gc> for Avm2Button<'gc> {
615615
}
616616

617617
if include_own_filters {
618-
let filters = self.filters();
619-
for mut filter in filters {
618+
for mut filter in self.filters().iter().cloned() {
620619
filter.scale(view_matrix.a, view_matrix.d);
621620
bounds = filter.calculate_dest_rect(bounds);
622621
}

0 commit comments

Comments
 (0)