core: Re-arrange internal implementation of 'pixelDissolve()'.
This commit is contained in:
parent
deae231176
commit
0f30b378b0
|
@ -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 {
|
||||
|
|
Loading…
Reference in New Issue