public VGFont FromTTF(String path) { Typeface typeFace; using (var fi = System.IO.File.OpenRead(path)) { Debug.WriteLine("OpenTypeReader"); typeFace = new OpenTypeReader().Read(fi); } // Create OpenVG font object: var destFont = vg.CreateFont(typeFace.Glyphs.Count); // Create a renderer instance that renders glyphs to OpenVG paths: var renderer = new NRasterizer.Renderer(typeFace, this); var allChars = typeFace.AllCharacters().ToList(); var escapements = new Dictionary <uint, float[]>(allChars.Count); // Run through all glyphs defined and create OpenVG paths for them: foreach (var c in allChars) { renderer.RenderChar(0, 0, c, 1, false); this.SetGlyphToPath(destFont, c); escapements[c] = escapement; } return(new VGFont(vg, destFont, escapements, 18.0f)); }
private void DrawSoft(FileInfo fontPath, FileInfo target, string text) { const int width = 200; const int height = 80; const int resolution = 72; var options = new TextOptions() { FontSize = 64 }; var raster = new Raster(width, height, width, resolution); using (var input = fontPath.OpenRead()) { var typeface = new OpenTypeReader().Read(input); var rasterizer = new Rasterizer.Rasterizer(raster); var renderer = new Renderer(typeface, rasterizer); renderer.Render(0, 0, text, options); } using (Bitmap b = new Bitmap(width, height, PixelFormat.Format8bppIndexed)) { b.SetResolution(resolution, resolution); Grayscale(b); BlitTo(raster, b); b.Save(target.FullName, ImageFormat.Png); } }
void ReadAndRender(string fontfile, string text) { char testChar = text[0];//only 1 char int resolution = 96; var reader = new OpenTypeReader(); using (var fs = new FileStream(fontfile, FileMode.Open)) { //1. read typeface from font file Typeface typeFace = reader.Read(fs); #if DEBUG //----- //about typeface short ascender = typeFace.Ascender; short descender = typeFace.Descender; short lineGap = typeFace.LineGap; //NOpenType.Tables.UnicodeLangBits test = NOpenType.Tables.UnicodeLangBits.Thai; //NOpenType.Tables.UnicodeRangeInfo rangeInfo = test.ToUnicodeRangeInfo(); //bool doseSupport = typeFace.DoseSupportUnicode(test); List <int> outputGlyphIndice = new List <int>(); typeFace.Lookup(text.ToCharArray(), outputGlyphIndice); #endif float fontSizeInPoint = 96; RenderWithMiniAgg(typeFace, testChar, fontSizeInPoint); } }
public void LoadingFontReturnsATypeface(string filename) { var reader = new OpenTypeReader(); using (var fs = File.OpenRead($"{fontsRoot}/{filename}")) { var typeface = reader.Read(fs); Assert.NotNull(typeface); } }
void LoadGlyphs() { using (FileStream fs = new FileStream("tahoma.ttf", FileMode.Open)) { OpenTypeReader reader = new OpenTypeReader(); Typeface typeface = reader.Read(fs); var testChar = 'a'; var builder = new GlyphPathBuilderVxs(typeface); float sizeInPoint = 48; builder.Build(testChar, sizeInPoint); vxs = builder.GetVxs(); } }
public static FontFace LoadFont(string fontfile, string lang, HBDirection direction, int defaultScriptCode = 0) { //read font file OpenTypeReader openTypeReader = new OpenTypeReader(); Typeface typeface = null; using (FileStream fs = new FileStream(fontfile, FileMode.Open, FileAccess.Read, FileShare.Read)) { typeface = openTypeReader.Read(fs); if (typeface == null) { return null; } } //TODO:... //set shape engine *** return new NOpenTypeFontFace(typeface, typeface.Name, fontfile); }
private static IEnumerable <FontInfo> AddFontFileToCache(Dictionary <string, List <FontInfo> > cache, Dictionary <string, FontInfo> fullCache, string path) { FontInfo AddFont(OpenTypeFont font) { #if DEBUG Logger.log.Debug($"'{path}' = '{font.Family}' '{font.Subfamily}' ({font.FullName})"); #endif var fontInfo = new FontInfo(path, font); var list = GetListForFamily(cache, font.Family); list.Add(fontInfo); var name = font.FullName; if (fullCache.ContainsKey(name)) { // Beat Saber 1.13.4 includes well over 100+ fonts that most systems have, this completely blows up the console on game launch. // Logger.log.Warn($"Duplcicate font with full name '{name}' at {path}"); } else { fullCache.Add(name, fontInfo); } return(fontInfo); } using var fileStream = new FileStream(path, FileMode.Open, FileAccess.Read); using var reader = OpenTypeReader.For(fileStream); if (reader is OpenTypeCollectionReader colReader) { var collection = new OpenTypeCollection(colReader, lazyLoad: false); return(collection.Select(AddFont).ToList()); } else if (reader is OpenTypeFontReader fontReader) { var font = new OpenTypeFont(fontReader, lazyLoad: false); return(Utilities.SingleEnumerable(AddFont(font))); } else { Logger.log.Warn($"Font file '{path}' is not an OpenType file"); return(Enumerable.Empty <FontInfo>()); } }
private void DrawGDI(FileInfo fontPath, FileInfo target, string text, bool drawbox) { var lineCount = text.Count(c => c == '\n') + 1; const int width = 200; int height = 80 * lineCount; const int resolution = 72; var options = new TextOptions() { FontSize = 64 }; int x = 0; int y = 0; using (var input = fontPath.OpenRead()) { var typeface = new OpenTypeReader().Read(input); using (Bitmap b = new Bitmap(width, height, PixelFormat.Format32bppArgb)) { b.SetResolution(resolution, resolution); using (var g = Graphics.FromImage(b)) { g.Clear(Color.White); g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; var rasterizer = new GDIGlyphRasterizer(g, resolution, Brushes.Black); var renderer = new Renderer(typeface, rasterizer); renderer.Render(x, y, text, options); if (drawbox) { var size = renderer.Measure(text, options); g.DrawRectangle(Pens.HotPink, new Rectangle(x, y, size.Width, size.Height)); } } b.Save(target.FullName, ImageFormat.Png); } } }
float fontSizeInPoint = 14; //default void ReadAndRender(string fontfile) { if (string.IsNullOrEmpty(this.txtInputChar.Text)) { return; } var reader = new OpenTypeReader(); char testChar = txtInputChar.Text[0];//only 1 char int resolution = 96; using (var fs = new FileStream(fontfile, FileMode.Open)) { //1. read typeface from font file Typeface typeFace = reader.Read(fs); #if DEBUG //----- //about typeface short ascender = typeFace.Ascender; short descender = typeFace.Descender; short lineGap = typeFace.LineGap; NOpenType.Tables.UnicodeLangBits test = NOpenType.Tables.UnicodeLangBits.Thai; NOpenType.Tables.UnicodeRangeInfo rangeInfo = test.ToUnicodeRangeInfo(); bool doseSupport = typeFace.DoseSupportUnicode(test); //----- string inputstr = "ก่นกิ่น"; List<int> outputGlyphIndice = new List<int>(); typeFace.Lookup(inputstr.ToCharArray(), outputGlyphIndice); #endif RenderChoice renderChoice = (RenderChoice)this.cmbRenderChoices.SelectedItem; switch (renderChoice) { case RenderChoice.RenderWithMiniAgg: RenderWithMiniAgg(typeFace, testChar, fontSizeInPoint); break; case RenderChoice.RenderWithPlugableGlyphRasterizer: RenderWithPlugableGlyphRasterizer(typeFace, testChar, fontSizeInPoint, resolution); break; case RenderChoice.RenderWithTypePlanAndMiniAgg: RenderWithTextPrinterAndMiniAgg(typeFace, this.txtInputChar.Text, fontSizeInPoint, resolution); break; default: throw new NotSupportedException(); } } }