using System; using System.Collections.Generic; using System.Drawing; using System.Globalization; using System.IO; using System.Linq; using System.Runtime.InteropServices; using System.Text; namespace HotelPms.Share.Windows.Report { #pragma warning disable CS0649 public class TrueFontFactory { [StructLayout(LayoutKind.Sequential, Pack = 0x1)] struct TT_OFFSET_TABLE { public ushort uMajorVersion; public ushort uMinorVersion; public ushort uNumOfTables; public ushort uSearchRange; public ushort uEntrySelector; public ushort uRangeShift; } [StructLayout(LayoutKind.Sequential, Pack = 0x1)] struct TT_TABLE_DIRECTORY { public char szTag1; public char szTag2; public char szTag3; public char szTag4; public uint uCheckSum; //Check sum public uint uOffset; //Offset from beginning of file public uint uLength; //length of the table in bytes } [StructLayout(LayoutKind.Sequential, Pack = 0x1)] struct TT_NAME_TABLE_HEADER { public ushort uFSelector; public ushort uNRCount; public ushort uStorageOffset; } [StructLayout(LayoutKind.Sequential, Pack = 0x1)] struct TT_NAME_RECORD { public ushort uPlatformID; public ushort uEncodingID; public ushort uLanguageID; public ushort uNameID; public ushort uStringLength; public ushort uStringOffset; } private static TT_OFFSET_TABLE ttOffsetTable; private static TT_TABLE_DIRECTORY tblDir; private static TT_NAME_TABLE_HEADER ttNTHeader; private static TT_NAME_RECORD ttNMRecord; public static string GetEngName(string fontName) { ////InstalledFontCollectionオブジェクトの取得 //System.Drawing.Text.InstalledFontCollection InstalledFont = new System.Drawing.Text.InstalledFontCollection(); ////インストール済みフォントを取得してコンボボックスに表示する //FontFamily[] FontFamilies = InstalledFont.Families; //foreach (FontFamily f in FontFamilies) //{ // string fontName = f.GetName(CultureInfo.GetCultureInfo("en-us").LCID); // string aa = fontName + ".ttf"; // System.Diagnostics.Debug.WriteLine(f.Name + ":" + aa); //} FontFamily msp = new FontFamily(fontName); return msp.GetName(CultureInfo.GetCultureInfo("en-us").LCID); } /// /// 例:MS UI Gothic ⇒ C:\\WINDOWS\\Fonts\\msgothic.ttc,1 /// /// /// filename,index public static string GetFontFile(string fontName) { string root = Environment.GetFolderPath(Environment.SpecialFolder.Fonts); string item = string.Empty; string engName = GetEngName(fontName); #region FontName(English) ⇒ FileName,Index switch (engName) { case "Agency FB": item = "AGENCYB.TTF,0"; break; case "Algerian": item = "ALGER.TTF,0"; break; case "Book Antiqua": item = "ANTQUAB.TTF,0"; break; case "Arial": item = "arial.ttf,0"; break; case "Arial Narrow": item = "ARIALN.TTF,0"; break; case "Arial Unicode MS": item = "ARIALUNI.TTF,0"; break; case "Arial Black": item = "ariblk.ttf,0"; break; case "Arial Rounded MT Bold": item = "ARLRDBD.TTF,0"; break; case "Baskerville Old Face": item = "BASKVILL.TTF,0"; break; case "Bauhaus 93": item = "BAUHS93.TTF,0"; break; case "Bell MT": item = "BELL.TTF,0"; break; case "Bernard MT Condensed": item = "BERNHC.TTF,0"; break; case "Bodoni MT": item = "BOD_B.TTF,0"; break; case "Bodoni MT Black": item = "BOD_BLAI.TTF,0"; break; case "Bodoni MT Condensed": item = "BOD_CB.TTF,0"; break; case "Bodoni MT Poster Compressed": item = "BOD_PSTC.TTF,0"; break; case "Bookman Old Style": item = "BOOKOS.TTF,0"; break; case "Bradley Hand ITC": item = "BRADHITC.TTF,0"; break; case "Britannic Bold": item = "BRITANIC.TTF,0"; break; case "Berlin Sans FB": item = "BRLNSB.TTF,0"; break; case "Berlin Sans FB Demi": item = "BRLNSDB.TTF,0"; break; case "Broadway": item = "BROADW.TTF,0"; break; case "Brush Script MT": item = "BRUSHSCI.TTF,0"; break; case "Bookshelf Symbol 7": item = "BSSYM7.TTF,0"; break; case "Buxton Sketch": item = "BuxtonSketch.ttf,0"; break; case "Calibri": item = "calibri.ttf,0"; break; case "Calibri Light": item = "calibril.ttf,0"; break; case "Californian FB": item = "CALIFB.TTF,0"; break; case "Calisto MT": item = "CALIST.TTF,0"; break; case "Cambria": item = "cambria.ttc,0"; break; case "Cambria Math": item = "cambria.ttc,1"; break; case "Candara": item = "Candara.ttf,0"; break; case "Castellar": item = "CASTELAR.TTF,0"; break; case "Century Schoolbook": item = "CENSCBK.TTF,0"; break; case "Centaur": item = "CENTAUR.TTF,0"; break; case "Century": item = "CENTURY.TTF,0"; break; case "Chiller": item = "CHILLER.TTF,0"; break; case "Colonna MT": item = "COLONNA.TTF,0"; break; case "Comic Sans MS": item = "comic.ttf,0"; break; case "Consolas": item = "consola.ttf,0"; break; case "Constantia": item = "constan.ttf,0"; break; case "Cooper Black": item = "COOPBL.TTF,0"; break; case "Copperplate Gothic Bold": item = "COPRGTB.TTF,0"; break; case "Copperplate Gothic Light": item = "COPRGTL.TTF,0"; break; case "Corbel": item = "corbel.ttf,0"; break; case "Courier New": item = "cour.ttf,0"; break; case "Curlz MT": item = "CURLZ___.TTF,0"; break; case "DengXian": item = "Deng.ttf,0"; break; case "DengXian Light": item = "Dengl.ttf,0"; break; case "Ebrima": item = "ebrima.ttf,0"; break; case "Elephant": item = "ELEPHNT.TTF,0"; break; case "Engravers MT": item = "ENGR.TTF,0"; break; case "Eras Bold ITC": item = "ERASBD.TTF,0"; break; case "Eras Demi ITC": item = "ERASDEMI.TTF,0"; break; case "Eras Light ITC": item = "ERASLGHT.TTF,0"; break; case "Eras Medium ITC": item = "ERASMD.TTF,0"; break; case "Felix Titling": item = "FELIXTI.TTF,0"; break; case "Forte": item = "FORTE.TTF,0"; break; case "Franklin Gothic Book": item = "FRABK.TTF,0"; break; case "Franklin Gothic Demi": item = "FRADM.TTF,0"; break; case "Franklin Gothic Demi Cond": item = "FRADMCN.TTF,0"; break; case "Franklin Gothic Heavy": item = "FRAHV.TTF,0"; break; case "Franklin Gothic Medium": item = "framd.ttf,0"; break; case "Franklin Gothic Medium Cond": item = "FRAMDCN.TTF,0"; break; case "Freestyle Script": item = "FREESCPT.TTF,0"; break; case "French Script MT": item = "FRSCRIPT.TTF,0"; break; case "Footlight MT Light": item = "FTLTLT.TTF,0"; break; case "FZLanTingHeiS-UL-GB": item = "FZLTCXHJW.TTF,0"; break; case "Gabriola": item = "Gabriola.ttf,0"; break; case "Gadugi": item = "gadugi.ttf,0"; break; case "Garamond": item = "GARA.TTF,0"; break; case "Georgia": item = "georgia.ttf,0"; break; case "Gigi": item = "GIGI.TTF,0"; break; case "Gill Sans MT": item = "GILBI___.TTF,0"; break; case "Gill Sans MT Condensed": item = "GILC____.TTF,0"; break; case "Gill Sans Ultra Bold Condensed": item = "GILLUBCD.TTF,0"; break; case "Gill Sans Ultra Bold": item = "GILSANUB.TTF,0"; break; case "Gloucester MT Extra Condensed": item = "GLECB.TTF,0"; break; case "Gill Sans MT Ext Condensed Bold": item = "GLSNECB.TTF,0"; break; case "Century Gothic": item = "GOTHIC.TTF,0"; break; case "Goudy Old Style": item = "GOUDOS.TTF,0"; break; case "Goudy Stout": item = "GOUDYSTO.TTF,0"; break; case "Harlow Solid Italic": item = "HARLOWSI.TTF,0"; break; case "Harrington": item = "HARNGTON.TTF,0"; break; case "Haettenschweiler": item = "HATTEN.TTF,0"; break; case "HGGothicE": item = "HGRGE.TTC,0"; break; case "HGPGothicE": item = "HGRGE.TTC,1"; break; case "HGSGothicE": item = "HGRGE.TTC,2"; break; case "HGGothicM": item = "HGRGM.TTC,0"; break; case "HGPGothicM": item = "HGRGM.TTC,1"; break; case "HGSGothicM": item = "HGRGM.TTC,2"; break; case "HGGyoshotai": item = "HGRGY.TTC,0"; break; case "HGPGyoshotai": item = "HGRGY.TTC,1"; break; case "HGSGyoshotai": item = "HGRGY.TTC,2"; break; case "HGKyokashotai": item = "HGRKK.TTC,0"; break; case "HGPKyokashotai": item = "HGRKK.TTC,1"; break; case "HGSKyokashotai": item = "HGRKK.TTC,2"; break; case "HGMinchoB": item = "HGRMB.TTC,0"; break; case "HGPMinchoB": item = "HGRMB.TTC,1"; break; case "HGSMinchoB": item = "HGRMB.TTC,2"; break; case "HGMinchoE": item = "HGRME.TTC,0"; break; case "HGPMinchoE": item = "HGRME.TTC,1"; break; case "HGSMinchoE": item = "HGRME.TTC,2"; break; case "HGSoeiKakupoptai": item = "HGRPP1.TTC,0"; break; case "HGPSoeiKakupoptai": item = "HGRPP1.TTC,1"; break; case "HGSSoeiKakupoptai": item = "HGRPP1.TTC,2"; break; case "HGSoeiPresenceEB": item = "HGRPRE.TTC,0"; break; case "HGPSoeiPresenceEB": item = "HGRPRE.TTC,1"; break; case "HGSSoeiPresenceEB": item = "HGRPRE.TTC,2"; break; case "HGSoeiKakugothicUB": item = "HGRSGU.TTC,0"; break; case "HGPSoeiKakugothicUB": item = "HGRSGU.TTC,1"; break; case "HGSSoeiKakugothicUB": item = "HGRSGU.TTC,2"; break; case "HGSeikaishotaiPRO": item = "HGRSKP.TTF,0"; break; case "HGMaruGothicMPRO": item = "HGRSMP.TTF,0"; break; case "Microsoft Himalaya": item = "himalaya.ttf,0"; break; case "High Tower Text": item = "HTOWERT.TTF,0"; break; case "Impact": item = "impact.ttf,0"; break; case "Imprint MT Shadow": item = "IMPRISHA.TTF,0"; break; case "Informal Roman": item = "INFROMAN.TTF,0"; break; case "Blackadder ITC": item = "ITCBLKAD.TTF,0"; break; case "Edwardian Script ITC": item = "ITCEDSCR.TTF,0"; break; case "Kristen ITC": item = "ITCKRIST.TTF,0"; break; case "Javanese Text": item = "javatext.ttf,0"; break; case "Jokerman": item = "JOKERMAN.TTF,0"; break; case "Juice ITC": item = "JUICE___.TTF,0"; break; case "Kunstler Script": item = "KUNSTLER.TTF,0"; break; case "Wide Latin": item = "LATINWD.TTF,0"; break; case "Lucida Bright": item = "LBRITE.TTF,0"; break; case "Lucida Calligraphy": item = "LCALLIG.TTF,0"; break; case "Leelawadee UI": item = "LeelaUIb.ttf,0"; break; case "Leelawadee UI Semilight": item = "LeelUIsl.ttf,0"; break; case "Lucida Fax": item = "LFAX.TTF,0"; break; case "Lucida Handwriting": item = "LHANDW.TTF,0"; break; case "Lucida Sans": item = "LSANS.TTF,0"; break; case "Lucida Sans Typewriter": item = "LTYPE.TTF,0"; break; case "Lucida Console": item = "lucon.ttf,0"; break; case "Lucida Sans Unicode": item = "l_10646.ttf,0"; break; case "Magneto": item = "MAGNETOB.TTF,0"; break; case "Maiandra GD": item = "MAIAN.TTF,0"; break; case "Malgun Gothic": item = "malgun.ttf,0"; break; case "Malgun Gothic Semilight": item = "malgunsl.ttf,0"; break; case "Marlett": item = "marlett.ttf,0"; break; case "Matura MT Script Capitals": item = "MATURASC.TTF,0"; break; case "Meiryo": item = "meiryo.ttc,0"; break; case "Meiryo UI": item = "meiryo.ttc,2"; break; case "Microsoft Sans Serif": item = "micross.ttf,0"; break; case "MingLiU-ExtB": item = "mingliub.ttc,0"; break; case "PMingLiU-ExtB": item = "mingliub.ttc,1"; break; case "MingLiU_HKSCS-ExtB": item = "mingliub.ttc,2"; break; case "Mistral": item = "MISTRAL.TTF,0"; break; case "Myanmar Text": item = "mmrtext.ttf,0"; break; case "Modern No. 20": item = "MOD20.TTF,0"; break; case "Mongolian Baiti": item = "monbaiti.ttf,0"; break; case "MS Gothic": item = "msgothic.ttc,0"; break; case "MS UI Gothic": item = "msgothic.ttc,1"; break; case "MS PGothic": item = "msgothic.ttc,2"; break; case "微軟正黑體": item = "msjh.ttc,0"; break; case "Microsoft JhengHei UI": item = "msjh.ttc,1"; break; case "微軟正黑體 Light": item = "msjhl.ttc,0"; break; case "Microsoft JhengHei UI Light": item = "msjhl.ttc,1"; break; case "Microsoft MHei": item = "MSMHei-Bold.ttf,0"; break; case "MS Mincho": item = "msmincho.ttc,0"; break; case "MS PMincho": item = "msmincho.ttc,1"; break; case "Microsoft NeoGothic": item = "MSNeoGothic-Bold.ttf,0"; break; case "Microsoft YaHei": item = "msyh.ttc,0"; break; case "Microsoft YaHei UI": item = "msyh.ttc,1"; break; case "Microsoft YaHei Light": item = "msyhl.ttc,0"; break; case "Microsoft YaHei UI Light": item = "msyhl.ttc,1"; break; case "Microsoft Yi Baiti": item = "msyi.ttf,0"; break; case "Monotype Corsiva": item = "MTCORSVA.TTF,0"; break; case "MV Boli": item = "mvboli.ttf,0"; break; case "Niagara Engraved": item = "NIAGENG.TTF,0"; break; case "Niagara Solid": item = "NIAGSOL.TTF,0"; break; case "Nina": item = "nina.ttf,0"; break; case "Nirmala UI": item = "Nirmala.ttf,0"; break; case "Nirmala UI Semilight": item = "NirmalaS.ttf,0"; break; case "Microsoft New Tai Lue": item = "ntailu.ttf,0"; break; case "OCR A Extended": item = "OCRAEXT.TTF,0"; break; case "OCRB": item = "OCRB.TTF,0"; break; case "OCR-B-10 BT": item = "OCRB10N.TTF,0"; break; case "Old English Text MT": item = "OLDENGL.TTF,0"; break; case "Onyx": item = "ONYX.TTF,0"; break; case "MS Outlook": item = "OUTLOOK.TTF,0"; break; case "Palatino Linotype": item = "pala.ttf,0"; break; case "Palace Script MT": item = "PALSCRI.TTF,0"; break; case "Papyrus": item = "PAPYRUS.TTF,0"; break; case "Parchment": item = "PARCHM.TTF,0"; break; case "Perpetua": item = "PERBI___.TTF,0"; break; case "Perpetua Titling MT": item = "PERTIBD.TTF,0"; break; case "Microsoft PhagsPa": item = "phagspa.ttf,0"; break; case "Playbill": item = "PLAYBILL.TTF,0"; break; case "Poor Richard": item = "POORICH.TTF,0"; break; case "Pristina": item = "PRISTINA.TTF,0"; break; case "Rage Italic": item = "RAGE.TTF,0"; break; case "Ravie": item = "RAVIE.TTF,0"; break; case "MS Reference Sans Serif": item = "REFSAN.TTF,0"; break; case "MS Reference Specialty": item = "REFSPCL.TTF,0"; break; case "Rockwell Condensed": item = "ROCCB___.TTF,0"; break; case "Rockwell": item = "ROCK.TTF,0"; break; case "Rockwell Extra Bold": item = "ROCKEB.TTF,0"; break; case "Script MT Bold": item = "SCRIPTBL.TTF,0"; break; case "Segoe MDL2 Assets": item = "segmdl2.ttf,0"; break; case "Segoe Marker": item = "SegoeMarker.ttf,0"; break; case "Segoe Print": item = "segoepr.ttf,0"; break; case "Segoe Script": item = "segoesc.ttf,0"; break; case "Segoe UI": item = "segoeui.ttf,0"; break; case "Segoe UI Light": item = "segoeuil.ttf,0"; break; case "Segoe UI Semilight": item = "segoeuisl.ttf,0"; break; case "Segoe WP Black": item = "SegoeWP-Black.ttf,0"; break; case "Segoe WP": item = "SegoeWP-Bold.ttf,0"; break; case "Segoe WP Light": item = "SegoeWP-Light.ttf,0"; break; case "Segoe WP Semibold": item = "SegoeWP-Semibold.ttf,0"; break; case "Segoe WP SemiLight": item = "SegoeWP-Semilight.ttf,0"; break; case "Segoe UI Black": item = "seguibl.ttf,0"; break; case "Segoe UI Emoji": item = "seguiemj.ttf,0"; break; case "Segoe UI Historic": item = "seguihis.ttf,0"; break; case "Segoe UI Semibold": item = "seguisb.ttf,0"; break; case "Segoe UI Symbol": item = "seguisym.ttf,0"; break; case "Showcard Gothic": item = "SHOWG.TTF,0"; break; case "FangSong": item = "simfang.ttf,0"; break; case "SimHei": item = "simhei.ttf,0"; break; case "KaiTi": item = "simkai.ttf,0"; break; case "SimSun": item = "simsun.ttc,0"; break; case "NSimSun": item = "simsun.ttc,1"; break; case "SimSun-ExtB": item = "simsunb.ttf,0"; break; case "Sitka Small": item = "Sitka.ttc,0"; break; case "Sitka Text": item = "Sitka.ttc,1"; break; case "Sitka Subheading": item = "Sitka.ttc,2"; break; case "Sitka Heading": item = "Sitka.ttc,3"; break; case "Sitka Display": item = "Sitka.ttc,4"; break; case "Sitka Banner": item = "Sitka.ttc,5"; break; case "SketchFlow Print": item = "SketchFlow Print.ttf,0"; break; case "Snap ITC": item = "SNAP____.TTF,0"; break; case "Stencil": item = "STENCIL.TTF,0"; break; case "Sylfaen": item = "sylfaen.ttf,0"; break; case "Symbol": item = "symbol.ttf,0"; break; case "Tahoma": item = "tahoma.ttf,0"; break; case "Microsoft Tai Le": item = "taile.ttf,0"; break; case "Tw Cen MT": item = "TCBI____.TTF,0"; break; case "Tw Cen MT Condensed": item = "TCCB____.TTF,0"; break; case "Tw Cen MT Condensed Extra Bold": item = "TCCEB.TTF,0"; break; case "Tempus Sans ITC": item = "TEMPSITC.TTF,0"; break; case "Times New Roman": item = "times.ttf,0"; break; case "Trebuchet MS": item = "trebuc.ttf,0"; break; case "Verdana": item = "verdana.ttf,0"; break; case "Viner Hand ITC": item = "VINERITC.TTF,0"; break; case "Vivaldi": item = "VIVALDII.TTF,0"; break; case "Vladimir Script": item = "VLADIMIR.TTF,0"; break; case "Webdings": item = "webdings.ttf,0"; break; case "Wingdings": item = "wingding.ttf,0"; break; case "Wingdings 2": item = "WINGDNG2.TTF,0"; break; case "Wingdings 3": item = "WINGDNG3.TTF,0"; break; case "Yu Gothic": item = "YuGothB.ttc,0"; break; case "Yu Gothic UI": item = "YuGothB.ttc,1"; break; case "Yu Gothic UI Semibold": item = "YuGothB.ttc,2"; break; case "Yu Gothic Light": item = "YuGothL.ttc,0"; break; case "Yu Gothic UI Light": item = "YuGothL.ttc,1"; break; case "Yu Gothic Medium": item = "YuGothM.ttc,0"; break; case "Yu Gothic UI Semilight": item = "YuGothR.ttc,1"; break; case "Yu Mincho": item = "yumin.ttf,0"; break; case "Yu Mincho Demibold": item = "yumindb.ttf,0"; break; case "Yu Mincho Light": item = "yuminl.ttf,0"; break; } #endregion return root + Path.DirectorySeparatorChar + item; } /// /// FontName(English) ⇒ FileName,Index /// /// public static Dictionary GetFontFileDict() { Dictionary dict = new Dictionary(); string root = Environment.GetFolderPath(Environment.SpecialFolder.Fonts); string[] files = Directory.GetFiles(root); foreach(string item in files) { if ((item.ToLower(System.Globalization.CultureInfo.InvariantCulture).EndsWith(".ttf") || item.ToLower(System.Globalization.CultureInfo.InvariantCulture).EndsWith(".otf") || item.ToLower(System.Globalization.CultureInfo.InvariantCulture).EndsWith(".ttc"))) { List list = GetFontName(item); if (list == null) { continue; } for (int i = 0; i < list.Count; i++) { if (dict.ContainsKey(list[i])) { continue; } dict.Add(list[i], string.Format("{0},{1}", item, i)); //System.Diagnostics.Debug.WriteLine("case \"" + list[i] + "\":"); //System.Diagnostics.Debug.WriteLine(" item = \"" + string.Format("{0},{1}", Path.GetFileName(item), i) + "\";"); //System.Diagnostics.Debug.WriteLine(" break;"); } } } return dict; } public static List GetFontName(string file) { try { List list = new List(); bool isMulti = false; if (file.ToLower(System.Globalization.CultureInfo.InvariantCulture).EndsWith(".ttc")) { isMulti = true; } using (FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read)) { using (BinaryReader r = new BinaryReader(fs)) { List offsetList = new List(); if (isMulti) { byte[] buffH = r.ReadBytes(4); //ttcf buffH = r.ReadBytes(4); //Skip int dirCount = ReadInt(r.ReadBytes(4)); for (int i = 0; i < dirCount; i++) { offsetList.Add(ReadInt(r.ReadBytes(4))); } } else { offsetList.Add(0); } foreach (int directoryOffset in offsetList) { if (isMulti) { fs.Seek(directoryOffset, SeekOrigin.Begin); } byte[] buff = r.ReadBytes(Marshal.SizeOf(ttOffsetTable)); buff = BigEndian(buff); IntPtr ptr = Marshal.AllocHGlobal(buff.Length); Marshal.Copy(buff, 0x0, ptr, buff.Length); TT_OFFSET_TABLE ttResult = (TT_OFFSET_TABLE)Marshal.PtrToStructure(ptr, typeof(TT_OFFSET_TABLE)); Marshal.FreeHGlobal(ptr); //Must be maj =1 minor = 0 if (ttResult.uMajorVersion != 1 || ttResult.uMinorVersion != 0) { return null; } bool bFound = false; TT_TABLE_DIRECTORY tbName = new TT_TABLE_DIRECTORY(); for (int i = 0; i < ttResult.uNumOfTables; i++) { byte[] bNameTable = r.ReadBytes(Marshal.SizeOf(tblDir)); IntPtr ptrName = Marshal.AllocHGlobal(bNameTable.Length); Marshal.Copy(bNameTable, 0x0, ptrName, bNameTable.Length); tbName = (TT_TABLE_DIRECTORY)Marshal.PtrToStructure(ptrName, typeof(TT_TABLE_DIRECTORY)); Marshal.FreeHGlobal(ptrName); string szName = tbName.szTag1.ToString() + tbName.szTag2.ToString() + tbName.szTag3.ToString() + tbName.szTag4.ToString(); if (szName == null) { continue; } if (szName.ToString() != "name") { continue; } bFound = true; byte[] btLength = BitConverter.GetBytes(tbName.uLength); byte[] btOffset = BitConverter.GetBytes(tbName.uOffset); Array.Reverse(btLength); Array.Reverse(btOffset); tbName.uLength = BitConverter.ToUInt32(btLength, 0); tbName.uOffset = BitConverter.ToUInt32(btOffset, 0); break; } //名称取得 if (bFound) { AddName(list, fs, r, ref tbName); } } } } return list; } catch { return null; } } private static void AddName(List list, FileStream fs, BinaryReader r, ref TT_TABLE_DIRECTORY tbName) { fs.Position = tbName.uOffset; byte[] btNTHeader = r.ReadBytes(Marshal.SizeOf(ttNTHeader)); btNTHeader = BigEndian(btNTHeader); IntPtr ptrNTHeader = Marshal.AllocHGlobal(btNTHeader.Length); Marshal.Copy(btNTHeader, 0x0, ptrNTHeader, btNTHeader.Length); TT_NAME_TABLE_HEADER ttNTResult = (TT_NAME_TABLE_HEADER)Marshal.PtrToStructure(ptrNTHeader, typeof(TT_NAME_TABLE_HEADER)); Marshal.FreeHGlobal(ptrNTHeader); for (int i = 0; i < ttNTResult.uNRCount; i++) { byte[] btNMRecord = r.ReadBytes(Marshal.SizeOf(ttNMRecord)); btNMRecord = BigEndian(btNMRecord); IntPtr ptrNMRecord = Marshal.AllocHGlobal(btNMRecord.Length); Marshal.Copy(btNMRecord, 0x0, ptrNMRecord, btNMRecord.Length); TT_NAME_RECORD ttNMResult = (TT_NAME_RECORD)Marshal.PtrToStructure(ptrNMRecord, typeof(TT_NAME_RECORD)); Marshal.FreeHGlobal(ptrNMRecord); if (ttNMResult.uNameID == 1) { long fPos = fs.Position; fs.Position = tbName.uOffset + ttNMResult.uStringOffset + ttNTResult.uStorageOffset; byte[] szResult = r.ReadBytes(ttNMResult.uStringLength); if (szResult.Length != 0) { string name; if (ttNMResult.uPlatformID == 0 || ttNMResult.uPlatformID == 3 || (ttNMResult.uPlatformID == 2 && ttNMResult.uEncodingID == 1)) { name = ReadUnicodeString(szResult); } else { name = System.Text.Encoding.Default.GetString(szResult); } list.Add(name); } } } } /// /// 反転 /// /// /// private static byte[] BigEndian(byte[] bLittle) { byte[] bBig = new byte[bLittle.Length]; for (int y = 0; y < (bLittle.Length - 1); y += 2) { byte b1, b2; b1 = bLittle[y]; b2 = bLittle[y + 1]; bBig[y] = b2; bBig[y + 1] = b1; } return bBig; } private static int ReadInt(byte[] buff) { int ch1 = buff[0]; int ch2 = buff[1]; int ch3 = buff[2]; int ch4 = buff[3]; if ((ch1 | ch2 | ch3 | ch4) < 0) throw new EndOfStreamException(); return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + ch4); } private static char ReadChar(byte[] buff) { int ch1 = buff[0]; int ch2 = buff[1]; if ((ch1 | ch2) < 0) throw new EndOfStreamException(); return (char)((ch1 << 8) + ch2); } private static string ReadUnicodeString(byte[] buff) { StringBuilder buf = new StringBuilder(); int length = buff.Length / 2; for (int k = 0; k < length; ++k) { byte[] item = new byte[2]; Array.Copy(buff, k * 2, item, 0, 2); buf.Append(ReadChar(item)); } return buf.ToString(); } } }