///|
fn pdf_image_list_entry_json(entry : PdfImageListEntry) -> Json {
  entry.pages.sort()
  Json::object(
    Map([
      ("Object", pdf_image_json_int(entry.object_number)),
      (
        "Pages",
        Json::array(
          [
            for page_number in entry.pages => pdf_image_json_int(page_number)
          ],
        ),
      ),
      ("Name", Json::string(entry.name)),
      ("Width", pdf_image_json_int(entry.width)),
      ("Height", pdf_image_json_int(entry.height)),
      ("Bytes", pdf_image_json_int(entry.byte_count)),
      ("BitsPerComponent", pdf_image_json_int_or_null(entry.bits_per_component)),
      ("Colourspace", pdf_image_json_string_or_null(entry.colourspace)),
      ("Filter", pdf_image_json_string_or_null(entry.filter)),
      ("Mask", Json::string(entry.mask)),
      ("MaskObjNum", pdf_image_json_int_or_null(entry.mask_object_number)),
    ]),
  )
}

///|
/// List image XObjects referenced by selected pages as cpdf-style JSON rows.
pub fn PdfDocument::images_json(
  self : PdfDocument,
  page_numbers : ArrayView[Int],
  inline? : Bool = false,
) -> Json raise @core.PdfError {
  let pages = self.pages_of_pagetree()
  pdf_page_box_validate_page_numbers(page_numbers, pages.length(), "images")
  let entries : Array[PdfImageListEntry] = Array(capacity=page_numbers.length())
  let form_numbers : @hashmap.HashMap[Int, Bool] = HashMap([])
  for page_number in page_numbers {
    self.pdf_image_collect_page_images(
      pages[page_number - 1],
      page_number,
      inline,
      entries,
      form_numbers,
    )
  }
  Json::array([ for entry in entries => pdf_image_list_entry_json(entry) ])
}

///|
/// List image XObjects referenced by selected pages as UTF-8 JSON bytes.
pub fn PdfDocument::images_json_blob(
  self : PdfDocument,
  page_numbers : ArrayView[Int],
  inline? : Bool = false,
) -> @core.PdfBytes raise @core.PdfError {
  @utf8.encode(self.images_json(page_numbers, inline~).stringify())
}

///|
/// Compatibility wrapper for `PdfDocument::images_json`.
pub fn pdf_image_images(
  inline : Bool,
  document : PdfDocument,
  page_numbers : ArrayView[Int],
) -> Json raise @core.PdfError {
  document.images_json(page_numbers, inline~)
}

///|
/// Source-spelled compatibility wrapper for cpdfimage's `images`.
pub fn pdf_images(
  inline : Bool,
  document : PdfDocument,
  page_numbers : ArrayView[Int],
) -> Json raise @core.PdfError {
  document.images_json(page_numbers, inline~)
}

///|
/// Compatibility wrapper for `PdfDocument::images_json_blob`.
pub fn pdf_image_images_json_blob(
  inline : Bool,
  document : PdfDocument,
  page_numbers : ArrayView[Int],
) -> @core.PdfBytes raise @core.PdfError {
  document.images_json_blob(page_numbers, inline~)
}