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