use super::LayoutedPage;
use crate::diag::SourceResult;
use crate::engine::Engine;
use crate::introspection::{ManualPageCounter, Tag};
use crate::layout::{Frame, FrameItem, Page, Point};
pub fn finalize(
engine: &mut Engine,
counter: &mut ManualPageCounter,
tags: &mut Vec<Tag>,
LayoutedPage {
inner,
mut margin,
binding,
two_sided,
header,
footer,
background,
foreground,
fill,
numbering,
}: LayoutedPage,
) -> SourceResult<Page> {
if two_sided && binding.swap(counter.physical()) {
std::mem::swap(&mut margin.left, &mut margin.right);
}
let mut frame = Frame::hard(inner.size() + margin.sum_by_axis());
for tag in tags.drain(..) {
frame.push(Point::zero(), FrameItem::Tag(tag));
}
if let Some(background) = background {
frame.push_frame(Point::zero(), background);
}
if let Some(header) = header {
frame.push_frame(Point::with_x(margin.left), header);
}
frame.push_frame(Point::new(margin.left, margin.top), inner);
if let Some(footer) = footer {
let y = frame.height() - footer.height();
frame.push_frame(Point::new(margin.left, y), footer);
}
if let Some(foreground) = foreground {
frame.push_frame(Point::zero(), foreground);
}
counter.visit(engine, &frame)?;
let number = counter.logical();
counter.step();
Ok(Page { frame, fill, numbering, number })
}