diff options
Diffstat (limited to 'src/lib.rs')
-rw-r--r-- | src/lib.rs | 37 |
1 files changed, 32 insertions, 5 deletions
@@ -5,7 +5,7 @@ pub mod binfile; pub use large_label_format::LargeLabelFormat; pub use label_format::LabelFormat; -pub(crate) fn flood(source: &LargeLabelFormat, destination: &mut Vec<u16>, +pub(crate) fn flood_u32(source: &LargeLabelFormat, destination: &mut Vec<u16>, x: usize, y: usize, from_color: u32, to_color: u16) { let width = source.width; @@ -19,15 +19,42 @@ pub(crate) fn flood(source: &LargeLabelFormat, destination: &mut Vec<u16>, } destination[x + y * width] = to_color; if x > 0 { - flood(source, destination, x-1, y, from_color, to_color); + flood_u32(source, destination, x-1, y, from_color, to_color); } if (x+1) < width { - flood(source, destination, x+1, y, from_color, to_color); + flood_u32(source, destination, x+1, y, from_color, to_color); } if y > 0 { - flood(source, destination, x, y-1, from_color, to_color); + flood_u32(source, destination, x, y-1, from_color, to_color); } if (y+1) < source.height { - flood(source, destination, x, y+1, from_color, to_color); + flood_u32(source, destination, x, y+1, from_color, to_color); + } +} + +pub(crate) fn flood_u16(source: &LabelFormat, destination: &mut Vec<u16>, + x: usize, y: usize, + from_color: u16, to_color: u16) { + let width = source.width; + let destination_color = destination[x + y * width]; + if destination_color != 0 { + return; + } + let source_color = source.buffer[x + y * width]; + if source_color != from_color { + return; + } + destination[x + y * width] = to_color; + if x > 0 { + flood_u16(source, destination, x-1, y, from_color, to_color); + } + if (x+1) < width { + flood_u16(source, destination, x+1, y, from_color, to_color); + } + if y > 0 { + flood_u16(source, destination, x, y-1, from_color, to_color); + } + if (y+1) < source.height { + flood_u16(source, destination, x, y+1, from_color, to_color); } } |