use super::*;
use crate::types::RenderingIntent;
pub struct ImageXObject<'a> {
stream: Stream<'a>,
}
impl<'a> ImageXObject<'a> {
pub(crate) fn start(mut stream: Stream<'a>) -> Self {
stream.pair(Name(b"Type"), Name(b"XObject"));
stream.pair(Name(b"Subtype"), Name(b"Image"));
Self { stream }
}
pub fn width(&mut self, width: i32) -> &mut Self {
self.pair(Name(b"Width"), width);
self
}
pub fn height(&mut self, height: i32) -> &mut Self {
self.pair(Name(b"Height"), height);
self
}
pub fn color_space(&mut self) -> ColorSpace<'_> {
self.insert(Name(b"ColorSpace")).start()
}
pub fn color_space_name(&mut self, name: Name) -> &mut Self {
self.pair(Name(b"ColorSpace"), name);
self
}
pub fn bits_per_component(&mut self, bits: i32) -> &mut Self {
self.pair(Name(b"BitsPerComponent"), bits);
self
}
pub fn intent(&mut self, intent: RenderingIntent) -> &mut Self {
self.pair(Name(b"Intent"), intent.to_name());
self
}
pub fn image_mask(&mut self, mask: bool) -> &mut Self {
self.pair(Name(b"ImageMask"), mask);
self
}
pub fn color_mask(&mut self, colors: impl IntoIterator<Item = i32>) -> &mut Self {
self.insert(Name(b"Mask")).array().typed().items(colors);
self
}
pub fn stencil_mask(&mut self, mask: Ref) -> &mut Self {
self.pair(Name(b"Mask"), mask);
self
}
pub fn decode(&mut self, decode: impl IntoIterator<Item = f32>) -> &mut Self {
self.insert(Name(b"Decode")).array().typed().items(decode);
self
}
pub fn interpolate(&mut self, interpolate: bool) -> &mut Self {
self.pair(Name(b"Interpolate"), interpolate);
self
}
pub fn alternates(&mut self, alternates: impl IntoIterator<Item = Ref>) -> &mut Self {
self.insert(Name(b"Alternates")).array().items(alternates);
self
}
pub fn s_mask(&mut self, x_object: Ref) -> &mut Self {
self.pair(Name(b"SMask"), x_object);
self
}
pub fn s_mask_in_data(&mut self, mode: SMaskInData) -> &mut Self {
self.pair(Name(b"SMaskInData"), mode.to_int());
self
}
pub fn struct_parent(&mut self, key: i32) -> &mut Self {
self.pair(Name(b"StructParent"), key);
self
}
pub fn matte(&mut self, color: impl IntoIterator<Item = f32>) -> &mut Self {
self.insert(Name(b"Matte")).array().items(color);
self
}
pub fn metadata(&mut self, id: Ref) -> &mut Self {
self.pair(Name(b"Metadata"), id);
self
}
}
deref!('a, ImageXObject<'a> => Stream<'a>, stream);
pub enum SMaskInData {
Ignore,
Use,
Preblended,
}
impl SMaskInData {
pub(crate) fn to_int(&self) -> i32 {
match self {
Self::Ignore => 0,
Self::Use => 1,
Self::Preblended => 2,
}
}
}
pub struct FormXObject<'a> {
stream: Stream<'a>,
}
impl<'a> FormXObject<'a> {
pub(crate) fn start(mut stream: Stream<'a>) -> Self {
stream.pair(Name(b"Type"), Name(b"XObject"));
stream.pair(Name(b"Subtype"), Name(b"Form"));
Self { stream }
}
pub fn bbox(&mut self, bbox: Rect) -> &mut Self {
self.pair(Name(b"BBox"), bbox);
self
}
pub fn matrix(&mut self, matrix: [f32; 6]) -> &mut Self {
self.insert(Name(b"Matrix")).array().items(matrix);
self
}
pub fn resources(&mut self) -> Resources<'_> {
self.insert(Name(b"Resources")).start()
}
pub fn group(&mut self) -> Group<'_> {
self.insert(Name(b"Group")).start()
}
pub fn struct_parent(&mut self, key: i32) -> &mut Self {
self.pair(Name(b"StructParent"), key);
self
}
pub fn struct_parents(&mut self, key: i32) -> &mut Self {
self.pair(Name(b"StructParents"), key);
self
}
pub fn reference(&mut self) -> Reference<'_> {
self.insert(Name(b"Ref")).start()
}
pub fn metadata(&mut self, id: Ref) -> &mut Self {
self.pair(Name(b"Metadata"), id);
self
}
pub fn last_modified(&mut self, last_modified: Date) -> &mut Self {
self.pair(Name(b"LastModified"), last_modified);
self
}
}
deref!('a, FormXObject<'a> => Stream<'a>, stream);
pub struct Group<'a> {
dict: Dict<'a>,
}
writer!(Group: |obj| {
let mut dict = obj.dict();
dict.pair(Name(b"Type"), Name(b"Group"));
Self { dict }
});
impl<'a> Group<'a> {
pub fn transparency(&mut self) -> &mut Self {
self.pair(Name(b"S"), Name(b"Transparency"));
self
}
pub fn color_space(&mut self) -> ColorSpace<'_> {
self.insert(Name(b"CS")).start()
}
pub fn isolated(&mut self, isolated: bool) -> &mut Self {
self.pair(Name(b"I"), isolated);
self
}
pub fn knockout(&mut self, knockout: bool) -> &mut Self {
self.pair(Name(b"K"), knockout);
self
}
}
deref!('a, Group<'a> => Dict<'a>, dict);
pub struct Reference<'a> {
dict: Dict<'a>,
}
writer!(Reference: |obj| Self { dict: obj.dict() });
impl<'a> Reference<'a> {
pub fn file_spec(&mut self) -> FileSpec<'_> {
self.insert(Name(b"F")).start()
}
pub fn page_number(&mut self, page: i32) -> &mut Self {
self.pair(Name(b"Page"), page);
self
}
pub fn page_label(&mut self, label: TextStr) -> &mut Self {
self.pair(Name(b"Page"), label);
self
}
pub fn id(&mut self, id: [Str; 2]) -> &mut Self {
self.insert(Name(b"ID")).array().items(id);
self
}
}
deref!('a, Reference<'a> => Dict<'a>, dict);