let cell = self.table.table.get(CellPos { x, y });
// XXX skip if not top-left cell
let rect = cell.rect();
- let bb = Rect2::from_fn(|a| {
+ let mut bb = Rect2::from_fn(|a| {
cp[a][rect[a].start * 2 + 1]..cp[a][(rect[a].end - 1) * 2 + 2]
});
- let clip = if y < self.table.h().y {
+ let mut clip = if y < self.table.h().y {
if x < self.table.h().x {
+ // Corner
bb.clone()
} else {
+ // Top stub
Rect2::new(
max(bb[X].start, self.ranges[X].start)
..min(bb[X].end, self.ranges[X].end),
)
}
} else if x < self.table.h().x {
+ // Left stub
Rect2::new(
bb[X].clone(),
max(bb[Y].start, self.ranges[Y].start)..min(bb[Y].end, self.ranges[Y].end),
)
} else {
+ // Body
Rect2::from_fn(|a| {
max(bb[a].start, self.ranges[a].start)..min(bb[a].end, self.ranges[a].end)
})
};
+ if clip[X].start >= clip[X].end || clip[Y].start >= clip[Y].end {
+ continue;
+ }
+ for a in [X, Y] {
+ if bb[a].start >= self.ranges[a].start {
+ let h = self.ranges[a].start - self.table.headers_width(a);
+ bb[a].start -= h;
+ bb[a].end -= h;
+ clip[a].start -= h;
+ clip[a].end -= h;
+ }
+ }
let draw_cell = DrawCell::new(cell.content.inner(), &self.table.table);
let valign_offset = match draw_cell.cell_style.vert_align {
VertAlign::Top => 0,
.enumerate()
.filter(|(x, _)| *x % 2 == 0 || y % 2 == 0)
{
- self.draw_rule(device, ofs, CellPos { x, y });
+ let mut bb = Rect2::new(xr.clone(), yr.clone());
+
+ let h = self.table.headers_width(X);
+ if xr.start < h {
+ } else if self.ranges[X].contains(&xr.start) {
+ bb[X].start -= self.ranges[X].start - h;
+ bb[X].end -= self.ranges[X].start - h;
+ } else {
+ continue;
+ }
+
+ let h = self.table.headers_width(Y);
+ if yr.start < h {
+ } else if self.ranges[Y].contains(&yr.start) {
+ bb[Y].start -= self.ranges[Y].start - h;
+ bb[Y].end -= self.ranges[Y].start - h;
+ } else {
+ continue;
+ }
+
+ self.draw_rule(device, ofs, CellPos { x, y }, bb);
}
}
}
- fn draw_rule(&self, device: &mut dyn Device, ofs: Coord2, coord: CellPos) {
+ fn draw_rule(&self, device: &mut dyn Device, ofs: Coord2, coord: CellPos, bb: Rect2) {
const NO_BORDER: BorderStyle = BorderStyle::none();
let styles = EnumMap::from_fn(|a: Axis2| {
let b = !a;
.values()
.all(|border| border.iter().all(BorderStyle::is_none))
{
- let bb = Rect2::from_fn(|a| self.table.cp[a][coord[a]]..self.table.cp[a][coord[a] + 1])
- .translate(ofs);
- device.draw_line(bb, styles);
+ device.draw_line(bb.translate(ofs), styles);
}
}
if !self.has_next() {
return Ok(None);
}
- let target = size
- .checked_sub(self.page.table.headers_width(self.axis))
- .ok_or(())?;
+ let target = size - self.page.table.headers_width(self.axis);
+ if target <= 0 {
+ return Err(());
+ }
let start = self.page.ranges[self.axis].start;
let (end, next_start) = self.find_breakpoint(start..start + target, device);
let result = Page {