void RenderWithMsdfImg(Typeface typeface, char testChar, float sizeInPoint) { _painter.FillColor = PixelFarm.Drawing.Color.Black; //p.UseSubPixelRendering = chkLcdTechnique.Checked; _painter.Clear(PixelFarm.Drawing.Color.White); //---------------------------------------------------- var builder = new GlyphOutlineBuilder(typeface); builder.SetHintTechnique(_glyphRenderOptions.HintTechnique); //---------------------------------------------------- builder.Build(testChar, sizeInPoint); //---------------------------------------------------- var glyphToContour = new ContourBuilder(); builder.ReadShapes(new GlyphTranslatorToContourBuilder(glyphToContour)); //glyphToContour.Read(builder.GetOutputPoints(), builder.GetOutputContours()); Msdfgen.MsdfGenParams genParams = new Msdfgen.MsdfGenParams(); BitmapAtlasItemSource glyphImg = MsdfImageGen.CreateMsdfImageV1(glyphToContour, genParams); MemBitmap actualImg = MemBitmap.CreateFromCopy(glyphImg.Width, glyphImg.Height, glyphImg.GetImageBuffer()); _painter.DrawImage(actualImg, 0, 0); //using (Bitmap bmp = new Bitmap(w, h, System.Drawing.Imaging.PixelFormat.Format32bppArgb)) //{ // var bmpdata = bmp.LockBits(new Rectangle(0, 0, w, h), System.Drawing.Imaging.ImageLockMode.ReadWrite, bmp.PixelFormat); // System.Runtime.InteropServices.Marshal.Copy(buffer, 0, bmpdata.Scan0, buffer.Length); // bmp.UnlockBits(bmpdata); // bmp.Save("a001_xn2_" + n + ".png"); //} if (_contourAnalysisOpts.ShowGrid) { //render grid RenderGrids(800, 600, _gridSize, _painter); } //6. use this util to copy image from Agg actual image to System.Drawing.Bitmap PixelFarm.CpuBlit.BitmapHelper.CopyToGdiPlusBitmapSameSize(_destImg, _winBmp); //--------------- //7. just render our bitmap _g.Clear(Color.White); _g.DrawImage(_winBmp, new Point(30, 20)); }
static void CreateSampleMsdfImg(ContourBuilder tx, string outputFile) { //sample MsdfGenParams msdfGenParams = new MsdfGenParams(); BitmapAtlasItemSource glyphImg = MsdfImageGen.CreateMsdfImageV1(tx, msdfGenParams); int w = glyphImg.Width; int h = glyphImg.Height; using (Bitmap bmp = new Bitmap(glyphImg.Width, glyphImg.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb)) { var bmpdata = bmp.LockBits(new System.Drawing.Rectangle(0, 0, w, h), System.Drawing.Imaging.ImageLockMode.ReadWrite, bmp.PixelFormat); int[] imgBuffer = glyphImg.GetImageBuffer(); System.Runtime.InteropServices.Marshal.Copy(imgBuffer, 0, bmpdata.Scan0, imgBuffer.Length); bmp.UnlockBits(bmpdata); bmp.Save(outputFile); } }
private void button1_Click(object sender, EventArgs e) { //1. MsdfGenParams msdfGenParams = new MsdfGenParams(); //GlyphImage glyphImg = MsdfGlyphGen.CreateMsdfImage(tx, msdfGenParams); Msdfgen.Shape shape1 = new Msdfgen.Shape(); // Msdfgen.Contour cnt = new Msdfgen.Contour(); //cnt.AddLine(0, 0, 50, 0); //cnt.AddLine(50, 0, 50, 50); //cnt.AddLine(50, 50, 0, 50); //cnt.AddLine(0, 50, 0, 0); //cnt.AddLine(10, 20, 50, 0); //cnt.AddLine(50, 0, 80, 20); //cnt.AddLine(80, 20, 50, 60); //cnt.AddLine(50, 60, 10, 20); //for msdf we draw shape clock-wise cnt.AddLine(10, 20, 50, 60); cnt.AddLine(50, 60, 80, 20); cnt.AddLine(80, 20, 50, 0); cnt.AddLine(50, 0, 10, 20); shape1.contours.Add(cnt); // // var genParams = new MsdfGenParams(); BitmapAtlasItemSource glyphImg = MsdfImageGen.CreateMsdfImageV1(shape1, genParams); using (Bitmap bmp = new Bitmap(glyphImg.Width, glyphImg.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb)) { int[] buffer = glyphImg.GetImageBuffer(); var bmpdata = bmp.LockBits(new System.Drawing.Rectangle(0, 0, glyphImg.Width, glyphImg.Height), System.Drawing.Imaging.ImageLockMode.ReadWrite, bmp.PixelFormat); System.Runtime.InteropServices.Marshal.Copy(buffer, 0, bmpdata.Scan0, buffer.Length); bmp.UnlockBits(bmpdata); bmp.Save("msdf_shape.png"); // } }
static void CreateSampleMsdfTextureFont(string fontfile, float sizeInPoint, ushort startGlyphIndex, ushort endGlyphIndex, string outputFile) { //sample var reader = new OpenFontReader(); Typeface typeface = null; using (var fs = new FileStream(fontfile, FileMode.Open)) { //1. read typeface from font file typeface = reader.Read(fs); } //sample: create sample msdf texture //------------------------------------------------------------- var builder = new GlyphOutlineBuilder(typeface); //builder.UseTrueTypeInterpreter = this.chkTrueTypeHint.Checked; //builder.UseVerticalHinting = this.chkVerticalHinting.Checked; //------------------------------------------------------------- RequestFont reqFont = new RequestFont(typeface.Name, sizeInPoint); var atlasBuilder = new SimpleBitmapAtlasBuilder(); atlasBuilder.FontFilename = System.IO.Path.GetFileName(fontfile); atlasBuilder.FontKey = reqFont.FontKey; //create temp folder for each glyph string tempFolderName = "tmp_msdf"; if (Directory.Exists(tempFolderName)) { //DANGER! Directory.Delete(tempFolderName, true); } Directory.CreateDirectory(tempFolderName); if (endGlyphIndex < 1) { endGlyphIndex = (ushort)(typeface.GlyphCount - 1); } for (ushort gindex = startGlyphIndex; gindex <= endGlyphIndex; ++gindex) { //build glyph builder.BuildFromGlyphIndex(gindex, sizeInPoint); var glyphContourBuilder = new ContourBuilder(); //glyphToContour.Read(builder.GetOutputPoints(), builder.GetOutputContours()); var genParams = new MsdfGenParams(); builder.ReadShapes(new GlyphContourBuilder2(glyphContourBuilder)); //genParams.shapeScale = 1f / 64; //we scale later (as original C++ code use 1/64) BitmapAtlasItemSource glyphImg = MsdfImageGen.CreateMsdfImageV1(glyphContourBuilder, genParams); glyphImg.UniqueInt16Name = gindex; atlasBuilder.AddItemSource(glyphImg); using (Bitmap bmp = new Bitmap(glyphImg.Width, glyphImg.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb)) { int[] buffer = glyphImg.GetImageBuffer(); var bmpdata = bmp.LockBits(new System.Drawing.Rectangle(0, 0, glyphImg.Width, glyphImg.Height), System.Drawing.Imaging.ImageLockMode.ReadWrite, bmp.PixelFormat); System.Runtime.InteropServices.Marshal.Copy(buffer, 0, bmpdata.Scan0, buffer.Length); bmp.UnlockBits(bmpdata); bmp.Save(tempFolderName + "//glyph_" + gindex + ".png"); } } MemBitmap glyphImg2 = atlasBuilder.BuildSingleImage(true); glyphImg2.SaveImage(outputFile); string saveToFile = "a_info.bin"; using (System.IO.FileStream saveFs = new FileStream(saveToFile, FileMode.Create)) { atlasBuilder.SaveAtlasInfo(saveFs); saveFs.Flush(); saveFs.Close(); } // //----------- //test read texture info back var atlasBuilder2 = new SimpleBitmapAtlasBuilder(); using (System.IO.FileStream readFromFs = new FileStream(saveToFile, FileMode.Open)) { var readbackFontAtlas = atlasBuilder2.LoadAtlasInfo(readFromFs); } }