core: Re-arrange internal implementation of 'pixelDissolve()'.

This commit is contained in:
iwannabethedev 2023-05-20 20:17:04 +02:00 committed by Nathan Adams
parent deae231176
commit 0f30b378b0
1 changed files with 95 additions and 92 deletions

View File

@ -1618,6 +1618,17 @@ pub fn set_pixels_from_byte_array<'gc>(
Ok(())
}
#[allow(clippy::too_many_arguments)]
pub fn pixel_dissolve<'gc>(
mc: MutationContext<'gc, '_>,
target: BitmapDataWrapper<'gc>,
source_bitmap: BitmapDataWrapper<'gc>,
src_rect: (i32, i32, i32, i32),
dest_point: (i32, i32),
random_seed: i32,
num_pixels: i32,
fill_color: i32,
) -> i32 {
/// Returns at least 2. Always returns an even number.
fn get_feistel_block_size(sequence_length: u32) -> u32 {
let sequence_length = sequence_length.max(2);
@ -1648,7 +1659,10 @@ fn get_feistel_block_size(sequence_length: u32) -> u32 {
///
/// * `raw_permutation_index` - Must obey '0 <= permutation_raw_index < permutation_length`.
/// * `feistel_block_size` - See `get_feistel_block_size()`.
fn pixel_dissolve_raw_to_feistel_index(raw_permutation_index: u32, feistel_block_size: u32) -> u32 {
fn pixel_dissolve_raw_to_feistel_index(
raw_permutation_index: u32,
feistel_block_size: u32,
) -> u32 {
// Discussion on Feistel networks:
// https://github.com/ruffle-rs/ruffle/issues/10962
@ -1680,17 +1694,36 @@ fn pixel_dissolve_raw_to_feistel_index(raw_permutation_index: u32, feistel_block
(new_halfpiece2 << feistel_halfpiece_size) | new_halfpiece1
}
#[allow(clippy::too_many_arguments)]
pub fn pixel_dissolve<'gc>(
mc: MutationContext<'gc, '_>,
target: BitmapDataWrapper<'gc>,
source_bitmap: BitmapDataWrapper<'gc>,
src_rect: (i32, i32, i32, i32),
dest_point: (i32, i32),
random_seed: i32,
num_pixels: i32,
fn write_pixel(
write: &mut RefMut<BitmapData>,
different_source_than_target: &Option<Ref<BitmapData>>,
fill_color: i32,
) -> i32 {
transparency: bool,
base_point: (u32, u32),
read_offset: (u32, u32),
write_offset: (u32, u32),
) {
let read_point = (read_offset.0 + base_point.0, read_offset.1 + base_point.1);
let write_point = (write_offset.0 + base_point.0, write_offset.1 + base_point.1);
match different_source_than_target {
None => {
write.set_pixel32_raw(
write_point.0,
write_point.1,
Color::from(fill_color).to_premultiplied_alpha(transparency),
);
}
Some(different_source) => {
write.set_pixel32_raw(
write_point.0,
write_point.1,
different_source.get_pixel32_raw(read_point.0, read_point.1),
);
}
}
}
// Apparently,
// "numPixels:int (default = 0) — The default is 1/30 of the source area (width x height). "
// is wrong.
@ -1727,36 +1760,6 @@ pub fn pixel_dissolve<'gc>(
let write_offset = (dest_region.x_min, dest_region.y_min);
let read_offset = (source_region.x_min, source_region.y_min);
fn write_pixel(
write: &mut RefMut<BitmapData>,
different_source_than_target: &Option<Ref<BitmapData>>,
fill_color: i32,
transparency: bool,
base_point: (u32, u32),
read_offset: (u32, u32),
write_offset: (u32, u32),
) {
let read_point = (read_offset.0 + base_point.0, read_offset.1 + base_point.1);
let write_point = (write_offset.0 + base_point.0, write_offset.1 + base_point.1);
match different_source_than_target {
None => {
write.set_pixel32_raw(
write_point.0,
write_point.1,
Color::from(fill_color).to_premultiplied_alpha(transparency),
);
}
Some(different_source) => {
write.set_pixel32_raw(
write_point.0,
write_point.1,
different_source.get_pixel32_raw(read_point.0, read_point.1),
);
}
}
}
let different_source_than_target = if source_bitmap.ptr_eq(target) {
None
} else {