Пример #1
0
        GlyphBitmap GetGlyphBitmapFromSvg(ushort glyphIndex)
        {
            //TODO: use string builder from pool?

            var stbuilder = new System.Text.StringBuilder();

            _typeface.ReadSvgContent(glyphIndex, stbuilder);

            float target_advW = _typeface.GetAdvanceWidthFromGlyphIndex(glyphIndex) * _px_scale;

            var req = new PixelFarm.Drawing.SvgBmpBuilderReq
            {
                SvgContent     = stbuilder,
                DefaultBgColor = Color.Transparent,
                ExpectedWidth  = target_advW
            };

            _svgBmpBuilderFunc.Invoke(req);

            MemBitmap memBmp = req.Output;

            if (memBmp == null)
            {
                //TODO: use blank img?
                return(null);
            }

            //TODO... review this again
            short offset_x = (short)req.BitmapXOffset;
            short offset_y = (short)req.BitmapYOffset;

            return(new GlyphBitmap
            {
                Bitmap = memBmp,
                Width = memBmp.Width,
                Height = memBmp.Height,
                ImageStartX = -offset_x, //offset back
                ImageStartY = -offset_y  //offset back
            });
        }
Пример #2
0
        public static void ParseAndRenderSvg(PixelFarm.Drawing.SvgBmpBuilderReq req)
        {
            //----------
            //copy from HtmlRenderer's SvgViewer demo
            //----------
            var          docBuilder   = new VgDocBuilder();
            var          parser       = new SvgParser(docBuilder);
            TextSnapshot textSnapshot = new TextSnapshot(req.SvgContent.ToString());

            parser.ParseDocument(textSnapshot);

            VgVisualDocBuilder builder   = new VgVisualDocBuilder();
            VgVisualElement    vgVisElem = builder.CreateVgVisualDoc(docBuilder.ResultDocument, _vgDocHost).VgRootElem;

            PixelFarm.CpuBlit.VertexProcessing.Q1RectD bounds = vgVisElem.GetRectBounds();

            float actualXOffset = (float)-bounds.Left;
            float actualYOffset = (float)-bounds.Bottom;

            //original svg width, height
            int bmpW = (int)Math.Round(bounds.Width);
            int bmpH = (int)Math.Round(bounds.Height);

            if (bmpW == 0 || bmpH == 0)
            {
                return;
            }

            //scale svg to specific size
            float scale_w = req.ExpectedWidth / bmpW;

            //at this point, we have 2 options
            //1) create bitmap with original svg size and scale it down to expected size
            //2) scale svg to expected size and create a bitmap

            //we choose 2)

            int new_w = (int)Math.Round(bmpW * scale_w);
            int new_h = (int)Math.Round(bmpH * scale_w);

            MemBitmap memBitmap = new MemBitmap(new_w, new_h);

            using (Tools.BorrowAggPainter(memBitmap, out var p))
                using (Tools.More.BorrowVgPaintArgs(p, out VgPaintArgs paintArgs))
                {
                    //pass by

                    Affine tx = Affine.NewScaling(scale_w);
                    paintArgs._currentTx = tx;

                    float orgX = p.OriginX;
                    float orgY = p.OriginY;


                    p.SetOrigin(actualXOffset * scale_w, actualYOffset * scale_w);

                    p.Clear(req.DefaultBgColor);

                    p.FillColor = PixelFarm.Drawing.Color.Black;

                    double prevStrokeW = p.StrokeWidth;

                    vgVisElem.Paint(paintArgs);

                    p.StrokeWidth = prevStrokeW; //restore

                    p.SetOrigin(orgX, orgY);     //restore
                }

#if DEBUG
            //memBitmap.SaveImage("svg.png");
#endif
            req.Output = memBitmap;
        }