///|
/// Apply cpdfcontent font state from a resolved ExtGState dictionary.
pub fn PdfDocument::content_apply_extgstate_font_op(
  self : PdfDocument,
  state : PdfContentOperatorState,
  extgstate : @syntax.PdfObject,
) -> PdfContentOperatorState raise @core.PdfError {
  match self.lookup_direct(pdf_content_extgstate_font_name, extgstate) {
    Some(PdfArray([PdfIndirect(font_number), size])) => {
      let font = self.read_font(PdfIndirect(font_number))
      let size_result : Result[Double, Error] = try
        self.get_number(size)
      catch {
        err => Err(err)
      } noraise {
        value => Ok(value)
      }
      let text_state = match size_result {
        Ok(value) => { ..state.text_state, font_size: value, }
        Err(_) => state.text_state
      }
      {
        ..state,
        text_state: {
          ..text_state,
          font: "__EXTGSTATE__" + font_number.to_string(),
          current_font: font,
        },
      }
    }
    _ => state
  }
}

///|
/// Compatibility wrapper for `PdfDocument::content_apply_extgstate_font_op`.
pub fn pdf_content_apply_extgstate_font_op(
  document : PdfDocument,
  state : PdfContentOperatorState,
  extgstate : @syntax.PdfObject,
) -> PdfContentOperatorState raise @core.PdfError {
  document.content_apply_extgstate_font_op(state, extgstate)
}

///|
fn PdfDocument::content_font_resource(
  self : PdfDocument,
  resources : @syntax.PdfObject,
  name : @core.PdfName,
) -> PdfFont? raise @core.PdfError {
  match self.lookup_direct(pdf_page_font_resource_name, resources) {
    Some(font_dictionary) =>
      match self.lookup_direct(name, font_dictionary) {
        Some(font) => Some(self.read_font(font))
        None => None
      }
    None => None
  }
}

///|
/// Apply cpdfcontent's resource-backed `Tf` font lookup and cache update.
pub fn PdfDocument::content_apply_font_resource_op(
  self : PdfDocument,
  state : PdfContentOperatorState,
  resources : @syntax.PdfObject,
  font_name : @core.PdfName,
  font_size : Double,
) -> PdfContentOperatorState raise @core.PdfError {
  let name_text = pdf_content_state_name_text(font_name)
  let text_state = state.text_state.content_apply_text_state_op(
    Op_Tf(font_name, font_size),
  )
  match text_state.content_cached_font(name_text) {
    Some(font) =>
      { ..state, text_state: { ..text_state, current_font: font, }, }
    None =>
      match self.content_font_resource(resources, font_name) {
        Some(font) =>
          {
            ..state,
            text_state: text_state.content_cache_font(name_text, font),
          }
        None => { ..state, text_state, }
      }
  }
}

///|
/// Compatibility wrapper for `PdfDocument::content_apply_font_resource_op`.
pub fn pdf_content_apply_font_resource_op(
  document : PdfDocument,
  state : PdfContentOperatorState,
  resources : @syntax.PdfObject,
  font_name : @core.PdfName,
  font_size : Double,
) -> PdfContentOperatorState raise @core.PdfError {
  document.content_apply_font_resource_op(
    state, resources, font_name, font_size,
  )
}