From 9c98ee2b97eb03d32bf6936b424041c0c96799d6 Mon Sep 17 00:00:00 2001 From: jan Date: Sat, 12 Apr 2025 23:02:08 -0700 Subject: [PATCH] return masque-style (dx, dy) vectors for AREF --- src/elements.rs | 46 +++++++++++++++++++++++++++------------------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/src/elements.rs b/src/elements.rs index ee6e7e8..db5eaa1 100644 --- a/src/elements.rs +++ b/src/elements.rs @@ -374,32 +374,40 @@ pub fn read_ref<'a>(input: &'a [u8], cell_builder: &mut StructBuilder, tag: u16, let (input, mut xy_iter) = XY::read_data(input, header.data_size)?; + let x = xy_iter.next().unwrap(); + let y = xy_iter.next().unwrap(); let x_builder = ref_builder.field_builder::(4).unwrap(); - x_builder.append_value(xy_iter.next().unwrap()); + x_builder.append_value(x); let y_builder = ref_builder.field_builder::(5).unwrap(); - y_builder.append_value(xy_iter.next().unwrap()); + y_builder.append_value(y); let rep_builder = ref_builder.field_builder::(6).unwrap(); println!("ref, {is_aref:?}"); if is_aref { - let x0_builder = rep_builder.field_builder::(0).unwrap(); - x0_builder.append_value(xy_iter.next().unwrap()); - let y0_builder = rep_builder.field_builder::(1).unwrap(); - y0_builder.append_value(xy_iter.next().unwrap()); - let x1_builder = rep_builder.field_builder::(2).unwrap(); - x1_builder.append_value(xy_iter.next().unwrap()); - let y1_builder = rep_builder.field_builder::(3).unwrap(); - y1_builder.append_value(xy_iter.next().unwrap()); - - match colrow { - None => return fail(input, "AREF without COLROW before XY".to_string()), - Some((count0, count1)) => { - let count0_builder = rep_builder.field_builder::(4).unwrap(); - count0_builder.append_value(count0); - let count1_builder = rep_builder.field_builder::(5).unwrap(); - count1_builder.append_value(count1); - }, + if colrow.is_none() { + return fail(input, "AREF without COLROW before XY".to_string()) } + let (count0, count1) = colrow.unwrap(); + + let x0a = (xy_iter.next().unwrap() - x) / (count0 as i32); + let y0a = (xy_iter.next().unwrap() - y) / (count0 as i32); + let x1a = (xy_iter.next().unwrap() - x) / (count1 as i32); + let y1a = (xy_iter.next().unwrap() - y) / (count1 as i32); + + let x0_builder = rep_builder.field_builder::(0).unwrap(); + x0_builder.append_value(x0a); + let y0_builder = rep_builder.field_builder::(1).unwrap(); + y0_builder.append_value(y0a); + let x1_builder = rep_builder.field_builder::(2).unwrap(); + x1_builder.append_value(x1a); + let y1_builder = rep_builder.field_builder::(3).unwrap(); + y1_builder.append_value(y1a); + + let count0_builder = rep_builder.field_builder::(4).unwrap(); + count0_builder.append_value(count0); + let count1_builder = rep_builder.field_builder::(5).unwrap(); + count1_builder.append_value(count1); + } else { let x0_builder = rep_builder.field_builder::(0).unwrap(); x0_builder.append_null();