public void Read(string fontFileName, char character, string expectedImageFilePath) { Typeface typeFace; using (var fs = Utility.ReadFile(Utility.FontDir + fontFileName)) { var reader = new OpenFontReader(); typeFace = reader.Read(fs); } Typography.OpenFont.Glyph glyph = typeFace.Lookup(character); // read polygons and bezier segments GlyphLoader.Read(glyph, out var polygons, out var bezierSegments); Rect aabb = new Rect(polygons[0][0], polygons[0][1]); //print to test output //calcualte the aabb for (int i = 0; i < polygons.Count; i++) { o.WriteLine("Polygon " + i); var polygon = polygons[i]; foreach (var p in polygon) { aabb.Union(p); o.WriteLine("{0}, {1}", (int)p.X, (int)p.Y); } o.WriteLine(""); } foreach (var segment in bezierSegments) { aabb.Union(segment.Item1); aabb.Union(segment.Item2); aabb.Union(segment.Item3); o.WriteLine("<{0}, {1}> <{2}, {3}> <{4}, {5}>", (int)segment.Item1.X, (int)segment.Item1.Y, (int)segment.Item2.X, (int)segment.Item2.Y, (int)segment.Item3.X, (int)segment.Item3.Y); } o.WriteLine(""); // draw to an image using (Cairo.ImageSurface surface = new Cairo.ImageSurface(Cairo.Format.Argb32, MathEx.RoundToInt(aabb.Width), MathEx.RoundToInt(aabb.Height))) using (Cairo.Context g = new Cairo.Context(surface)) { g.Translate(-aabb.Min.X, -aabb.Min.Y); //essential: set surface back ground to white (1,1,1,1) g.SetSourceColor(CairoEx.ColorWhite); g.Paint(); for (var i = 0; i < polygons.Count; i++) { var polygon = polygons[i]; g.MoveTo(polygon[0].X, polygon[0].Y); foreach (var point in polygon) { g.LineTo(point.X, point.Y); } g.ClosePath(); } g.SetSourceColor(new Cairo.Color(0, 0, 0)); g.LineWidth = 4; g.StrokePreserve(); g.SetSourceColor(new Cairo.Color(0.8, 0, 0, 0.6)); g.Fill(); foreach (var segment in bezierSegments) { var p0 = segment.Item1; var c = segment.Item2; var p1 = segment.Item3; g.MoveTo(p0.X, p0.Y); g.QuadraticTo(c.X, c.Y, p1.X, p1.Y); } g.LineWidth = 4; g.SetSourceColor(CairoEx.ColorRgb(0, 122, 204)); g.Stroke(); //used to generate expected image //surface.WriteToPng($"{Util.OutputPath}\\GlyphReaderFacts.TheReadMethod.Read_{fontFileName}_{character}.png"); var image = Image.LoadPixelData <Bgra32>(Configuration.Default, surface.Data, surface.Width, surface.Height); var expectedImage = Image.Load(expectedImageFilePath); Assert.True(Util.CompareImage(expectedImage, image)); } }
public void ReadBitmapContent(Glyph glyph, System.IO.Stream output) { _bitmapFontGlyphSource.CopyBitmapContent(glyph, output); }
void RenderAndShowMeasureBox() { bool flipY = chkFlipY.Checked; //set some Gdi+ props... g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; g.Clear(Color.White); Typography.OpenFont.Typeface typeface = _currentTextPrinter.Typeface; Typography.OpenFont.TypefaceExtension2.UpdateAllCffGlyphBounds(typeface); float pxscale = typeface.CalculateScaleToPixelFromPointSize(_currentTextPrinter.FontSizeInPoints); int lineSpacing = (int)System.Math.Ceiling((double)typeface.CalculateLineSpacing(LineSpacingChoice.TypoMetric) * pxscale); if (flipY) { //credit: //http://stackoverflow.com/questions/1485745/flip-coordinates-when-drawing-to-control g.ScaleTransform(1.0F, -1.0F); // Flip the Y-Axis g.TranslateTransform(0.0F, -500); // Translate the drawing area accordingly } //-------------------------------- //textspan measurement sample //-------------------------------- _currentTextPrinter.HintTechnique = (HintTechnique)lstHintList.SelectedItem; _currentTextPrinter.PositionTechnique = (PositionTechnique)cmbPositionTech.SelectedItem; _currentTextPrinter.UpdateGlyphLayoutSettings(); //render at specific pos float x_pos = 0, y_pos = lineSpacing * 2; char[] textBuffer = txtInputChar.Text.ToCharArray(); //Example 1: this is a basic draw sample _currentTextPrinter.FillColor = Color.Black; _currentTextPrinter.TargetGraphics = g; _currentTextPrinter.DrawString( textBuffer, 0, textBuffer.Length, x_pos, y_pos ); // //-------------------------------------------------- //Example 2: print glyph plan to 'user' list-> then draw it (or hold it/ not draw) //you can create you own class to hold userGlyphPlans.*** //2.1 _reusableUnscaledGlyphPlanList.Clear(); _currentTextPrinter.GenerateGlyphPlan(textBuffer, 0, textBuffer.Length, _reusableUnscaledGlyphPlanList); //2.2 //and we can print the formatted glyph plan later. y_pos -= lineSpacing;//next line _currentTextPrinter.FillColor = Color.Red; _currentTextPrinter.DrawFromGlyphPlans( new GlyphPlanSequence(_reusableUnscaledGlyphPlanList), x_pos, y_pos ); //Example 3: MeasureString UnscaledGlyphPlanList glyphPlans = new UnscaledGlyphPlanList(); _currentTextPrinter.GlyphLayoutMan.GenerateUnscaledGlyphPlans(glyphPlans); MeasuredStringBox strBox = _currentTextPrinter.GlyphLayoutMan.LayoutAndMeasureString( textBuffer, 0, textBuffer.Length, _currentTextPrinter.FontSizeInPoints); int j = glyphPlans.Count; float backup_xpos = x_pos; for (int i = 0; i < j; ++i) { UnscaledGlyphPlan glyphPlan = glyphPlans[i]; Typography.OpenFont.Glyph glyph = typeface.GetGlyphByIndex(glyphPlan.glyphIndex); // Typography.OpenFont.Bounds b = glyph.Bounds; // float xmin = b.XMin * pxscale; float ymin = b.YMin * pxscale; // float xmax = b.XMax * pxscale; float ymax = b.YMax * pxscale; // float glyph_x = x_pos + glyphPlan.OffsetX; g.DrawRectangle(Pens.Red, glyph_x + xmin, y_pos + ymin, xmax - xmin, ymax - ymin); x_pos += glyphPlan.AdvanceX * pxscale; } x_pos = backup_xpos; g.FillRectangle(Brushes.Red, new RectangleF(0, 0, 5, 5));//reference point(0,0) g.FillRectangle(Brushes.Green, new RectangleF(x_pos, y_pos, 3, 3)); float x_pos2 = x_pos + strBox.width + 10; g.DrawRectangle(Pens.Black, x_pos, y_pos + strBox.DescendingInPx, strBox.width, strBox.ClipHeightInPx); g.DrawRectangle(Pens.Red, x_pos, y_pos + strBox.DescendingInPx, strBox.width, strBox.LineSpaceInPx); g.DrawLine(Pens.Blue, x_pos, y_pos, x_pos2, y_pos); //baseline g.DrawLine(Pens.Green, x_pos, y_pos + strBox.DescendingInPx, x_pos2, y_pos + strBox.DescendingInPx); //descending g.DrawLine(Pens.Magenta, x_pos, y_pos + strBox.AscendingInPx, x_pos2, y_pos + strBox.AscendingInPx); //ascending ////------------ ////draw another line (for reference) y_pos -= lineSpacing;//next line _currentTextPrinter.FillColor = Color.Black; _currentTextPrinter.DrawFromGlyphPlans( new GlyphPlanSequence(_reusableUnscaledGlyphPlanList), x_pos, y_pos ); //transform back if (flipY) { g.ScaleTransform(1.0F, -1.0F); // Flip the Y-Axis g.TranslateTransform(0.0F, -500); // Translate the drawing area accordingly } //--------- //txtMsgInfo.Text = "choice:" + choice.ToString() + "=" + lineSpacing.ToString(); }
public static void Read( Glyph glyph, out List <List <Point> > polygons,