summaryrefslogtreecommitdiff
path: root/src/label_formats/large_label_format.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/label_formats/large_label_format.rs')
-rw-r--r--src/label_formats/large_label_format.rs66
1 files changed, 66 insertions, 0 deletions
diff --git a/src/label_formats/large_label_format.rs b/src/label_formats/large_label_format.rs
new file mode 100644
index 0000000..121a4df
--- /dev/null
+++ b/src/label_formats/large_label_format.rs
@@ -0,0 +1,66 @@
+use super::LabelFormat;
+
+pub struct LargeLabelFormat {
+ pub buffer: Vec<u32>,
+ pub width: usize,
+ pub height: usize,
+}
+
+impl std::fmt::Debug for LargeLabelFormat {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ f.debug_struct("LargeLabelFormat")
+ .field("width", &self.width)
+ .field("height", &self.height)
+ .finish()
+ }
+}
+
+fn flood(source: &LargeLabelFormat, destination: &mut Vec<u16>,
+ x: usize, y: usize,
+ from_color: u32, 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(source, destination, x-1, y, from_color, to_color);
+ }
+ if (x+1) < width {
+ flood(source, destination, x+1, y, from_color, to_color);
+ }
+ if y > 0 {
+ flood(source, destination, x, y-1, from_color, to_color);
+ }
+ if (y+1) < source.height {
+ flood(source, destination, x, y+1, from_color, to_color);
+ }
+}
+
+pub fn compress_large_labels(buffer: LargeLabelFormat) -> LabelFormat {
+ let mut label: u16 = 1;
+ let mut output_buffer: Vec<u16> = vec![0u16; buffer.buffer.len()];
+ for y in 0..buffer.height {
+ for x in 0..buffer.width {
+ let index = x + y*buffer.width;
+ if buffer.buffer[index] == 0 {
+ continue;
+ }
+ if output_buffer[index] == 0 {
+ let color = buffer.buffer[index];
+ flood(&buffer, &mut output_buffer, x, y, color, label);
+ label += 1;
+ }
+ }
+ }
+ return LabelFormat {
+ buffer: output_buffer,
+ width: buffer.width,
+ height: buffer.height,
+ };
+}