Esempio n. 1
0
        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));
        }
Esempio n. 2
0
        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);
            }
        }
Esempio n. 3
0
        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);
            }
        }
Esempio n. 4
0
        public void LoadingFontReturnsATypeface(string filename)
        {
            var reader = new OpenTypeReader();

            using (var fs = File.OpenRead($"{fontsRoot}/{filename}"))
            {
                var typeface = reader.Read(fs);

                Assert.NotNull(typeface);
            }
        }
Esempio n. 5
0
        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>());
            }
        }
Esempio n. 8
0
        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);
                }
            }
        }
Esempio n. 9
0
        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();

                }
            }
        }