From 4ce5e090bfc18a5a1578494e9ec836b32e7e6918 Mon Sep 17 00:00:00 2001 From: Kornel Date: Tue, 16 Jan 2024 00:11:21 +0000 Subject: [PATCH] Avoid searching entire pixel buffer --- src/encoder.rs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/encoder.rs b/src/encoder.rs index cc3cba0..f3e306d 100644 --- a/src/encoder.rs +++ b/src/encoder.rs @@ -366,7 +366,17 @@ impl Encoder { /// /// The first byte is the minimum code size, followed by LZW data. fn lzw_encode(data: &[u8], buffer: &mut Vec) { - let min_code_size = match flag_size(1 + data.iter().copied().max().unwrap_or(0) as usize) + 1 { + let mut max_byte = 0; + for &byte in data { + if byte > max_byte { + max_byte = byte; + // code size is the same after that + if byte > 128 { + break; + } + } + } + let min_code_size = match flag_size(1 + max_byte as usize) + 1 { 1 => 2, // As per gif spec: The minimal code size has to be >= 2 n => n, };