use crate::Quad;
use crate::table::cell_content_backfill::TextLine;
use crate::table::detection::PageLine;
#[derive(Debug, Clone, PartialEq)]
pub struct PageTextLine {
pub index: usize,
pub text: String,
pub polygon: Quad,
pub bbox: [f32; 4],
pub score: f32,
}
impl PageTextLine {
pub fn new(index: usize, polygon: Quad, text: String, score: f32) -> Self {
let flat = [
polygon[0][0],
polygon[0][1],
polygon[1][0],
polygon[1][1],
polygon[2][0],
polygon[2][1],
polygon[3][0],
polygon[3][1],
];
Self {
index,
text,
polygon,
bbox: crate::vision::geometry::aabb_from_flat8(&flat),
score,
}
}
pub fn to_page_line(&self) -> PageLine {
PageLine {
polygon: self.polygon,
text: self.text.clone(),
score: self.score,
}
}
pub fn to_text_line(&self) -> TextLine {
TextLine {
bbox: self.bbox,
text: self.text.clone(),
score: self.score,
}
}
}
#[cfg(test)]
mod tests {
use super::PageTextLine;
use crate::table::cell_content_backfill::axis_aligned_bbox;
#[test]
fn derived_views_match_the_pre_merge_construction() {
let polygon: crate::Quad = [[3.0, 8.0], [10.0, 2.0], [12.0, 6.0], [5.0, 11.0]];
let flat = [
polygon[0][0],
polygon[0][1],
polygon[1][0],
polygon[1][1],
polygon[2][0],
polygon[2][1],
polygon[3][0],
polygon[3][1],
];
let line = PageTextLine::new(7, polygon, "行文本".into(), 0.87);
assert_eq!(line.bbox, axis_aligned_bbox(&flat));
assert_eq!(line.bbox, [3.0, 2.0, 12.0, 11.0]);
let page = line.to_page_line();
assert_eq!(page.polygon, polygon);
assert_eq!(page.text, "行文本");
assert_eq!(page.score, 0.87);
let text = line.to_text_line();
assert_eq!(text.bbox, line.bbox);
assert_eq!(text.text, "行文本");
assert_eq!(text.score, 0.87);
assert_eq!(line.index, 7);
}
#[test]
fn degenerate_and_negative_polygon_bbox_matches_reference() {
let polygon: crate::Quad = [[-4.0, -1.0], [-4.0, -1.0], [0.0, 5.0], [0.0, 5.0]];
let flat = [
polygon[0][0],
polygon[0][1],
polygon[1][0],
polygon[1][1],
polygon[2][0],
polygon[2][1],
polygon[3][0],
polygon[3][1],
];
let line = PageTextLine::new(0, polygon, String::new(), 0.0);
assert_eq!(line.bbox, axis_aligned_bbox(&flat));
assert_eq!(line.bbox, [-4.0, -1.0, 0.0, 5.0]);
}
}