Skip to content

Commit e919e57

Browse files
committed
core: Use interior mutability for DisplayObjectBase
The only 'cast' method is now `TDisplayObject::base`, which now returns a `Gc<DisplayObjectBase>`.
1 parent fb28ae7 commit e919e57

26 files changed

+283
-282
lines changed

core/src/avm1/globals/color.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -142,14 +142,15 @@ fn set_rgb<'gc>(
142142
.coerce_to_i32(activation)?;
143143
let [b, g, r, _] = rgb.to_le_bytes();
144144

145-
let mut base = target.base_mut(activation.gc());
146-
let color_transform = base.color_transform_mut();
145+
let base = target.base();
146+
let mut color_transform = base.color_transform();
147147
color_transform.r_multiply = Fixed8::ZERO;
148148
color_transform.g_multiply = Fixed8::ZERO;
149149
color_transform.b_multiply = Fixed8::ZERO;
150150
color_transform.r_add = r.into();
151151
color_transform.g_add = g.into();
152152
color_transform.b_add = b.into();
153+
base.set_color_transform(color_transform);
153154
}
154155
Ok(Value::Undefined)
155156
}
@@ -198,8 +199,8 @@ fn set_transform<'gc>(
198199
parent.invalidate_cached_bitmap(activation.gc());
199200
}
200201

201-
let mut base = target.base_mut(activation.gc());
202-
let color_transform = base.color_transform_mut();
202+
let base = target.base();
203+
let mut color_transform = base.color_transform();
203204
let transform = args
204205
.get(0)
205206
.unwrap_or(&Value::Undefined)
@@ -252,6 +253,8 @@ fn set_transform<'gc>(
252253
istr!("ab"),
253254
&mut color_transform.a_add,
254255
)?;
256+
257+
base.set_color_transform(color_transform);
255258
}
256259

257260
Ok(Value::Undefined)

core/src/avm1/globals/movie_clip.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -983,8 +983,8 @@ pub fn clone_sprite<'gc>(
983983
parent.replace_at_depth(context, new_clip.into(), depth);
984984

985985
// Copy display properties from previous clip to new clip.
986-
new_clip.set_matrix(context.gc(), *movie_clip.base().matrix());
987-
new_clip.set_color_transform(context.gc(), *movie_clip.base().color_transform());
986+
new_clip.set_matrix(context.gc(), movie_clip.base().matrix());
987+
new_clip.set_color_transform(context.gc(), movie_clip.base().color_transform());
988988

989989
new_clip.init_clip_event_handlers(movie_clip.clip_actions().into());
990990

@@ -1665,10 +1665,10 @@ fn set_transform<'gc>(
16651665
if let Value::Object(object) = value {
16661666
if let NativeObject::Transform(transform) = object.native() {
16671667
if let Some(clip) = transform.clip(activation) {
1668-
let matrix = *clip.base().matrix();
1668+
let matrix = clip.base().matrix();
16691669
this.set_matrix(activation.gc(), matrix);
16701670

1671-
let color_transform = *clip.base().color_transform();
1671+
let color_transform = clip.base().color_transform();
16721672
this.set_color_transform(activation.gc(), color_transform);
16731673

16741674
if let Some(parent) = this.parent() {

core/src/avm1/globals/sound.rs

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -360,8 +360,8 @@ fn get_pan<'gc>(
360360
if let NativeObject::Sound(sound) = this.native() {
361361
let transform = sound
362362
.owner()
363-
.map(|owner| owner.base().sound_transform().clone())
364-
.unwrap_or_else(|| activation.context.global_sound_transform().clone());
363+
.map(|owner| owner.base().sound_transform())
364+
.unwrap_or_else(|| *activation.context.global_sound_transform());
365365
Ok(transform.pan().into())
366366
} else {
367367
Ok(Value::Undefined)
@@ -376,8 +376,8 @@ fn get_transform<'gc>(
376376
if let NativeObject::Sound(sound) = this.native() {
377377
let transform = sound
378378
.owner()
379-
.map(|owner| owner.base().sound_transform().clone())
380-
.unwrap_or_else(|| activation.context.global_sound_transform().clone());
379+
.map(|owner| owner.base().sound_transform())
380+
.unwrap_or_else(|| *activation.context.global_sound_transform());
381381

382382
let obj = Object::new(
383383
&activation.context.strings,
@@ -402,8 +402,8 @@ fn get_volume<'gc>(
402402
if let NativeObject::Sound(sound) = this.native() {
403403
let transform = sound
404404
.owner()
405-
.map(|owner| owner.base().sound_transform().clone())
406-
.unwrap_or_else(|| activation.context.global_sound_transform().clone());
405+
.map(|owner| owner.base().sound_transform())
406+
.unwrap_or_else(|| *activation.context.global_sound_transform());
407407
Ok(transform.volume.into())
408408
} else {
409409
Ok(Value::Undefined)
@@ -483,13 +483,13 @@ fn set_pan<'gc>(
483483
.clamp_to_i32();
484484
if let NativeObject::Sound(sound) = this.native() {
485485
if let Some(owner) = sound.owner() {
486-
let mut transform = owner.base().sound_transform().clone();
487-
transform.set_pan(pan);
488-
owner.set_sound_transform(activation.context, transform);
486+
let transform = owner.base().sound_transform();
487+
owner.set_sound_transform(activation.context, transform.with_pan(pan));
489488
} else {
490-
let mut transform = activation.context.global_sound_transform().clone();
491-
transform.set_pan(pan);
492-
activation.context.set_global_sound_transform(transform);
489+
let transform = activation.context.global_sound_transform();
490+
activation
491+
.context
492+
.set_global_sound_transform(transform.with_pan(pan));
493493
}
494494
}
495495

@@ -508,9 +508,9 @@ fn set_transform<'gc>(
508508

509509
if let NativeObject::Sound(sound) = this.native() {
510510
let mut transform = if let Some(owner) = sound.owner() {
511-
owner.base().sound_transform().clone()
511+
owner.base().sound_transform()
512512
} else {
513-
activation.context.global_sound_transform().clone()
513+
*activation.context.global_sound_transform()
514514
};
515515

516516
if obj.has_own_property(activation, istr!("ll")) {
@@ -558,7 +558,7 @@ fn set_volume<'gc>(
558558
if let Some(owner) = sound.owner() {
559559
let transform = SoundTransform {
560560
volume,
561-
..*owner.base().sound_transform()
561+
..owner.base().sound_transform()
562562
};
563563
owner.set_sound_transform(activation.context, transform);
564564
} else {

core/src/avm1/globals/transform.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ fn method<'gc>(
8181
};
8282

8383
Ok(match index {
84-
GET_MATRIX => matrix_to_value(clip.base().matrix(), activation)?,
84+
GET_MATRIX => matrix_to_value(&clip.base().matrix(), activation)?,
8585
SET_MATRIX => {
8686
let matrix_props: &[AvmString<'_>] = &[
8787
istr!("a"),
@@ -120,7 +120,7 @@ fn method<'gc>(
120120
)?
121121
}
122122
GET_COLOR_TRANSFORM => {
123-
ColorTransformObject::construct(activation, clip.base().color_transform())?
123+
ColorTransformObject::construct(activation, &clip.base().color_transform())?
124124
}
125125
SET_COLOR_TRANSFORM => {
126126
if let [value] = args {
@@ -135,10 +135,10 @@ fn method<'gc>(
135135
}
136136
GET_CONCATENATED_COLOR_TRANSFORM => {
137137
// Walk through parents to get combined color transform.
138-
let mut color_transform = *clip.base().color_transform();
138+
let mut color_transform = clip.base().color_transform();
139139
let mut node = clip.avm1_parent();
140140
while let Some(display_object) = node {
141-
color_transform = *display_object.base().color_transform() * color_transform;
141+
color_transform = display_object.base().color_transform() * color_transform;
142142
node = display_object.parent();
143143
}
144144
ColorTransformObject::construct(activation, &color_transform)?

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

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -850,11 +850,10 @@ pub fn set_transform<'gc>(
850850
let color_transform = color_transform_from_transform_object(transform);
851851

852852
let dobj = this.as_display_object().unwrap();
853-
let mut write = dobj.base_mut(activation.gc());
854-
write.set_matrix(matrix);
855-
write.set_has_matrix3d_stub(has_matrix3d);
856-
write.set_color_transform(color_transform);
857-
drop(write);
853+
let base = dobj.base();
854+
base.set_matrix(matrix);
855+
base.set_has_matrix3d_stub(has_matrix3d);
856+
base.set_color_transform(color_transform);
858857
if let Some(parent) = dobj.parent() {
859858
// Self-transform changes are automatically handled,
860859
// we only want to inform ancestors to avoid unnecessary invalidations for tx/ty

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ pub fn get_sound_transform<'gc>(
102102
let this = this.as_object().unwrap();
103103

104104
if let Some(dobj) = this.as_display_object() {
105-
let dobj_st = dobj.base().sound_transform().clone();
105+
let dobj_st = dobj.base().sound_transform();
106106

107107
return Ok(dobj_st.into_avm2_object(activation)?.into());
108108
}

core/src/avm2/globals/flash/geom/perspective_projection.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -208,17 +208,16 @@ fn sync_from_display_object<'gc>(
208208
}
209209

210210
fn sync_to_display_object<'gc>(
211-
activation: &mut Activation<'_, 'gc>,
211+
_activation: &mut Activation<'_, 'gc>,
212212
this: Object<'gc>,
213213
) -> Result<(), Error<'gc>> {
214214
let Some(dobj) = this.get_slot(pp_slots::DISPLAY_OBJECT).as_object() else {
215215
// Not associated with DO. Unnecessary to sync.
216216
return Ok(());
217217
};
218-
let dobj = dobj.as_display_object().unwrap();
218+
let base = dobj.as_display_object().unwrap().base();
219219

220-
let mut write = dobj.base_mut(activation.gc());
221-
let Some(write) = write.perspective_projection_mut() else {
220+
let Some(mut proj) = base.perspective_projection() else {
222221
return Ok(());
223222
};
224223

@@ -230,8 +229,9 @@ fn sync_to_display_object<'gc>(
230229
(x, y)
231230
};
232231

233-
write.field_of_view = fov;
234-
write.center = (x, y);
232+
proj.field_of_view = fov;
233+
proj.center = (x, y);
234+
base.set_perspective_projection(Some(proj));
235235

236236
Ok(())
237237
}

core/src/avm2/globals/flash/geom/transform.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ pub fn get_concatenated_matrix<'gc>(
125125
StageQuality::High16x16 | StageQuality::High16x16Linear => 1.25,
126126
};
127127

128-
let mut mat = *dobj.base().matrix();
128+
let mut mat = dobj.base().matrix();
129129
mat.a *= scale;
130130
mat.d *= scale;
131131

@@ -140,11 +140,11 @@ pub fn has_matrix3d_from_transform_object(transform_object: Object<'_>) -> bool
140140
}
141141

142142
pub fn matrix_from_transform_object(transform_object: Object<'_>) -> Matrix {
143-
*get_display_object(transform_object).base().matrix()
143+
get_display_object(transform_object).base().matrix()
144144
}
145145

146146
pub fn color_transform_from_transform_object(transform_object: Object<'_>) -> ColorTransform {
147-
*get_display_object(transform_object)
147+
get_display_object(transform_object)
148148
.base()
149149
.color_transform()
150150
}
@@ -260,7 +260,6 @@ pub fn object_to_perspective_projection<'gc>(
260260
.unwrap()
261261
.base()
262262
.perspective_projection()
263-
.copied()
264263
.unwrap_or_default());
265264
}
266265

@@ -367,7 +366,7 @@ pub fn get_matrix_3d<'gc>(
367366

368367
let display_object = get_display_object(this);
369368
if display_object.base().has_matrix3d_stub() {
370-
let matrix = *get_display_object(this).base().matrix();
369+
let matrix = get_display_object(this).base().matrix();
371370
let matrix3d = Matrix3D::from(matrix);
372371
matrix3d_to_object(matrix3d, activation)
373372
} else {

core/src/avm2/globals/flash/media/sound_mixer.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ pub fn get_sound_transform<'gc>(
1717
_this: Value<'gc>,
1818
_args: &[Value<'gc>],
1919
) -> Result<Value<'gc>, Error<'gc>> {
20-
let dobj_st = activation.context.global_sound_transform().clone();
20+
let dobj_st = activation.context.global_sound_transform();
2121

2222
Ok(dobj_st.into_avm2_object(activation)?.into())
2323
}

core/src/avm2/object/soundchannel_object.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ impl<'gc> SoundChannelObject<'gc> {
133133
if let Some(sound_transform) = sound_transform {
134134
activation
135135
.context
136-
.set_local_sound_transform(instance, sound_transform.clone());
136+
.set_local_sound_transform(instance, *sound_transform);
137137
}
138138

139139
if *should_stop {
@@ -153,13 +153,13 @@ impl<'gc> SoundChannelObject<'gc> {
153153

154154
pub fn sound_transform(self, activation: &mut Activation<'_, 'gc>) -> Option<SoundTransform> {
155155
let sound_channel_data = self.0.sound_channel_data.borrow();
156-
match &*sound_channel_data {
156+
match *sound_channel_data {
157157
SoundChannelData::NotLoaded {
158158
sound_transform, ..
159-
} => sound_transform.clone(),
159+
} => sound_transform,
160160
SoundChannelData::Loaded { sound_instance } => activation
161161
.context
162-
.local_sound_transform(*sound_instance)
162+
.local_sound_transform(sound_instance)
163163
.cloned(),
164164
}
165165
}

0 commit comments

Comments
 (0)