void UpdateRenderOutput() { if (!_readyToRender) { return; } // //test option use be used with lcd subpixel rendering. //this demonstrate how we shift a pixel for subpixel rendering tech _devVxsTextPrinter.UseWithLcdSubPixelRenderingTechnique = true; //1. read typeface from font file TypographyTest.RenderChoice renderChoice = _basicOptions.RenderChoice; switch (renderChoice) { case TypographyTest.RenderChoice.RenderWithGdiPlusPath: //not render in this example //see more at ... break; case TypographyTest.RenderChoice.RenderWithTextPrinterAndMiniAgg: { //clear previous draw painter.Clear(PixelFarm.Drawing.Color.White); painter.UseSubPixelLcdEffect = false; painter.FillColor = PixelFarm.Drawing.Color.Black; selectedTextPrinter = _devVxsTextPrinter; selectedTextPrinter.Typeface = _basicOptions.Typeface; selectedTextPrinter.FontSizeInPoints = _basicOptions.FontSizeInPoints; selectedTextPrinter.ScriptLang = _basicOptions.ScriptLang; selectedTextPrinter.PositionTechnique = _basicOptions.PositionTech; selectedTextPrinter.HintTechnique = HintTechnique.None; selectedTextPrinter.EnableLigature = true; _devVxsTextPrinter.UpdateGlyphLayoutSettings(); // _controllerForPixelFarm.ReadyToRender = true; _controllerForPixelFarm.UpdateOutput(); //---------------- //copy from Agg's memory buffer to gdi PixelFarm.Agg.Imaging.BitmapHelper.CopyToGdiPlusBitmapSameSize(destImg, winBmp); g.Clear(Color.White); g.DrawImage(winBmp, new Point(10, 0)); } break; default: throw new NotSupportedException(); } }
private void button2_Click(object sender, EventArgs e) { //test text service if (_textService == null) { _textService = new TextServiceHub(); } Typography.TextServices.TextShapingService shapingService = _textService.ShapingService; shapingService.SetCurrentFont(_basicOptions.Typeface.Name, InstalledFontStyle.Normal, 8); shapingService.SetCurrentScriptLang(Typography.OpenFont.ScriptLangs.Latin); GlyphPlanSequence seq = shapingService.LayoutText("Hello"); //---- // test render the output selectedTextPrinter = _devVxsTextPrinter; selectedTextPrinter.Typeface = _basicOptions.Typeface; selectedTextPrinter.FontSizeInPoints = _basicOptions.FontSizeInPoints; selectedTextPrinter.ScriptLang = _basicOptions.ScriptLang; selectedTextPrinter.PositionTechnique = _basicOptions.PositionTech; selectedTextPrinter.HintTechnique = HintTechnique.None; selectedTextPrinter.EnableLigature = true; _devVxsTextPrinter.UpdateGlyphLayoutSettings(); //------------- //pre-render painter.Clear(PixelFarm.Drawing.Color.White); painter.UseSubPixelRendering = false; painter.FillColor = PixelFarm.Drawing.Color.Black; _devVxsTextPrinter.TargetCanvasPainter = painter; //*** essential *** //render!, float x = 20, y = 200; _devVxsTextPrinter.DrawFromGlyphPlans( GlyphPlanSequence.UnsafeGetInteralGlyphPlanList(seq), seq.startAt, seq.len, x, y); //---------- //use this util to copy image from Agg actual image to System.Drawing.Bitmap PixelFarm.Agg.Imaging.BitmapHelper.CopyToGdiPlusBitmapSameSize(painter.Graphics.DestActualImage, winBmp); //---------------- //copy from Agg's memory buffer to gdi //PixelFarm.Agg.Imaging.BitmapHelper.CopyToGdiPlusBitmapSameSize(destImg, winBmp); g.Clear(Color.White); g.DrawImage(winBmp, new Point(10, 0)); }
void UpdateRenderOutput() { if (!_readyToRender) { return; } // if (g == null) { destImg = new ActualImage(800, 600, PixelFormat.ARGB32); imgGfx2d = new ImageGraphics2D(destImg); //no platform painter = new AggCanvasPainter(imgGfx2d); winBmp = new Bitmap(destImg.Width, destImg.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb); g = this.CreateGraphics(); painter.CurrentFont = new PixelFarm.Drawing.RequestFont("tahoma", 14); _devVxsTextPrinter = new VxsTextPrinter(painter, _basicOptions.OpenFontStore); _devVxsTextPrinter.TargetCanvasPainter = painter; _devVxsTextPrinter.ScriptLang = _basicOptions.ScriptLang; _devVxsTextPrinter.PositionTechnique = Typography.TextLayout.PositionTechnique.OpenFont; //_devGdiTextPrinter.TargetGraphics = g; } if (string.IsNullOrEmpty(this.txtInputChar.Text)) { return; } //test option use be used with lcd subpixel rendering. //this demonstrate how we shift a pixel for subpixel rendering tech _devVxsTextPrinter.UseWithLcdSubPixelRenderingTechnique = _contourAnalysisOpts.SetupPrinterLayoutForLcdSubPix; //1. read typeface from font file TypographyTest.RenderChoice renderChoice = _basicOptions.RenderChoice; switch (renderChoice) { case TypographyTest.RenderChoice.RenderWithGdiPlusPath: //not render in this example //see more at ... break; case TypographyTest.RenderChoice.RenderWithTextPrinterAndMiniAgg: { //clear previous draw painter.Clear(PixelFarm.Drawing.Color.White); painter.UseSubPixelRendering = _contourAnalysisOpts.LcdTechnique; painter.FillColor = PixelFarm.Drawing.Color.Black; selectedTextPrinter = _devVxsTextPrinter; selectedTextPrinter.Typeface = _basicOptions.Typeface; selectedTextPrinter.FontSizeInPoints = _basicOptions.FontSizeInPoints; selectedTextPrinter.ScriptLang = _basicOptions.ScriptLang; selectedTextPrinter.PositionTechnique = _basicOptions.PositionTech; selectedTextPrinter.HintTechnique = _glyphRenderOptions.HintTechnique; selectedTextPrinter.EnableLigature = _glyphRenderOptions.EnableLigature; //test print 3 lines #if DEBUG GlyphDynamicOutline.dbugTestNewGridFitting = _contourAnalysisOpts.EnableGridFit; GlyphDynamicOutline.dbugActualPosToConsole = _contourAnalysisOpts.WriteFitOutputToConsole; GlyphDynamicOutline.dbugUseHorizontalFitValue = _contourAnalysisOpts.UseHorizontalFitAlignment; #endif char[] printTextBuffer = this.txtInputChar.Text.ToCharArray(); float x_pos = 0, y_pos = 200; float lineSpacingPx = selectedTextPrinter.FontLineSpacingPx; for (int i = 0; i < 1; ++i) { selectedTextPrinter.DrawString(printTextBuffer, x_pos, y_pos); y_pos -= lineSpacingPx; } //copy from Agg's memory buffer to gdi PixelFarm.Agg.Imaging.BitmapHelper.CopyToGdiPlusBitmapSameSize(destImg, winBmp); g.Clear(Color.White); g.DrawImage(winBmp, new Point(10, 0)); } break; //============================================== //render 1 glyph for debug and test case TypographyTest.RenderChoice.RenderWithMsdfGen: case TypographyTest.RenderChoice.RenderWithSdfGen: { char testChar = this.txtInputChar.Text[0]; Typeface typeFace = _basicOptions.Typeface; RenderWithMsdfImg(typeFace, testChar, _basicOptions.FontSizeInPoints); } break; case TypographyTest.RenderChoice.RenderWithMiniAgg_SingleGlyph: { selectedTextPrinter = _devVxsTextPrinter; //for test only 1 char RenderSingleCharWithMiniAgg( _basicOptions.Typeface, this.txtInputChar.Text[0], _basicOptions.FontSizeInPoints); } break; default: throw new NotSupportedException(); } }
public void BindPrinter(DevTextPrinterBase printer) { _printer = printer; }
private void button1_Click(object sender, EventArgs e) { selectedTextPrinter = _devVxsTextPrinter; selectedTextPrinter.Typeface = _basicOptions.Typeface; selectedTextPrinter.FontSizeInPoints = _basicOptions.FontSizeInPoints; selectedTextPrinter.ScriptLang = _basicOptions.ScriptLang; selectedTextPrinter.PositionTechnique = _basicOptions.PositionTech; selectedTextPrinter.HintTechnique = HintTechnique.None; selectedTextPrinter.EnableLigature = true; _devVxsTextPrinter.UpdateGlyphLayoutSettings(); //------- var editableTextBlockLayoutEngine = new EditableTextBlockLayoutEngine(); editableTextBlockLayoutEngine.DefaultTypeface = _basicOptions.Typeface; editableTextBlockLayoutEngine.FontSizeInPts = _basicOptions.FontSizeInPoints; editableTextBlockLayoutEngine.LoadText("ABCD\r\n EFGH!"); editableTextBlockLayoutEngine.DoLayout(); //then we render the output to the screen //see UpdateRenderOutput() code //clear previous draw //---------------- //------------- painter.Clear(PixelFarm.Drawing.Color.White); painter.UseSubPixelLcdEffect = false; painter.FillColor = PixelFarm.Drawing.Color.Black; _devVxsTextPrinter.TargetCanvasPainter = painter; List <EditableTextLine> textlines = editableTextBlockLayoutEngine.UnsafeGetEditableTextLine(); //render eachline with painter int lineCount = textlines.Count; float x = 0; int y = 200; int lineSpacing = (int)_devVxsTextPrinter.FontLineSpacingPx; for (int i = 0; i < lineCount; ++i) { EditableTextLine line = textlines[i]; List <IRun> runs = line.UnsageGetTextRunList(); int runCount = runs.Count; for (int r = 0; r < runCount; ++r) { IRun run = runs[r]; TextRun textRun = run as TextRun; if (textRun == null) { continue; } // GlyphPlanSequence seq = textRun.GetGlyphPlanSeq(); _devVxsTextPrinter.DrawFromGlyphPlans( GlyphPlanSequence.UnsafeGetInteralGlyphPlanList(seq), seq.startAt, seq.len, x, y); x += run.Width; y -= lineSpacing; //next line? } x = 0; //reset at newline } //---------- //use this util to copy image from Agg actual image to System.Drawing.Bitmap PixelFarm.Agg.Imaging.BitmapHelper.CopyToGdiPlusBitmapSameSize(painter.RenderSurface.DestActualImage, winBmp); //---------------- //copy from Agg's memory buffer to gdi //PixelFarm.Agg.Imaging.BitmapHelper.CopyToGdiPlusBitmapSameSize(destImg, winBmp); g.Clear(Color.White); g.DrawImage(winBmp, new Point(10, 0)); }
public Form1() { InitializeComponent(); _devVxsTextPrinter = new DevVxsTextPrinter(); _devGdiTextPrinter = new DevGdiTextPrinter(); this.sampleTextBox1.Visible = false; selectedTextPrinter = _devVxsTextPrinter; //default //set script lang, //test with Thai for 'complex script' _devGdiTextPrinter.ScriptLang = _devVxsTextPrinter.ScriptLang = Typography.OpenFont.ScriptLangs.Thai; _devGdiTextPrinter.PositionTechnique = _devVxsTextPrinter.PositionTechnique = PositionTechnique.OpenFont; this.Load += new EventHandler(Form1_Load); this.txtGridSize.KeyDown += TxtGridSize_KeyDown; //---------- txtInputChar.TextChanged += (s, e) => UpdateRenderOutput(); //---------- cmbRenderChoices.Items.Add(RenderChoice.RenderWithMiniAgg_SingleGlyph); cmbRenderChoices.Items.Add(RenderChoice.RenderWithGdiPlusPath); cmbRenderChoices.Items.Add(RenderChoice.RenderWithTextPrinterAndMiniAgg); cmbRenderChoices.Items.Add(RenderChoice.RenderWithMsdfGen); cmbRenderChoices.SelectedIndex = 2; cmbRenderChoices.SelectedIndexChanged += (s, e) => UpdateRenderOutput(); //---------- cmbPositionTech.Items.Add(PositionTechnique.OpenFont); cmbPositionTech.Items.Add(PositionTechnique.Kerning); cmbPositionTech.Items.Add(PositionTechnique.None); cmbPositionTech.SelectedIndex = 0; cmbPositionTech.SelectedIndexChanged += (s, e) => UpdateRenderOutput(); //---------- lstHintList.Items.Add(HintTechnique.None); lstHintList.Items.Add(HintTechnique.TrueTypeInstruction); lstHintList.Items.Add(HintTechnique.TrueTypeInstruction_VerticalOnly); lstHintList.Items.Add(HintTechnique.CustomAutoFit); lstHintList.SelectedIndex = 0; lstHintList.SelectedIndexChanged += (s, e) => UpdateRenderOutput(); //---------- //---------- //share text printer to our sample textbox //but you can create another text printer that specific to text textbox control Graphics gx = this.sampleTextBox1.CreateGraphics(); _controllerForGdi.TextPrinter = _devGdiTextPrinter; _controllerForGdi.BindHostGraphics(gx); //---------- _controllerForPixelFarm.TextPrinter = _devVxsTextPrinter; _controllerForPixelFarm.BindHostGraphics(gx); //---------- this.sampleTextBox1.SetController(_controllerForPixelFarm); button1.Click += (s, e) => UpdateRenderOutput(); chkShowGrid.CheckedChanged += (s, e) => UpdateRenderOutput(); chkShowTess.CheckedChanged += (s, e) => UpdateRenderOutput(); chkXGridFitting.CheckedChanged += (s, e) => UpdateRenderOutput(); chkYGridFitting.CheckedChanged += (s, e) => UpdateRenderOutput(); chkFillBackground.CheckedChanged += (s, e) => UpdateRenderOutput(); chkLcdTechnique.CheckedChanged += (s, e) => UpdateRenderOutput(); chkDrawBone.CheckedChanged += (s, e) => UpdateRenderOutput(); chkGsubEnableLigature.CheckedChanged += (s, e) => UpdateRenderOutput(); chkShowTess.CheckedChanged += (s, e) => UpdateRenderOutput(); //---------- lstFontSizes.Items.AddRange( new object[] { 8, 9, 10, 11, 12, 14, 16, 18, 20, 22, 24, 26, 28, 36, 48, 72, 240, 300, 360 }); lstFontSizes.SelectedIndexChanged += (s, e) => { //new font size _fontSizeInPts = (int)lstFontSizes.SelectedItem; UpdateRenderOutput(); }; //---------- //simple load test fonts from local test dir //and send it into test list int selectedFileIndex = -1; //string selectedFontFileName = "pala.ttf"; string selectedFontFileName = "tahoma.ttf"; //string selectedFontFileName="cambriaz.ttf"; //string selectedFontFileName="CompositeMS2.ttf"; int fileIndexCount = 0; foreach (string file in Directory.GetFiles("..\\..\\..\\TestFonts", "*.ttf")) { var tmpLocalFile = new TempLocalFontFile(file); lstFontList.Items.Add(tmpLocalFile); if (selectedFileIndex < 0 && tmpLocalFile.OnlyFileName == selectedFontFileName) { selectedFileIndex = fileIndexCount; _selectedFontFilename = file; } fileIndexCount++; } if (selectedFileIndex < 0) { selectedFileIndex = 0; } lstFontList.SelectedIndex = selectedFileIndex; lstFontList.SelectedIndexChanged += (s, e) => { _selectedFontFilename = ((TempLocalFontFile)lstFontList.SelectedItem).actualFileName; UpdateRenderOutput(); }; //---------------- //string inputstr = "ก้า"; string inputstr = "น้ำน้ำ"; //string inputstr = "fi"; //string inputstr = "ก่นกิ่น"; //string inputstr = "ญญู"; //string inputstr = "ป่า"; //for gpos test //string inputstr = "快速上手"; //---------------- this.txtInputChar.Text = inputstr; this.chkFillBackground.Checked = true; }
void UpdateRenderOutput() { if (g == null) { destImg = new ActualImage(400, 300, PixelFormat.ARGB32); imgGfx2d = new ImageGraphics2D(destImg); //no platform p = new AggCanvasPainter(imgGfx2d); winBmp = new Bitmap(400, 300, System.Drawing.Imaging.PixelFormat.Format32bppArgb); g = this.CreateGraphics(); _devVxsTextPrinter.TargetCanvasPainter = p; _devGdiTextPrinter.TargetGraphics = g; } if (string.IsNullOrEmpty(this.txtInputChar.Text)) { return; } var hintTech = (HintTechnique)lstHintList.SelectedItem; //1. read typeface from font file RenderChoice renderChoice = (RenderChoice)this.cmbRenderChoices.SelectedItem; switch (renderChoice) { case RenderChoice.RenderWithGdiPlusPath: { selectedTextPrinter = _devGdiTextPrinter; selectedTextPrinter.FontFilename = _selectedFontFilename; selectedTextPrinter.FontSizeInPoints = _fontSizeInPts; selectedTextPrinter.HintTechnique = hintTech; selectedTextPrinter.PositionTechnique = (PositionTechnique)cmbPositionTech.SelectedItem; // selectedTextPrinter.DrawString(this.txtInputChar.Text.ToCharArray(), 0, 0); } break; case RenderChoice.RenderWithTextPrinterAndMiniAgg: { //clear previous draw p.Clear(PixelFarm.Drawing.Color.White); p.UseSubPixelRendering = chkLcdTechnique.Checked; p.FillColor = PixelFarm.Drawing.Color.Black; selectedTextPrinter = _devVxsTextPrinter; selectedTextPrinter.FontFilename = _selectedFontFilename; selectedTextPrinter.FontSizeInPoints = _fontSizeInPts; selectedTextPrinter.HintTechnique = hintTech; selectedTextPrinter.PositionTechnique = (PositionTechnique)cmbPositionTech.SelectedItem; //test print 3 lines char[] printTextBuffer = this.txtInputChar.Text.ToCharArray(); float x_pos = 0, y_pos = 200; float lineSpacingPx = selectedTextPrinter.FontLineSpacingPx; for (int i = 0; i < 3; ++i) { selectedTextPrinter.DrawString(printTextBuffer, x_pos, y_pos); y_pos -= lineSpacingPx; } //copy from Agg's memory buffer to gdi PixelFarm.Agg.Imaging.BitmapHelper.CopyToGdiPlusBitmapSameSize(destImg, winBmp); g.Clear(Color.White); g.DrawImage(winBmp, new Point(10, 0)); } break; //============================================== //render 1 glyph for debug and test case RenderChoice.RenderWithMsdfGen: case RenderChoice.RenderWithSdfGen: { char testChar = this.txtInputChar.Text[0]; using (var fs = new FileStream(_selectedFontFilename, FileMode.Open)) { var reader = new OpenFontReader(); Typeface typeFace = reader.Read(fs); RenderWithMsdfImg(typeFace, testChar, _fontSizeInPts); } } break; case RenderChoice.RenderWithMiniAgg_SingleGlyph: { //for test only 1 char char testChar = this.txtInputChar.Text[0]; using (var fs = new FileStream(_selectedFontFilename, FileMode.Open)) { var reader = new OpenFontReader(); Typeface typeFace = reader.Read(fs); RenderWithMiniAgg(typeFace, testChar, _fontSizeInPts); } } break; default: throw new NotSupportedException(); } }