void InitGraphics() { //INIT ONCE if (_g != null) { return; } // _destImg = new MemBitmap(800, 600); _painter = AggPainter.Create(_destImg); _winBmp = new Bitmap(_destImg.Width, _destImg.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb); _g = this.CreateGraphics(); _defaultReqFont = new PixelFarm.Drawing.RequestFont("Source Sans Pro", 10); _painter.CurrentFont = _defaultReqFont; _textService = new Typography.Text.OpenFontTextService(); _textService.LoadFontsFromFolder("../../../TestFonts"); _textService.UpdateUnicodeRanges(); _devVxsTextPrinter = new PixelFarm.Drawing.VxsTextSpanPrinter(_painter, _textService.CreateNewServiceClient()); _devVxsTextPrinter.SetSvgBmpBuilderFunc(PaintLab.SvgBuilderHelper.ParseAndRenderSvg); _devVxsTextPrinter.ScriptLang = new ScriptLang(ScriptTagDefs.Latin.Tag); _devVxsTextPrinter.PositionTechnique = Typography.TextLayout.PositionTechnique.OpenFont; //Alternative Typeface selector.. _myAlternativeTypefaceSelector = new Typography.Text.AlternativeTypefaceSelector(); { //------------ //TODO: review this again //load from config? //------------ //arabic //1. create prefer typeface list for arabic script var preferTypefaces = new Typography.FontCollections.PreferredTypefaceList(); preferTypefaces.AddTypefaceName("Noto Sans Arabic UI"); //2. set unicode ranges and prefered typeface list. _myAlternativeTypefaceSelector.SetPreferredTypefaces( new[] { Typography.TextBreak.Unicode13RangeInfoList.Arabic, Typography.TextBreak.Unicode13RangeInfoList.Arabic_Supplement, Typography.TextBreak.Unicode13RangeInfoList.Arabic_Extended_A }, preferTypefaces); } { //latin var preferTypefaces = new Typography.FontCollections.PreferredTypefaceList(); preferTypefaces.AddTypefaceName("Sarabun"); _myAlternativeTypefaceSelector.SetPreferredTypefaces( new[] { Typography.TextBreak.Unicode13RangeInfoList.C0_Controls_and_Basic_Latin, Typography.TextBreak.Unicode13RangeInfoList.C1_Controls_and_Latin_1_Supplement, Typography.TextBreak.Unicode13RangeInfoList.Latin_Extended_A, Typography.TextBreak.Unicode13RangeInfoList.Latin_Extended_B, }, preferTypefaces); } _devVxsTextPrinter.AlternativeTypefaceSelector = _myAlternativeTypefaceSelector; }
void DrawStringToMemBitmap(RequestFont reqFont, string textOutput, float x_pos, float y_pos, int repeatLines = 1) { ResolvedFont resolvedFont = _textService.ResolveFont(reqFont); if (resolvedFont == null) { //we dont' have resolvedFont = _textService.ResolveFont(_defaultReqFont); if (resolvedFont == null) { throw new NotSupportedException(); } //use alternative typeface, but use reqFont's Size resolvedFont = new ResolvedFont(resolvedFont.Typeface, reqFont.SizeInPoints); } //check if reqFont has alternative or not _myAlternativeTypefaceSelector.SetCurrentReqFont(reqFont, _textService); PixelFarm.Drawing.VxsTextSpanPrinter _selectedTextPrinter = _devVxsTextPrinter; _painter.UseLcdEffectSubPixelRendering = true; _painter.FillColor = PixelFarm.Drawing.Color.Black; _selectedTextPrinter = _devVxsTextPrinter; _selectedTextPrinter.FontSizeInPoints = resolvedFont.SizeInPoints; _selectedTextPrinter.Typeface = resolvedFont.Typeface; _selectedTextPrinter.ScriptLang = new ScriptLang(ScriptTagDefs.Latin.Tag); _selectedTextPrinter.PositionTechnique = PositionTechnique.OpenFont; _selectedTextPrinter.HintTechnique = HintTechnique.None; _selectedTextPrinter.EnableLigature = true; _selectedTextPrinter.SimulateSlant = false; _selectedTextPrinter.EnableMultiTypefaces = true; //*** for auto typeface selection*** //_selectedTextPrinter.TextBaseline = PixelFarm.Drawing.TextBaseline.Alphabetic; //_selectedTextPrinter.TextBaseline = PixelFarm.Drawing.TextBaseline.Bottom; _selectedTextPrinter.TextBaseline = (Typography.Text.TextBaseline)PixelFarm.Drawing.TextBaseline.Top; //test print 3 lines //#if DEBUG // DynamicOutline.dbugTestNewGridFitting = _contourAnalysisOpts.EnableGridFit; // DynamicOutline.dbugActualPosToConsole = _contourAnalysisOpts.WriteFitOutputToConsole; // DynamicOutline.dbugUseHorizontalFitValue = _contourAnalysisOpts.UseHorizontalFitAlignment; //#endif char[] printTextBuffer = textOutput.ToCharArray(); float lineSpacingPx = _selectedTextPrinter.FontLineSpacingPx; const int REF_LINE_LEN = 300; for (int i = 0; i < repeatLines; ++i) { _selectedTextPrinter.DrawString(printTextBuffer, x_pos, y_pos); #if DEBUG //show debug info... var prevColor = _painter.FillColor; var prevStrokColor = _painter.StrokeColor; _painter.FillColor = PixelFarm.Drawing.Color.Red; _painter.FillRect(x_pos, y_pos, 5, 5); // start point //see //https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/textBaseline switch (_selectedTextPrinter.TextBaseline) { default: { System.Diagnostics.Debug.WriteLine("UNIMPLEMENTED" + _selectedTextPrinter.TextBaseline.ToString()); goto case Typography.Text.TextBaseline.Alphabetic; // } case Typography.Text.TextBaseline.Alphabetic: { //alphabetic baseline _painter.StrokeColor = _grayColor; _painter.DrawLine(x_pos, /**/ y_pos, x_pos + REF_LINE_LEN, y_pos); _painter.StrokeColor = PixelFarm.Drawing.Color.Blue; _painter.DrawLine(x_pos, /**/ y_pos - _selectedTextPrinter.FontDescedingPx, x_pos + REF_LINE_LEN, y_pos - _selectedTextPrinter.FontDescedingPx); //bottom most } break; case Typography.Text.TextBaseline.Top: { //alphabetic baseline _painter.StrokeColor = _grayColor; _painter.DrawLine(x_pos, /**/ y_pos + _selectedTextPrinter.FontAscendingPx, x_pos + REF_LINE_LEN, y_pos + _selectedTextPrinter.FontAscendingPx); //em bottom _painter.StrokeColor = PixelFarm.Drawing.Color.Blue; _painter.DrawLine(x_pos, /**/ y_pos + (_selectedTextPrinter.FontAscendingPx - _selectedTextPrinter.FontDescedingPx), x_pos + REF_LINE_LEN, y_pos + (_selectedTextPrinter.FontAscendingPx - _selectedTextPrinter.FontDescedingPx)); //bottom most } break; case Typography.Text.TextBaseline.Bottom: { //alphabetic baseline _painter.StrokeColor = _grayColor; _painter.DrawLine(x_pos, /**/ y_pos + _selectedTextPrinter.FontDescedingPx, x_pos + REF_LINE_LEN, y_pos + _selectedTextPrinter.FontDescedingPx); //em bottom _painter.StrokeColor = PixelFarm.Drawing.Color.Blue; _painter.DrawLine(x_pos, /**/ y_pos, x_pos + REF_LINE_LEN, y_pos); //bottom most } break; } _painter.FillColor = prevColor; _painter.StrokeColor = prevColor; #endif y_pos += (_selectedTextPrinter.FontAscendingPx - _selectedTextPrinter.FontDescedingPx); } //reset _myAlternativeTypefaceSelector.SetCurrentReqFont(null, null); }