Introduce src dir.
[librarian.git] / src / librarian / font-optimizer / ext / Font-TTF / lib / Font / TTF / OTTags.pm
diff --git a/src/librarian/font-optimizer/ext/Font-TTF/lib/Font/TTF/OTTags.pm b/src/librarian/font-optimizer/ext/Font-TTF/lib/Font/TTF/OTTags.pm
new file mode 100644 (file)
index 0000000..71338e2
--- /dev/null
@@ -0,0 +1,706 @@
+package Font::TTF::OTTags;
+
+=head1 NAME
+
+Font::TTF::OTTags - Utilities for TrueType/OpenType tags
+
+=head1 SYNOPSIS
+
+  use Font::TTF::OTTags qw( %tttags %ttnames readtagsfile );
+  
+  # Look at built-in stuff:
+  $script_tag = $tttags{'SCRIPT'}{'Cypriot Syllabary'};
+  $lang_name = $ttnames{'LANGUAGE'}{'AFK '}
+  
+  # Read latest tags file to add to built-in definitions
+  readtagsfile ("C:\\Program Files\\Microsoft VOLT\\TAGS.txt");
+  
+First-level keys to %tttags and %ttnames are:
+
+=over
+
+'SCRIPT' -- retrieve script tag or name
+
+'LANGUAGE' -- retrieve language tag or name
+
+'FEATURE' -- retrieve feature tag or name
+
+=back
+
+Built-in data has been derived from Microsoft's tag registry at
+L<http://www.microsoft.com/typography/otspec/ttoreg.htm>, 
+updated to draft v1.5 of the OpenType Spec.
+
+=head1 METHODS
+
+=cut
+
+use strict;
+use vars qw( %tttags %ttnames @EXPORT_OK @ISA );
+require Exporter;
+@ISA = qw( Exporter );
+@EXPORT_OK = qw( %tttags %ttnames readtagsfile);
+
+
+%tttags = (
+
+# All data below derived from VOLT 1.3 TAGS.txt file.
+# For conveninence of human checking, these are now sorted alphabetically.
+
+'SCRIPT' => {
+    "Arabic" => "arab",
+    "Armenian" => "armn",
+    "Balinese" => "bali",
+    "Bengali v.2" => "bng2",
+    "Bengali" => "beng",
+    "Bopomofo" => "bopo",
+    "Braille" => "brai",
+    "Buginese" => "bugi",
+    "Buhid" => "buhd",
+    "Byzantine Music" => "byzm",
+    "CJK Ideographic" => "hani",
+    "Canadian Syllabics" => "cans",
+    "Carian" => "cari",
+    "Cham" => "cham",
+    "Cherokee" => "cher",
+    "Coptic" => "copt",
+    "Cypriot Syllabary" => "cprt",
+    "Cyrillic" => "cyrl",
+    "Default" => "DFLT",
+    "Deseret" => "dsrt",
+    "Devanagari v.2" => "dev2",
+    "Devanagari" => "deva",
+    "Ethiopic" => "ethi",
+    "Georgian" => "geor",
+    "Glagolitic" => "glag",
+    "Gothic" => "goth",
+    "Greek" => "grek",
+    "Gujarati v.2" => "gjr2",
+    "Gujarati" => "gujr",
+    "Gurmukhi v.2" => "gur2",
+    "Gurmukhi" => "guru",
+    "Hangul Jamo" => "jamo",
+    "Hangul" => "hang",
+    "Hanunoo" => "hano",
+    "Hebrew" => "hebr",
+    "Hiragana" => "kana",
+    "Javanese" => "java",
+    "Kannada v.2" => "knd2",
+    "Kannada" => "knda",
+    "Katakana" => "kana",
+    "Kayah Li" => "kali",
+    "Kharosthi" => "khar",
+    "Khmer" => "khmr",
+    "Lao" => "lao ",
+    "Latin" => "latn",
+    "Lepcha" => "lepc",
+    "Limbu" => "limb",
+    "Linear B" => "linb",
+    "Lycian" => "lyci",
+    "Lydian" => "lydi",
+    "Malayalam v.2" => "mlm2",
+    "Malayalam" => "mlym",
+    "Mathematical Alphanumeric Symbols" => "math",
+    "Mongolian" => "mong",
+    "Musical Symbols" => "musc",
+    "Myanmar" => "mymr",
+    "N'Ko" => "nko ",
+    "New Tai Lue" => "talu",
+    "Ogham" => "ogam",
+    "Ol Chiki" => "olck",
+    "Old Italic" => "ital",
+    "Old Persian Cuneiform" => "xpeo",
+    "Oriya v.2" => "ory2",
+    "Oriya" => "orya",
+    "Osmanya" => "osma",
+    "Phags-pa" => "phag",
+    "Phoenician" => "phnx",
+    "Rejang" => "rjng",
+    "Runic" => "runr",
+    "Saurashtra" => "saur",
+    "Shavian" => "shaw",
+    "Sinhala" => "sinh",
+    "Sumero-Akkadian Cuneiform" => "xsux",
+    "Sundanese" => "sund",
+    "Syloti Nagri" => "sylo",
+    "Syriac" => "syrc",
+    "Tagalog" => "tglg",
+    "Tagbanwa" => "tagb",
+    "Tai Le" => "tale",
+    "Tamil v.2" => "tml2",
+    "Tamil" => "taml",
+    "Telugu v.2" => "tel2",
+    "Telugu" => "telu",
+    "Thaana" => "thaa",
+    "Thai" => "thai",
+    "Tibetan" => "tibt",
+    "Tifinagh" => "tfng",
+    "Ugaritic Cuneiform" => "ugar",
+    "Vai" => "vai ",
+    "Yi" => "yi  ",
+    }, 
+
+'LANGUAGE' => {
+    "Aari" => "ARI ",
+    "Abaza" => "ABA ",
+    "Abkhazian" => "ABK ",
+    "Adyghe" => "ADY ",
+    "Afar" => "AFR ",
+    "Afrikaans" => "AFK ",
+    "Agaw" => "AGW ",
+    "Albanian" => "SQI ",
+    "Alsatian" => "ALS ",
+    "Altai" => "ALT ",
+    "Amharic" => "AMH ",
+    "Arabic" => "ARA ",
+    "Arakanese" => "ARK ",
+    "Armenian" => "HYE ",
+    "Assamese" => "ASM ",
+    "Athapaskan" => "ATH ",
+    "Avar" => "AVR ",
+    "Awadhi" => "AWA ",
+    "Aymara" => "AYM ",
+    "Azeri" => "AZE ",
+    "Badaga" => "BAD ",
+    "Baghelkhandi" => "BAG ",
+    "Balante" => "BLN ",
+    "Balkar" => "BAL ",
+    "Balochi" => "BLI ",
+    "Balti" => "BLT ",
+    "Bambara" => "BMB ",
+    "Bamileke" => "BML ",
+    "Bashkir" => "BSH ",
+    "Basque" => "EUQ ",
+    "Baule" => "BAU ",
+    "Belarussian" => "BEL ",
+    "Bemba" => "BEM ",
+    "Bench" => "BCH ",
+    "Bengali" => "BEN ",
+    "Berber" => "BBR ",
+    "Beti" => "BTI ",
+    "Bhili" => "BHI ",
+    "Bhojpuri" => "BHO ",
+    "Bible Cree" => "BCR ",
+    "Bikol" => "BIK ",
+    "Bilen" => "BIL ",
+    "Blackfoot" => "BKF ",
+    "Bosnian" => "BOS ",
+    "Brahui" => "BRH ",
+    "Braj Bhasha" => "BRI ",
+    "Breton" => "BRE ",
+    "Bulgarian" => "BGR ",
+    "Burmese" => "BRM ",
+    "Carrier" => "CRR ",
+    "Catalan" => "CAT ",
+    "Cebuano" => "CEB ",
+    "Chaha Gurage" => "CHG ",
+    "Chattisgarhi" => "CHH ",
+    "Chechen" => "CHE ",
+    "Cherokee" => "CHR ",
+    "Chichewa" => "CHI ",
+    "Chin" => "QIN ",
+    "Chinese Hong Kong" => "ZHH ",
+    "Chinese Phonetic" => "ZHP ",
+    "Chinese Simplified" => "ZHS ",
+    "Chinese Traditional" => "ZHT ",
+    "Chipewyan" => "CHP ",
+    "Chukchi" => "CHK ",
+    "Church Slavonic" => "CSL ",
+    "Chuvash" => "CHU ",
+    "Comorian" => "CMR ",
+    "Coptic" => "COP ",
+    "Corsican" => "COS ",
+    "Cree" => "CRE ",
+    "Crimean Tatar" => "CRT ",
+    "Croatian" => "HRV ",
+    "Czech" => "CSY ",
+    "Dangme" => "DNG ",
+    "Danish" => "DAN ",
+    "Dargwa" => "DAR ",
+    "Dari" => "DRI ",
+    "Default" => "dflt",
+    "Dhivehi (OBSOLETE)" => "DHV ",
+    "Dhivehi" => "DIV ",
+    "Dinka" => "DNK ",
+    "Djerma" => "DJR ",
+    "Dogri" => "DGR ",
+    "Dungan" => "DUN ",
+    "Dutch" => "NLD ",
+    "Dzongkha" => "DZN ",
+    "Eastern Cree" => "ECR ",
+    "Ebira" => "EBI ",
+    "Edo" => "EDO ",
+    "Efik" => "EFI ",
+    "English" => "ENG ",
+    "Erzya" => "ERZ ",
+    "Esperanto" => "NTO ",
+    "Estonian" => "ETI ",
+    "Even" => "EVN ",
+    "Evenki" => "EVK ",
+    "Ewe" => "EWE ",
+    "Faroese" => "FOS ",
+    "Farsi" => "FAR ",
+    "Fijian" => "FJI ",
+    "Filipino" => "PIL ",
+    "Finnish" => "FIN ",
+    "Flemish" => "FLE ",
+    "Fon" => "FON ",
+    "Forest Nenets" => "FNE ",
+    "French Antillean" => "FAN ",
+    "French" => "FRA ",
+    "Frisian" => "FRI ",
+    "Friulian" => "FRL ",
+    "Fulani" => "FUL ",
+    "Futa" => "FTA ",
+    "Ga" => "GAD ",
+    "Gaelic" => "GAE ",
+    "Gagauz" => "GAG ",
+    "Galician" => "GAL ",
+    "Garhwali" => "GAW ",
+    "Garo" => "GRO ",
+    "Garshuni" => "GAR ",
+    "Ge'ez" => "GEZ ",
+    "Georgian" => "KAT ",
+    "German" => "DEU ",
+    "Gilyak" => "GIL ",
+    "Gondi" => "GON ",
+    "Greek" => "ELL ",
+    "Greenlandic" => "GRN ",
+    "Guarani" => "GUA ",
+    "Gujarati" => "GUJ ",
+    "Gumuz" => "GMZ ",
+    "Haitian" => "HAI ",
+    "Halam" => "HAL ",
+    "Hammer-Banna" => "HBN ",
+    "Harari" => "HRI ",
+    "Harauti" => "HAR ",
+    "Hausa" => "HAU ",
+    "Hawaiin" => "HAW ",
+    "Hebrew" => "IWR ",
+    "High Mari" => "HMA ",
+    "Hiligaynon" => "HIL ",
+    "Hindi" => "HIN ",
+    "Hindko" => "HND ",
+    "Ho" => "HO  ",
+    "Hungarian" => "HUN ",
+    "Icelandic" => "ISL ",
+    "Igbo" => "IBO ",
+    "Ijo" => "IJO ",
+    "Ilokano" => "ILO ",
+    "Inari Sami" => "ISM ",
+    "Indonesian" => "IND ",
+    "Ingush" => "ING ",
+    "Inuktitut" => "INU ",
+    "Irish Traditional" => "IRT ",
+    "Irish" => "IRI ",
+    "Italian" => "ITA ",
+    "Japanese" => "JAN ",
+    "Javanese" => "JAV ",
+    "Judezmo" => "JUD ",
+    "Jula" => "JUL ",
+    "Kabardian" => "KAB ",
+    "Kachchi" => "KAC ",
+    "Kalenjin" => "KAL ",
+    "Kalmyk" => "KLM ",
+    "Kamba" => "KMB ",
+    "Kannada" => "KAN ",
+    "Kanuri" => "KNR ",
+    "Karachay" => "KAR ",
+    "Karaim" => "KRM ",
+    "Karakalpak" => "KRK ",
+    "Karelian" => "KRL ",
+    "Karen" => "KRN ",
+    "Kashmiri" => "KSH ",
+    "Kazakh" => "KAZ ",
+    "Kebena" => "KEB ",
+    "Khakass" => "KHA ",
+    "Khanty-Kazim" => "KHK ",
+    "Khanty-Shurishkar" => "KHS ",
+    "Khanty-Vakhi" => "KHV ",
+    "Khasi" => "KSI ",
+    "Khmer" => "KHM ",
+    "Khowar" => "KHW ",
+    "Khutsuri Georgian" => "KGE ",
+    "Kikongo" => "KON ",
+    "Kikuyu" => "KIK ",
+    "Kildin Sami" => "KSM ",
+    "Kirghiz" => "KIR ",
+    "Kisii" => "KIS ",
+    "Kodagu" => "KOD ",
+    "Kokni" => "KKN ",
+    "Komi-Permyak" => "KOP ",
+    "Komi-Zyrian" => "KOZ ",
+    "Komo" => "KMO ",
+    "Komso" => "KMS ",
+    "Konkani" => "KOK ",
+    "Koorete" => "KRT ",
+    "Korean Old Hangul" => "KOH ",
+    "Korean" => "KOR ",
+    "Koryak" => "KYK ",
+    "Kpelle" => "KPL ",
+    "Krio" => "KRI ",
+    "Kui" => "KUI ",
+    "Kulvi" => "KUL ",
+    "Kumaoni" => "KMN ",
+    "Kumyk" => "KUM ",
+    "Kurdish" => "KUR ",
+    "Kurukh" => "KUU ",
+    "Kuy" => "KUY ",
+    "L-Cree" => "LCR ",
+    "Ladakhi" => "LDK ",
+    "Ladin" => "LAD ",
+    "Lahuli" => "LAH ",
+    "Lak" => "LAK ",
+    "Lambani" => "LAM ",
+    "Lao" => "LAO ",
+    "Latin" => "LAT ",
+    "Latvian" => "LVI ",
+    "Laz" => "LAZ ",
+    "Lezgi" => "LEZ ",
+    "Limbu" => "LMB ",
+    "Lingala" => "LIN ",
+    "Lithuanian" => "LTH ",
+    "Lomwe" => "LMW ",
+    "Low Mari" => "LMA ",
+    "Lower Sorbian" => "LSB ",
+    "Luba" => "LUB ",
+    "Luganda" => "LUG ",
+    "Luhya" => "LUH ",
+    "Lule Sami" => "LSM ",
+    "Luo" => "LUO ",
+    "Luxembourgish" => "LTZ ",
+    "Macedonian" => "MKD ",
+    "Maithili" => "MTH ",
+    "Majang" => "MAJ ",
+    "Makua" => "MAK ",
+    "Malagasy" => "MLG ",
+    "Malay" => "MLY ",
+    "Malayalam Reformed" => "MLR ",
+    "Malayalam Traditional" => "MAL ",
+    "Male" => "MLE ",
+    "Malinke" => "MLN ",
+    "Maltese" => "MTS ",
+    "Manchu" => "MCH ",
+    "Mandinka" => "MND ",
+    "Maninka" => "MNK ",
+    "Manipuri" => "MNI ",
+    "Mansi" => "MAN ",
+    "Manx Gaelic" => "MNX ",
+    "Maori" => "MRI ",
+    "Mapudungun" => "MAP ",
+    "Marathi" => "MAR ",
+    "Marwari" => "MAW ",
+    "Mbundu" => "MBN ",
+    "Me'en" => "MEN ",
+    "Mende" => "MDE ",
+    "Mizo" => "MIZ ",
+    "Mohawk" => "MOH ",
+    "Moksha" => "MOK ",
+    "Moldavian" => "MOL ",
+    "Mon" => "MON ",
+    "Mongolian" => "MNG ",
+    "Moose Cree" => "MCR ",
+    "Moroccan" => "MOR ",
+    "Mundari" => "MUN ",
+    "N'Ko" => "NKO ",
+    "N-Cree" => "NCR ",
+    "Naga-Assamese" => "NAG ",
+    "Nagari" => "NGR ",
+    "Nanai" => "NAN ",
+    "Naskapi" => "NAS ",
+    "Ndebele" => "NDB ",
+    "Ndonga" => "NDG ",
+    "Nepali" => "NEP ",
+    "Newari" => "NEW ",
+    "Nisi" => "NIS ",
+    "Niuean" => "NIU ",
+    "Nkole" => "NKL ",
+    "Nogai" => "NOG ",
+    "Northern Sami" => "NSM ",
+    "Northern Tai" => "NTA ",
+    "Norway House Cree" => "NHC ",
+    "Norwegian" => "NOR ",
+    "Nynorsk" => "NYN ",
+    "Occitan" => "OCI ",
+    "Oji-Cree" => "OCR ",
+    "Ojibway" => "OJB ",
+    "Oriya" => "ORI ",
+    "Oromo" => "ORO ",
+    "Ossetian" => "OSS ",
+    "Palaung" => "PLG ",
+    "Palestinian Aramaic" => "PAA ",
+    "Pali" => "PAL ",
+    "Palpa" => "PAP ",
+    "Pashto" => "PAS ",
+    "Polish" => "PLK ",
+    "Polytonic Greek" => "PGR ",
+    "Portuguese" => "PTG ",
+    "Provencal" => "PRO ",
+    "Punjabi" => "PAN ",
+    "R-Cree" => "RCR ",
+    "Rajasthani" => "RAJ ",
+    "Rhaeto-Romanic" => "RMS ",
+    "Riang" => "RIA ",
+    "Romanian" => "ROM ",
+    "Romany" => "ROY ",
+    "Ruanda" => "RUA ",
+    "Russian Buriat" => "RBU ",
+    "Russian" => "RUS ",
+    "Rusyn" => "RSY ",
+    "Sadri" => "SAD ",
+    "Samoan" => "SMO ",
+    "Sango" => "SGO ",
+    "Sanskrit" => "SAN ",
+    "Santali" => "SAT ",
+    "Saraiki" => "SRK ",
+    "Sayisi" => "SAY ",
+    "Sekota" => "SEK ",
+    "Selkup" => "SEL ",
+    "Sena" => "SNA ",
+    "Serbian" => "SRB ",
+    "Serer" => "SRR ",
+    "Shan" => "SHN ",
+    "Sibe" => "SIB ",
+    "Sidamo" => "SID ",
+    "Silte Gurage" => "SIG ",
+    "Sindhi" => "SND ",
+    "Sinhalese" => "SNH ",
+    "Skolt Sami" => "SKS ",
+    "Slavey" => "SLA ",
+    "Slovak" => "SKY ",
+    "Slovenian" => "SLV ",
+    "Sodo Gurage" => "SOG ",
+    "Somali" => "SML ",
+    "Soninke" => "SNK ",
+    "Sotho" => "SOT ",
+    "South Slavey" => "SSL ",
+    "Southern Sami" => "SSM ",
+    "Spanish" => "ESP ",
+    "Suri" => "SUR ",
+    "Sutu" => "SXT ",
+    "Svan" => "SVA ",
+    "Swadaya Aramaic" => "SWA ",
+    "Swahili" => "SWK ",
+    "Swazi" => "SWZ ",
+    "Swedish" => "SVE ",
+    "Syriac" => "SYR ",
+    "TH-Cree" => "TCR ",
+    "Tabasaran" => "TAB ",
+    "Tahitian" => "THT ",
+    "Tai Lue" => "XBD ",
+    "Tajiki" => "TAJ ",
+    "Tamil" => "TAM ",
+    "Tatar" => "TAT ",
+    "Telugu" => "TEL ",
+    "Temne" => "TMN ",
+    "Thai" => "THA ",
+    "Tibetan" => "TIB ",
+    "Tigre" => "TGR ",
+    "Tigrinya" => "TGY ",
+    "Todo" => "TOD ",
+    "Tonga" => "TNG ",
+    "Tongan" => "TGN ",
+    "Tsonga" => "TSG ",
+    "Tswana" => "TNA ",
+    "Tulu" => "TUL ",
+    "Tundra Nenets" => "TNE ",
+    "Turkish" => "TRK ",
+    "Turkmen" => "TKM ",
+    "Turoyo Aramaic" => "TUA ",
+    "Tuvin" => "TUV ",
+    "Twi" => "TWI ",
+    "Udmurt" => "UDM ",
+    "Ukrainian" => "UKR ",
+    "Upper Sorbian" => "USB ",
+    "Urdu" => "URD ",
+    "Uyghur" => "UYG ",
+    "Uzbek" => "UZB ",
+    "Venda" => "VEN ",
+    "Vietnamese" => "VIT ",
+    "Wa" => "WA  ",
+    "Wagdi" => "WAG ",
+    "Welsh" => "WEL ",
+    "West-Cree" => "WCR ",
+    "Wolof" => "WLF ",
+    "Woods Cree" => "DCR ",
+    "Xhosa" => "XHS ",
+    "Y-Cree" => "YCR ",
+    "Yakut" => "YAK ",
+    "Yi Classic" => "YIC ",
+    "Yi Modern" => "YIM ",
+    "Yiddish" => "JII ",
+    "Yoruba" => "YBA ",
+    "Zande" => "ZND ",
+    "Zulu" => "ZUL ",
+    },
+
+'FEATURE' => {
+    "Above-Base Forms" => "abvf",
+    "Above-Base Mark Positioning" => "abvm",
+    "Above-Base Substitutions" => "abvs",
+    "Access All Alternates" => "aalt",
+    "Akhands" => "akhn",
+    "Alternate Annotation Forms" => "nalt",
+    "Alternate Half Widths" => "halt",
+    "Alternate Vertical Half Metrics" => "vhal",
+    "Alternate Vertical Metrics" => "valt",
+    "Alternative Fractions" => "afrc",
+    "Below-Base Forms" => "blwf",
+    "Below-Base Mark Positioning" => "blwm",
+    "Below-Base Substitutions" => "blws",
+    "Capital Spacing" => "cpsp",
+    "Case-Sensitive Forms" => "case",
+    "Centered CJK Punctuation" => "cpct",
+    "Conjunct Forms After Ro" => "cfar",
+    "Conjunct Forms" => "cjct",
+    "Contextual Alternates" => "calt",
+    "Contextual Ligatures" => "clig",
+    "Contextual Swash" => "cswh",
+    "Cursive Positioning" => "curs",
+    "Default Processing" => "dflt",
+    "Denominators" => "dnom",
+    "Diphthongs (OBSOLETE)" => "dpng",
+    "Discretionary Ligatures" => "dlig",
+    "Distances" => "dist",
+    "Expert Forms" => "expt",
+    "Final Glyph On Line Alternates" => "falt",
+    "Fractions" => "frac",
+    "Full Widths" => "fwid",
+    "Glyph Composition/Decomposition" => "ccmp",
+    "Halant Forms" => "haln",
+    "Half Forms" => "half",
+    "Half Widths" => "hwid",
+    "Hangul" => "hngl",
+    "Historical Forms" => "hist",
+    "Historical Ligatures" => "hlig",
+    "Hojo (JIS X 0212-1990) Kanji Forms" => "hojo",
+    "Horizontal Kana Alternates" => "hkna",
+    "Initial Forms" => "init",
+    "Isolated Forms" => "isol",
+    "Italics" => "ital",
+    "JIS2004 Forms" => "jp04",
+    "JIS78 Forms" => "jp78",
+    "JIS83 Forms" => "jp83",
+    "JIS90 Forms" => "jp90",
+    "Justification Alternates" => "jalt",
+    "Kerning" => "kern",
+    "Leading Jamo Forms" => "ljmo",
+    "Left Bounds" => "lfbd",
+    "Lining Figures" => "lnum",
+    "Localized Forms" => "locl",
+    "Mark Positioning via Substitution" => "mset",
+    "Mark Positioning" => "mark",
+    "Mark to Mark Positioning" => "mkmk",
+    "Mathematical Greek" => "mgrk",
+    "Medial Forms #2" => "med2",
+    "Medial Forms" => "medi",
+    "NLC Kanji Forms" => "nlck",
+    "Nukta Forms" => "nukt",
+    "Numerators" => "numr",
+    "Oldstyle Figures" => "onum",
+    "Optical Bounds" => "opbd",
+    "Optical Size" => "size",
+    "Ordinals" => "ordn",
+    "Ornaments" => "ornm",
+    "Petite Capitals From Capitals" => "c2pc",
+    "Petite Capitals" => "pcap",
+    "Post-base Forms" => "pstf",
+    "Post-base Substitutions" => "psts",
+    "Pre-base Forms" => "pref",
+    "Pre-base Substitutions" => "pres",
+    "Proportional Alternate Vertical Metrics" => "vpal",
+    "Proportional Alternate Widths" => "palt",
+    "Proportional Figures" => "pnum",
+    "Proportional Kana" => "pkna",
+    "Proportional Widths" => "pwid",
+    "Quarter Widths" => "qwid",
+    "Rakar Forms" => "rkrf",
+    "Randomize" => "rand",
+    "Reph Forms" => "rphf",
+    "Required Ligatures" => "rlig",
+    "Right Bounds" => "rtbd",
+    "Right-To-Left Alternates" => "rtla",
+    "Ruby Notation Forms" => "ruby",
+    "Scientific Inferiors" => "sinf",
+    "Simplified Forms" => "smpl",
+    "Slashed Zero" => "zero",
+    "Small Capitals From Capitals" => "c2sc",
+    "Small Capitals" => "smcp",
+    "Standard Ligatures" => "liga",
+    "Stylistic Alternates" => "salt",
+    "Stylistic Set 1" => "ss01",
+    "Stylistic Set 10" => "ss10",
+    "Stylistic Set 11" => "ss11",
+    "Stylistic Set 12" => "ss12",
+    "Stylistic Set 13" => "ss13",
+    "Stylistic Set 14" => "ss14",
+    "Stylistic Set 15" => "ss15",
+    "Stylistic Set 16" => "ss16",
+    "Stylistic Set 17" => "ss17",
+    "Stylistic Set 18" => "ss18",
+    "Stylistic Set 19" => "ss19",
+    "Stylistic Set 2" => "ss02",
+    "Stylistic Set 20" => "ss20",
+    "Stylistic Set 3" => "ss03",
+    "Stylistic Set 4" => "ss04",
+    "Stylistic Set 5" => "ss05",
+    "Stylistic Set 6" => "ss06",
+    "Stylistic Set 7" => "ss07",
+    "Stylistic Set 8" => "ss08",
+    "Stylistic Set 9" => "ss09",
+    "Subscript" => "subs",
+    "Superscript" => "sups",
+    "Swash" => "swsh",
+    "Tabular Figures" => "tnum",
+    "Terminal Forms #2" => "fin2",
+    "Terminal Forms #3" => "fin3",
+    "Terminal Forms" => "fina",
+    "Third Widths" => "twid",
+    "Titling" => "titl",
+    "Traditional Forms" => "trad",
+    "Traditional Name Forms" => "tnam",
+    "Trailing Jamo Forms" => "tjmo",
+    "Unicase" => "unic",
+    "Vattu Variants" => "vatu",
+    "Vertical Alternates and Rotation" => "vrt2",
+    "Vertical Kana Alternates" => "vkna",
+    "Vertical Kerning" => "vkrn",
+    "Vertical Writing" => "vert",
+    "Vowel Jamo Forms" => "vjmo",
+    }
+);
+
+{
+    foreach my $s (qw ( SCRIPT LANGUAGE FEATURE ) )
+    {
+        map { $ttnames{$s}{$tttags{$s}{$_}} = $_ }  keys %{$tttags{$s}};
+    }
+}
+
+
+=head2 readtagsfile ( filename )
+
+Read a file in the syntax of Tags.txt (included with Microsoft VOLT) to obtain additional/replacement tag definitions.
+
+Returns 0 if can't open the file; else 1.
+
+=cut
+
+sub readtagsfile
+{
+    my $fname = shift;
+    open (TAGS, $fname) or return 0;
+       my ($what, $name, $tag);
+       while (<TAGS>)
+       {
+               ($what, $name, $tag) = (m/"([^"]*)", "([^"]*)", "([^"]*)"/);  #"
+               $ttnames{$what}{$tag} = $name;
+               $tttags{$what}{$name} = $tag;
+       }
+       close TAGS;
+    return 1;  
+}
+
+
+
+1;