Example #1
0
        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();
            }
        }
Example #2
0
        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));
        }
Example #3
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;
 }
Example #5
0
        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));
        }
Example #6
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;
        }
Example #7
0
        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();
            }
        }