///|
fn PdfFont::pdf_text_predefined_builtin_codepoints(
  self : PdfFont,
  code : Int,
) -> Array[Int]? {
  match self {
    PdfFontCIDKeyed(font) =>
      match font.encoding {
        PdfPredefinedCMap(name) =>
          match pdf_text_predefined_direct_unicode_codepoints(name, code) {
            Some(codepoints) => Some(codepoints)
            None =>
              match pdf_text_predefined_japan1_builtin_codepoints(name, code) {
                Some(codepoints) => Some(codepoints)
                None =>
                  if pdf_text_predefined_cmap_uses_shift_jis_charcodes(name) {
                    match pdf_text_predefined_rksj_single_byte_codepoint(code) {
                      Some(codepoint) => Some([codepoint])
                      None => None
                    }
                  } else if pdf_text_predefined_cmap_uses_gb_euc_charcodes(name) {
                    match
                      pdf_text_predefined_vertical_codepoint(
                        pdf_text_predefined_gb1_vertical_codepoint_table(name),
                        code,
                      ) {
                      Some(codepoint) => Some([codepoint])
                      None =>
                        match pdf_text_predefined_gb_euc_codepoint(code) {
                          Some(codepoint) => Some([codepoint])
                          None => None
                        }
                    }
                  } else if pdf_text_predefined_cmap_uses_gbpc_euc_charcodes(
                      name,
                    ) {
                    match
                      pdf_text_predefined_vertical_codepoint(
                        pdf_text_predefined_gb1_vertical_codepoint_table(name),
                        code,
                      ) {
                      Some(codepoint) => Some([codepoint])
                      None => pdf_text_predefined_gbpc_euc_codepoints(code)
                    }
                  } else {
                    match
                      pdf_text_predefined_cns1_builtin_codepoints(name, code) {
                      Some(codepoints) => Some(codepoints)
                      None =>
                        if pdf_text_predefined_cmap_uses_uhc_charcodes(name) {
                          match
                            pdf_text_predefined_vertical_codepoint(
                              pdf_text_predefined_korea1_vertical_codepoint_table(
                                name,
                              ),
                              code,
                            ) {
                            Some(codepoint) => Some([codepoint])
                            None =>
                              match pdf_text_predefined_uhc_codepoint(code) {
                                Some(codepoint) => Some([codepoint])
                                None => None
                              }
                          }
                        } else if pdf_text_predefined_cmap_uses_ksc_euc_charcodes(
                            name,
                          ) {
                          match
                            pdf_text_predefined_vertical_codepoint(
                              pdf_text_predefined_korea1_vertical_codepoint_table(
                                name,
                              ),
                              code,
                            ) {
                            Some(codepoint) => Some([codepoint])
                            None =>
                              match
                                pdf_text_predefined_ksc_euc_codepoint(code) {
                                Some(codepoint) => Some([codepoint])
                                None => None
                              }
                          }
                        } else if pdf_text_predefined_cmap_uses_kscpc_euc_charcodes(
                            name,
                          ) {
                          match
                            pdf_text_predefined_vertical_codepoint(
                              pdf_text_predefined_korea1_vertical_codepoint_table(
                                name,
                              ),
                              code,
                            ) {
                            Some(codepoint) => Some([codepoint])
                            None =>
                              pdf_text_predefined_kscpc_euc_codepoints(code)
                          }
                        } else if pdf_text_predefined_cmap_uses_gbk2k_charcodes(
                            name,
                          ) {
                          match
                            pdf_text_predefined_vertical_codepoint(
                              pdf_text_predefined_gb1_vertical_codepoint_table(
                                name,
                              ),
                              code,
                            ) {
                            Some(codepoint) => Some([codepoint])
                            None =>
                              match pdf_text_predefined_gbk2k_codepoint(code) {
                                Some(codepoint) => Some([codepoint])
                                None => None
                              }
                          }
                        } else if pdf_text_predefined_cmap_uses_gbk_charcodes(
                            name,
                          ) {
                          match
                            pdf_text_predefined_vertical_codepoint(
                              pdf_text_predefined_gb1_vertical_codepoint_table(
                                name,
                              ),
                              code,
                            ) {
                            Some(codepoint) => Some([codepoint])
                            None =>
                              match pdf_text_predefined_gbk_codepoint(code) {
                                Some(codepoint) => Some([codepoint])
                                None => None
                              }
                          }
                        } else {
                          None
                        }
                    }
                  }
              }
          }
        _ => None
      }
    _ => None
  }
}

///|
fn PdfFont::pdf_text_predefined_builtin_charcode(
  self : PdfFont,
  codepoint : Int,
) -> Int? {
  match self {
    PdfFontCIDKeyed(font) =>
      match font.encoding {
        PdfPredefinedCMap(name) =>
          match pdf_text_predefined_direct_unicode_charcode(name, codepoint) {
            Some(code) => Some(code)
            None =>
              match
                pdf_text_predefined_japan1_builtin_charcode(name, codepoint) {
                Some(code) => Some(code)
                None =>
                  if pdf_text_predefined_cmap_uses_shift_jis_charcodes(name) {
                    pdf_text_predefined_rksj_single_byte_charcode(codepoint)
                  } else if pdf_text_predefined_cmap_uses_gb_euc_charcodes(name) {
                    match
                      pdf_text_predefined_vertical_charcode(
                        pdf_text_predefined_gb1_vertical_charcode_table(name),
                        codepoint,
                      ) {
                      Some(code) => Some(code)
                      None => pdf_text_predefined_gb_euc_charcode(codepoint)
                    }
                  } else if pdf_text_predefined_cmap_uses_gbpc_euc_charcodes(
                      name,
                    ) {
                    match
                      pdf_text_predefined_vertical_charcode(
                        pdf_text_predefined_gb1_vertical_charcode_table(name),
                        codepoint,
                      ) {
                      Some(code) => Some(code)
                      None => pdf_text_predefined_gbpc_euc_charcode(codepoint)
                    }
                  } else {
                    match
                      pdf_text_predefined_cns1_builtin_charcode(name, codepoint) {
                      Some(code) => Some(code)
                      None =>
                        if pdf_text_predefined_cmap_uses_uhc_charcodes(name) {
                          match
                            pdf_text_predefined_vertical_charcode(
                              pdf_text_predefined_korea1_vertical_charcode_table(
                                name,
                              ),
                              codepoint,
                            ) {
                            Some(code) => Some(code)
                            None => pdf_text_predefined_uhc_charcode(codepoint)
                          }
                        } else if pdf_text_predefined_cmap_uses_ksc_euc_charcodes(
                            name,
                          ) {
                          match
                            pdf_text_predefined_vertical_charcode(
                              pdf_text_predefined_korea1_vertical_charcode_table(
                                name,
                              ),
                              codepoint,
                            ) {
                            Some(code) => Some(code)
                            None =>
                              pdf_text_predefined_ksc_euc_charcode(codepoint)
                          }
                        } else if pdf_text_predefined_cmap_uses_kscpc_euc_charcodes(
                            name,
                          ) {
                          match
                            pdf_text_predefined_vertical_charcode(
                              pdf_text_predefined_korea1_vertical_charcode_table(
                                name,
                              ),
                              codepoint,
                            ) {
                            Some(code) => Some(code)
                            None =>
                              pdf_text_predefined_kscpc_euc_charcode(codepoint)
                          }
                        } else if pdf_text_predefined_cmap_uses_gbk2k_charcodes(
                            name,
                          ) {
                          match
                            pdf_text_predefined_vertical_charcode(
                              pdf_text_predefined_gb1_vertical_charcode_table(
                                name,
                              ),
                              codepoint,
                            ) {
                            Some(code) => Some(code)
                            None =>
                              pdf_text_predefined_gbk2k_charcode(codepoint)
                          }
                        } else if pdf_text_predefined_cmap_uses_gbk_charcodes(
                            name,
                          ) {
                          match
                            pdf_text_predefined_vertical_charcode(
                              pdf_text_predefined_gb1_vertical_charcode_table(
                                name,
                              ),
                              codepoint,
                            ) {
                            Some(code) => Some(code)
                            None => pdf_text_predefined_gbk_charcode(codepoint)
                          }
                        } else {
                          None
                        }
                    }
                  }
              }
          }
        _ => None
      }
    _ => None
  }
}