Fix Indexed8 Texm palette decoding
Docs Deploy / Build and Deploy MkDocs (push) Successful in 35s

This commit is contained in:
Valentin Popov committed 2026-10-18 00:19:42 +04:00
1 parent c92beb1b38
commit d4a29b3aca
1 file changed
+15 -4
+15 -4
View File
@@ -665,10 +665,10 @@ fn decode_mip_rgba8_internal(
continue; continue;
} }
let out = index.saturating_mul(4); let out = index.saturating_mul(4);
rgba[out] = palette[palette_offset]; rgba[out] = palette[palette_offset + 2];
rgba[out + 1] = palette[palette_offset + 1]; rgba[out + 1] = palette[palette_offset + 1];
rgba[out + 2] = palette[palette_offset + 2]; rgba[out + 2] = palette[palette_offset];
rgba[out + 3] = palette[palette_offset + 3]; rgba[out + 3] = 255;
} }
} }
DiskPixelFormat::Rgb565 => decode_words(level_data, pixel_count, &mut rgba, decode_rgb565), DiskPixelFormat::Rgb565 => decode_words(level_data, pixel_count, &mut rgba, decode_rgb565),
@@ -995,6 +995,17 @@ mod tests {
assert!(matches!(err, TexmError::Format(_))); assert!(matches!(err, TexmError::Format(_)));
} }
#[test]
fn indexed_palette_decodes_bgrx_as_opaque_rgba() {
let document =
decode_texm(Arc::from(indexed_payload().into_boxed_slice())).expect("indexed document");
assert_eq!(
decode_mip_rgba8(&document, 0).expect("rgba").rgba8,
[30, 20, 10, 255]
);
}
#[test] #[test]
fn channel_expansion_boundary_values_are_stable() { fn channel_expansion_boundary_values_are_stable() {
let document = decode_texm(Arc::from( let document = decode_texm(Arc::from(
@@ -1155,7 +1166,7 @@ mod tests {
fn indexed_payload() -> Vec<u8> { fn indexed_payload() -> Vec<u8> {
let mut palette = [0_u8; 1024]; let mut palette = [0_u8; 1024];
palette[4..8].copy_from_slice(&[10, 20, 30, 255]); palette[4..8].copy_from_slice(&[10, 20, 30, 0]);
let mut out = header(1, 1, 1, 0); let mut out = header(1, 1, 1, 0);
out.extend_from_slice(&palette); out.extend_from_slice(&palette);
out.push(1); out.push(1);