///|
fn pdf_spot_name(text : String) -> @core.PdfName {
@core.pdf_name_of_bytes(@ascii.encode(text))
}
///|
let pdf_spot_separation_name : @core.PdfName = pdf_spot_name("/Separation")
///|
fn pdf_spot_separation() -> @core.PdfName {
pdf_spot_separation_name
}
///|
fn pdf_spot_colour_of_object(
document : PdfDocument,
object : @syntax.PdfObject,
) -> @core.PdfName? {
match object {
PdfArray([PdfNameObject(kind), colourant, ..]) if kind ==
pdf_spot_separation() =>
match document.direct(colourant) {
PdfNameObject(name) => Some(name)
_ => None
}
_ => None
}
}
///|
/// Return spot colourant names from top-level `/Separation` colour-space objects.
///
/// This follows cpdf's `list_spot_colours` scan: it iterates document objects
/// and reports arrays whose first entry is `/Separation`; nested arrays inside
/// dictionaries are not recursively scanned by this helper.
pub fn PdfDocument::list_spot_colours(
self : PdfDocument,
) -> Array[@core.PdfName] {
let colours : Array[@core.PdfName] = []
for entry in self.parsed_object_entries() {
match pdf_spot_colour_of_object(self, entry.2) {
Some(name) => colours.push(name)
None => ()
}
}
colours
}
///|
/// Return the bytes cpdf's `list_spot_colours` would print to stdout.
pub fn PdfDocument::list_spot_colours_blob(
self : PdfDocument,
) -> @core.PdfBytes {
let names = self.list_spot_colours()
let mut output_length = 0
for name in names {
output_length += name.bytes().length() + 1
}
let output = Array::make(output_length, b'\n')
let mut position = 0
for name in names {
for byte in name.bytes() {
output[position] = byte
position += 1
}
position += 1
}
Bytes::from_array(output)
}
///|
/// Compatibility wrapper for `PdfDocument::list_spot_colours`.
pub fn pdf_list_spot_colours(document : PdfDocument) -> Array[@core.PdfName] {
document.list_spot_colours()
}
///|
/// Compatibility wrapper for `PdfDocument::list_spot_colours_blob`.
pub fn pdf_list_spot_colours_blob(document : PdfDocument) -> @core.PdfBytes {
document.list_spot_colours_blob()
}