public void SetUp() { // create a BitmapComparator comparator = new BitmapComparator(); // create an SVGWindow and an associated GdiRenderer renderer = new GdiRenderer(); window = new SvgWindow(75,75, renderer); }
private Image getImage(RectangleF bounds) { GdiRenderer renderer = new GdiRenderer(); renderer.Window = _patternElement.OwnerDocument.Window as SvgWindow; SvgSvgElement elm = moveIntoSvgElement(); Image img = renderer.Render(elm as SvgElement); moveOutOfSvgElement(elm); return img; }
public SvgPictureBox() { InitializeComponent(); SetStyle(ControlStyles.UserPaint, true); SetStyle(ControlStyles.AllPaintingInWmPaint, true); SetStyle(ControlStyles.DoubleBuffer, true); scriptEngineByMimeType = new TypeDictionary(); SetMimeTypeEngineType("application/ecmascript", typeof(JScriptEngine)); renderer = new GdiRenderer(); renderer.OnRender = new RenderEvent(this.OnRender); window = new SvgWindow(this, renderer); }
private void PaintMarkers(GdiRenderer renderer, SvgStyleableElement styleElm, GraphicsWrapper gr) { // OPTIMIZE if (styleElm is ISharpMarkerHost) { string markerStartUrl = extractMarkerUrl(styleElm.GetPropertyValue("marker-start", "marker")); string markerMiddleUrl = extractMarkerUrl(styleElm.GetPropertyValue("marker-mid", "marker")); string markerEndUrl = extractMarkerUrl(styleElm.GetPropertyValue("marker-end", "marker")); RenderingNode grNode; if (markerStartUrl.Length > 0) { grNode = renderer.GetGraphicsNodeByUri(styleElm.BaseURI, markerStartUrl); if (grNode is SvgMarkerGraphicsNode) { ((SvgMarkerGraphicsNode)grNode).PaintMarker(renderer, gr, SvgMarkerPosition.Start, styleElm); } } if (markerMiddleUrl.Length > 0) { // TODO markerMiddleUrl != markerStartUrl grNode = renderer.GetGraphicsNodeByUri(styleElm.BaseURI, markerMiddleUrl); if (grNode is SvgMarkerGraphicsNode) { ((SvgMarkerGraphicsNode)grNode).PaintMarker(renderer, gr, SvgMarkerPosition.Mid, styleElm); } } if (markerEndUrl.Length > 0) { // TODO: markerEndUrl != markerMiddleUrl grNode = renderer.GetGraphicsNodeByUri(styleElm.BaseURI, markerEndUrl); if (grNode is SvgMarkerGraphicsNode) { ((SvgMarkerGraphicsNode)grNode).PaintMarker(renderer, gr, SvgMarkerPosition.End, styleElm); } } } }
public SvgImageWidget() { //scriptEngineByMimeType = new TypeDictionary(); //SetMimeTypeEngineType("application/ecmascript", //typeof(JScriptEngine)); this.Events = this.Events | Gdk.EventMask.ButtonPressMask | Gdk.EventMask.ButtonReleaseMask | Gdk.EventMask.PointerMotionMask | Gdk.EventMask.EnterNotifyMask | Gdk.EventMask.LeaveNotifyMask | Gdk.EventMask.ScrollMask; this.CanFocus = true; renderer = new GdiRenderer(); renderer.OnRender += OnRender; window = new SvgWindow(this.Allocation.Width, this.Allocation.Height, renderer); }
public void PaintMarker(GdiRenderer renderer, GraphicsWrapper gr, SvgMarkerPosition markerPos, SvgStyleableElement refElement) { ISharpMarkerHost markerHostElm = (ISharpMarkerHost)refElement; SvgMarkerElement markerElm = (SvgMarkerElement) element; PointF[] vertexPositions = markerHostElm.MarkerPositions; int start; int len; // Choose which part of the position array to use switch (markerPos) { case SvgMarkerPosition.Start: start = 0; len = 1; break; case SvgMarkerPosition.Mid: start = 1; len = vertexPositions.Length - 2; break; default: // == MarkerPosition.End start = vertexPositions.Length-1; len = 1; break; } for ( int i = start; i<start+len; i++ ) { PointF point = vertexPositions[i]; GraphicsContainerWrapper gc = gr.BeginContainer(); gr.TranslateTransform(point.X, point.Y); if ( markerElm.OrientType.AnimVal.Equals(SvgMarkerOrient.Angle) ) { gr.RotateTransform((float)markerElm.OrientAngle.AnimVal.Value); } else { float angle; switch(markerPos) { case SvgMarkerPosition.Start: angle = markerHostElm.GetStartAngle(i + 1); break; case SvgMarkerPosition.Mid: //angle = (markerHostElm.GetEndAngle(i) + markerHostElm.GetStartAngle(i + 1)) / 2; angle = SvgNumber.CalcAngleBisection(markerHostElm.GetEndAngle(i), markerHostElm.GetStartAngle(i + 1)); break; default: angle = markerHostElm.GetEndAngle(i); break; } gr.RotateTransform(angle); } if ( markerElm.MarkerUnits.AnimVal.Equals(SvgMarkerUnit.StrokeWidth) ) { SvgLength strokeWidthLength = new SvgLength(refElement, "stroke-width", SvgLengthSource.Css, SvgLengthDirection.Viewport, "1"); float strokeWidth = (float)strokeWidthLength.Value; gr.ScaleTransform(strokeWidth, strokeWidth); } SvgPreserveAspectRatio spar = (SvgPreserveAspectRatio)markerElm.PreserveAspectRatio.AnimVal; float[] translateAndScale = spar.FitToViewBox( (SvgRect)markerElm.ViewBox.AnimVal, new SvgRect( 0, 0, (float)markerElm.MarkerWidth.AnimVal.Value, (float)markerElm.MarkerHeight.AnimVal.Value) ); gr.TranslateTransform( -(float)markerElm.RefX.AnimVal.Value * translateAndScale[2], -(float)markerElm.RefY.AnimVal.Value * translateAndScale[3] ); gr.ScaleTransform(translateAndScale[2], translateAndScale[3]); Clip(gr); markerElm.RenderChildren(renderer); gr.EndContainer(gc); } }
public void PaintMarker(GdiRenderer renderer, GraphicsWrapper gr, SvgMarkerPosition markerPos, SvgStyleableElement refElement) { ISharpMarkerHost markerHostElm = (ISharpMarkerHost)refElement; SvgMarkerElement markerElm = (SvgMarkerElement)element; PointF[] vertexPositions = markerHostElm.MarkerPositions; int start; int len; // Choose which part of the position array to use switch (markerPos) { case SvgMarkerPosition.Start: start = 0; len = 1; break; case SvgMarkerPosition.Mid: start = 1; len = vertexPositions.Length - 2; break; default: // == MarkerPosition.End start = vertexPositions.Length - 1; len = 1; break; } for (int i = start; i < start + len; i++) { PointF point = vertexPositions[i]; GraphicsContainerWrapper gc = gr.BeginContainer(); gr.TranslateTransform(point.X, point.Y); if (markerElm.OrientType.AnimVal.Equals(SvgMarkerOrient.Angle)) { gr.RotateTransform((float)markerElm.OrientAngle.AnimVal.Value); } else { float angle; switch (markerPos) { case SvgMarkerPosition.Start: angle = markerHostElm.GetStartAngle(i + 1); break; case SvgMarkerPosition.Mid: //angle = (markerHostElm.GetEndAngle(i) + markerHostElm.GetStartAngle(i + 1)) / 2; angle = SvgNumber.CalcAngleBisection(markerHostElm.GetEndAngle(i), markerHostElm.GetStartAngle(i + 1)); break; default: angle = markerHostElm.GetEndAngle(i); break; } gr.RotateTransform(angle); } if (markerElm.MarkerUnits.AnimVal.Equals(SvgMarkerUnit.StrokeWidth)) { SvgLength strokeWidthLength = new SvgLength(refElement, "stroke-width", SvgLengthSource.Css, SvgLengthDirection.Viewport, "1"); float strokeWidth = (float)strokeWidthLength.Value; gr.ScaleTransform(strokeWidth, strokeWidth); } SvgPreserveAspectRatio spar = (SvgPreserveAspectRatio)markerElm.PreserveAspectRatio.AnimVal; float[] translateAndScale = spar.FitToViewBox( (SvgRect)markerElm.ViewBox.AnimVal, new SvgRect( 0, 0, (float)markerElm.MarkerWidth.AnimVal.Value, (float)markerElm.MarkerHeight.AnimVal.Value) ); gr.TranslateTransform( -(float)markerElm.RefX.AnimVal.Value * translateAndScale[2], -(float)markerElm.RefY.AnimVal.Value * translateAndScale[3] ); gr.ScaleTransform(translateAndScale[2], translateAndScale[3]); Clip(gr); markerElm.RenderChildren(renderer); gr.EndContainer(gc); } }
/// <summary> /// The following code will load the SVGDOM, render to a emf, and /// place the EMF on the clipboard. Kt seems more complicated than it should /// see http://www.dotnet247.com/247reference/msgs/23/118514.aspx /// for why the straight forward solution does not work. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void miCopy_Click( object sender, System.EventArgs e) { if (svgUrlCombo.Text.Length > 0) { int width = 500; int height = 500; // make SVG document with associated window so we can render it. SvgWindow window = new SvgWindow(width, height, null); GdiRenderer renderer = new GdiRenderer(); renderer.Window = window; window.Renderer = renderer; window.Src = svgUrlCombo.Text; // copy and paste code taken from // http://www.dotnet247.com/247reference/msgs/23/117611.aspx // putting a plain MetaFile on the clipboard does not work. // .Net's metafile format is not recognised by most programs. Graphics g = CreateGraphics(); IntPtr hdc = g.GetHdc(); Metafile m = new Metafile(hdc, EmfType.EmfOnly); g.ReleaseHdc(hdc); g.Dispose(); g = Graphics.FromImage(m); // draw the SVG here // NOTE: the graphics object is automatically Disposed by the // GdiRenderer. renderer.Graphics = g; renderer.Render(window.Document as SvgDocument); //window.Render(); // put meta file on the clipboard. IntPtr hwnd = this.Handle; if (Win32.OpenClipboard(hwnd)) { Win32.EmptyClipboard(); IntPtr hemf = m.GetHenhmetafile(); Win32.SetClipboardData(14, hemf); //CF_ENHMETAFILE=14 Win32.CloseClipboard(); } } }
private void PaintMarkers(GdiRenderer renderer, SvgStyleableElement styleElm, GraphicsWrapper gr) { // OPTIMIZE if ( styleElm is ISharpMarkerHost ) { string markerStartUrl = extractMarkerUrl(styleElm.GetPropertyValue("marker-start", "marker")); string markerMiddleUrl = extractMarkerUrl(styleElm.GetPropertyValue("marker-mid", "marker")); string markerEndUrl = extractMarkerUrl(styleElm.GetPropertyValue("marker-end", "marker")); RenderingNode grNode; if ( markerStartUrl.Length > 0 ) { grNode = renderer.GetGraphicsNodeByUri(styleElm.BaseURI, markerStartUrl); if (grNode is SvgMarkerGraphicsNode) { ((SvgMarkerGraphicsNode) grNode).PaintMarker(renderer, gr, SvgMarkerPosition.Start, styleElm); } } if ( markerMiddleUrl.Length > 0 ) { // TODO markerMiddleUrl != markerStartUrl grNode = renderer.GetGraphicsNodeByUri(styleElm.BaseURI, markerMiddleUrl); if ( grNode is SvgMarkerGraphicsNode ) { ((SvgMarkerGraphicsNode) grNode).PaintMarker(renderer, gr, SvgMarkerPosition.Mid, styleElm); } } if ( markerEndUrl.Length > 0 ) { // TODO: markerEndUrl != markerMiddleUrl grNode = renderer.GetGraphicsNodeByUri(styleElm.BaseURI, markerEndUrl); if(grNode is SvgMarkerGraphicsNode) { ((SvgMarkerGraphicsNode) grNode).PaintMarker(renderer, gr, SvgMarkerPosition.End, styleElm); } } } }
private int singleRun(string filePath, bool saveLocal, bool saveImage) { DateTime startTime = DateTime.Now; GdiRenderer gdiRenderer = new GdiRenderer(); SvgWindow wnd = new SvgWindow(300, 300, gdiRenderer); SvgDocument doc = new SvgDocument(wnd); wnd.Document = doc; doc.Load(filePath); //wnd.Render(); if(((GdiRenderer)wnd.Renderer).RasterImage == null) { Console.WriteLine("ERROR: no image rendered"); } DateTime endTime = DateTime.Now; TimeSpan diff = endTime - startTime; if(saveLocal) { doc.Save(localPath); } if(saveImage) { ((GdiRenderer)wnd.Renderer).RasterImage.Save(imgPath, System.Drawing.Imaging.ImageFormat.Png); Console.WriteLine("Reference image saved as :\n" + imgPath); } wnd.Renderer = null; wnd = null; doc = null; return (int)diff.TotalMilliseconds; }
public override void Render(ISvgRenderer renderer) { GdiRenderer gdiRenderer = renderer as GdiRenderer; GraphicsWrapper graphics = gdiRenderer.GraphicsWrapper; if (!(element is SvgClipPathElement) && !(element.ParentNode is SvgClipPathElement)) { SvgStyleableElement styleElm = element as SvgStyleableElement; if (styleElm != null) { string sVisibility = styleElm.GetPropertyValue("visibility"); string sDisplay = styleElm.GetPropertyValue("display"); if (element is ISharpGDIPath && sVisibility != "hidden" && sDisplay != "none") { GraphicsPath gp = ((ISharpGDIPath)element).GetGraphicsPath(); if (gp != null) { Clip(graphics); GdiSvgPaint fillPaint = new GdiSvgPaint(styleElm, "fill"); Brush brush = fillPaint.GetBrush(gp); GdiSvgPaint strokePaint = new GdiSvgPaint(styleElm, "stroke"); Pen pen = strokePaint.GetPen(gp); if (brush != null) { if (brush is PathGradientBrush) { GradientPaintServer gps = fillPaint.PaintServer as GradientPaintServer; //GraphicsContainer container = graphics.BeginContainer(); graphics.SetClip(gps.GetRadialGradientRegion(gp.GetBounds()), CombineMode.Exclude); SolidBrush tempBrush = new SolidBrush(((PathGradientBrush)brush).InterpolationColors.Colors[0]); graphics.FillPath(this, tempBrush, gp); tempBrush.Dispose(); graphics.ResetClip(); //graphics.EndContainer(container); } graphics.FillPath(this, brush, gp); brush.Dispose(); } if (pen != null) { if (pen.Brush is PathGradientBrush) { GradientPaintServer gps = strokePaint.PaintServer as GradientPaintServer; GraphicsContainerWrapper container = graphics.BeginContainer(); graphics.SetClip(gps.GetRadialGradientRegion(gp.GetBounds()), CombineMode.Exclude); SolidBrush tempBrush = new SolidBrush(((PathGradientBrush)pen.Brush).InterpolationColors.Colors[0]); Pen tempPen = new Pen(tempBrush, pen.Width); graphics.DrawPath(this, tempPen, gp); tempPen.Dispose(); tempBrush.Dispose(); graphics.EndContainer(container); } graphics.DrawPath(this, pen, gp); pen.Dispose(); } } } PaintMarkers(gdiRenderer, styleElm, graphics); } } }
public void SetUp() { renderer = new GdiRenderer(); wnd = new SvgWindow(75, 75, renderer); doc = new SvgDocument(wnd); }