///|
fn PdfDocument::pdf_page_stamp_protect_content(
  self : PdfDocument,
  resources : @syntax.PdfObject,
  content : ArrayView[@syntax.PdfObject],
  fast : Bool,
) -> Array[@syntax.PdfObject] raise @core.PdfError {
  let deficit = if fast {
    0
  } else {
    let ops = self.pdf_page_parse_content_ops(resources, content)
    let mut saves = 0
    let mut restores = 0
    for op in ops {
      match op {
        Op_q => saves += 1
        Op_Q => restores += 1
        _ => ()
      }
    }
    if saves > restores {
      saves - restores
    } else {
      0
    }
  }
  let begin_number = self.add_object(pdf_content_stream_of_ops([Op_q]))
  let end_ops : Array[@content.PdfContentOp] = []
  for _ in 0.. Array[@syntax.PdfObject] {
  [..first, ..second]
}

///|
fn PdfDocument::pdf_page_stamp_pair(
  self : PdfDocument,
  overlay_page : @page.PdfPage,
  under_page : @page.PdfPage,
  relative_to_box : @core.PdfName,
  position : @geometry.PdfPosition,
  topline : Bool,
  midline : Bool,
  scale_to_fit : Bool,
  is_over : Bool,
  fast : Bool,
) -> @page.PdfPage raise @core.PdfError {
  let overlay_page = self.pdf_page_stamp_transform_overlay(
    overlay_page, under_page, relative_to_box, position, topline, midline, scale_to_fit,
    fast,
  )
  let under_content = self.pdf_page_stamp_protect_content(
    under_page.resources,
    under_page.content,
    fast,
  )
  let overlay_content = self.pdf_page_stamp_protect_content(
    overlay_page.resources,
    overlay_page.content,
    fast,
  )
  {
    ..under_page,
    content: if is_over {
      pdf_page_stamp_concat_content(under_content, overlay_content)
    } else {
      pdf_page_stamp_concat_content(overlay_content, under_content)
    },
    rest: self.combine_pdf_rests(under_page.rest, overlay_page.rest),
    resources: self.combine_pdf_resources(
      under_page.resources,
      overlay_page.resources,
    ),
  }
}