use oxideav_core::vector::VectorFrame;
use crate::objects::{Dict, Document, Object, ObjectId, Stream};
use crate::resources::ResourceCollector;
pub struct PageBuild {
pub page_id: ObjectId,
pub pages_tree_id: ObjectId,
pub catalog_id: ObjectId,
}
pub fn build_page(
doc: &mut Document,
frame: &VectorFrame,
content_bytes: Vec<u8>,
resources: &ResourceCollector,
) -> PageBuild {
let catalog_id = doc.allocate_id();
let pages_id = doc.allocate_id();
let page_id = doc.allocate_id();
let resources_id = doc.allocate_id();
let contents_id = doc.allocate_id();
let media_box = Object::Array(vec![
Object::Real(0.0),
Object::Real(0.0),
Object::Real(frame.width as f64),
Object::Real(frame.height as f64),
]);
doc.add_object(
catalog_id,
Object::Dict(
Dict::new()
.with("Type", Object::Name("Catalog".into()))
.with("Pages", Object::Reference(pages_id)),
),
);
doc.add_object(
pages_id,
Object::Dict(
Dict::new()
.with("Type", Object::Name("Pages".into()))
.with("Kids", Object::Array(vec![Object::Reference(page_id)]))
.with("Count", Object::Integer(1)),
),
);
doc.add_object(
page_id,
Object::Dict(
Dict::new()
.with("Type", Object::Name("Page".into()))
.with("Parent", Object::Reference(pages_id))
.with("MediaBox", media_box)
.with("Resources", Object::Reference(resources_id))
.with("Contents", Object::Reference(contents_id)),
),
);
let res_obj = resources.flatten_into_resources_dict(doc);
doc.add_object(resources_id, res_obj);
let mut content_dict = Dict::new();
let _ = &mut content_dict; doc.add_object(
contents_id,
Object::Stream(Stream::new(content_dict, content_bytes)),
);
doc.root = Some(catalog_id);
PageBuild {
page_id,
pages_tree_id: pages_id,
catalog_id,
}
}
#[cfg(test)]
mod tests {
use super::*;
use oxideav_core::time::TimeBase;
use oxideav_core::vector::Group;
#[test]
fn build_page_assembles_catalog_pages_page_resources_contents() {
let frame = VectorFrame {
width: 100.0,
height: 50.0,
view_box: None,
root: Group::default(),
pts: None,
time_base: TimeBase::new(1, 1),
};
let mut doc = Document::new();
let res = ResourceCollector::new();
let pb = build_page(&mut doc, &frame, b"% empty\n".to_vec(), &res);
assert_eq!(pb.catalog_id.number, 1);
assert_eq!(pb.pages_tree_id.number, 2);
assert_eq!(pb.page_id.number, 3);
assert_eq!(doc.object_count(), 5);
}
}