///|
fn pdf_text_codepoint_of_basic_latin_glyphname(name : PdfName) -> Int? {
  match pdf_text_string_of_name(name) {
    "/A" => Some(65)
    "/B" => Some(66)
    "/C" => Some(67)
    "/D" => Some(68)
    "/E" => Some(69)
    "/F" => Some(70)
    "/G" => Some(71)
    "/H" => Some(72)
    "/I" => Some(73)
    "/J" => Some(74)
    "/K" => Some(75)
    "/L" => Some(76)
    "/M" => Some(77)
    "/N" => Some(78)
    "/O" => Some(79)
    "/P" => Some(80)
    "/Q" => Some(81)
    "/R" => Some(82)
    "/S" => Some(83)
    "/T" => Some(84)
    "/U" => Some(85)
    "/V" => Some(86)
    "/W" => Some(87)
    "/X" => Some(88)
    "/Y" => Some(89)
    "/Z" => Some(90)
    "/a" => Some(97)
    "/b" => Some(98)
    "/c" => Some(99)
    "/controlACK" => Some(6)
    "/controlBEL" => Some(7)
    "/controlBS" => Some(8)
    "/controlCAN" => Some(24)
    "/controlDC1" => Some(17)
    "/controlDC2" => Some(18)
    "/controlDC3" => Some(19)
    "/controlDC4" => Some(20)
    "/controlDEL" => Some(127)
    "/controlDLE" => Some(16)
    "/controlEM" => Some(25)
    "/controlENQ" => Some(5)
    "/controlEOT" => Some(4)
    "/controlESC" => Some(27)
    "/controlETB" => Some(23)
    "/controlETX" => Some(3)
    "/controlFS" => Some(28)
    "/controlGS" => Some(29)
    "/controlNAK" => Some(21)
    "/controlRS" => Some(30)
    "/controlSI" => Some(15)
    "/controlSO" => Some(14)
    "/controlSOT" => Some(2)
    "/controlSTX" => Some(1)
    "/controlSUB" => Some(26)
    "/controlSYN" => Some(22)
    "/controlUS" => Some(31)
    "/controlVT" => Some(11)
    "/d" => Some(100)
    "/e" => Some(101)
    "/f" => Some(102)
    "/g" => Some(103)
    "/h" => Some(104)
    "/i" => Some(105)
    "/j" => Some(106)
    "/k" => Some(107)
    "/l" => Some(108)
    "/m" => Some(109)
    "/n" => Some(110)
    "/o" => Some(111)
    "/p" => Some(112)
    "/q" => Some(113)
    "/r" => Some(114)
    "/s" => Some(115)
    "/spacehackarabic" => Some(32)
    "/t" => Some(116)
    "/u" => Some(117)
    "/v" => Some(118)
    "/verticalbar" => Some(124)
    "/w" => Some(119)
    "/x" => Some(120)
    "/y" => Some(121)
    "/z" => Some(122)
    _ => None
  }
}

///|
fn pdf_text_codepoint_of_digit_glyphname(name : PdfName) -> Int? {
  match pdf_text_string_of_name(name) {
    "/zero" => Some(48)
    "/one" => Some(49)
    "/two" => Some(50)
    "/three" => Some(51)
    "/four" => Some(52)
    "/five" => Some(53)
    "/six" => Some(54)
    "/seven" => Some(55)
    "/eight" => Some(56)
    "/nine" => Some(57)
    "/zerooldstyle" => Some(0xF730)
    "/oneoldstyle" => Some(0xF731)
    "/twooldstyle" => Some(0xF732)
    "/threeoldstyle" => Some(0xF733)
    "/fouroldstyle" => Some(0xF734)
    "/fiveoldstyle" => Some(0xF735)
    "/sixoldstyle" => Some(0xF736)
    "/sevenoldstyle" => Some(0xF737)
    "/eightoldstyle" => Some(0xF738)
    "/nineoldstyle" => Some(0xF739)
    "/zeroinferior" => Some(0x2080)
    "/oneinferior" => Some(0x2081)
    "/twoinferior" => Some(0x2082)
    "/threeinferior" => Some(0x2083)
    "/fourinferior" => Some(0x2084)
    "/fiveinferior" => Some(0x2085)
    "/sixinferior" => Some(0x2086)
    "/seveninferior" => Some(0x2087)
    "/eightinferior" => Some(0x2088)
    "/nineinferior" => Some(0x2089)
    "/zerosuperior" => Some(0x2070)
    "/onesuperior" => Some(0x00B9)
    "/twosuperior" => Some(0x00B2)
    "/threesuperior" => Some(0x00B3)
    "/oneeighth" => Some(0x215B)
    "/threeeighths" => Some(0x215C)
    "/fiveeighths" => Some(0x215D)
    "/seveneighths" => Some(0x215E)
    "/onethird" => Some(0x2153)
    "/twothirds" => Some(0x2154)
    "/threequartersemdash" => Some(0xF6DE)
    "/foursuperior" => Some(0x2074)
    "/fivesuperior" => Some(0x2075)
    "/sixsuperior" => Some(0x2076)
    "/sevensuperior" => Some(0x2077)
    "/eightsuperior" => Some(0x2078)
    "/ninesuperior" => Some(0x2079)
    _ => None
  }
}

///|
fn pdf_text_codepoint_of_punctuation_glyphname(name : PdfName) -> Int? {
  match pdf_text_string_of_name(name) {
    "/space" => Some(32)
    "/blank" => Some(0x2423)
    "/controlHT" => Some(9)
    "/controlLF" => Some(10)
    "/controlFF" => Some(12)
    "/controlCR" => Some(13)
    "/exclam" => Some(33)
    "/quotedbl" => Some(34)
    "/numbersign" => Some(35)
    "/dollar" => Some(36)
    "/percent" => Some(37)
    "/ampersand" => Some(38)
    "/quotesingle" => Some(39)
    "/quoteright" => Some(0x2019)
    "/parenleft" => Some(40)
    "/parenright" => Some(41)
    "/asterisk" => Some(42)
    "/plus" => Some(43)
    "/comma" => Some(44)
    "/hyphen" => Some(45)
    "/period" => Some(46)
    "/slash" => Some(47)
    "/colon" => Some(58)
    "/semicolon" => Some(59)
    "/less" => Some(60)
    "/equal" => Some(61)
    "/greater" => Some(62)
    "/question" => Some(63)
    "/at" => Some(64)
    "/bracketleft" => Some(91)
    "/backslash" => Some(92)
    "/bracketright" => Some(93)
    "/asciicircum" => Some(94)
    "/underscore" => Some(95)
    "/grave" => Some(96)
    "/quoteleft" => Some(0x2018)
    "/braceleft" => Some(123)
    "/bar" => Some(124)
    "/braceright" => Some(125)
    "/asciitilde" => Some(126)
    "/Euro" => Some(0x20AC)
    "/exclamdown" => Some(0x00A1)
    "/cent" => Some(0x00A2)
    "/sterling" => Some(0x00A3)
    "/fraction" => Some(0x2044)
    "/yen" => Some(0x00A5)
    "/section" => Some(0x00A7)
    "/currency" => Some(0x00A4)
    "/nbspace" => Some(0x00A0)
    "/nonbreakingspace" => Some(0x00A0)
    "/guillemotleft" => Some(0x00AB)
    "/guillemotright" => Some(0x00BB)
    "/ff" => Some(0xFB00)
    "/fi" => Some(0xFB01)
    "/fl" => Some(0xFB02)
    "/ffi" => Some(0xFB03)
    "/ffl" => Some(0xFB04)
    "/periodcentered" => Some(0x00B7)
    "/middot" => Some(0x00B7)
    "/paragraph" => Some(0x00B6)
    "/questiondown" => Some(0x00BF)
    "/Agrave" => Some(0x00C0)
    "/Aacute" => Some(0x00C1)
    "/Acircumflex" => Some(0x00C2)
    "/Atilde" => Some(0x00C3)
    "/AE" => Some(0x00C6)
    "/Egrave" => Some(0x00C8)
    "/Ecircumflex" => Some(0x00CA)
    "/Edieresis" => Some(0x00CB)
    "/Igrave" => Some(0x00CC)
    "/Iacute" => Some(0x00CD)
    "/Icircumflex" => Some(0x00CE)
    "/Idieresis" => Some(0x00CF)
    "/Eth" => Some(0x00D0)
    "/Ograve" => Some(0x00D2)
    "/Oacute" => Some(0x00D3)
    "/Ocircumflex" => Some(0x00D4)
    "/Otilde" => Some(0x00D5)
    "/Oslash" => Some(0x00D8)
    "/Ugrave" => Some(0x00D9)
    "/Uacute" => Some(0x00DA)
    "/Ucircumflex" => Some(0x00DB)
    "/Yacute" => Some(0x00DD)
    "/Thorn" => Some(0x00DE)
    "/germandbls" => Some(0x00DF)
    "/ae" => Some(0x00E6)
    "/eth" => Some(0x00F0)
    "/oslash" => Some(0x00F8)
    "/yacute" => Some(0x00FD)
    "/thorn" => Some(0x00FE)
    "/ydieresis" => Some(0x00FF)
    "/Adieresis" => Some(0x00C4)
    "/Aring" => Some(0x00C5)
    "/Ccedilla" => Some(0x00C7)
    "/Eacute" => Some(0x00C9)
    "/Ntilde" => Some(0x00D1)
    "/Odieresis" => Some(0x00D6)
    "/Udieresis" => Some(0x00DC)
    "/aacute" => Some(0x00E1)
    "/agrave" => Some(0x00E0)
    "/acircumflex" => Some(0x00E2)
    "/adieresis" => Some(0x00E4)
    "/atilde" => Some(0x00E3)
    "/aring" => Some(0x00E5)
    "/ccedilla" => Some(0x00E7)
    "/egrave" => Some(0x00E8)
    "/ecircumflex" => Some(0x00EA)
    "/edieresis" => Some(0x00EB)
    "/brokenbar" => Some(0x00A6)
    "/dieresis" => Some(0x00A8)
    "/ordfeminine" => Some(0x00AA)
    "/logicalnot" => Some(0x00AC)
    "/registered" => Some(0x00AE)
    "/macron" => Some(0x00AF)
    "/overscore" => Some(0x00AF)
    "/breve" => Some(0x02D8)
    "/dotaccent" => Some(0x02D9)
    "/ring" => Some(0x02DA)
    "/hungarumlaut" => Some(0x02DD)
    "/ogonek" => Some(0x02DB)
    "/caron" => Some(0x02C7)
    "/dotlessi" => Some(0x0131)
    "/Lslash" => Some(0x0141)
    "/lslash" => Some(0x0142)
    "/degree" => Some(0x00B0)
    "/mu1" => Some(0x00B5)
    "/twosuperior" => Some(0x00B2)
    "/threesuperior" => Some(0x00B3)
    "/acute" => Some(0x00B4)
    "/cedilla" => Some(0x00B8)
    "/onesuperior" => Some(0x00B9)
    "/ordmasculine" => Some(0x00BA)
    "/onequarter" => Some(0x00BC)
    "/onehalf" => Some(0x00BD)
    "/threequarters" => Some(0x00BE)
    "/iacute" => Some(0x00ED)
    "/igrave" => Some(0x00EC)
    "/icircumflex" => Some(0x00EE)
    "/idieresis" => Some(0x00EF)
    "/ntilde" => Some(0x00F1)
    "/oacute" => Some(0x00F3)
    "/ograve" => Some(0x00F2)
    "/ocircumflex" => Some(0x00F4)
    "/odieresis" => Some(0x00F6)
    "/otilde" => Some(0x00F5)
    "/uacute" => Some(0x00FA)
    "/ugrave" => Some(0x00F9)
    "/ucircumflex" => Some(0x00FB)
    "/udieresis" => Some(0x00FC)
    "/quotesinglbase" => Some(0x201A)
    "/florin" => Some(0x0192)
    "/quotedblbase" => Some(0x201E)
    "/ellipsis" => Some(0x2026)
    "/dagger" => Some(0x2020)
    "/daggerdbl" => Some(0x2021)
    "/circumflex" => Some(0x02C6)
    "/perthousand" => Some(0x2030)
    "/Scaron" => Some(0x0160)
    "/guilsinglleft" => Some(0x2039)
    "/OE" => Some(0x0152)
    "/Zcaron" => Some(0x017D)
    "/quotedblleft" => Some(0x201C)
    "/quotedblright" => Some(0x201D)
    "/bullet" => Some(0x2022)
    "/endash" => Some(0x2013)
    "/emdash" => Some(0x2014)
    "/tilde" => Some(0x02DC)
    "/trademark" => Some(0x2122)
    "/scaron" => Some(0x0161)
    "/guilsinglright" => Some(0x203A)
    "/oe" => Some(0x0153)
    "/zcaron" => Some(0x017E)
    "/Ydieresis" => Some(0x0178)
    "/copyright" => Some(0x00A9)
    "/eacute" => Some(0x00E9)
    "/equalsuperior" => Some(0x207C)
    "/plussuperior" => Some(0x207A)
    "/sfthyphen" => Some(0x00AD)
    "/softhyphen" => Some(0x00AD)
    "/afii00208" => Some(0x2015)
    "/afii299" => Some(0x200E)
    "/afii300" => Some(0x200F)
    "/afii301" => Some(0x200D)
    "/afii61573" => Some(0x202C)
    "/afii61574" => Some(0x202D)
    "/afii61575" => Some(0x202E)
    "/afii61664" => Some(0x200C)
    "/asterism" => Some(0x2042)
    "/dbllowline" => Some(0x2017)
    "/dblverticalbar" => Some(0x2016)
    "/enspace" => Some(0x2002)
    "/exclamdbl" => Some(0x203C)
    "/horizontalbar" => Some(0x2015)
    "/hyphentwo" => Some(0x2010)
    "/overline" => Some(0x203E)
    "/primereversed" => Some(0x2035)
    "/quoteleftreversed" => Some(0x201B)
    "/quotereversed" => Some(0x201B)
    "/referencemark" => Some(0x203B)
    "/twodotleader" => Some(0x2025)
    "/underscoredbl" => Some(0x2017)
    "/zerowidthnonjoiner" => Some(0x200C)
    "/zerowidthspace" => Some(0x200B)
    _ => None
  }
}

///|
fn pdf_text_codepoint_of_ipa_extension_glyphname(name : PdfName) -> Int? {
  match pdf_text_string_of_name(name) {
    "/Gsmallhook" => Some(0x029B)
    "/Rsmallinverted" => Some(0x0281)
    "/ascript" => Some(0x0251)
    "/ascriptturned" => Some(0x0252)
    "/aturned" => Some(0x0250)
    "/bhook" => Some(0x0253)
    "/bilabialclick" => Some(0x0298)
    "/ccurl" => Some(0x0255)
    "/cstretched" => Some(0x0297)
    "/dezh" => Some(0x02A4)
    "/dhook" => Some(0x0257)
    "/dotlessjstrokehook" => Some(0x0284)
    "/dtail" => Some(0x0256)
    "/dzaltone" => Some(0x02A3)
    "/dzcurl" => Some(0x02A5)
    "/eopen" => Some(0x025B)
    "/eopenclosed" => Some(0x029A)
    "/eopenreversed" => Some(0x025C)
    "/eopenreversedclosed" => Some(0x025E)
    "/eopenreversedhook" => Some(0x025D)
    "/ereversed" => Some(0x0258)
    "/esh" => Some(0x0283)
    "/eshcurl" => Some(0x0286)
    "/eshsquatreversed" => Some(0x0285)
    "/ezh" => Some(0x0292)
    "/ezhcurl" => Some(0x0293)
    "/gammalatinsmall" => Some(0x0263)
    "/ghook" => Some(0x0260)
    "/glottalstop" => Some(0x0294)
    "/glottalstopinverted" => Some(0x0296)
    "/glottalstopreversed" => Some(0x0295)
    "/glottalstopstroke" => Some(0x02A1)
    "/glottalstopstrokereversed" => Some(0x02A2)
    "/gscript" => Some(0x0261)
    "/henghook" => Some(0x0267)
    "/hhook" => Some(0x0266)
    "/hturned" => Some(0x0265)
    "/iotalatin" => Some(0x0269)
    "/istroke" => Some(0x0268)
    "/jcrossedtail" => Some(0x029D)
    "/jdotlessstroke" => Some(0x025F)
    "/kturned" => Some(0x029E)
    "/lbelt" => Some(0x026C)
    "/lezh" => Some(0x026E)
    "/lhookretroflex" => Some(0x026D)
    "/lmiddletilde" => Some(0x026B)
    "/mhook" => Some(0x0271)
    "/mlonglegturned" => Some(0x0270)
    "/mturned" => Some(0x026F)
    "/nhookleft" => Some(0x0272)
    "/nhookretroflex" => Some(0x0273)
    "/obarred" => Some(0x0275)
    "/omegalatinclosed" => Some(0x0277)
    "/oopen" => Some(0x0254)
    "/philatin" => Some(0x0278)
    "/qhook" => Some(0x02A0)
    "/ramshorn" => Some(0x0264)
    "/rfishhook" => Some(0x027E)
    "/rfishhookreversed" => Some(0x027F)
    "/rhook" => Some(0x027D)
    "/rhookturned" => Some(0x027B)
    "/rlongleg" => Some(0x027C)
    "/rlonglegturned" => Some(0x027A)
    "/rturned" => Some(0x0279)
    "/schwa" => Some(0x0259)
    "/schwahook" => Some(0x025A)
    "/shook" => Some(0x0282)
    "/tccurl" => Some(0x02A8)
    "/tesh" => Some(0x02A7)
    "/tretroflexhook" => Some(0x0288)
    "/ts" => Some(0x02A6)
    "/tturned" => Some(0x0287)
    "/ubar" => Some(0x0289)
    "/upsilonlatin" => Some(0x028A)
    "/vhook" => Some(0x028B)
    "/vturned" => Some(0x028C)
    "/wturned" => Some(0x028D)
    "/yturned" => Some(0x028E)
    "/zcurl" => Some(0x0291)
    "/zretroflexhook" => Some(0x0290)
    _ => None
  }
}

///|
fn pdf_text_codepoint_of_spacing_modifier_glyphname(name : PdfName) -> Int? {
  match pdf_text_string_of_name(name) {
    "/Rsmallinvertedsuperior" => Some(0x02B6)
    "/acutelowmod" => Some(0x02CF)
    "/afii57929" => Some(0x02BC)
    "/afii64937" => Some(0x02BD)
    "/apostrophemod" => Some(0x02BC)
    "/arrowheaddownmod" => Some(0x02C5)
    "/arrowheadleftmod" => Some(0x02C2)
    "/arrowheadrightmod" => Some(0x02C3)
    "/arrowheadupmod" => Some(0x02C4)
    "/colontriangularhalfmod" => Some(0x02D1)
    "/colontriangularmod" => Some(0x02D0)
    "/commareversedmod" => Some(0x02BD)
    "/commaturnedmod" => Some(0x02BB)
    "/dblprimemod" => Some(0x02BA)
    "/downtackmod" => Some(0x02D5)
    "/firsttonechinese" => Some(0x02C9)
    "/fourthtonechinese" => Some(0x02CB)
    "/gammasuperior" => Some(0x02E0)
    "/glottalstopmod" => Some(0x02C0)
    "/glottalstopreversedmod" => Some(0x02C1)
    "/glottalstopreversedsuperior" => Some(0x02E4)
    "/gravelowmod" => Some(0x02CE)
    "/hhooksuperior" => Some(0x02B1)
    "/hsuperior" => Some(0x02B0)
    "/ilde" => Some(0x02DC)
    "/jsuperior" => Some(0x02B2)
    "/macronlowmod" => Some(0x02CD)
    "/minusmod" => Some(0x02D7)
    "/plusmod" => Some(0x02D6)
    "/primemod" => Some(0x02B9)
    "/rhookturnedsuperior" => Some(0x02B5)
    "/rhotichookmod" => Some(0x02DE)
    "/ringhalfleft" => Some(0x02BF)
    "/ringhalfleftcentered" => Some(0x02D3)
    "/ringhalfright" => Some(0x02BE)
    "/ringhalfrightcentered" => Some(0x02D2)
    "/rturnedsuperior" => Some(0x02B4)
    "/secondtonechinese" => Some(0x02CA)
    "/tonebarextrahighmod" => Some(0x02E5)
    "/tonebarextralowmod" => Some(0x02E9)
    "/tonebarhighmod" => Some(0x02E6)
    "/tonebarlowmod" => Some(0x02E8)
    "/tonebarmidmod" => Some(0x02E7)
    "/uptackmod" => Some(0x02D4)
    "/verticallinelowmod" => Some(0x02CC)
    "/verticallinemod" => Some(0x02C8)
    "/wsuperior" => Some(0x02B7)
    "/xsuperior" => Some(0x02E3)
    "/ysuperior" => Some(0x02B8)
    _ => None
  }
}

///|
fn pdf_text_codepoint_of_combining_mark_glyphname(name : PdfName) -> Int? {
  match pdf_text_string_of_name(name) {
    "/acutebelowcmb" => Some(0x0317)
    "/acutecmb" => Some(0x0301)
    "/acutecomb" => Some(0x0301)
    "/acutetonecmb" => Some(0x0341)
    "/brevebelowcmb" => Some(0x032E)
    "/brevecmb" => Some(0x0306)
    "/breveinvertedbelowcmb" => Some(0x032F)
    "/breveinvertedcmb" => Some(0x0311)
    "/breveinverteddoublecmb" => Some(0x0361)
    "/bridgebelowcmb" => Some(0x032A)
    "/bridgeinvertedbelowcmb" => Some(0x033A)
    "/candrabinducmb" => Some(0x0310)
    "/caronbelowcmb" => Some(0x032C)
    "/caroncmb" => Some(0x030C)
    "/cedillacmb" => Some(0x0327)
    "/circumflexbelowcmb" => Some(0x032D)
    "/circumflexcmb" => Some(0x0302)
    "/commaabovecmb" => Some(0x0313)
    "/commaaboverightcmb" => Some(0x0315)
    "/commareversedabovecmb" => Some(0x0314)
    "/commaturnedabovecmb" => Some(0x0312)
    "/dblarchinvertedbelowcmb" => Some(0x032B)
    "/dblgravecmb" => Some(0x030F)
    "/dbllowlinecmb" => Some(0x0333)
    "/dbloverlinecmb" => Some(0x033F)
    "/dblverticallineabovecmb" => Some(0x030E)
    "/dialytikatonoscmb" => Some(0x0344)
    "/dieresisbelowcmb" => Some(0x0324)
    "/dieresiscmb" => Some(0x0308)
    "/dotaccentcmb" => Some(0x0307)
    "/dotbelowcmb" => Some(0x0323)
    "/dotbelowcomb" => Some(0x0323)
    "/downtackbelowcmb" => Some(0x031E)
    "/gravebelowcmb" => Some(0x0316)
    "/gravecmb" => Some(0x0300)
    "/gravecomb" => Some(0x0300)
    "/gravetonecmb" => Some(0x0340)
    "/hookabovecomb" => Some(0x0309)
    "/hookcmb" => Some(0x0309)
    "/hookpalatalizedbelowcmb" => Some(0x0321)
    "/hookretroflexbelowcmb" => Some(0x0322)
    "/horncmb" => Some(0x031B)
    "/hungarumlautcmb" => Some(0x030B)
    "/koroniscmb" => Some(0x0343)
    "/leftangleabovecmb" => Some(0x031A)
    "/lefttackbelowcmb" => Some(0x0318)
    "/lowlinecmb" => Some(0x0332)
    "/macronbelowcmb" => Some(0x0331)
    "/macroncmb" => Some(0x0304)
    "/minusbelowcmb" => Some(0x0320)
    "/ogonekcmb" => Some(0x0328)
    "/overlinecmb" => Some(0x0305)
    "/perispomenigreekcmb" => Some(0x0342)
    "/plusbelowcmb" => Some(0x031F)
    "/righttackbelowcmb" => Some(0x0319)
    "/ringbelowcmb" => Some(0x0325)
    "/ringcmb" => Some(0x030A)
    "/ringhalfleftbelowcmb" => Some(0x031C)
    "/ringhalfrightbelowcmb" => Some(0x0339)
    "/seagullbelowcmb" => Some(0x033C)
    "/soliduslongoverlaycmb" => Some(0x0338)
    "/solidusshortoverlaycmb" => Some(0x0337)
    "/squarebelowcmb" => Some(0x033B)
    "/strokelongoverlaycmb" => Some(0x0336)
    "/strokeshortoverlaycmb" => Some(0x0335)
    "/tildebelowcmb" => Some(0x0330)
    "/tildecmb" => Some(0x0303)
    "/tildecomb" => Some(0x0303)
    "/tildedoublecmb" => Some(0x0360)
    "/tildeoverlaycmb" => Some(0x0334)
    "/tildeverticalcmb" => Some(0x033E)
    "/uptackbelowcmb" => Some(0x031D)
    "/verticallineabovecmb" => Some(0x030D)
    "/verticallinebelowcmb" => Some(0x0329)
    "/xabovecmb" => Some(0x033D)
    "/ypogegrammenigreekcmb" => Some(0x0345)
    _ => None
  }
}

///|
fn pdf_text_codepoint_of_currency_letterlike_glyphname(name : PdfName) -> Int? {
  match pdf_text_string_of_name(name) {
    "/afii08941" => Some(0x20A4)
    "/afii57636" => Some(0x20AA)
    "/colonsign" => Some(0x20A1)
    "/cruzeiro" => Some(0x20A2)
    "/dong" => Some(0x20AB)
    "/euro" => Some(0x20AC)
    "/franc" => Some(0x20A3)
    "/lira" => Some(0x20A4)
    "/newsheqelsign" => Some(0x20AA)
    "/peseta" => Some(0x20A7)
    "/sheqel" => Some(0x20AA)
    "/sheqelhebrew" => Some(0x20AA)
    "/won" => Some(0x20A9)
    "/Ohm" => Some(0x2126)
    "/afii61248" => Some(0x2105)
    "/afii61289" => Some(0x2113)
    "/afii61352" => Some(0x2116)
    "/angstrom" => Some(0x212B)
    "/careof" => Some(0x2105)
    "/centigrade" => Some(0x2103)
    "/estimated" => Some(0x212E)
    "/fahrenheit" => Some(0x2109)
    "/lsquare" => Some(0x2113)
    "/numero" => Some(0x2116)
    "/prescription" => Some(0x211E)
    "/telephone" => Some(0x2121)
    _ => None
  }
}

///|
fn pdf_text_codepoint_of_arrow_glyphname(name : PdfName) -> Int? {
  match pdf_text_string_of_name(name) {
    "/arrowdashdown" => Some(0x21E3)
    "/arrowdashleft" => Some(0x21E0)
    "/arrowdashright" => Some(0x21E2)
    "/arrowdashup" => Some(0x21E1)
    "/arrowdownleft" => Some(0x2199)
    "/arrowdownright" => Some(0x2198)
    "/arrowdownwhite" => Some(0x21E9)
    "/arrowleftdbl" => Some(0x21D0)
    "/arrowleftdblstroke" => Some(0x21CD)
    "/arrowleftoverright" => Some(0x21C6)
    "/arrowleftwhite" => Some(0x21E6)
    "/arrowrightdblstroke" => Some(0x21CF)
    "/arrowrightoverleft" => Some(0x21C4)
    "/arrowrightwhite" => Some(0x21E8)
    "/arrowtableft" => Some(0x21E4)
    "/arrowtabright" => Some(0x21E5)
    "/arrowupdn" => Some(0x2195)
    "/arrowupdnbse" => Some(0x21A8)
    "/arrowupdownbase" => Some(0x21A8)
    "/arrowupleft" => Some(0x2196)
    "/arrowupleftofdown" => Some(0x21C5)
    "/arrowupright" => Some(0x2197)
    "/arrowupwhite" => Some(0x21E7)
    "/capslock" => Some(0x21EA)
    "/dblarrowleft" => Some(0x21D4)
    "/dblarrowright" => Some(0x21D2)
    "/harpoonleftbarbup" => Some(0x21BC)
    "/harpoonrightbarbup" => Some(0x21C0)
    "/pagedown" => Some(0x21DF)
    "/pageup" => Some(0x21DE)
    _ => None
  }
}

///|
fn pdf_text_codepoint_of_greek_glyphname(name : PdfName) -> Int? {
  match pdf_text_string_of_name(name) {
    "/Alphatonos" => Some(0x0386)
    "/Deicoptic" => Some(0x03EE)
    "/Deltagreek" => Some(0x0394)
    "/Digammagreek" => Some(0x03DC)
    "/Epsilontonos" => Some(0x0388)
    "/Etatonos" => Some(0x0389)
    "/Feicoptic" => Some(0x03E4)
    "/Gangiacoptic" => Some(0x03EA)
    "/Horicoptic" => Some(0x03E8)
    "/Iotadieresis" => Some(0x03AA)
    "/Iotatonos" => Some(0x038A)
    "/Kheicoptic" => Some(0x03E6)
    "/Koppagreek" => Some(0x03DE)
    "/Omegagreek" => Some(0x03A9)
    "/Omegatonos" => Some(0x038F)
    "/Omicrontonos" => Some(0x038C)
    "/Sampigreek" => Some(0x03E0)
    "/Sheicoptic" => Some(0x03E2)
    "/Shimacoptic" => Some(0x03EC)
    "/Stigmagreek" => Some(0x03DA)
    "/Upsilonacutehooksymbolgreek" => Some(0x03D3)
    "/Upsilondieresis" => Some(0x03AB)
    "/Upsilondieresishooksymbolgreek" => Some(0x03D4)
    "/Upsilonhooksymbol" => Some(0x03D2)
    "/Upsilontonos" => Some(0x038E)
    "/alphatonos" => Some(0x03AC)
    "/anoteleia" => Some(0x0387)
    "/betasymbolgreek" => Some(0x03D0)
    "/deicoptic" => Some(0x03EF)
    "/dialytikatonos" => Some(0x0385)
    "/dieresistonos" => Some(0x0385)
    "/epsilontonos" => Some(0x03AD)
    "/etatonos" => Some(0x03AE)
    "/feicoptic" => Some(0x03E5)
    "/gangiacoptic" => Some(0x03EB)
    "/horicoptic" => Some(0x03E9)
    "/iotadieresis" => Some(0x03CA)
    "/iotadieresistonos" => Some(0x0390)
    "/iotatonos" => Some(0x03AF)
    "/kappasymbolgreek" => Some(0x03F0)
    "/kheicoptic" => Some(0x03E7)
    "/mugreek" => Some(0x03BC)
    "/numeralsigngreek" => Some(0x0374)
    "/numeralsignlowergreek" => Some(0x0375)
    "/omegatonos" => Some(0x03CE)
    "/omicrontonos" => Some(0x03CC)
    "/phisymbolgreek" => Some(0x03D5)
    "/pisymbolgreek" => Some(0x03D6)
    "/questiongreek" => Some(0x037E)
    "/rhosymbolgreek" => Some(0x03F1)
    "/sheicoptic" => Some(0x03E3)
    "/shimacoptic" => Some(0x03ED)
    "/sigmafinal" => Some(0x03C2)
    "/sigmalunatesymbolgreek" => Some(0x03F2)
    "/thetasymbolgreek" => Some(0x03D1)
    "/tonos" => Some(0x0384)
    "/upsilondieresis" => Some(0x03CB)
    "/upsilondieresistonos" => Some(0x03B0)
    "/upsilontonos" => Some(0x03CD)
    "/yotgreek" => Some(0x03F3)
    "/ypogegrammeni" => Some(0x037A)
    _ => None
  }
}

///|
fn pdf_text_codepoint_of_armenian_glyphname(name : PdfName) -> Int? {
  match pdf_text_string_of_name(name) {
    "/Aybarmenian" => Some(0x0531)
    "/Benarmenian" => Some(0x0532)
    "/Caarmenian" => Some(0x053E)
    "/Chaarmenian" => Some(0x0549)
    "/Cheharmenian" => Some(0x0543)
    "/Coarmenian" => Some(0x0551)
    "/Daarmenian" => Some(0x0534)
    "/Echarmenian" => Some(0x0535)
    "/Eharmenian" => Some(0x0537)
    "/Etarmenian" => Some(0x0538)
    "/Feharmenian" => Some(0x0556)
    "/Ghadarmenian" => Some(0x0542)
    "/Gimarmenian" => Some(0x0533)
    "/Hoarmenian" => Some(0x0540)
    "/Iniarmenian" => Some(0x053B)
    "/Jaarmenian" => Some(0x0541)
    "/Jheharmenian" => Some(0x054B)
    "/Keharmenian" => Some(0x0554)
    "/Kenarmenian" => Some(0x053F)
    "/Liwnarmenian" => Some(0x053C)
    "/Menarmenian" => Some(0x0544)
    "/Nowarmenian" => Some(0x0546)
    "/Oharmenian" => Some(0x0555)
    "/Peharmenian" => Some(0x054A)
    "/Piwrarmenian" => Some(0x0553)
    "/Raarmenian" => Some(0x054C)
    "/Reharmenian" => Some(0x0550)
    "/Seharmenian" => Some(0x054D)
    "/Shaarmenian" => Some(0x0547)
    "/Tiwnarmenian" => Some(0x054F)
    "/Toarmenian" => Some(0x0539)
    "/Vewarmenian" => Some(0x054E)
    "/Voarmenian" => Some(0x0548)
    "/Xeharmenian" => Some(0x053D)
    "/Yiarmenian" => Some(0x0545)
    "/Yiwnarmenian" => Some(0x0552)
    "/Zaarmenian" => Some(0x0536)
    "/Zhearmenian" => Some(0x053A)
    "/abbreviationmarkarmenian" => Some(0x055F)
    "/apostrophearmenian" => Some(0x055A)
    "/aybarmenian" => Some(0x0561)
    "/benarmenian" => Some(0x0562)
    "/caarmenian" => Some(0x056E)
    "/chaarmenian" => Some(0x0579)
    "/cheharmenian" => Some(0x0573)
    "/coarmenian" => Some(0x0581)
    "/commaarmenian" => Some(0x055D)
    "/daarmenian" => Some(0x0564)
    "/echarmenian" => Some(0x0565)
    "/echyiwnarmenian" => Some(0x0587)
    "/eharmenian" => Some(0x0567)
    "/emphasismarkarmenian" => Some(0x055B)
    "/etarmenian" => Some(0x0568)
    "/exclamarmenian" => Some(0x055C)
    "/feharmenian" => Some(0x0586)
    "/ghadarmenian" => Some(0x0572)
    "/gimarmenian" => Some(0x0563)
    "/hoarmenian" => Some(0x0570)
    "/iniarmenian" => Some(0x056B)
    "/jaarmenian" => Some(0x0571)
    "/jheharmenian" => Some(0x057B)
    "/keharmenian" => Some(0x0584)
    "/kenarmenian" => Some(0x056F)
    "/liwnarmenian" => Some(0x056C)
    "/menarmenian" => Some(0x0574)
    "/nowarmenian" => Some(0x0576)
    "/oharmenian" => Some(0x0585)
    "/peharmenian" => Some(0x057A)
    "/periodarmenian" => Some(0x0589)
    "/piwrarmenian" => Some(0x0583)
    "/questionarmenian" => Some(0x055E)
    "/raarmenian" => Some(0x057C)
    "/reharmenian" => Some(0x0580)
    "/ringhalfleftarmenian" => Some(0x0559)
    "/seharmenian" => Some(0x057D)
    "/shaarmenian" => Some(0x0577)
    "/tiwnarmenian" => Some(0x057F)
    "/toarmenian" => Some(0x0569)
    "/vewarmenian" => Some(0x057E)
    "/voarmenian" => Some(0x0578)
    "/xeharmenian" => Some(0x056D)
    "/yiarmenian" => Some(0x0575)
    "/yiwnarmenian" => Some(0x0582)
    "/zaarmenian" => Some(0x0566)
    "/zhearmenian" => Some(0x056A)
    _ => None
  }
}

///|
fn pdf_text_codepoint_of_devanagari_glyphname(name : PdfName) -> Int? {
  match pdf_text_string_of_name(name) {
    "/aadeva" => Some(0x0906)
    "/aavowelsigndeva" => Some(0x093E)
    "/abbreviationsigndeva" => Some(0x0970)
    "/acutedeva" => Some(0x0954)
    "/adeva" => Some(0x0905)
    "/aideva" => Some(0x0910)
    "/aivowelsigndeva" => Some(0x0948)
    "/anudattadeva" => Some(0x0952)
    "/anusvaradeva" => Some(0x0902)
    "/audeva" => Some(0x0914)
    "/auvowelsigndeva" => Some(0x094C)
    "/avagrahadeva" => Some(0x093D)
    "/badeva" => Some(0x092C)
    "/bhadeva" => Some(0x092D)
    "/cadeva" => Some(0x091A)
    "/candrabindudeva" => Some(0x0901)
    "/chadeva" => Some(0x091B)
    "/dadeva" => Some(0x0926)
    "/danda" => Some(0x0964)
    "/dbldanda" => Some(0x0965)
    "/ddadeva" => Some(0x0921)
    "/dddhadeva" => Some(0x095C)
    "/ddhadeva" => Some(0x0922)
    "/dhadeva" => Some(0x0927)
    "/ecandradeva" => Some(0x090D)
    "/ecandravowelsigndeva" => Some(0x0945)
    "/edeva" => Some(0x090F)
    "/eightdeva" => Some(0x096E)
    "/eshortdeva" => Some(0x090E)
    "/eshortvowelsigndeva" => Some(0x0946)
    "/evowelsigndeva" => Some(0x0947)
    "/fadeva" => Some(0x095E)
    "/fivedeva" => Some(0x096B)
    "/fourdeva" => Some(0x096A)
    "/gadeva" => Some(0x0917)
    "/ghadeva" => Some(0x0918)
    "/ghhadeva" => Some(0x095A)
    "/gravedeva" => Some(0x0953)
    "/hadeva" => Some(0x0939)
    "/ideva" => Some(0x0907)
    "/iideva" => Some(0x0908)
    "/iivowelsigndeva" => Some(0x0940)
    "/ivowelsigndeva" => Some(0x093F)
    "/jadeva" => Some(0x091C)
    "/jhadeva" => Some(0x091D)
    "/kadeva" => Some(0x0915)
    "/khadeva" => Some(0x0916)
    "/khhadeva" => Some(0x0959)
    "/ladeva" => Some(0x0932)
    "/lladeva" => Some(0x0933)
    "/llladeva" => Some(0x0934)
    "/llvocalicdeva" => Some(0x0961)
    "/llvocalicvowelsigndeva" => Some(0x0963)
    "/lvocalicdeva" => Some(0x090C)
    "/lvocalicvowelsigndeva" => Some(0x0962)
    "/madeva" => Some(0x092E)
    "/nadeva" => Some(0x0928)
    "/ngadeva" => Some(0x0919)
    "/ninedeva" => Some(0x096F)
    "/nnadeva" => Some(0x0923)
    "/nnnadeva" => Some(0x0929)
    "/nuktadeva" => Some(0x093C)
    "/nyadeva" => Some(0x091E)
    "/ocandradeva" => Some(0x0911)
    "/ocandravowelsigndeva" => Some(0x0949)
    "/odeva" => Some(0x0913)
    "/omdeva" => Some(0x0950)
    "/onedeva" => Some(0x0967)
    "/oshortdeva" => Some(0x0912)
    "/oshortvowelsigndeva" => Some(0x094A)
    "/ovowelsigndeva" => Some(0x094B)
    "/padeva" => Some(0x092A)
    "/phadeva" => Some(0x092B)
    "/qadeva" => Some(0x0958)
    "/radeva" => Some(0x0930)
    "/rhadeva" => Some(0x095D)
    "/rradeva" => Some(0x0931)
    "/rrvocalicdeva" => Some(0x0960)
    "/rrvocalicvowelsigndeva" => Some(0x0944)
    "/rvocalicdeva" => Some(0x090B)
    "/rvocalicvowelsigndeva" => Some(0x0943)
    "/sadeva" => Some(0x0938)
    "/sevendeva" => Some(0x096D)
    "/shadeva" => Some(0x0936)
    "/sixdeva" => Some(0x096C)
    "/ssadeva" => Some(0x0937)
    "/tadeva" => Some(0x0924)
    "/thadeva" => Some(0x0925)
    "/threedeva" => Some(0x0969)
    "/ttadeva" => Some(0x091F)
    "/tthadeva" => Some(0x0920)
    "/twodeva" => Some(0x0968)
    "/udattadeva" => Some(0x0951)
    "/udeva" => Some(0x0909)
    "/uudeva" => Some(0x090A)
    "/uuvowelsigndeva" => Some(0x0942)
    "/uvowelsigndeva" => Some(0x0941)
    "/vadeva" => Some(0x0935)
    "/viramadeva" => Some(0x094D)
    "/visargadeva" => Some(0x0903)
    "/yadeva" => Some(0x092F)
    "/yyadeva" => Some(0x095F)
    "/zadeva" => Some(0x095B)
    "/zerodeva" => Some(0x0966)
    _ => None
  }
}

///|
fn pdf_text_codepoint_of_thai_glyphname(name : PdfName) -> Int? {
  match pdf_text_string_of_name(name) {
    "/angkhankhuthai" => Some(0x0E5A)
    "/bahtthai" => Some(0x0E3F)
    "/bobaimaithai" => Some(0x0E1A)
    "/chochangthai" => Some(0x0E0A)
    "/chochanthai" => Some(0x0E08)
    "/chochingthai" => Some(0x0E09)
    "/chochoethai" => Some(0x0E0C)
    "/dochadathai" => Some(0x0E0E)
    "/dodekthai" => Some(0x0E14)
    "/eightthai" => Some(0x0E58)
    "/fivethai" => Some(0x0E55)
    "/fofanthai" => Some(0x0E1F)
    "/fofathai" => Some(0x0E1D)
    "/fongmanthai" => Some(0x0E4F)
    "/fourthai" => Some(0x0E54)
    "/hohipthai" => Some(0x0E2B)
    "/honokhukthai" => Some(0x0E2E)
    "/khokhaithai" => Some(0x0E02)
    "/khokhonthai" => Some(0x0E05)
    "/khokhuatthai" => Some(0x0E03)
    "/khokhwaithai" => Some(0x0E04)
    "/khomutthai" => Some(0x0E5B)
    "/khorakhangthai" => Some(0x0E06)
    "/kokaithai" => Some(0x0E01)
    "/lakkhangyaothai" => Some(0x0E45)
    "/lochulathai" => Some(0x0E2C)
    "/lolingthai" => Some(0x0E25)
    "/luthai" => Some(0x0E26)
    "/maichattawathai" => Some(0x0E4B)
    "/maiekthai" => Some(0x0E48)
    "/maihanakatthai" => Some(0x0E31)
    "/maitaikhuthai" => Some(0x0E47)
    "/maithothai" => Some(0x0E49)
    "/maitrithai" => Some(0x0E4A)
    "/maiyamokthai" => Some(0x0E46)
    "/momathai" => Some(0x0E21)
    "/ngonguthai" => Some(0x0E07)
    "/nikhahitthai" => Some(0x0E4D)
    "/ninethai" => Some(0x0E59)
    "/nonenthai" => Some(0x0E13)
    "/nonuthai" => Some(0x0E19)
    "/oangthai" => Some(0x0E2D)
    "/onethai" => Some(0x0E51)
    "/paiyannoithai" => Some(0x0E2F)
    "/phinthuthai" => Some(0x0E3A)
    "/phophanthai" => Some(0x0E1E)
    "/phophungthai" => Some(0x0E1C)
    "/phosamphaothai" => Some(0x0E20)
    "/poplathai" => Some(0x0E1B)
    "/roruathai" => Some(0x0E23)
    "/ruthai" => Some(0x0E24)
    "/saraaathai" => Some(0x0E32)
    "/saraaethai" => Some(0x0E41)
    "/saraaimaimalaithai" => Some(0x0E44)
    "/saraaimaimuanthai" => Some(0x0E43)
    "/saraamthai" => Some(0x0E33)
    "/saraathai" => Some(0x0E30)
    "/saraethai" => Some(0x0E40)
    "/saraiithai" => Some(0x0E35)
    "/saraithai" => Some(0x0E34)
    "/saraothai" => Some(0x0E42)
    "/saraueethai" => Some(0x0E37)
    "/sarauethai" => Some(0x0E36)
    "/sarauthai" => Some(0x0E38)
    "/sarauuthai" => Some(0x0E39)
    "/seventhai" => Some(0x0E57)
    "/sixthai" => Some(0x0E56)
    "/sorusithai" => Some(0x0E29)
    "/sosalathai" => Some(0x0E28)
    "/sosothai" => Some(0x0E0B)
    "/sosuathai" => Some(0x0E2A)
    "/thanthakhatthai" => Some(0x0E4C)
    "/thonangmonthothai" => Some(0x0E11)
    "/thophuthaothai" => Some(0x0E12)
    "/thothahanthai" => Some(0x0E17)
    "/thothanthai" => Some(0x0E10)
    "/thothongthai" => Some(0x0E18)
    "/thothungthai" => Some(0x0E16)
    "/threethai" => Some(0x0E53)
    "/topatakthai" => Some(0x0E0F)
    "/totaothai" => Some(0x0E15)
    "/twothai" => Some(0x0E52)
    "/wowaenthai" => Some(0x0E27)
    "/yamakkanthai" => Some(0x0E4E)
    "/yoyakthai" => Some(0x0E22)
    "/yoyingthai" => Some(0x0E0D)
    "/zerothai" => Some(0x0E50)
    _ => None
  }
}

///|
fn pdf_text_codepoint_of_math_glyphname(name : PdfName) -> Int? {
  match pdf_text_string_of_name(name) {
    "/allequal" => Some(0x224C)
    "/approaches" => Some(0x2250)
    "/approxequalorimage" => Some(0x2252)
    "/approximatelyequal" => Some(0x2245)
    "/asteriskmath" => Some(0x2217)
    "/asymptoticallyequal" => Some(0x2243)
    "/because" => Some(0x2235)
    "/bulletoperator" => Some(0x2219)
    "/circleot" => Some(0x2299)
    "/contourintegral" => Some(0x222E)
    "/curlyand" => Some(0x22CF)
    "/curlyor" => Some(0x22CE)
    "/dblintegral" => Some(0x222C)
    "/divides" => Some(0x2223)
    "/divisionslash" => Some(0x2215)
    "/ellipsisvertical" => Some(0x22EE)
    "/forall" => Some(0x2200)
    "/geometricallyequal" => Some(0x2251)
    "/greaterequalorless" => Some(0x22DB)
    "/greaterorequivalent" => Some(0x2273)
    "/greaterorless" => Some(0x2277)
    "/greateroverequal" => Some(0x2267)
    "/imageorapproximatelyequal" => Some(0x2253)
    "/increment" => Some(0x2206)
    "/lessequalorgreater" => Some(0x22DA)
    "/lessorequivalent" => Some(0x2272)
    "/lessorgreater" => Some(0x2276)
    "/lessoverequal" => Some(0x2266)
    "/minus" => Some(0x2212)
    "/minuscircle" => Some(0x2296)
    "/minusplus" => Some(0x2213)
    "/muchgreater" => Some(0x226B)
    "/muchless" => Some(0x226A)
    "/nabla" => Some(0x2207)
    "/notcontains" => Some(0x220C)
    "/notelementof" => Some(0x2209)
    "/notgreater" => Some(0x226F)
    "/notgreaternorequal" => Some(0x2271)
    "/notgreaternorless" => Some(0x2279)
    "/notidentical" => Some(0x2262)
    "/notless" => Some(0x226E)
    "/notlessnorequal" => Some(0x2270)
    "/notparallel" => Some(0x2226)
    "/notprecedes" => Some(0x2280)
    "/notsucceeds" => Some(0x2281)
    "/notsuperset" => Some(0x2285)
    "/orthogonal" => Some(0x221F)
    "/parallel" => Some(0x2225)
    "/pluscircle" => Some(0x2295)
    "/precedes" => Some(0x227A)
    "/proportion" => Some(0x2237)
    "/ratio" => Some(0x2236)
    "/reversedtilde" => Some(0x223D)
    "/rightangle" => Some(0x221F)
    "/righttriangle" => Some(0x22BF)
    "/subset" => Some(0x2282)
    "/subsetnotequal" => Some(0x228A)
    "/subsetorequal" => Some(0x2286)
    "/succeeds" => Some(0x227B)
    "/superset" => Some(0x2283)
    "/supersetnotequal" => Some(0x228B)
    "/supersetorequal" => Some(0x2287)
    "/tackdown" => Some(0x22A4)
    "/tackleft" => Some(0x22A3)
    "/thereexists" => Some(0x2203)
    "/tildeoperator" => Some(0x223C)
    "/timescircle" => Some(0x2297)
    _ => None
  }
}

///|
fn pdf_text_codepoint_of_number_form_glyphname(name : PdfName) -> Int? {
  match pdf_text_string_of_name(name) {
    "/Oneroman" => Some(0x2160)
    "/Tworoman" => Some(0x2161)
    "/Threeroman" => Some(0x2162)
    "/Fourroman" => Some(0x2163)
    "/Fiveroman" => Some(0x2164)
    "/Sixroman" => Some(0x2165)
    "/Sevenroman" => Some(0x2166)
    "/Eightroman" => Some(0x2167)
    "/Nineroman" => Some(0x2168)
    "/Tenroman" => Some(0x2169)
    "/Elevenroman" => Some(0x216A)
    "/Twelveroman" => Some(0x216B)
    "/oneroman" => Some(0x2170)
    "/tworoman" => Some(0x2171)
    "/threeroman" => Some(0x2172)
    "/fourroman" => Some(0x2173)
    "/fiveroman" => Some(0x2174)
    "/sixroman" => Some(0x2175)
    "/sevenroman" => Some(0x2176)
    "/eightroman" => Some(0x2177)
    "/nineroman" => Some(0x2178)
    "/tenroman" => Some(0x2179)
    "/elevenroman" => Some(0x217A)
    "/twelveroman" => Some(0x217B)
    _ => None
  }
}

///|
fn pdf_text_codepoint_of_technical_glyphname(name : PdfName) -> Int? {
  match pdf_text_string_of_name(name) {
    "/arc" => Some(0x2312)
    "/clear" => Some(0x2327)
    "/control" => Some(0x2303)
    "/deleteleft" => Some(0x232B)
    "/deleteright" => Some(0x2326)
    "/house" => Some(0x2302)
    "/integralbottom" => Some(0x2321)
    "/integraltop" => Some(0x2320)
    "/logicalnotreversed" => Some(0x2310)
    "/option" => Some(0x2325)
    "/projective" => Some(0x2305)
    "/propellor" => Some(0x2318)
    "/revlogicalnot" => Some(0x2310)
    _ => None
  }
}

///|
fn pdf_text_codepoint_of_enclosed_alnum_glyphname(name : PdfName) -> Int? {
  match pdf_text_string_of_name(name) {
    "/Acircle" => Some(0x24B6)
    "/Bcircle" => Some(0x24B7)
    "/Ccircle" => Some(0x24B8)
    "/Dcircle" => Some(0x24B9)
    "/Ecircle" => Some(0x24BA)
    "/Fcircle" => Some(0x24BB)
    "/Gcircle" => Some(0x24BC)
    "/Hcircle" => Some(0x24BD)
    "/Icircle" => Some(0x24BE)
    "/Jcircle" => Some(0x24BF)
    "/Kcircle" => Some(0x24C0)
    "/Lcircle" => Some(0x24C1)
    "/Mcircle" => Some(0x24C2)
    "/Ncircle" => Some(0x24C3)
    "/Ocircle" => Some(0x24C4)
    "/Pcircle" => Some(0x24C5)
    "/Qcircle" => Some(0x24C6)
    "/Rcircle" => Some(0x24C7)
    "/Scircle" => Some(0x24C8)
    "/Tcircle" => Some(0x24C9)
    "/Ucircle" => Some(0x24CA)
    "/Vcircle" => Some(0x24CB)
    "/Wcircle" => Some(0x24CC)
    "/Xcircle" => Some(0x24CD)
    "/Ycircle" => Some(0x24CE)
    "/Zcircle" => Some(0x24CF)
    "/acircle" => Some(0x24D0)
    "/aparen" => Some(0x249C)
    "/bcircle" => Some(0x24D1)
    "/bparen" => Some(0x249D)
    "/ccircle" => Some(0x24D2)
    "/cparen" => Some(0x249E)
    "/dcircle" => Some(0x24D3)
    "/dparen" => Some(0x249F)
    "/ecircle" => Some(0x24D4)
    "/eightcircle" => Some(0x2467)
    "/eighteencircle" => Some(0x2471)
    "/eighteenparen" => Some(0x2485)
    "/eighteenperiod" => Some(0x2499)
    "/eightparen" => Some(0x247B)
    "/eightperiod" => Some(0x248F)
    "/elevencircle" => Some(0x246A)
    "/elevenparen" => Some(0x247E)
    "/elevenperiod" => Some(0x2492)
    "/eparen" => Some(0x24A0)
    "/fcircle" => Some(0x24D5)
    "/fifteencircle" => Some(0x246E)
    "/fifteenparen" => Some(0x2482)
    "/fifteenperiod" => Some(0x2496)
    "/fivecircle" => Some(0x2464)
    "/fiveparen" => Some(0x2478)
    "/fiveperiod" => Some(0x248C)
    "/fourcircle" => Some(0x2463)
    "/fourparen" => Some(0x2477)
    "/fourperiod" => Some(0x248B)
    "/fourteencircle" => Some(0x246D)
    "/fourteenparen" => Some(0x2481)
    "/fourteenperiod" => Some(0x2495)
    "/fparen" => Some(0x24A1)
    "/gcircle" => Some(0x24D6)
    "/gparen" => Some(0x24A2)
    "/hcircle" => Some(0x24D7)
    "/hparen" => Some(0x24A3)
    "/icircle" => Some(0x24D8)
    "/iparen" => Some(0x24A4)
    "/jcircle" => Some(0x24D9)
    "/jparen" => Some(0x24A5)
    "/kcircle" => Some(0x24DA)
    "/kparen" => Some(0x24A6)
    "/lcircle" => Some(0x24DB)
    "/lparen" => Some(0x24A7)
    "/mcircle" => Some(0x24DC)
    "/mparen" => Some(0x24A8)
    "/ncircle" => Some(0x24DD)
    "/ninecircle" => Some(0x2468)
    "/nineparen" => Some(0x247C)
    "/nineperiod" => Some(0x2490)
    "/nineteencircle" => Some(0x2472)
    "/nineteenparen" => Some(0x2486)
    "/nineteenperiod" => Some(0x249A)
    "/nparen" => Some(0x24A9)
    "/ocircle" => Some(0x24DE)
    "/onecircle" => Some(0x2460)
    "/oneparen" => Some(0x2474)
    "/oneperiod" => Some(0x2488)
    "/oparen" => Some(0x24AA)
    "/pcircle" => Some(0x24DF)
    "/pparen" => Some(0x24AB)
    "/qcircle" => Some(0x24E0)
    "/qparen" => Some(0x24AC)
    "/rcircle" => Some(0x24E1)
    "/rparen" => Some(0x24AD)
    "/scircle" => Some(0x24E2)
    "/sevencircle" => Some(0x2466)
    "/sevenparen" => Some(0x247A)
    "/sevenperiod" => Some(0x248E)
    "/seventeencircle" => Some(0x2470)
    "/seventeenparen" => Some(0x2484)
    "/seventeenperiod" => Some(0x2498)
    "/sixcircle" => Some(0x2465)
    "/sixparen" => Some(0x2479)
    "/sixperiod" => Some(0x248D)
    "/sixteencircle" => Some(0x246F)
    "/sixteenparen" => Some(0x2483)
    "/sixteenperiod" => Some(0x2497)
    "/sparen" => Some(0x24AE)
    "/tcircle" => Some(0x24E3)
    "/tencircle" => Some(0x2469)
    "/tenparen" => Some(0x247D)
    "/tenperiod" => Some(0x2491)
    "/thirteencircle" => Some(0x246C)
    "/thirteenparen" => Some(0x2480)
    "/thirteenperiod" => Some(0x2494)
    "/threecircle" => Some(0x2462)
    "/threeparen" => Some(0x2476)
    "/threeperiod" => Some(0x248A)
    "/tparen" => Some(0x24AF)
    "/twelvecircle" => Some(0x246B)
    "/twelveparen" => Some(0x247F)
    "/twelveperiod" => Some(0x2493)
    "/twentycircle" => Some(0x2473)
    "/twentyparen" => Some(0x2487)
    "/twentyperiod" => Some(0x249B)
    "/twocircle" => Some(0x2461)
    "/twoparen" => Some(0x2475)
    "/twoperiod" => Some(0x2489)
    "/ucircle" => Some(0x24E4)
    "/uparen" => Some(0x24B0)
    "/vcircle" => Some(0x24E5)
    "/vparen" => Some(0x24B1)
    "/wcircle" => Some(0x24E6)
    "/wparen" => Some(0x24B2)
    "/xcircle" => Some(0x24E7)
    "/xparen" => Some(0x24B3)
    "/ycircle" => Some(0x24E8)
    "/yparen" => Some(0x24B4)
    "/zcircle" => Some(0x24E9)
    "/zparen" => Some(0x24B5)
    _ => None
  }
}

///|
fn pdf_text_codepoint_of_cjk_symbol_glyphname(name : PdfName) -> Int? {
  match pdf_text_string_of_name(name) {
    "/anglebracketleft" => Some(0x3008)
    "/anglebracketright" => Some(0x3009)
    "/blacklenticularbracketleft" => Some(0x3010)
    "/blacklenticularbracketright" => Some(0x3011)
    "/circlepostalmark" => Some(0x3036)
    "/cornerbracketleft" => Some(0x300C)
    "/cornerbracketright" => Some(0x300D)
    "/dblanglebracketleft" => Some(0x300A)
    "/dblanglebracketright" => Some(0x300B)
    "/dittomark" => Some(0x3003)
    "/eighthangzhou" => Some(0x3028)
    "/fivehangzhou" => Some(0x3025)
    "/fourhangzhou" => Some(0x3024)
    "/getamark" => Some(0x3013)
    "/ideographicclose" => Some(0x3006)
    "/ideographiccomma" => Some(0x3001)
    "/ideographiciterationmark" => Some(0x3005)
    "/ideographicperiod" => Some(0x3002)
    "/ideographicspace" => Some(0x3000)
    "/ideographiczero" => Some(0x3007)
    "/jis" => Some(0x3004)
    "/ninehangzhou" => Some(0x3029)
    "/onehangzhou" => Some(0x3021)
    "/postalmark" => Some(0x3012)
    "/postalmarkface" => Some(0x3020)
    "/quotedblprime" => Some(0x301E)
    "/quotedblprimereversed" => Some(0x301D)
    "/sevenhangzhou" => Some(0x3027)
    "/sixhangzhou" => Some(0x3026)
    "/threehangzhou" => Some(0x3023)
    "/tortoiseshellbracketleft" => Some(0x3014)
    "/tortoiseshellbracketright" => Some(0x3015)
    "/twentyhangzhou" => Some(0x5344)
    "/twohangzhou" => Some(0x3022)
    "/wavedash" => Some(0x301C)
    "/whitecornerbracketleft" => Some(0x300E)
    "/whitecornerbracketright" => Some(0x300F)
    "/whitelenticularbracketleft" => Some(0x3016)
    "/whitelenticularbracketright" => Some(0x3017)
    "/whitetortoiseshellbracketleft" => Some(0x3018)
    "/whitetortoiseshellbracketright" => Some(0x3019)
    _ => None
  }
}

///|
fn pdf_text_codepoint_of_hiragana_glyphname(name : PdfName) -> Int? {
  match pdf_text_string_of_name(name) {
    "/ahiragana" => Some(0x3042)
    "/asmallhiragana" => Some(0x3041)
    "/bahiragana" => Some(0x3070)
    "/behiragana" => Some(0x3079)
    "/bihiragana" => Some(0x3073)
    "/bohiragana" => Some(0x307C)
    "/buhiragana" => Some(0x3076)
    "/dahiragana" => Some(0x3060)
    "/dehiragana" => Some(0x3067)
    "/dihiragana" => Some(0x3062)
    "/dohiragana" => Some(0x3069)
    "/duhiragana" => Some(0x3065)
    "/ehiragana" => Some(0x3048)
    "/esmallhiragana" => Some(0x3047)
    "/gahiragana" => Some(0x304C)
    "/gehiragana" => Some(0x3052)
    "/gihiragana" => Some(0x304E)
    "/gohiragana" => Some(0x3054)
    "/guhiragana" => Some(0x3050)
    "/hahiragana" => Some(0x306F)
    "/hehiragana" => Some(0x3078)
    "/hihiragana" => Some(0x3072)
    "/hohiragana" => Some(0x307B)
    "/huhiragana" => Some(0x3075)
    "/ihiragana" => Some(0x3044)
    "/ismallhiragana" => Some(0x3043)
    "/iterationhiragana" => Some(0x309D)
    "/kahiragana" => Some(0x304B)
    "/kehiragana" => Some(0x3051)
    "/kihiragana" => Some(0x304D)
    "/kohiragana" => Some(0x3053)
    "/kuhiragana" => Some(0x304F)
    "/mahiragana" => Some(0x307E)
    "/mehiragana" => Some(0x3081)
    "/mihiragana" => Some(0x307F)
    "/mohiragana" => Some(0x3082)
    "/muhiragana" => Some(0x3080)
    "/nahiragana" => Some(0x306A)
    "/nehiragana" => Some(0x306D)
    "/nhiragana" => Some(0x3093)
    "/nihiragana" => Some(0x306B)
    "/nohiragana" => Some(0x306E)
    "/nuhiragana" => Some(0x306C)
    "/ohiragana" => Some(0x304A)
    "/osmallhiragana" => Some(0x3049)
    "/pahiragana" => Some(0x3071)
    "/pehiragana" => Some(0x307A)
    "/pihiragana" => Some(0x3074)
    "/pohiragana" => Some(0x307D)
    "/puhiragana" => Some(0x3077)
    "/rahiragana" => Some(0x3089)
    "/rehiragana" => Some(0x308C)
    "/rihiragana" => Some(0x308A)
    "/rohiragana" => Some(0x308D)
    "/ruhiragana" => Some(0x308B)
    "/sahiragana" => Some(0x3055)
    "/sehiragana" => Some(0x305B)
    "/semivoicedmarkkana" => Some(0x309C)
    "/sihiragana" => Some(0x3057)
    "/sohiragana" => Some(0x305D)
    "/suhiragana" => Some(0x3059)
    "/tahiragana" => Some(0x305F)
    "/tehiragana" => Some(0x3066)
    "/tihiragana" => Some(0x3061)
    "/tohiragana" => Some(0x3068)
    "/tuhiragana" => Some(0x3064)
    "/tusmallhiragana" => Some(0x3063)
    "/uhiragana" => Some(0x3046)
    "/usmallhiragana" => Some(0x3045)
    "/voicediterationhiragana" => Some(0x309E)
    "/voicedmarkkana" => Some(0x309B)
    "/vuhiragana" => Some(0x3094)
    "/wahiragana" => Some(0x308F)
    "/wasmallhiragana" => Some(0x308E)
    "/wehiragana" => Some(0x3091)
    "/wihiragana" => Some(0x3090)
    "/wohiragana" => Some(0x3092)
    "/yahiragana" => Some(0x3084)
    "/yasmallhiragana" => Some(0x3083)
    "/yohiragana" => Some(0x3088)
    "/yosmallhiragana" => Some(0x3087)
    "/yuhiragana" => Some(0x3086)
    "/yusmallhiragana" => Some(0x3085)
    "/zahiragana" => Some(0x3056)
    "/zehiragana" => Some(0x305C)
    "/zihiragana" => Some(0x3058)
    "/zohiragana" => Some(0x305E)
    "/zuhiragana" => Some(0x305A)
    _ => None
  }
}

///|
fn pdf_text_codepoint_of_katakana_glyphname(name : PdfName) -> Int? {
  match pdf_text_string_of_name(name) {
    "/akatakana" => Some(0x30A2)
    "/asmallkatakana" => Some(0x30A1)
    "/bakatakana" => Some(0x30D0)
    "/bekatakana" => Some(0x30D9)
    "/bikatakana" => Some(0x30D3)
    "/bokatakana" => Some(0x30DC)
    "/bukatakana" => Some(0x30D6)
    "/dakatakana" => Some(0x30C0)
    "/dekatakana" => Some(0x30C7)
    "/dikatakana" => Some(0x30C2)
    "/dokatakana" => Some(0x30C9)
    "/dotkatakana" => Some(0x30FB)
    "/dukatakana" => Some(0x30C5)
    "/ekatakana" => Some(0x30A8)
    "/esmallkatakana" => Some(0x30A7)
    "/gakatakana" => Some(0x30AC)
    "/gekatakana" => Some(0x30B2)
    "/gikatakana" => Some(0x30AE)
    "/gokatakana" => Some(0x30B4)
    "/gukatakana" => Some(0x30B0)
    "/hakatakana" => Some(0x30CF)
    "/hekatakana" => Some(0x30D8)
    "/hikatakana" => Some(0x30D2)
    "/hokatakana" => Some(0x30DB)
    "/hukatakana" => Some(0x30D5)
    "/ikatakana" => Some(0x30A4)
    "/ismallkatakana" => Some(0x30A3)
    "/iterationkatakana" => Some(0x30FD)
    "/kakatakana" => Some(0x30AB)
    "/kasmallkatakana" => Some(0x30F5)
    "/kekatakana" => Some(0x30B1)
    "/kesmallkatakana" => Some(0x30F6)
    "/kikatakana" => Some(0x30AD)
    "/kokatakana" => Some(0x30B3)
    "/kukatakana" => Some(0x30AF)
    "/makatakana" => Some(0x30DE)
    "/mekatakana" => Some(0x30E1)
    "/mikatakana" => Some(0x30DF)
    "/mokatakana" => Some(0x30E2)
    "/mukatakana" => Some(0x30E0)
    "/nakatakana" => Some(0x30CA)
    "/nekatakana" => Some(0x30CD)
    "/nikatakana" => Some(0x30CB)
    "/nkatakana" => Some(0x30F3)
    "/nokatakana" => Some(0x30CE)
    "/nukatakana" => Some(0x30CC)
    "/okatakana" => Some(0x30AA)
    "/osmallkatakana" => Some(0x30A9)
    "/pakatakana" => Some(0x30D1)
    "/pekatakana" => Some(0x30DA)
    "/pikatakana" => Some(0x30D4)
    "/pokatakana" => Some(0x30DD)
    "/prolongedkana" => Some(0x30FC)
    "/pukatakana" => Some(0x30D7)
    "/rakatakana" => Some(0x30E9)
    "/rekatakana" => Some(0x30EC)
    "/rikatakana" => Some(0x30EA)
    "/rokatakana" => Some(0x30ED)
    "/rukatakana" => Some(0x30EB)
    "/sakatakana" => Some(0x30B5)
    "/sekatakana" => Some(0x30BB)
    "/sikatakana" => Some(0x30B7)
    "/sokatakana" => Some(0x30BD)
    "/sukatakana" => Some(0x30B9)
    "/takatakana" => Some(0x30BF)
    "/tekatakana" => Some(0x30C6)
    "/tikatakana" => Some(0x30C1)
    "/tokatakana" => Some(0x30C8)
    "/tukatakana" => Some(0x30C4)
    "/tusmallkatakana" => Some(0x30C3)
    "/ukatakana" => Some(0x30A6)
    "/usmallkatakana" => Some(0x30A5)
    "/vakatakana" => Some(0x30F7)
    "/vekatakana" => Some(0x30F9)
    "/vikatakana" => Some(0x30F8)
    "/voicediterationkatakana" => Some(0x30FE)
    "/vokatakana" => Some(0x30FA)
    "/vukatakana" => Some(0x30F4)
    "/wakatakana" => Some(0x30EF)
    "/wasmallkatakana" => Some(0x30EE)
    "/wekatakana" => Some(0x30F1)
    "/wikatakana" => Some(0x30F0)
    "/wokatakana" => Some(0x30F2)
    "/yakatakana" => Some(0x30E4)
    "/yasmallkatakana" => Some(0x30E3)
    "/yokatakana" => Some(0x30E8)
    "/yosmallkatakana" => Some(0x30E7)
    "/yukatakana" => Some(0x30E6)
    "/yusmallkatakana" => Some(0x30E5)
    "/zakatakana" => Some(0x30B6)
    "/zekatakana" => Some(0x30BC)
    "/zikatakana" => Some(0x30B8)
    "/zokatakana" => Some(0x30BE)
    "/zukatakana" => Some(0x30BA)
    _ => None
  }
}

///|
fn pdf_text_codepoint_of_bopomofo_glyphname(name : PdfName) -> Int? {
  match pdf_text_string_of_name(name) {
    "/abopomofo" => Some(0x311A)
    "/aibopomofo" => Some(0x311E)
    "/anbopomofo" => Some(0x3122)
    "/angbopomofo" => Some(0x3124)
    "/aubopomofo" => Some(0x3120)
    "/bbopomofo" => Some(0x3105)
    "/cbopomofo" => Some(0x3118)
    "/chbopomofo" => Some(0x3114)
    "/dbopomofo" => Some(0x3109)
    "/ebopomofo" => Some(0x311C)
    "/ehbopomofo" => Some(0x311D)
    "/eibopomofo" => Some(0x311F)
    "/enbopomofo" => Some(0x3123)
    "/engbopomofo" => Some(0x3125)
    "/erbopomofo" => Some(0x3126)
    "/fbopomofo" => Some(0x3108)
    "/gbopomofo" => Some(0x310D)
    "/hbopomofo" => Some(0x310F)
    "/ibopomofo" => Some(0x3127)
    "/iubopomofo" => Some(0x3129)
    "/jbopomofo" => Some(0x3110)
    "/kbopomofo" => Some(0x310E)
    "/lbopomofo" => Some(0x310C)
    "/mbopomofo" => Some(0x3107)
    "/nbopomofo" => Some(0x310B)
    "/obopomofo" => Some(0x311B)
    "/oubopomofo" => Some(0x3121)
    "/pbopomofo" => Some(0x3106)
    "/qbopomofo" => Some(0x3111)
    "/rbopomofo" => Some(0x3116)
    "/sbopomofo" => Some(0x3119)
    "/shbopomofo" => Some(0x3115)
    "/tbopomofo" => Some(0x310A)
    "/ubopomofo" => Some(0x3128)
    "/xbopomofo" => Some(0x3112)
    "/zbopomofo" => Some(0x3117)
    "/zhbopomofo" => Some(0x3113)
    _ => None
  }
}

///|
fn pdf_text_codepoint_of_box_drawing_glyphname(name : PdfName) -> Int? {
  match pdf_text_string_of_name(name) {
    "/SF010000" => Some(0x250C)
    "/SF020000" => Some(0x2514)
    "/SF030000" => Some(0x2510)
    "/SF040000" => Some(0x2518)
    "/SF050000" => Some(0x253C)
    "/SF060000" => Some(0x252C)
    "/SF070000" => Some(0x2534)
    "/SF080000" => Some(0x251C)
    "/SF090000" => Some(0x2524)
    "/SF100000" => Some(0x2500)
    "/SF110000" => Some(0x2502)
    "/SF190000" => Some(0x2561)
    "/SF200000" => Some(0x2562)
    "/SF210000" => Some(0x2556)
    "/SF220000" => Some(0x2555)
    "/SF230000" => Some(0x2563)
    "/SF240000" => Some(0x2551)
    "/SF250000" => Some(0x2557)
    "/SF260000" => Some(0x255D)
    "/SF270000" => Some(0x255C)
    "/SF280000" => Some(0x255B)
    "/SF360000" => Some(0x255E)
    "/SF370000" => Some(0x255F)
    "/SF380000" => Some(0x255A)
    "/SF390000" => Some(0x2554)
    "/SF400000" => Some(0x2569)
    "/SF410000" => Some(0x2566)
    "/SF420000" => Some(0x2560)
    "/SF430000" => Some(0x2550)
    "/SF440000" => Some(0x256C)
    "/SF450000" => Some(0x2567)
    "/SF460000" => Some(0x2568)
    "/SF470000" => Some(0x2564)
    "/SF480000" => Some(0x2565)
    "/SF490000" => Some(0x2559)
    "/SF500000" => Some(0x2558)
    "/SF510000" => Some(0x2552)
    "/SF520000" => Some(0x2553)
    "/SF530000" => Some(0x256B)
    "/SF540000" => Some(0x256A)
    _ => None
  }
}

///|
fn pdf_text_codepoint_of_block_element_glyphname(name : PdfName) -> Int? {
  match pdf_text_string_of_name(name) {
    "/block" => Some(0x2588)
    "/dkshade" => Some(0x2593)
    "/dnblock" => Some(0x2584)
    "/lfblock" => Some(0x258C)
    "/ltshade" => Some(0x2591)
    "/rtblock" => Some(0x2590)
    "/shade" => Some(0x2592)
    "/shadedark" => Some(0x2593)
    "/shadelight" => Some(0x2591)
    "/shademedium" => Some(0x2592)
    "/upblock" => Some(0x2580)
    _ => None
  }
}

///|
fn pdf_text_codepoint_of_geometric_shape_glyphname(name : PdfName) -> Int? {
  match pdf_text_string_of_name(name) {
    "/H18533" => Some(0x25CF)
    "/H18543" => Some(0x25AA)
    "/H18551" => Some(0x25AB)
    "/H22073" => Some(0x25A1)
    "/blackcircle" => Some(0x25CF)
    "/blackdiamond" => Some(0x25C6)
    "/blackdownpointingtriangle" => Some(0x25BC)
    "/blackleftpointingpointer" => Some(0x25C4)
    "/blackleftpointingtriangle" => Some(0x25C0)
    "/blacklowerlefttriangle" => Some(0x25E3)
    "/blacklowerrighttriangle" => Some(0x25E2)
    "/blackrectangle" => Some(0x25AC)
    "/blackrightpointingpointer" => Some(0x25BA)
    "/blackrightpointingtriangle" => Some(0x25B6)
    "/blacksmallsquare" => Some(0x25AA)
    "/blacksquare" => Some(0x25A0)
    "/blackupperlefttriangle" => Some(0x25E4)
    "/blackupperrighttriangle" => Some(0x25E5)
    "/blackuppointingsmalltriangle" => Some(0x25B4)
    "/blackuppointingtriangle" => Some(0x25B2)
    "/bulletinverse" => Some(0x25D8)
    "/bullseye" => Some(0x25CE)
    "/circle" => Some(0x25CB)
    "/circlewithlefthalfblack" => Some(0x25D0)
    "/circlewithrighthalfblack" => Some(0x25D1)
    "/dottedcircle" => Some(0x25CC)
    "/filledbox" => Some(0x25A0)
    "/filledrect" => Some(0x25AC)
    "/fisheye" => Some(0x25C9)
    "/invbullet" => Some(0x25D8)
    "/invcircle" => Some(0x25D9)
    "/largecircle" => Some(0x25EF)
    "/openbullet" => Some(0x25E6)
    "/squarediagonalcrosshatchfill" => Some(0x25A9)
    "/squarehorizontalfill" => Some(0x25A4)
    "/squareorthogonalcrosshatchfill" => Some(0x25A6)
    "/squareupperlefttolowerrightfill" => Some(0x25A7)
    "/squareupperrighttolowerleftfill" => Some(0x25A8)
    "/squareverticalfill" => Some(0x25A5)
    "/squarewhitewithsmallblack" => Some(0x25A3)
    "/triagdn" => Some(0x25BC)
    "/triaglf" => Some(0x25C4)
    "/triagrt" => Some(0x25BA)
    "/triagup" => Some(0x25B2)
    "/whitebullet" => Some(0x25E6)
    "/whitecircle" => Some(0x25CB)
    "/whitecircleinverse" => Some(0x25D9)
    "/whitediamond" => Some(0x25C7)
    "/whitediamondcontainingblacksmalldiamond" => Some(0x25C8)
    "/whitedownpointingsmalltriangle" => Some(0x25BF)
    "/whitedownpointingtriangle" => Some(0x25BD)
    "/whiteleftpointingsmalltriangle" => Some(0x25C3)
    "/whiteleftpointingtriangle" => Some(0x25C1)
    "/whiterightpointingsmalltriangle" => Some(0x25B9)
    "/whiterightpointingtriangle" => Some(0x25B7)
    "/whitesmallsquare" => Some(0x25AB)
    "/whitesquare" => Some(0x25A1)
    "/whiteuppointingsmalltriangle" => Some(0x25B5)
    "/whiteuppointingtriangle" => Some(0x25B3)
    _ => None
  }
}

///|
fn pdf_text_codepoint_of_misc_symbol_glyphname(name : PdfName) -> Int? {
  match pdf_text_string_of_name(name) {
    "/beamedsixteenthnotes" => Some(0x266C)
    "/blacksmilingface" => Some(0x263B)
    "/blackstar" => Some(0x2605)
    "/clubsuitblack" => Some(0x2663)
    "/clubsuitwhite" => Some(0x2667)
    "/compass" => Some(0x263C)
    "/diamondsuitwhite" => Some(0x2662)
    "/earth" => Some(0x2641)
    "/eighthnotebeamed" => Some(0x266B)
    "/female" => Some(0x2640)
    "/heartsuitblack" => Some(0x2665)
    "/heartsuitwhite" => Some(0x2661)
    "/hotsprings" => Some(0x2668)
    "/invsmileface" => Some(0x263B)
    "/male" => Some(0x2642)
    "/mars" => Some(0x2642)
    "/musicalnote" => Some(0x266A)
    "/musicalnotedbl" => Some(0x266B)
    "/musicflatsign" => Some(0x266D)
    "/musicsharpsign" => Some(0x266F)
    "/pointingindexdownwhite" => Some(0x261F)
    "/pointingindexleftwhite" => Some(0x261C)
    "/pointingindexrightwhite" => Some(0x261E)
    "/pointingindexupwhite" => Some(0x261D)
    "/quarternote" => Some(0x2669)
    "/smileface" => Some(0x263A)
    "/spadesuitblack" => Some(0x2660)
    "/spadesuitwhite" => Some(0x2664)
    "/sun" => Some(0x263C)
    "/telephoneblack" => Some(0x260E)
    "/venus" => Some(0x2640)
    "/whitesmilingface" => Some(0x263A)
    "/whitestar" => Some(0x2606)
    "/whitetelephone" => Some(0x260F)
    "/yinyang" => Some(0x262F)
    _ => None
  }
}

///|
fn pdf_text_codepoint_of_latin_extended_glyphname(name : PdfName) -> Int? {
  match pdf_text_string_of_name(name) {
    "/Abreve" => Some(0x0102)
    "/Amacron" => Some(0x0100)
    "/Aogonek" => Some(0x0104)
    "/Cacute" => Some(0x0106)
    "/Ccaron" => Some(0x010C)
    "/Ccircumflex" => Some(0x0108)
    "/Cdot" => Some(0x010A)
    "/Cdotaccent" => Some(0x010A)
    "/Dcaron" => Some(0x010E)
    "/Dcroat" => Some(0x0110)
    "/Dslash" => Some(0x0110)
    "/Ebreve" => Some(0x0114)
    "/Ecaron" => Some(0x011A)
    "/Edot" => Some(0x0116)
    "/Edotaccent" => Some(0x0116)
    "/Emacron" => Some(0x0112)
    "/Eng" => Some(0x014A)
    "/Eogonek" => Some(0x0118)
    "/Gbreve" => Some(0x011E)
    "/Gcedilla" => Some(0x0122)
    "/Gcircumflex" => Some(0x011C)
    "/Gcommaaccent" => Some(0x0122)
    "/Gdot" => Some(0x0120)
    "/Gdotaccent" => Some(0x0120)
    "/Hbar" => Some(0x0126)
    "/Hcircumflex" => Some(0x0124)
    "/IJ" => Some(0x0132)
    "/Ibreve" => Some(0x012C)
    "/Idot" => Some(0x0130)
    "/Idotaccent" => Some(0x0130)
    "/Imacron" => Some(0x012A)
    "/Iogonek" => Some(0x012E)
    "/Itilde" => Some(0x0128)
    "/Jcircumflex" => Some(0x0134)
    "/Kcedilla" => Some(0x0136)
    "/Kcommaaccent" => Some(0x0136)
    "/Lacute" => Some(0x0139)
    "/Lcaron" => Some(0x013D)
    "/Lcedilla" => Some(0x013B)
    "/Lcommaaccent" => Some(0x013B)
    "/Ldot" => Some(0x013F)
    "/Ldotaccent" => Some(0x013F)
    "/Nacute" => Some(0x0143)
    "/Ncaron" => Some(0x0147)
    "/Ncedilla" => Some(0x0145)
    "/Ncommaaccent" => Some(0x0145)
    "/Obreve" => Some(0x014E)
    "/Odblacute" => Some(0x0150)
    "/Ohungarumlaut" => Some(0x0150)
    "/Omacron" => Some(0x014C)
    "/Racute" => Some(0x0154)
    "/Rcaron" => Some(0x0158)
    "/Rcedilla" => Some(0x0156)
    "/Rcommaaccent" => Some(0x0156)
    "/Sacute" => Some(0x015A)
    "/Scedilla" => Some(0x015E)
    "/Scircumflex" => Some(0x015C)
    "/Tbar" => Some(0x0166)
    "/Tcaron" => Some(0x0164)
    "/Tcedilla" => Some(0x0162)
    "/Tcommaaccent" => Some(0x0162)
    "/Ubreve" => Some(0x016C)
    "/Udblacute" => Some(0x0170)
    "/Uhungarumlaut" => Some(0x0170)
    "/Umacron" => Some(0x016A)
    "/Uogonek" => Some(0x0172)
    "/Uring" => Some(0x016E)
    "/Utilde" => Some(0x0168)
    "/Wcircumflex" => Some(0x0174)
    "/Ycircumflex" => Some(0x0176)
    "/Zacute" => Some(0x0179)
    "/Zdot" => Some(0x017B)
    "/Zdotaccent" => Some(0x017B)
    "/abreve" => Some(0x0103)
    "/amacron" => Some(0x0101)
    "/aogonek" => Some(0x0105)
    "/cacute" => Some(0x0107)
    "/ccaron" => Some(0x010D)
    "/ccircumflex" => Some(0x0109)
    "/cdot" => Some(0x010B)
    "/cdotaccent" => Some(0x010B)
    "/dcaron" => Some(0x010F)
    "/dcroat" => Some(0x0111)
    "/dmacron" => Some(0x0111)
    "/ebreve" => Some(0x0115)
    "/ecaron" => Some(0x011B)
    "/edot" => Some(0x0117)
    "/edotaccent" => Some(0x0117)
    "/emacron" => Some(0x0113)
    "/eng" => Some(0x014B)
    "/eogonek" => Some(0x0119)
    "/gbreve" => Some(0x011F)
    "/gcedilla" => Some(0x0123)
    "/gcircumflex" => Some(0x011D)
    "/gcommaaccent" => Some(0x0123)
    "/gdot" => Some(0x0121)
    "/gdotaccent" => Some(0x0121)
    "/hbar" => Some(0x0127)
    "/hcircumflex" => Some(0x0125)
    "/ibreve" => Some(0x012D)
    "/ij" => Some(0x0133)
    "/imacron" => Some(0x012B)
    "/iogonek" => Some(0x012F)
    "/itilde" => Some(0x0129)
    "/jcircumflex" => Some(0x0135)
    "/kcedilla" => Some(0x0137)
    "/kcommaaccent" => Some(0x0137)
    "/kgreenlandic" => Some(0x0138)
    "/lacute" => Some(0x013A)
    "/lcaron" => Some(0x013E)
    "/lcedilla" => Some(0x013C)
    "/lcommaaccent" => Some(0x013C)
    "/ldot" => Some(0x0140)
    "/ldotaccent" => Some(0x0140)
    "/longs" => Some(0x017F)
    "/nacute" => Some(0x0144)
    "/napostrophe" => Some(0x0149)
    "/ncaron" => Some(0x0148)
    "/ncedilla" => Some(0x0146)
    "/ncommaaccent" => Some(0x0146)
    "/obreve" => Some(0x014F)
    "/odblacute" => Some(0x0151)
    "/ohungarumlaut" => Some(0x0151)
    "/omacron" => Some(0x014D)
    "/quoterightn" => Some(0x0149)
    "/racute" => Some(0x0155)
    "/rcaron" => Some(0x0159)
    "/rcedilla" => Some(0x0157)
    "/rcommaaccent" => Some(0x0157)
    "/sacute" => Some(0x015B)
    "/scedilla" => Some(0x015F)
    "/scircumflex" => Some(0x015D)
    "/slong" => Some(0x017F)
    "/tbar" => Some(0x0167)
    "/tcaron" => Some(0x0165)
    "/tcedilla" => Some(0x0163)
    "/tcommaaccent" => Some(0x0163)
    "/ubreve" => Some(0x016D)
    "/udblacute" => Some(0x0171)
    "/uhungarumlaut" => Some(0x0171)
    "/umacron" => Some(0x016B)
    "/uogonek" => Some(0x0173)
    "/uring" => Some(0x016F)
    "/utilde" => Some(0x0169)
    "/wcircumflex" => Some(0x0175)
    "/ycircumflex" => Some(0x0177)
    "/zacute" => Some(0x017A)
    "/zdot" => Some(0x017C)
    "/zdotaccent" => Some(0x017C)
    "/AEacute" => Some(0x01FC)
    "/AEmacron" => Some(0x01E2)
    "/Acaron" => Some(0x01CD)
    "/Adblgrave" => Some(0x0200)
    "/Adieresismacron" => Some(0x01DE)
    "/Adotmacron" => Some(0x01E0)
    "/Ainvertedbreve" => Some(0x0202)
    "/Aringacute" => Some(0x01FA)
    "/Bhook" => Some(0x0181)
    "/Btopbar" => Some(0x0182)
    "/Chook" => Some(0x0187)
    "/DZ" => Some(0x01F1)
    "/DZcaron" => Some(0x01C4)
    "/Dafrican" => Some(0x0189)
    "/Dhook" => Some(0x018A)
    "/Dtopbar" => Some(0x018B)
    "/Dz" => Some(0x01F2)
    "/Dzcaron" => Some(0x01C5)
    "/Edblgrave" => Some(0x0204)
    "/Einvertedbreve" => Some(0x0206)
    "/Eopen" => Some(0x0190)
    "/Ereversed" => Some(0x018E)
    "/Esh" => Some(0x01A9)
    "/Ezh" => Some(0x01B7)
    "/Ezhcaron" => Some(0x01EE)
    "/Ezhreversed" => Some(0x01B8)
    "/Fhook" => Some(0x0191)
    "/Gacute" => Some(0x01F4)
    "/Gammaafrican" => Some(0x0194)
    "/Gcaron" => Some(0x01E6)
    "/Ghook" => Some(0x0193)
    "/Gstroke" => Some(0x01E4)
    "/Icaron" => Some(0x01CF)
    "/Idblgrave" => Some(0x0208)
    "/Iinvertedbreve" => Some(0x020A)
    "/Iotaafrican" => Some(0x0196)
    "/Istroke" => Some(0x0197)
    "/Kcaron" => Some(0x01E8)
    "/Khook" => Some(0x0198)
    "/LJ" => Some(0x01C7)
    "/Lj" => Some(0x01C8)
    "/Mturned" => Some(0x019C)
    "/NJ" => Some(0x01CA)
    "/Nhookleft" => Some(0x019D)
    "/Nj" => Some(0x01CB)
    "/Ocaron" => Some(0x01D1)
    "/Ocenteredtilde" => Some(0x019F)
    "/Odblgrave" => Some(0x020C)
    "/Ohorn" => Some(0x01A0)
    "/Oi" => Some(0x01A2)
    "/Oinvertedbreve" => Some(0x020E)
    "/Oogonek" => Some(0x01EA)
    "/Oogonekmacron" => Some(0x01EC)
    "/Oopen" => Some(0x0186)
    "/Oslashacute" => Some(0x01FE)
    "/Ostrokeacute" => Some(0x01FE)
    "/Phook" => Some(0x01A4)
    "/Rdblgrave" => Some(0x0210)
    "/Rinvertedbreve" => Some(0x0212)
    "/Schwa" => Some(0x018F)
    "/Scommaaccent" => Some(0x0218)
    "/Thook" => Some(0x01AC)
    "/Tonefive" => Some(0x01BC)
    "/Tonesix" => Some(0x0184)
    "/Tonetwo" => Some(0x01A7)
    "/Tretroflexhook" => Some(0x01AE)
    "/Ucaron" => Some(0x01D3)
    "/Udblgrave" => Some(0x0214)
    "/Udieresisacute" => Some(0x01D7)
    "/Udieresiscaron" => Some(0x01D9)
    "/Udieresisgrave" => Some(0x01DB)
    "/Udieresismacron" => Some(0x01D5)
    "/Uhorn" => Some(0x01AF)
    "/Uinvertedbreve" => Some(0x0216)
    "/Upsilonafrican" => Some(0x01B1)
    "/Vhook" => Some(0x01B2)
    "/Yhook" => Some(0x01B3)
    "/Zstroke" => Some(0x01B5)
    "/acaron" => Some(0x01CE)
    "/adblgrave" => Some(0x0201)
    "/adieresismacron" => Some(0x01DF)
    "/adotmacron" => Some(0x01E1)
    "/aeacute" => Some(0x01FD)
    "/aemacron" => Some(0x01E3)
    "/ainvertedbreve" => Some(0x0203)
    "/aringacute" => Some(0x01FB)
    "/bstroke" => Some(0x0180)
    "/btopbar" => Some(0x0183)
    "/chook" => Some(0x0188)
    "/clickalveolar" => Some(0x01C2)
    "/clickdental" => Some(0x01C0)
    "/clicklateral" => Some(0x01C1)
    "/clickretroflex" => Some(0x01C3)
    "/deltaturned" => Some(0x018D)
    "/dtopbar" => Some(0x018C)
    "/dz" => Some(0x01F3)
    "/dzcaron" => Some(0x01C6)
    "/edblgrave" => Some(0x0205)
    "/einvertedbreve" => Some(0x0207)
    "/eshreversedloop" => Some(0x01AA)
    "/eturned" => Some(0x01DD)
    "/ezhcaron" => Some(0x01EF)
    "/ezhreversed" => Some(0x01B9)
    "/ezhtail" => Some(0x01BA)
    "/gacute" => Some(0x01F5)
    "/gcaron" => Some(0x01E7)
    "/glottalinvertedstroke" => Some(0x01BE)
    "/gstroke" => Some(0x01E5)
    "/hv" => Some(0x0195)
    "/icaron" => Some(0x01D0)
    "/idblgrave" => Some(0x0209)
    "/iinvertedbreve" => Some(0x020B)
    "/jcaron" => Some(0x01F0)
    "/kcaron" => Some(0x01E9)
    "/khook" => Some(0x0199)
    "/lambdastroke" => Some(0x019B)
    "/lbar" => Some(0x019A)
    "/lj" => Some(0x01C9)
    "/nj" => Some(0x01CC)
    "/nlegrightlong" => Some(0x019E)
    "/ocaron" => Some(0x01D2)
    "/odblgrave" => Some(0x020D)
    "/ohorn" => Some(0x01A1)
    "/oi" => Some(0x01A3)
    "/oinvertedbreve" => Some(0x020F)
    "/oogonek" => Some(0x01EB)
    "/oogonekmacron" => Some(0x01ED)
    "/oslashacute" => Some(0x01FF)
    "/ostrokeacute" => Some(0x01FF)
    "/phook" => Some(0x01A5)
    "/rdblgrave" => Some(0x0211)
    "/rinvertedbreve" => Some(0x0213)
    "/scommaaccent" => Some(0x0219)
    "/thook" => Some(0x01AD)
    "/tonefive" => Some(0x01BD)
    "/tonesix" => Some(0x0185)
    "/tonetwo" => Some(0x01A8)
    "/tpalatalhook" => Some(0x01AB)
    "/twostroke" => Some(0x01BB)
    "/ucaron" => Some(0x01D4)
    "/udblgrave" => Some(0x0215)
    "/udieresisacute" => Some(0x01D8)
    "/udieresiscaron" => Some(0x01DA)
    "/udieresisgrave" => Some(0x01DC)
    "/udieresismacron" => Some(0x01D6)
    "/uhorn" => Some(0x01B0)
    "/uinvertedbreve" => Some(0x0217)
    "/wynn" => Some(0x01BF)
    "/yhook" => Some(0x01B4)
    "/yr" => Some(0x01A6)
    "/zstroke" => Some(0x01B6)
    _ => None
  }
}

///|
fn pdf_text_codepoint_of_hangul_compat_jamo_glyphname(name : PdfName) -> Int? {
  match pdf_text_string_of_name(name) {
    "/aekorean" => Some(0x3150)
    "/akorean" => Some(0x314F)
    "/araeaekorean" => Some(0x318E)
    "/araeakorean" => Some(0x318D)
    "/chieuchkorean" => Some(0x314A)
    "/cieuckorean" => Some(0x3148)
    "/ekorean" => Some(0x3154)
    "/eokorean" => Some(0x3153)
    "/eukorean" => Some(0x3161)
    "/hangulfiller" => Some(0x3164)
    "/hieuhkorean" => Some(0x314E)
    "/ieungkorean" => Some(0x3147)
    "/ikorean" => Some(0x3163)
    "/kapyeounmieumkorean" => Some(0x3171)
    "/kapyeounphieuphkorean" => Some(0x3184)
    "/kapyeounpieupkorean" => Some(0x3178)
    "/kapyeounssangpieupkorean" => Some(0x3179)
    "/khieukhkorean" => Some(0x314B)
    "/kiyeokkorean" => Some(0x3131)
    "/kiyeoksioskorean" => Some(0x3133)
    "/mieumkorean" => Some(0x3141)
    "/mieumpansioskorean" => Some(0x3170)
    "/mieumpieupkorean" => Some(0x316E)
    "/mieumsioskorean" => Some(0x316F)
    "/nieuncieuckorean" => Some(0x3135)
    "/nieunhieuhkorean" => Some(0x3136)
    "/nieunkorean" => Some(0x3134)
    "/nieunpansioskorean" => Some(0x3168)
    "/nieunsioskorean" => Some(0x3167)
    "/nieuntikeutkorean" => Some(0x3166)
    "/oekorean" => Some(0x315A)
    "/okorean" => Some(0x3157)
    "/pansioskorean" => Some(0x317F)
    "/phieuphkorean" => Some(0x314D)
    "/pieupcieuckorean" => Some(0x3176)
    "/pieupkiyeokkorean" => Some(0x3172)
    "/pieupkorean" => Some(0x3142)
    "/pieupsioskiyeokkorean" => Some(0x3174)
    "/pieupsioskorean" => Some(0x3144)
    "/pieupsiostikeutkorean" => Some(0x3175)
    "/pieupthieuthkorean" => Some(0x3177)
    "/pieuptikeutkorean" => Some(0x3173)
    "/rieulhieuhkorean" => Some(0x3140)
    "/rieulkiyeokkorean" => Some(0x313A)
    "/rieulkiyeoksioskorean" => Some(0x3169)
    "/rieulkorean" => Some(0x3139)
    "/rieulmieumkorean" => Some(0x313B)
    "/rieulpansioskorean" => Some(0x316C)
    "/rieulphieuphkorean" => Some(0x313F)
    "/rieulpieupkorean" => Some(0x313C)
    "/rieulpieupsioskorean" => Some(0x316B)
    "/rieulsioskorean" => Some(0x313D)
    "/rieulthieuthkorean" => Some(0x313E)
    "/rieultikeutkorean" => Some(0x316A)
    "/rieulyeorinhieuhkorean" => Some(0x316D)
    "/sioscieuckorean" => Some(0x317E)
    "/sioskiyeokkorean" => Some(0x317A)
    "/sioskorean" => Some(0x3145)
    "/siosnieunkorean" => Some(0x317B)
    "/siospieupkorean" => Some(0x317D)
    "/siostikeutkorean" => Some(0x317C)
    "/ssangcieuckorean" => Some(0x3149)
    "/ssanghieuhkorean" => Some(0x3185)
    "/ssangieungkorean" => Some(0x3180)
    "/ssangkiyeokkorean" => Some(0x3132)
    "/ssangnieunkorean" => Some(0x3165)
    "/ssangpieupkorean" => Some(0x3143)
    "/ssangsioskorean" => Some(0x3146)
    "/ssangtikeutkorean" => Some(0x3138)
    "/thieuthkorean" => Some(0x314C)
    "/tikeutkorean" => Some(0x3137)
    "/ukorean" => Some(0x315C)
    "/waekorean" => Some(0x3159)
    "/wakorean" => Some(0x3158)
    "/wekorean" => Some(0x315E)
    "/weokorean" => Some(0x315D)
    "/wikorean" => Some(0x315F)
    "/yaekorean" => Some(0x3152)
    "/yakorean" => Some(0x3151)
    "/yekorean" => Some(0x3156)
    "/yeokorean" => Some(0x3155)
    "/yeorinhieuhkorean" => Some(0x3186)
    "/yesieungkorean" => Some(0x3181)
    "/yesieungpansioskorean" => Some(0x3183)
    "/yesieungsioskorean" => Some(0x3182)
    "/yikorean" => Some(0x3162)
    "/yoikorean" => Some(0x3189)
    "/yokorean" => Some(0x315B)
    "/yoyaekorean" => Some(0x3188)
    "/yoyakorean" => Some(0x3187)
    "/yuikorean" => Some(0x318C)
    "/yukorean" => Some(0x3160)
    "/yuyekorean" => Some(0x318B)
    "/yuyeokorean" => Some(0x318A)
    _ => None
  }
}

///|
fn pdf_text_codepoint_of_enclosed_cjk_glyphname(name : PdfName) -> Int? {
  match pdf_text_string_of_name(name) {
    "/chieuchacirclekorean" => Some(0x3277)
    "/chieuchaparenkorean" => Some(0x3217)
    "/chieuchcirclekorean" => Some(0x3269)
    "/chieuchparenkorean" => Some(0x3209)
    "/cieucacirclekorean" => Some(0x3276)
    "/cieucaparenkorean" => Some(0x3216)
    "/cieuccirclekorean" => Some(0x3268)
    "/cieucparenkorean" => Some(0x3208)
    "/cieucuparenkorean" => Some(0x321C)
    "/eightideographicparen" => Some(0x3227)
    "/fiveideographicparen" => Some(0x3224)
    "/fourideographicparen" => Some(0x3223)
    "/hieuhacirclekorean" => Some(0x327B)
    "/hieuhaparenkorean" => Some(0x321B)
    "/hieuhcirclekorean" => Some(0x326D)
    "/hieuhparenkorean" => Some(0x320D)
    "/ideographearthcircle" => Some(0x328F)
    "/ideographfirecircle" => Some(0x328B)
    "/ideographicallianceparen" => Some(0x323F)
    "/ideographiccallparen" => Some(0x323A)
    "/ideographiccentrecircle" => Some(0x32A5)
    "/ideographiccongratulationparen" => Some(0x3237)
    "/ideographiccorrectcircle" => Some(0x32A3)
    "/ideographicearthparen" => Some(0x322F)
    "/ideographicenterpriseparen" => Some(0x323D)
    "/ideographicexcellentcircle" => Some(0x329D)
    "/ideographicfestivalparen" => Some(0x3240)
    "/ideographicfinancialcircle" => Some(0x3296)
    "/ideographicfinancialparen" => Some(0x3236)
    "/ideographicfireparen" => Some(0x322B)
    "/ideographichaveparen" => Some(0x3232)
    "/ideographichighcircle" => Some(0x32A4)
    "/ideographiclaborcircle" => Some(0x3298)
    "/ideographiclaborparen" => Some(0x3238)
    "/ideographicleftcircle" => Some(0x32A7)
    "/ideographiclowcircle" => Some(0x32A6)
    "/ideographicmedicinecircle" => Some(0x32A9)
    "/ideographicmetalparen" => Some(0x322E)
    "/ideographicmoonparen" => Some(0x322A)
    "/ideographicnameparen" => Some(0x3234)
    "/ideographicprintcircle" => Some(0x329E)
    "/ideographicreachparen" => Some(0x3243)
    "/ideographicrepresentparen" => Some(0x3239)
    "/ideographicresourceparen" => Some(0x323E)
    "/ideographicrightcircle" => Some(0x32A8)
    "/ideographicsecretcircle" => Some(0x3299)
    "/ideographicselfparen" => Some(0x3242)
    "/ideographicsocietyparen" => Some(0x3233)
    "/ideographicspecialparen" => Some(0x3235)
    "/ideographicstockparen" => Some(0x3231)
    "/ideographicstudyparen" => Some(0x323B)
    "/ideographicsunparen" => Some(0x3230)
    "/ideographicsuperviseparen" => Some(0x323C)
    "/ideographicwaterparen" => Some(0x322C)
    "/ideographicwoodparen" => Some(0x322D)
    "/ideographmetalcircle" => Some(0x328E)
    "/ideographmooncircle" => Some(0x328A)
    "/ideographnamecircle" => Some(0x3294)
    "/ideographsuncircle" => Some(0x3290)
    "/ideographwatercircle" => Some(0x328C)
    "/ideographwoodcircle" => Some(0x328D)
    "/ieungacirclekorean" => Some(0x3275)
    "/ieungaparenkorean" => Some(0x3215)
    "/ieungcirclekorean" => Some(0x3267)
    "/ieungparenkorean" => Some(0x3207)
    "/khieukhacirclekorean" => Some(0x3278)
    "/khieukhaparenkorean" => Some(0x3218)
    "/khieukhcirclekorean" => Some(0x326A)
    "/khieukhparenkorean" => Some(0x320A)
    "/kiyeokacirclekorean" => Some(0x326E)
    "/kiyeokaparenkorean" => Some(0x320E)
    "/kiyeokcirclekorean" => Some(0x3260)
    "/kiyeokparenkorean" => Some(0x3200)
    "/koreanstandardsymbol" => Some(0x327F)
    "/mieumacirclekorean" => Some(0x3272)
    "/mieumaparenkorean" => Some(0x3212)
    "/mieumcirclekorean" => Some(0x3264)
    "/mieumparenkorean" => Some(0x3204)
    "/nieunacirclekorean" => Some(0x326F)
    "/nieunaparenkorean" => Some(0x320F)
    "/nieuncirclekorean" => Some(0x3261)
    "/nieunparenkorean" => Some(0x3201)
    "/nineideographicparen" => Some(0x3228)
    "/oneideographicparen" => Some(0x3220)
    "/phieuphacirclekorean" => Some(0x327A)
    "/phieuphaparenkorean" => Some(0x321A)
    "/phieuphcirclekorean" => Some(0x326C)
    "/phieuphparenkorean" => Some(0x320C)
    "/pieupacirclekorean" => Some(0x3273)
    "/pieupaparenkorean" => Some(0x3213)
    "/pieupcirclekorean" => Some(0x3265)
    "/pieupparenkorean" => Some(0x3205)
    "/rieulacirclekorean" => Some(0x3271)
    "/rieulaparenkorean" => Some(0x3211)
    "/rieulcirclekorean" => Some(0x3263)
    "/rieulparenkorean" => Some(0x3203)
    "/sevenideographicparen" => Some(0x3226)
    "/siosacirclekorean" => Some(0x3274)
    "/siosaparenkorean" => Some(0x3214)
    "/sioscirclekorean" => Some(0x3266)
    "/siosparenkorean" => Some(0x3206)
    "/sixideographicparen" => Some(0x3225)
    "/tenideographicparen" => Some(0x3229)
    "/thieuthacirclekorean" => Some(0x3279)
    "/thieuthaparenkorean" => Some(0x3219)
    "/thieuthcirclekorean" => Some(0x326B)
    "/thieuthparenkorean" => Some(0x320B)
    "/threeideographicparen" => Some(0x3222)
    "/tikeutacirclekorean" => Some(0x3270)
    "/tikeutaparenkorean" => Some(0x3210)
    "/tikeutcirclekorean" => Some(0x3262)
    "/tikeutparenkorean" => Some(0x3202)
    "/twoideographicparen" => Some(0x3221)
    _ => None
  }
}

///|
fn pdf_text_codepoint_of_private_use_glyphname(name : PdfName) -> Int? {
  match pdf_text_string_of_name(name) {
    "/Acute" => Some(0xF6C9)
    "/Caron" => Some(0xF6CA)
    "/Dieresis" => Some(0xF6CB)
    "/DieresisAcute" => Some(0xF6CC)
    "/DieresisGrave" => Some(0xF6CD)
    "/Grave" => Some(0xF6CE)
    "/Hungarumlaut" => Some(0xF6CF)
    "/LL" => Some(0xF6BF)
    "/Macron" => Some(0xF6D0)
    "/afii10063" => Some(0xF6C4)
    "/afii10064" => Some(0xF6C5)
    "/afii10192" => Some(0xF6C6)
    "/afii10831" => Some(0xF6C7)
    "/afii10832" => Some(0xF6C8)
    "/apple" => Some(0xF8FF)
    "/commaaccent" => Some(0xF6C3)
    "/cyrBreve" => Some(0xF6D1)
    "/cyrFlex" => Some(0xF6D2)
    "/cyrbreve" => Some(0xF6D4)
    "/cyrflex" => Some(0xF6D5)
    "/dblGrave" => Some(0xF6D3)
    "/dblgrave" => Some(0xF6D6)
    "/dieresisacute" => Some(0xF6D7)
    "/dieresisgrave" => Some(0xF6D8)
    "/dollarsuperior" => Some(0xF6E4)
    "/dotlessj" => Some(0xF6BE)
    "/ll" => Some(0xF6C0)
    "/maichattawalowleftthai" => Some(0xF895)
    "/maichattawalowrightthai" => Some(0xF894)
    "/maichattawaupperleftthai" => Some(0xF893)
    "/maieklowleftthai" => Some(0xF88C)
    "/maieklowrightthai" => Some(0xF88B)
    "/maiekupperleftthai" => Some(0xF88A)
    "/maihanakatleftthai" => Some(0xF884)
    "/maitaikhuleftthai" => Some(0xF889)
    "/maitholowleftthai" => Some(0xF88F)
    "/maitholowrightthai" => Some(0xF88E)
    "/maithoupperleftthai" => Some(0xF88D)
    "/maitrilowleftthai" => Some(0xF892)
    "/maitrilowrightthai" => Some(0xF891)
    "/maitriupperleftthai" => Some(0xF890)
    "/nikhahitleftthai" => Some(0xF899)
    "/saraiileftthai" => Some(0xF886)
    "/saraileftthai" => Some(0xF885)
    "/saraueeleftthai" => Some(0xF888)
    "/saraueleftthai" => Some(0xF887)
    "/thanthakhatlowleftthai" => Some(0xF898)
    "/thanthakhatlowrightthai" => Some(0xF897)
    "/thanthakhatupperleftthai" => Some(0xF896)
    _ => None
  }
}

///|
fn pdf_text_codepoint_of_expert_glyphname(name : PdfName) -> Int? {
  match pdf_text_string_of_name(name) {
    "/AEsmall" => Some(0xF7E6)
    "/Aacutesmall" => Some(0xF7E1)
    "/Acircumflexsmall" => Some(0xF7E2)
    "/Acutesmall" => Some(0xF7B4)
    "/Adieresissmall" => Some(0xF7E4)
    "/Agravesmall" => Some(0xF7E0)
    "/Aringsmall" => Some(0xF7E5)
    "/Asmall" => Some(0xF761)
    "/Atildesmall" => Some(0xF7E3)
    "/Brevesmall" => Some(0xF6F4)
    "/Bsmall" => Some(0xF762)
    "/Caronsmall" => Some(0xF6F5)
    "/Ccedillasmall" => Some(0xF7E7)
    "/Cedillasmall" => Some(0xF7B8)
    "/Circumflexsmall" => Some(0xF6F6)
    "/Csmall" => Some(0xF763)
    "/Dieresissmall" => Some(0xF7A8)
    "/Dotaccentsmall" => Some(0xF6F7)
    "/Dsmall" => Some(0xF764)
    "/Eacutesmall" => Some(0xF7E9)
    "/Ecircumflexsmall" => Some(0xF7EA)
    "/Edieresissmall" => Some(0xF7EB)
    "/Egravesmall" => Some(0xF7E8)
    "/Esmall" => Some(0xF765)
    "/Ethsmall" => Some(0xF7F0)
    "/Fsmall" => Some(0xF766)
    "/Gravesmall" => Some(0xF760)
    "/Gsmall" => Some(0xF767)
    "/Hsmall" => Some(0xF768)
    "/Hungarumlautsmall" => Some(0xF6F8)
    "/Iacutesmall" => Some(0xF7ED)
    "/Icircumflexsmall" => Some(0xF7EE)
    "/Idieresissmall" => Some(0xF7EF)
    "/Igravesmall" => Some(0xF7EC)
    "/Ismall" => Some(0xF769)
    "/Jsmall" => Some(0xF76A)
    "/Ksmall" => Some(0xF76B)
    "/Lslashsmall" => Some(0xF6F9)
    "/Lsmall" => Some(0xF76C)
    "/Macronsmall" => Some(0xF7AF)
    "/Msmall" => Some(0xF76D)
    "/Nsmall" => Some(0xF76E)
    "/Ntildesmall" => Some(0xF7F1)
    "/OEsmall" => Some(0xF6FA)
    "/Oacutesmall" => Some(0xF7F3)
    "/Ocircumflexsmall" => Some(0xF7F4)
    "/Odieresissmall" => Some(0xF7F6)
    "/Ogoneksmall" => Some(0xF6FB)
    "/Ogravesmall" => Some(0xF7F2)
    "/Oslashsmall" => Some(0xF7F8)
    "/Osmall" => Some(0xF76F)
    "/Otildesmall" => Some(0xF7F5)
    "/Psmall" => Some(0xF770)
    "/Qsmall" => Some(0xF771)
    "/Ringsmall" => Some(0xF6FC)
    "/Rsmall" => Some(0xF772)
    "/Scaronsmall" => Some(0xF6FD)
    "/Ssmall" => Some(0xF773)
    "/Thornsmall" => Some(0xF7FE)
    "/Tildesmall" => Some(0xF6FE)
    "/Tsmall" => Some(0xF774)
    "/Uacutesmall" => Some(0xF7FA)
    "/Ucircumflexsmall" => Some(0xF7FB)
    "/Udieresissmall" => Some(0xF7FC)
    "/Ugravesmall" => Some(0xF7F9)
    "/Usmall" => Some(0xF775)
    "/Vsmall" => Some(0xF776)
    "/Wsmall" => Some(0xF777)
    "/Xsmall" => Some(0xF778)
    "/Yacutesmall" => Some(0xF7FD)
    "/Ydieresissmall" => Some(0xF7FF)
    "/Ysmall" => Some(0xF779)
    "/Zcaronsmall" => Some(0xF6FF)
    "/Zsmall" => Some(0xF77A)
    "/ampersandsmall" => Some(0xF726)
    "/asuperior" => Some(0xF6E9)
    "/bsuperior" => Some(0xF6EA)
    "/centinferior" => Some(0xF6DF)
    "/centoldstyle" => Some(0xF7A2)
    "/centsuperior" => Some(0xF6E0)
    "/colonmonetary" => Some(0x20A1)
    "/commainferior" => Some(0xF6E1)
    "/commasuperior" => Some(0xF6E2)
    "/dollarinferior" => Some(0xF6E3)
    "/dollaroldstyle" => Some(0xF724)
    "/dsuperior" => Some(0xF6EB)
    "/esuperior" => Some(0xF6EC)
    "/exclamdownsmall" => Some(0xF7A1)
    "/exclamsmall" => Some(0xF721)
    "/figuredash" => Some(0x2012)
    "/hypheninferior" => Some(0xF6E5)
    "/hyphensuperior" => Some(0xF6E6)
    "/isuperior" => Some(0xF6ED)
    "/lsuperior" => Some(0xF6EE)
    "/msuperior" => Some(0xF6EF)
    "/nsuperior" => Some(0x207F)
    "/onedotenleader" => Some(0x2024)
    "/onefitted" => Some(0xF6DC)
    "/osuperior" => Some(0xF6F0)
    "/parenleftinferior" => Some(0x208D)
    "/parenleftsuperior" => Some(0x207D)
    "/parenrightinferior" => Some(0x208E)
    "/parenrightsuperior" => Some(0x207E)
    "/periodinferior" => Some(0xF6E7)
    "/periodsuperior" => Some(0xF6E8)
    "/questiondownsmall" => Some(0xF7BF)
    "/questionsmall" => Some(0xF73F)
    "/rsuperior" => Some(0xF6F1)
    "/rupiah" => Some(0xF6DD)
    "/ssuperior" => Some(0xF6F2)
    "/tsuperior" => Some(0xF6F3)
    "/twodotenleader" => Some(0x2025)
    _ => None
  }
}

///|
fn pdf_text_codepoint_of_symbol_glyphname(name : PdfName) -> Int? {
  match pdf_text_string_of_name(name) {
    "/Alpha" => Some(0x0391)
    "/Beta" => Some(0x0392)
    "/Gamma" => Some(0x0393)
    "/Delta" => Some(0x0394)
    "/Epsilon" => Some(0x0395)
    "/Zeta" => Some(0x0396)
    "/Eta" => Some(0x0397)
    "/Theta" => Some(0x0398)
    "/Iota" => Some(0x0399)
    "/Kappa" => Some(0x039A)
    "/Lambda" => Some(0x039B)
    "/Mu" => Some(0x039C)
    "/Nu" => Some(0x039D)
    "/Xi" => Some(0x039E)
    "/Omicron" => Some(0x039F)
    "/Pi" => Some(0x03A0)
    "/Rho" => Some(0x03A1)
    "/Sigma" => Some(0x03A3)
    "/Tau" => Some(0x03A4)
    "/Upsilon" => Some(0x03A5)
    "/Upsilon1" => Some(0x03D2)
    "/Phi" => Some(0x03A6)
    "/Chi" => Some(0x03A7)
    "/Psi" => Some(0x03A8)
    "/Omega" => Some(0x03A9)
    "/alpha" => Some(0x03B1)
    "/beta" => Some(0x03B2)
    "/gamma" => Some(0x03B3)
    "/delta" => Some(0x03B4)
    "/epsilon" => Some(0x03B5)
    "/zeta" => Some(0x03B6)
    "/eta" => Some(0x03B7)
    "/theta" => Some(0x03B8)
    "/theta1" => Some(0x03D1)
    "/iota" => Some(0x03B9)
    "/kappa" => Some(0x03BA)
    "/lambda" => Some(0x03BB)
    "/mu" => Some(0x03BC)
    "/nu" => Some(0x03BD)
    "/xi" => Some(0x03BE)
    "/omicron" => Some(0x03BF)
    "/pi" => Some(0x03C0)
    "/rho" => Some(0x03C1)
    "/sigma" => Some(0x03C3)
    "/sigma1" => Some(0x03C2)
    "/tau" => Some(0x03C4)
    "/upsilon" => Some(0x03C5)
    "/phi" => Some(0x03C6)
    "/phi1" => Some(0x03D5)
    "/chi" => Some(0x03C7)
    "/psi" => Some(0x03C8)
    "/omega" => Some(0x03C9)
    "/omega1" => Some(0x03D6)
    "/universal" => Some(0x2200)
    "/existential" => Some(0x2203)
    "/suchthat" => Some(0x220B)
    "/congruent" => Some(0x2245)
    "/therefore" => Some(0x2234)
    "/perpendicular" => Some(0x22A5)
    "/similar" => Some(0x223C)
    "/aleph" => Some(0x2135)
    "/Ifraktur" => Some(0x2111)
    "/Rfraktur" => Some(0x211C)
    "/weierstrass" => Some(0x2118)
    "/circlemultiply" => Some(0x2297)
    "/circleplus" => Some(0x2295)
    "/emptyset" => Some(0x2205)
    "/intersection" => Some(0x2229)
    "/union" => Some(0x222A)
    "/propersuperset" => Some(0x2283)
    "/reflexsuperset" => Some(0x2287)
    "/notsubset" => Some(0x2284)
    "/propersubset" => Some(0x2282)
    "/reflexsubset" => Some(0x2286)
    "/element" => Some(0x2208)
    "/notelement" => Some(0x2209)
    "/angle" => Some(0x2220)
    "/gradient" => Some(0x2207)
    "/product" => Some(0x220F)
    "/dotmath" => Some(0x22C5)
    "/logicalnot" => Some(0x00AC)
    "/logicaland" => Some(0x2227)
    "/logicalor" => Some(0x2228)
    "/arrowdblboth" => Some(0x21D4)
    "/arrowdblleft" => Some(0x21D0)
    "/arrowdblright" => Some(0x21D2)
    "/arrowdbldown" => Some(0x21D3)
    "/lessequal" => Some(0x2264)
    "/infinity" => Some(0x221E)
    "/arrowboth" => Some(0x2194)
    "/arrowleft" => Some(0x2190)
    "/arrowup" => Some(0x2191)
    "/arrowright" => Some(0x2192)
    "/arrowdown" => Some(0x2193)
    "/degree" => Some(0x00B0)
    "/minute" => Some(0x2032)
    "/plusminus" => Some(0x00B1)
    "/second" => Some(0x2033)
    "/florin" => Some(0x0192)
    "/greaterequal" => Some(0x2265)
    "/multiply" => Some(0x00D7)
    "/proportional" => Some(0x221D)
    "/partialdiff" => Some(0x2202)
    "/divide" => Some(0x00F7)
    "/notequal" => Some(0x2260)
    "/equivalence" => Some(0x2261)
    "/approxequal" => Some(0x2248)
    "/summation" => Some(0x2211)
    "/radical" => Some(0x221A)
    "/radicalex" => Some(0xF8E5)
    "/arrowvertex" => Some(0xF8E6)
    "/arrowhorizex" => Some(0xF8E7)
    "/carriagereturn" => Some(0x21B5)
    "/arrowdblup" => Some(0x21D1)
    "/angleleft" => Some(0x2329)
    "/angleright" => Some(0x232A)
    "/registerserif" => Some(0xF6DA)
    "/copyrightserif" => Some(0xF6D9)
    "/trademarkserif" => Some(0xF6DB)
    "/registersans" => Some(0xF8E8)
    "/copyrightsans" => Some(0xF8E9)
    "/trademarksans" => Some(0xF8EA)
    "/parenlefttp" => Some(0xF8EB)
    "/parenleftex" => Some(0xF8EC)
    "/parenleftbt" => Some(0xF8ED)
    "/bracketlefttp" => Some(0xF8EE)
    "/bracketleftex" => Some(0xF8EF)
    "/bracketleftbt" => Some(0xF8F0)
    "/bracelefttp" => Some(0xF8F1)
    "/braceleftmid" => Some(0xF8F2)
    "/braceleftbt" => Some(0xF8F3)
    "/braceex" => Some(0xF8F4)
    "/integral" => Some(0x222B)
    "/integraltp" => Some(0x2320)
    "/integralex" => Some(0xF8F5)
    "/integralbt" => Some(0x2321)
    "/parenrighttp" => Some(0xF8F6)
    "/parenrightex" => Some(0xF8F7)
    "/parenrightbt" => Some(0xF8F8)
    "/bracketrighttp" => Some(0xF8F9)
    "/bracketrightex" => Some(0xF8FA)
    "/bracketrightbt" => Some(0xF8FB)
    "/bracerighttp" => Some(0xF8FC)
    "/bracerightmid" => Some(0xF8FD)
    "/bracerightbt" => Some(0xF8FE)
    "/lozenge" => Some(0x25CA)
    "/spade" => Some(0x2660)
    "/club" => Some(0x2663)
    "/heart" => Some(0x2665)
    "/diamond" => Some(0x2666)
    _ => None
  }
}

///|
fn pdf_text_codepoint_of_half_fullwidth_glyphname(name : PdfName) -> Int? {
  match pdf_text_string_of_name(name) {
    "/Amonospace" => Some(0xFF21)
    "/Bmonospace" => Some(0xFF22)
    "/Cmonospace" => Some(0xFF23)
    "/Dmonospace" => Some(0xFF24)
    "/Emonospace" => Some(0xFF25)
    "/Fmonospace" => Some(0xFF26)
    "/Gmonospace" => Some(0xFF27)
    "/Hmonospace" => Some(0xFF28)
    "/Imonospace" => Some(0xFF29)
    "/Jmonospace" => Some(0xFF2A)
    "/Kmonospace" => Some(0xFF2B)
    "/Lmonospace" => Some(0xFF2C)
    "/Mmonospace" => Some(0xFF2D)
    "/Nmonospace" => Some(0xFF2E)
    "/Omonospace" => Some(0xFF2F)
    "/Pmonospace" => Some(0xFF30)
    "/Qmonospace" => Some(0xFF31)
    "/Rmonospace" => Some(0xFF32)
    "/Smonospace" => Some(0xFF33)
    "/Tmonospace" => Some(0xFF34)
    "/Umonospace" => Some(0xFF35)
    "/Vmonospace" => Some(0xFF36)
    "/Wmonospace" => Some(0xFF37)
    "/Xmonospace" => Some(0xFF38)
    "/Ymonospace" => Some(0xFF39)
    "/Zmonospace" => Some(0xFF3A)
    "/akatakanahalfwidth" => Some(0xFF71)
    "/amonospace" => Some(0xFF41)
    "/ampersandmonospace" => Some(0xFF06)
    "/asciicircummonospace" => Some(0xFF3E)
    "/asciitildemonospace" => Some(0xFF5E)
    "/asmallkatakanahalfwidth" => Some(0xFF67)
    "/asteriskmonospace" => Some(0xFF0A)
    "/atmonospace" => Some(0xFF20)
    "/backslashmonospace" => Some(0xFF3C)
    "/barmonospace" => Some(0xFF5C)
    "/bmonospace" => Some(0xFF42)
    "/braceleftmonospace" => Some(0xFF5B)
    "/bracerightmonospace" => Some(0xFF5D)
    "/bracketleftmonospace" => Some(0xFF3B)
    "/bracketrightmonospace" => Some(0xFF3D)
    "/centmonospace" => Some(0xFFE0)
    "/cmonospace" => Some(0xFF43)
    "/colonmonospace" => Some(0xFF1A)
    "/commamonospace" => Some(0xFF0C)
    "/cornerbracketlefthalfwidth" => Some(0xFF62)
    "/cornerbracketrighthalfwidth" => Some(0xFF63)
    "/dmonospace" => Some(0xFF44)
    "/dollarmonospace" => Some(0xFF04)
    "/eightmonospace" => Some(0xFF18)
    "/ekatakanahalfwidth" => Some(0xFF74)
    "/emonospace" => Some(0xFF45)
    "/equalmonospace" => Some(0xFF1D)
    "/esmallkatakanahalfwidth" => Some(0xFF6A)
    "/exclammonospace" => Some(0xFF01)
    "/fivemonospace" => Some(0xFF15)
    "/fmonospace" => Some(0xFF46)
    "/fourmonospace" => Some(0xFF14)
    "/gmonospace" => Some(0xFF47)
    "/gravemonospace" => Some(0xFF40)
    "/greatermonospace" => Some(0xFF1E)
    "/hakatakanahalfwidth" => Some(0xFF8A)
    "/hekatakanahalfwidth" => Some(0xFF8D)
    "/hikatakanahalfwidth" => Some(0xFF8B)
    "/hmonospace" => Some(0xFF48)
    "/hokatakanahalfwidth" => Some(0xFF8E)
    "/hukatakanahalfwidth" => Some(0xFF8C)
    "/hyphenmonospace" => Some(0xFF0D)
    "/ideographiccommaleft" => Some(0xFF64)
    "/ikatakanahalfwidth" => Some(0xFF72)
    "/imonospace" => Some(0xFF49)
    "/ismallkatakanahalfwidth" => Some(0xFF68)
    "/jmonospace" => Some(0xFF4A)
    "/kakatakanahalfwidth" => Some(0xFF76)
    "/katahiraprolongmarkhalfwidth" => Some(0xFF70)
    "/kekatakanahalfwidth" => Some(0xFF79)
    "/kikatakanahalfwidth" => Some(0xFF77)
    "/kmonospace" => Some(0xFF4B)
    "/kokatakanahalfwidth" => Some(0xFF7A)
    "/kukatakanahalfwidth" => Some(0xFF78)
    "/lessmonospace" => Some(0xFF1C)
    "/lmonospace" => Some(0xFF4C)
    "/macronmonospace" => Some(0xFFE3)
    "/makatakanahalfwidth" => Some(0xFF8F)
    "/mekatakanahalfwidth" => Some(0xFF92)
    "/middledotkatakanahalfwidth" => Some(0xFF65)
    "/mikatakanahalfwidth" => Some(0xFF90)
    "/mmonospace" => Some(0xFF4D)
    "/mokatakanahalfwidth" => Some(0xFF93)
    "/mukatakanahalfwidth" => Some(0xFF91)
    "/nakatakanahalfwidth" => Some(0xFF85)
    "/nekatakanahalfwidth" => Some(0xFF88)
    "/nikatakanahalfwidth" => Some(0xFF86)
    "/ninemonospace" => Some(0xFF19)
    "/nkatakanahalfwidth" => Some(0xFF9D)
    "/nmonospace" => Some(0xFF4E)
    "/nokatakanahalfwidth" => Some(0xFF89)
    "/nukatakanahalfwidth" => Some(0xFF87)
    "/numbersignmonospace" => Some(0xFF03)
    "/okatakanahalfwidth" => Some(0xFF75)
    "/omonospace" => Some(0xFF4F)
    "/onemonospace" => Some(0xFF11)
    "/osmallkatakanahalfwidth" => Some(0xFF6B)
    "/parenleftmonospace" => Some(0xFF08)
    "/parenrightmonospace" => Some(0xFF09)
    "/percentmonospace" => Some(0xFF05)
    "/periodhalfwidth" => Some(0xFF61)
    "/periodmonospace" => Some(0xFF0E)
    "/plusmonospace" => Some(0xFF0B)
    "/pmonospace" => Some(0xFF50)
    "/qmonospace" => Some(0xFF51)
    "/questionmonospace" => Some(0xFF1F)
    "/quotedblmonospace" => Some(0xFF02)
    "/quotesinglemonospace" => Some(0xFF07)
    "/rakatakanahalfwidth" => Some(0xFF97)
    "/rekatakanahalfwidth" => Some(0xFF9A)
    "/rikatakanahalfwidth" => Some(0xFF98)
    "/rmonospace" => Some(0xFF52)
    "/rokatakanahalfwidth" => Some(0xFF9B)
    "/rukatakanahalfwidth" => Some(0xFF99)
    "/sakatakanahalfwidth" => Some(0xFF7B)
    "/sekatakanahalfwidth" => Some(0xFF7E)
    "/semicolonmonospace" => Some(0xFF1B)
    "/semivoicedmarkkanahalfwidth" => Some(0xFF9F)
    "/sevenmonospace" => Some(0xFF17)
    "/sikatakanahalfwidth" => Some(0xFF7C)
    "/sixmonospace" => Some(0xFF16)
    "/slashmonospace" => Some(0xFF0F)
    "/smonospace" => Some(0xFF53)
    "/sokatakanahalfwidth" => Some(0xFF7F)
    "/sterlingmonospace" => Some(0xFFE1)
    "/sukatakanahalfwidth" => Some(0xFF7D)
    "/takatakanahalfwidth" => Some(0xFF80)
    "/tekatakanahalfwidth" => Some(0xFF83)
    "/threemonospace" => Some(0xFF13)
    "/tikatakanahalfwidth" => Some(0xFF81)
    "/tmonospace" => Some(0xFF54)
    "/tokatakanahalfwidth" => Some(0xFF84)
    "/tukatakanahalfwidth" => Some(0xFF82)
    "/tusmallkatakanahalfwidth" => Some(0xFF6F)
    "/twomonospace" => Some(0xFF12)
    "/ukatakanahalfwidth" => Some(0xFF73)
    "/umonospace" => Some(0xFF55)
    "/underscoremonospace" => Some(0xFF3F)
    "/usmallkatakanahalfwidth" => Some(0xFF69)
    "/vmonospace" => Some(0xFF56)
    "/voicedmarkkanahalfwidth" => Some(0xFF9E)
    "/wakatakanahalfwidth" => Some(0xFF9C)
    "/wmonospace" => Some(0xFF57)
    "/wokatakanahalfwidth" => Some(0xFF66)
    "/wonmonospace" => Some(0xFFE6)
    "/xmonospace" => Some(0xFF58)
    "/yakatakanahalfwidth" => Some(0xFF94)
    "/yasmallkatakanahalfwidth" => Some(0xFF6C)
    "/yenmonospace" => Some(0xFFE5)
    "/ymonospace" => Some(0xFF59)
    "/yokatakanahalfwidth" => Some(0xFF96)
    "/yosmallkatakanahalfwidth" => Some(0xFF6E)
    "/yukatakanahalfwidth" => Some(0xFF95)
    "/yusmallkatakanahalfwidth" => Some(0xFF6D)
    "/zeromonospace" => Some(0xFF10)
    "/zmonospace" => Some(0xFF5A)
    _ => None
  }
}

///|
fn pdf_text_codepoint_of_dingbat_glyphname(name : PdfName) -> Int? {
  match pdf_text_string_of_name(name) {
    "/a1" => Some(0x2701)
    "/a2" => Some(0x2702)
    "/a202" => Some(0x2703)
    "/a3" => Some(0x2704)
    "/a4" => Some(0x260E)
    "/a5" => Some(0x2706)
    "/a119" => Some(0x2707)
    "/a118" => Some(0x2708)
    "/a117" => Some(0x2709)
    "/a11" => Some(0x261B)
    "/a12" => Some(0x261E)
    "/a13" => Some(0x270C)
    "/a14" => Some(0x270D)
    "/a15" => Some(0x270E)
    "/a16" => Some(0x270F)
    "/a105" => Some(0x2710)
    "/a17" => Some(0x2711)
    "/a18" => Some(0x2712)
    "/a19" => Some(0x2713)
    "/a20" => Some(0x2714)
    "/a21" => Some(0x2715)
    "/a22" => Some(0x2716)
    "/a23" => Some(0x2717)
    "/a24" => Some(0x2718)
    "/a25" => Some(0x2719)
    "/a26" => Some(0x271A)
    "/a27" => Some(0x271B)
    "/a28" => Some(0x271C)
    "/a6" => Some(0x271D)
    "/a7" => Some(0x271E)
    "/a8" => Some(0x271F)
    "/a9" => Some(0x2720)
    "/a10" => Some(0x2721)
    "/a29" => Some(0x2722)
    "/a30" => Some(0x2723)
    "/a31" => Some(0x2724)
    "/a32" => Some(0x2725)
    "/a33" => Some(0x2726)
    "/a34" => Some(0x2727)
    "/a35" => Some(0x2605)
    "/a36" => Some(0x2729)
    "/a37" => Some(0x272A)
    "/a38" => Some(0x272B)
    "/a39" => Some(0x272C)
    "/a40" => Some(0x272D)
    "/a41" => Some(0x272E)
    "/a42" => Some(0x272F)
    "/a43" => Some(0x2730)
    "/a44" => Some(0x2731)
    "/a45" => Some(0x2732)
    "/a46" => Some(0x2733)
    "/a47" => Some(0x2734)
    "/a48" => Some(0x2735)
    "/a49" => Some(0x2736)
    "/a50" => Some(0x2737)
    "/a51" => Some(0x2738)
    "/a52" => Some(0x2739)
    "/a53" => Some(0x273A)
    "/a54" => Some(0x273B)
    "/a55" => Some(0x273C)
    "/a56" => Some(0x273D)
    "/a57" => Some(0x273E)
    "/a58" => Some(0x273F)
    "/a59" => Some(0x2740)
    "/a60" => Some(0x2741)
    "/a61" => Some(0x2742)
    "/a62" => Some(0x2743)
    "/a63" => Some(0x2744)
    "/a64" => Some(0x2745)
    "/a65" => Some(0x2746)
    "/a66" => Some(0x2747)
    "/a67" => Some(0x2748)
    "/a68" => Some(0x2749)
    "/a69" => Some(0x274A)
    "/a70" => Some(0x274B)
    "/a71" => Some(0x25CF)
    "/a72" => Some(0x274D)
    "/a73" => Some(0x25A0)
    "/a74" => Some(0x274F)
    "/a203" => Some(0x2750)
    "/a75" => Some(0x2751)
    "/a204" => Some(0x2752)
    "/a76" => Some(0x25B2)
    "/a77" => Some(0x25BC)
    "/a78" => Some(0x25C6)
    "/a79" => Some(0x2756)
    "/a81" => Some(0x25D7)
    "/a82" => Some(0x2758)
    "/a83" => Some(0x2759)
    "/a84" => Some(0x275A)
    "/a97" => Some(0x275B)
    "/a98" => Some(0x275C)
    "/a99" => Some(0x275D)
    "/a100" => Some(0x275E)
    "/a101" => Some(0x2761)
    "/a102" => Some(0x2762)
    "/a103" => Some(0x2763)
    "/a104" => Some(0x2764)
    "/a106" => Some(0x2765)
    "/a107" => Some(0x2766)
    "/a108" => Some(0x2767)
    "/a112" => Some(0x2663)
    "/a111" => Some(0x2666)
    "/a110" => Some(0x2665)
    "/a109" => Some(0x2660)
    "/a89" => Some(0x2768)
    "/a90" => Some(0x2769)
    "/a93" => Some(0x276A)
    "/a94" => Some(0x276B)
    "/a91" => Some(0x276C)
    "/a92" => Some(0x276D)
    "/a205" => Some(0x276E)
    "/a85" => Some(0x276F)
    "/a206" => Some(0x2770)
    "/a86" => Some(0x2771)
    "/a87" => Some(0x2772)
    "/a88" => Some(0x2773)
    "/a95" => Some(0x2774)
    "/a96" => Some(0x2775)
    "/a120" => Some(0x2460)
    "/a121" => Some(0x2461)
    "/a122" => Some(0x2462)
    "/a123" => Some(0x2463)
    "/a124" => Some(0x2464)
    "/a125" => Some(0x2465)
    "/a126" => Some(0x2466)
    "/a127" => Some(0x2467)
    "/a128" => Some(0x2468)
    "/a129" => Some(0x2469)
    "/a130" => Some(0x2776)
    "/a131" => Some(0x2777)
    "/a132" => Some(0x2778)
    "/a133" => Some(0x2779)
    "/a134" => Some(0x277A)
    "/a135" => Some(0x277B)
    "/a136" => Some(0x277C)
    "/a137" => Some(0x277D)
    "/a138" => Some(0x277E)
    "/a139" => Some(0x277F)
    "/a140" => Some(0x2780)
    "/a141" => Some(0x2781)
    "/a142" => Some(0x2782)
    "/a143" => Some(0x2783)
    "/a144" => Some(0x2784)
    "/a145" => Some(0x2785)
    "/a146" => Some(0x2786)
    "/a147" => Some(0x2787)
    "/a148" => Some(0x2788)
    "/a149" => Some(0x2789)
    "/a150" => Some(0x278A)
    "/a151" => Some(0x278B)
    "/a152" => Some(0x278C)
    "/a153" => Some(0x278D)
    "/a154" => Some(0x278E)
    "/a155" => Some(0x278F)
    "/a156" => Some(0x2790)
    "/a157" => Some(0x2791)
    "/a158" => Some(0x2792)
    "/a159" => Some(0x2793)
    "/a160" => Some(0x2794)
    "/a161" => Some(0x2192)
    "/a163" => Some(0x2194)
    "/a164" => Some(0x2195)
    "/a196" => Some(0x2798)
    "/a165" => Some(0x2799)
    "/a192" => Some(0x279A)
    "/a166" => Some(0x279B)
    "/a167" => Some(0x279C)
    "/a168" => Some(0x279D)
    "/a169" => Some(0x279E)
    "/a170" => Some(0x279F)
    "/a171" => Some(0x27A0)
    "/a172" => Some(0x27A1)
    "/a173" => Some(0x27A2)
    "/a162" => Some(0x27A3)
    "/a174" => Some(0x27A4)
    "/a175" => Some(0x27A5)
    "/a176" => Some(0x27A6)
    "/a177" => Some(0x27A7)
    "/a178" => Some(0x27A8)
    "/a179" => Some(0x27A9)
    "/a193" => Some(0x27AA)
    "/a180" => Some(0x27AB)
    "/a199" => Some(0x27AC)
    "/a181" => Some(0x27AD)
    "/a200" => Some(0x27AE)
    "/a182" => Some(0x27AF)
    "/a201" => Some(0x27B1)
    "/a183" => Some(0x27B2)
    "/a184" => Some(0x27B3)
    "/a197" => Some(0x27B4)
    "/a185" => Some(0x27B5)
    "/a194" => Some(0x27B6)
    "/a198" => Some(0x27B7)
    "/a186" => Some(0x27B8)
    "/a195" => Some(0x27B9)
    "/a187" => Some(0x27BA)
    "/a188" => Some(0x27BB)
    "/a189" => Some(0x27BC)
    "/a190" => Some(0x27BD)
    "/a191" => Some(0x27BE)
    "/arrowrightheavy" => Some(0x279E)
    "/checkmark" => Some(0x2713)
    "/onecircleinversesansserif" => Some(0x278A)
    "/twocircleinversesansserif" => Some(0x278B)
    "/threecircleinversesansserif" => Some(0x278C)
    "/fourcircleinversesansserif" => Some(0x278D)
    "/fivecircleinversesansserif" => Some(0x278E)
    "/sixcircleinversesansserif" => Some(0x278F)
    "/sevencircleinversesansserif" => Some(0x2790)
    "/eightcircleinversesansserif" => Some(0x2791)
    "/ninecircleinversesansserif" => Some(0x2792)
    _ => None
  }
}

///|
fn pdf_text_glyphname_base_bytes(name : PdfName) -> BytesView {
  let bytes = name.bytes()
  let mut end = bytes.length()
  let mut index = 0
  while index < bytes.length() {
    if bytes[index].to_int() == 46 {
      end = index
      break
    }
    index += 1
  }
  bytes[:end]
}

///|
fn pdf_text_valid_unicode_scalar(codepoint : Int) -> Bool {
  codepoint >= 0 &&
  codepoint <= 0x10FFFF &&
  !(codepoint >= 0xD800 && codepoint <= 0xDFFF)
}

///|
fn pdf_text_parse_hex_codepoint(
  bytes : BytesView,
  start : Int,
  stop : Int,
) -> Int? {
  guard stop > start else { return None }
  let mut value = 0
  for index in start.. value = value * 16 + digit
      None => return None
    }
  }
  if pdf_text_valid_unicode_scalar(value) {
    Some(value)
  } else {
    None
  }
}

///|
fn pdf_text_uni_glyphname_codepoints(base : BytesView) -> Array[Int]? {
  guard base.length() > 4 &&
    base[0].to_int() == 47 &&
    base[1].to_int() == 117 &&
    base[2].to_int() == 110 &&
    base[3].to_int() == 105 &&
    (base.length() - 4) % 4 == 0 else {
    return None
  }
  let output : Array[Int] = Array::new(capacity=(base.length() - 4) / 4)
  let mut index = 4
  while index < base.length() {
    match pdf_text_parse_hex_codepoint(base, index, index + 4) {
      Some(codepoint) => output.push(codepoint)
      None => return None
    }
    index += 4
  }
  Some(output)
}

///|
fn pdf_text_u_glyphname_codepoints(base : BytesView) -> Array[Int]? {
  guard base.length() >= 6 &&
    base.length() <= 8 &&
    base[0].to_int() == 47 &&
    base[1].to_int() == 117 else {
    return None
  }
  match pdf_text_parse_hex_codepoint(base, 2, base.length()) {
    Some(codepoint) => Some([codepoint])
    None => None
  }
}

///|
fn pdf_text_upper_hex_letter(byte : Byte) -> Bool {
  let value = byte.to_int()
  value >= 65 && value <= 70
}

///|
fn pdf_text_truetype_control_high_byte(value : Int) -> Bool {
  value == 0x8A ||
  value == 0x8B ||
  value == 0x8C ||
  value == 0x9A ||
  value == 0x9B ||
  value == 0x9C
}

///|
fn pdf_text_truetype_windows_high_byte_table() -> Array[(Int, Int)] {
  [
    (0x82, 0x201A),
    (0x83, 0x0192),
    (0x84, 0x201E),
    (0x85, 0x2026),
    (0x86, 0x2020),
    (0x87, 0x2021),
    (0x88, 0x02C6),
    (0x89, 0x2030),
    (0x8A, 0x0160),
    (0x8B, 0x2039),
    (0x8C, 0x0152),
    (0x91, 0x2018),
    (0x92, 0x2019),
    (0x93, 0x201C),
    (0x94, 0x201D),
    (0x95, 0x2022),
    (0x96, 0x2013),
    (0x97, 0x2014),
    (0x98, 0x02DC),
    (0x99, 0x2122),
    (0x9A, 0x0161),
    (0x9B, 0x203A),
    (0x9C, 0x0153),
    (0x9F, 0x0178),
  ]
}

///|
fn pdf_text_truetype_high_byte_codepoint(value : Int, low_hex : Byte) -> Int? {
  if pdf_text_upper_hex_letter(low_hex) &&
    pdf_text_truetype_control_high_byte(value) {
    Some(value)
  } else {
    for entry in pdf_text_truetype_windows_high_byte_table() {
      if entry.0 == value {
        break Some(entry.1)
      }
    } nobreak {
      None
    }
  }
}

///|
fn pdf_text_truetype_glyphname_codepoints(base : BytesView) -> Array[Int]? {
  guard base.length() == 4 && base[0].to_int() == 47 && base[1].to_int() == 71 else {
    return None
  }
  let high = match pdf_text_hex_digit_value(base[2]) {
    Some(value) => value
    None => return None
  }
  let low = match pdf_text_hex_digit_value(base[3]) {
    Some(value) => value
    None => return None
  }
  let value = high * 16 + low
  if base[2].to_int() == 65 && base[3].to_int() == 54 {
    Some([0x00B6])
  } else if value == 0x6D && pdf_text_upper_hex_letter(base[3]) {
    Some([0x002D])
  } else if (value >= 0x20 && value <= 0x7E) || (value >= 0xA0 && value <= 0xFF) {
    Some([value])
  } else {
    match pdf_text_truetype_high_byte_codepoint(value, base[3]) {
      Some(codepoint) => Some([codepoint])
      None => None
    }
  }
}

///|
fn pdf_text_glyphname_base_name(name : PdfName, base : BytesView) -> PdfName {
  if base.length() == name.byte_length() {
    name
  } else {
    pdf_name_of_bytes(base.to_owned())
  }
}

///|
fn pdf_text_codepoint_of_agl_base_glyphname(base_name : PdfName) -> Int? {
  match pdf_text_codepoint_of_basic_latin_glyphname(base_name) {
    Some(codepoint) => return Some(codepoint)
    None => ()
  }
  match pdf_text_codepoint_of_digit_glyphname(base_name) {
    Some(codepoint) => return Some(codepoint)
    None => ()
  }
  match pdf_text_codepoint_of_punctuation_glyphname(base_name) {
    Some(codepoint) => return Some(codepoint)
    None => ()
  }
  match pdf_text_codepoint_of_ipa_extension_glyphname(base_name) {
    Some(codepoint) => return Some(codepoint)
    None => ()
  }
  match pdf_text_codepoint_of_spacing_modifier_glyphname(base_name) {
    Some(codepoint) => return Some(codepoint)
    None => ()
  }
  match pdf_text_codepoint_of_combining_mark_glyphname(base_name) {
    Some(codepoint) => return Some(codepoint)
    None => ()
  }
  match pdf_text_codepoint_of_currency_letterlike_glyphname(base_name) {
    Some(codepoint) => return Some(codepoint)
    None => ()
  }
  match pdf_text_codepoint_of_arrow_glyphname(base_name) {
    Some(codepoint) => return Some(codepoint)
    None => ()
  }
  match pdf_text_codepoint_of_greek_glyphname(base_name) {
    Some(codepoint) => return Some(codepoint)
    None => ()
  }
  match pdf_text_codepoint_of_cyrillic_glyphname(base_name) {
    Some(codepoint) => return Some(codepoint)
    None => ()
  }
  match pdf_text_codepoint_of_armenian_glyphname(base_name) {
    Some(codepoint) => return Some(codepoint)
    None => ()
  }
  match pdf_text_codepoint_of_hebrew_glyphname(base_name) {
    Some(codepoint) => return Some(codepoint)
    None => ()
  }
  match pdf_text_codepoint_of_arabic_glyphname(base_name) {
    Some(codepoint) => return Some(codepoint)
    None => ()
  }
  match pdf_text_codepoint_of_devanagari_glyphname(base_name) {
    Some(codepoint) => return Some(codepoint)
    None => ()
  }
  match pdf_text_codepoint_of_bengali_glyphname(base_name) {
    Some(codepoint) => return Some(codepoint)
    None => ()
  }
  match pdf_text_codepoint_of_gurmukhi_glyphname(base_name) {
    Some(codepoint) => return Some(codepoint)
    None => ()
  }
  match pdf_text_codepoint_of_gujarati_glyphname(base_name) {
    Some(codepoint) => return Some(codepoint)
    None => ()
  }
  match pdf_text_codepoint_of_thai_glyphname(base_name) {
    Some(codepoint) => return Some(codepoint)
    None => ()
  }
  match pdf_text_codepoint_of_math_glyphname(base_name) {
    Some(codepoint) => return Some(codepoint)
    None => ()
  }
  match pdf_text_codepoint_of_number_form_glyphname(base_name) {
    Some(codepoint) => return Some(codepoint)
    None => ()
  }
  match pdf_text_codepoint_of_technical_glyphname(base_name) {
    Some(codepoint) => return Some(codepoint)
    None => ()
  }
  match pdf_text_codepoint_of_enclosed_alnum_glyphname(base_name) {
    Some(codepoint) => return Some(codepoint)
    None => ()
  }
  match pdf_text_codepoint_of_cjk_symbol_glyphname(base_name) {
    Some(codepoint) => return Some(codepoint)
    None => ()
  }
  match pdf_text_codepoint_of_hiragana_glyphname(base_name) {
    Some(codepoint) => return Some(codepoint)
    None => ()
  }
  match pdf_text_codepoint_of_katakana_glyphname(base_name) {
    Some(codepoint) => return Some(codepoint)
    None => ()
  }
  match pdf_text_codepoint_of_bopomofo_glyphname(base_name) {
    Some(codepoint) => return Some(codepoint)
    None => ()
  }
  match pdf_text_codepoint_of_hangul_compat_jamo_glyphname(base_name) {
    Some(codepoint) => return Some(codepoint)
    None => ()
  }
  match pdf_text_codepoint_of_enclosed_cjk_glyphname(base_name) {
    Some(codepoint) => return Some(codepoint)
    None => ()
  }
  match pdf_text_codepoint_of_cjk_compat_square_glyphname(base_name) {
    Some(codepoint) => return Some(codepoint)
    None => ()
  }
  match pdf_text_codepoint_of_presentation_form_glyphname(base_name) {
    Some(codepoint) => return Some(codepoint)
    None => ()
  }
  match pdf_text_codepoint_of_box_drawing_glyphname(base_name) {
    Some(codepoint) => return Some(codepoint)
    None => ()
  }
  match pdf_text_codepoint_of_block_element_glyphname(base_name) {
    Some(codepoint) => return Some(codepoint)
    None => ()
  }
  match pdf_text_codepoint_of_geometric_shape_glyphname(base_name) {
    Some(codepoint) => return Some(codepoint)
    None => ()
  }
  match pdf_text_codepoint_of_misc_symbol_glyphname(base_name) {
    Some(codepoint) => return Some(codepoint)
    None => ()
  }
  match pdf_text_codepoint_of_latin_extended_glyphname(base_name) {
    Some(codepoint) => return Some(codepoint)
    None => ()
  }
  match pdf_text_codepoint_of_latin_ext_additional_glyphname(base_name) {
    Some(codepoint) => return Some(codepoint)
    None => ()
  }
  match pdf_text_codepoint_of_private_use_glyphname(base_name) {
    Some(codepoint) => return Some(codepoint)
    None => ()
  }
  match pdf_text_codepoint_of_expert_glyphname(base_name) {
    Some(codepoint) => return Some(codepoint)
    None => ()
  }
  match pdf_text_codepoint_of_symbol_glyphname(base_name) {
    Some(codepoint) => return Some(codepoint)
    None => ()
  }
  match pdf_text_codepoint_of_half_fullwidth_glyphname(base_name) {
    Some(codepoint) => return Some(codepoint)
    None => ()
  }
  pdf_text_codepoint_of_dingbat_glyphname(base_name)
}

///|
fn pdf_text_codepoints_of_glyphname(name : PdfName) -> Array[Int]? {
  let base = pdf_text_glyphname_base_bytes(name)
  match pdf_text_uni_glyphname_codepoints(base) {
    Some(codepoints) => Some(codepoints)
    None =>
      match pdf_text_u_glyphname_codepoints(base) {
        Some(codepoints) => Some(codepoints)
        None =>
          match pdf_text_truetype_glyphname_codepoints(base) {
            Some(codepoints) => Some(codepoints)
            None =>
              if base.length() == 2 && base[0].to_int() == 47 {
                let value = base[1].to_int()
                if (value >= 65 && value <= 90) || (value >= 97 && value <= 122) {
                  Some([value])
                } else {
                  None
                }
              } else {
                let base_name = pdf_text_glyphname_base_name(name, base)
                match pdf_text_codepoints_of_agl_sequence_glyphname(base_name) {
                  Some(codepoints) => Some(codepoints)
                  None =>
                    match pdf_text_codepoint_of_agl_base_glyphname(base_name) {
                      Some(codepoint) => Some([codepoint])
                      None => None
                    }
                }
              }
          }
      }
  }
}

///|
fn pdf_text_codepoint_of_agl_symbol_conflict_glyphname(name : PdfName) -> Int? {
  match pdf_text_string_of_name(name) {
    "/Delta" => Some(0x2206)
    "/Omega" => Some(0x2126)
    "/mu" => Some(0x00B5)
    _ => None
  }
}

///|
fn PdfFont::pdf_text_uses_symbol_codepoints(self : PdfFont) -> Bool {
  match self {
    PdfFontStandard(data) =>
      data.font == PdfSymbol && data.encoding == PdfImplicitInFontFile
    _ => false
  }
}

///|
fn PdfFont::pdf_text_codepoints_of_glyphname(
  self : PdfFont,
  glyphname : PdfName,
) -> Array[Int]? {
  if self.pdf_text_uses_symbol_codepoints() {
    pdf_text_codepoints_of_glyphname(glyphname)
  } else {
    match pdf_text_codepoint_of_agl_symbol_conflict_glyphname(glyphname) {
      Some(codepoint) => Some([codepoint])
      None => pdf_text_codepoints_of_glyphname(glyphname)
    }
  }
}

///|
fn PdfFont::pdf_text_glyphname_has_single_codepoint(
  self : PdfFont,
  glyphname : PdfName,
  codepoint : Int,
) -> Bool {
  match self.pdf_text_codepoints_of_glyphname(glyphname) {
    Some([single]) if single == codepoint => true
    _ => false
  }
}

///|
fn PdfEncoding::pdf_text_has_macexpert_base(self : PdfEncoding) -> Bool {
  match self {
    PdfMacExpertEncoding => true
    PdfCustomEncoding(base, _) => base.pdf_text_has_macexpert_base()
    PdfFillUndefinedWithStandard(base) => base.pdf_text_has_macexpert_base()
    _ => false
  }
}

///|
fn PdfFont::pdf_text_has_macexpert_base(self : PdfFont) -> Bool {
  match self {
    PdfFontStandard(data) => data.encoding.pdf_text_has_macexpert_base()
    PdfFontSimple(font) => font.encoding.pdf_text_has_macexpert_base()
    PdfFontCIDKeyed(_) => false
  }
}

///|
fn PdfFont::pdf_text_macexpert_duplicate_charcode(
  self : PdfFont,
  codepoint : Int,
) -> Int? {
  if codepoint == 0xF6E6 && self.pdf_text_has_macexpert_base() {
    Some(0x5F)
  } else {
    None
  }
}