// disable default rendering public override void BeforeRender(WpfDrawingRenderer renderer) { base.BeforeRender(renderer); _matrix = Matrix.Identity; WpfDrawingContext context = renderer.Context; _drawGroup = new DrawingGroup(); //string elementId = this.GetElementName(); //if (!String.IsNullOrEmpty(elementId)) //{ // _drawGroup.SetValue(FrameworkElement.NameProperty, elementId); //} DrawingGroup currentGroup = context.Peek(); if (currentGroup == null) { throw new InvalidOperationException("An existing group is expected."); } currentGroup.Children.Add(_drawGroup); context.Push(_drawGroup); }
public override void AfterRender(WpfDrawingRenderer renderer) { Debug.Assert(_drawGroup != null); WpfDrawingContext context = renderer.Context; DrawingGroup currentGroup = context.Peek(); if (currentGroup == null || currentGroup != _drawGroup) { throw new InvalidOperationException("An existing group is expected."); } // Remove the added group from the stack... context.Pop(); // If the group is empty, we simply remove it... if (_drawGroup.Children.Count == 0 && _drawGroup.ClipGeometry == null && _drawGroup.Transform == null) { currentGroup = context.Peek(); if (currentGroup != null) { currentGroup.Children.Remove(_drawGroup); } } base.AfterRender(renderer); }
public override void Render(WpfDrawingRenderer renderer) { Geometry clipGeom = this.ClipGeometry; Transform transform = this.Transform; if (clipGeom != null || transform != null) { WpfDrawingContext context = renderer.Context; _drawGroup = new DrawingGroup(); DrawingGroup currentGroup = context.Peek(); if (currentGroup == null) { throw new InvalidOperationException("An existing group is expected."); } currentGroup.Children.Add(_drawGroup); context.Push(_drawGroup); if (clipGeom != null) { _drawGroup.ClipGeometry = clipGeom; } if (transform != null) { _drawGroup.Transform = transform; } } base.Render(renderer); }
/// <summary> /// Initializes a new instance of the <see cref="FileSvgConverter"/> class /// with the specified drawing or rendering settings and the saving options. /// </summary> /// <param name="saveXaml"> /// This specifies whether to save result object tree in XAML file. /// </param> /// <param name="saveZaml"> /// This specifies whether to save result object tree in ZAML file. The /// ZAML is simply a G-Zip compressed XAML format, similar to the SVGZ. /// </param> /// <param name="settings"> /// This specifies the settings used by the rendering or drawing engine. /// If this is <see langword="null"/>, the default settings is used. /// </param> public FileSvgConverter(bool saveXaml, bool saveZaml, WpfDrawingSettings settings) : base(saveXaml, saveZaml, settings) { _wpfRenderer = new WpfDrawingRenderer(this.DrawingSettings); _wpfWindow = new WpfSvgWindow(640, 480, _wpfRenderer); }
public override void BeforeRender(WpfDrawingRenderer renderer) { base.BeforeRender(renderer); WpfDrawingContext context = renderer.Context; _drawGroup = new DrawingGroup(); string elementId = this.GetElementName(); if (!String.IsNullOrEmpty(elementId) && !context.IsRegisteredId(elementId)) { _drawGroup.SetValue(FrameworkElement.NameProperty, elementId); context.RegisterId(elementId); if (context.IncludeRuntime) { SvgObject.SetId(_drawGroup, elementId); } } DrawingGroup currentGroup = context.Peek(); if (currentGroup == null) { throw new InvalidOperationException("An existing group is expected."); } currentGroup.Children.Add(_drawGroup); context.Push(_drawGroup); }
public override void AfterRender(WpfDrawingRenderer renderer) { if (_isLayer) { WpfDrawingContext context = renderer.Context; context.Pop(); base.AfterRender(renderer); return; } if (_drawGroup != null) { WpfDrawingContext context = renderer.Context; if (context.IncludeRuntime) { // Add the element/object type... SvgObject.SetType(_drawGroup, SvgObjectType.Link); // Add title for tooltips, if any... SvgTitleElement titleElement = this.GetTitleElement(); if (titleElement != null) { string titleValue = titleElement.InnerText; if (!String.IsNullOrEmpty(titleValue)) { SvgObject.SetTitle(_drawGroup, titleValue); } } } DrawingGroup currentGroup = context.Peek(); if (currentGroup == null || currentGroup != _drawGroup) { throw new InvalidOperationException("An existing group is expected."); } context.Pop(); // If not aggregated by a link visitor, we remove it from the links/animation and // add it to the main drawing stack... if (!_isAggregated) { if (context.Links.Children.Remove(_drawGroup)) { currentGroup = context.Peek(); currentGroup.Children.Add(_drawGroup); } } } base.AfterRender(renderer); }
public override void BeforeRender(WpfDrawingRenderer renderer) { if (renderer == null) { return; } WpfDrawingContext context = renderer.Context; SetQuality(context); SetTransform(context); SetMask(context); }
public override void AfterRender(WpfDrawingRenderer renderer) { Debug.Assert(_drawGroup != null); WpfDrawingContext context = renderer.Context; DrawingGroup currentGroup = context.Peek(); if (currentGroup == null || currentGroup != _drawGroup) { throw new InvalidOperationException("An existing group is expected."); } context.Pop(); base.AfterRender(renderer); }
protected void SetMask(WpfDrawingContext context) { _maskUnits = SvgUnitType.UserSpaceOnUse; _maskContentUnits = SvgUnitType.UserSpaceOnUse; CssPrimitiveValue maskPath = _svgElement.GetComputedCssValue("mask", string.Empty) as CssPrimitiveValue; SvgMaskElement maskElement = null; if (maskPath != null && maskPath.PrimitiveType == CssPrimitiveType.Uri) { string absoluteUri = _svgElement.ResolveUri(maskPath.GetStringValue()); maskElement = _svgElement.OwnerDocument.GetNodeByUri(absoluteUri) as SvgMaskElement; } else if (string.Equals(_svgElement.ParentNode.LocalName, "use", StringComparison.OrdinalIgnoreCase)) { var parentElement = _svgElement.ParentNode as SvgElement; maskPath = parentElement.GetComputedCssValue("mask", string.Empty) as CssPrimitiveValue; if (maskPath != null && maskPath.PrimitiveType == CssPrimitiveType.Uri) { string absoluteUri = _svgElement.ResolveUri(maskPath.GetStringValue()); maskElement = _svgElement.OwnerDocument.GetNodeByUri(absoluteUri) as SvgMaskElement; } } if (maskElement != null) { if (maskElement.IsHiddenCss) { this.Masking = Brushes.Transparent; return; } WpfDrawingRenderer renderer = new WpfDrawingRenderer(); renderer.Window = _svgElement.OwnerDocument.Window as SvgWindow; WpfDrawingSettings settings = context.Settings.Clone(); settings.TextAsGeometry = true; WpfDrawingContext maskContext = new WpfDrawingContext(true, settings); //maskContext.Initialize(null, context.FontFamilyVisitor, null); maskContext.Initialize(context.LinkVisitor, context.FontFamilyVisitor, context.ImageVisitor); renderer.RenderMask(maskElement, maskContext); DrawingGroup maskDrawing = renderer.Drawing; if (maskDrawing.Children.Count == 0 || maskDrawing.Opacity == 0) { this.Masking = Brushes.Transparent; return; } else if (maskDrawing.Children.Count == 1) { var childGroup = maskDrawing.Children[0] as DrawingGroup; if (childGroup != null && (childGroup.Children.Count == 0 || childGroup.Opacity == 0)) { this.Masking = Brushes.Transparent; return; } } Rect bounds = new Rect(0, 0, 1, 1); //Rect destRect = GetMaskDestRect(maskElement, bounds); //destRect = bounds; //DrawingImage drawImage = new DrawingImage(image); //DrawingVisual drawingVisual = new DrawingVisual(); //DrawingContext drawingContext = drawingVisual.RenderOpen(); //drawingContext.DrawDrawing(image); //drawingContext.Close(); //RenderTargetBitmap drawImage = new RenderTargetBitmap((int)200, // (int)200, 96, 96, PixelFormats.Pbgra32); //drawImage.Render(drawingVisual); //ImageBrush imageBrush = new ImageBrush(drawImage); //imageBrush.Viewbox = image.Bounds; //imageBrush.Viewport = image.Bounds; //imageBrush.ViewboxUnits = BrushMappingMode.Absolute; //imageBrush.ViewportUnits = BrushMappingMode.Absolute; //imageBrush.TileMode = TileMode.None; //imageBrush.Stretch = Stretch.None; //this.Masking = imageBrush; DrawingBrush maskBrush = new DrawingBrush(maskDrawing); //tb.Viewbox = new Rect(0, 0, destRect.Width, destRect.Height); //tb.Viewport = new Rect(0, 0, destRect.Width, destRect.Height); maskBrush.Viewbox = maskDrawing.Bounds; maskBrush.Viewport = maskDrawing.Bounds; maskBrush.ViewboxUnits = BrushMappingMode.Absolute; maskBrush.ViewportUnits = BrushMappingMode.Absolute; maskBrush.TileMode = TileMode.None; maskBrush.Stretch = Stretch.Uniform; ////maskBrush.AlignmentX = AlignmentX.Center; ////maskBrush.AlignmentY = AlignmentY.Center; this.Masking = maskBrush; _maskUnits = (SvgUnitType)maskElement.MaskUnits.AnimVal; _maskContentUnits = (SvgUnitType)maskElement.MaskContentUnits.AnimVal; } }
public override void Render(WpfDrawingRenderer renderer) { if (_drawGroup != null) { if (!_matrix.IsIdentity) { _drawGroup.Transform = new MatrixTransform(_matrix); } Geometry clipGeom = this.ClipGeometry; if (clipGeom != null) { _drawGroup.ClipGeometry = clipGeom; } //Transform transform = this.Transform; //if (transform != null) //{ // _drawGroup.Transform = transform; //} } base.Render(renderer); }
public override void Render(WpfDrawingRenderer renderer) { base.Render(renderer); }
public override void BeforeRender(WpfDrawingRenderer renderer) { _isTextPath = false; _isGroupAdded = false; _textWidth = 0; _isMeasuring = false; WpfDrawingContext context = renderer.Context; SvgRenderingHint hint = _svgElement.RenderingHint; if (hint == SvgRenderingHint.Clipping) { return; } // We do not directly render the contents of the clip-path, unless specifically requested... if (String.Equals(_svgElement.ParentNode.LocalName, "clipPath") && !context.RenderingClipRegion) { return; } string sVisibility = _textElement.GetPropertyValue("visibility"); string sDisplay = _textElement.GetPropertyValue("display"); if (String.Equals(sVisibility, "hidden") || String.Equals(sDisplay, "none")) { return; } _context = renderer.Context; SetQuality(context); SetTransform(context); SetClip(_context); SetMask(_context); _drawGroup = new DrawingGroup(); string elementId = this.GetElementName(); if (!String.IsNullOrEmpty(elementId) && !context.IsRegisteredId(elementId)) { _drawGroup.SetValue(FrameworkElement.NameProperty, elementId); context.RegisterId(elementId); if (context.IncludeRuntime) { SvgObject.SetId(_drawGroup, elementId); } } Transform textTransform = this.Transform; if (textTransform != null && !textTransform.Value.IsIdentity) { _drawGroup.Transform = textTransform; } else { textTransform = null; // render any identity transform useless... } Geometry textClip = this.ClipGeometry; if (textClip != null && !textClip.IsEmpty()) { _drawGroup.ClipGeometry = textClip; } else { textClip = null; // render any empty geometry useless... } Brush textMask = this.Masking; if (textMask != null) { _drawGroup.OpacityMask = textMask; } if (textTransform != null || textClip != null || textMask != null) { DrawingGroup curGroup = _context.Peek(); Debug.Assert(curGroup != null); if (curGroup != null) { curGroup.Children.Add(_drawGroup); context.Push(_drawGroup); _isGroupAdded = true; } } _drawContext = _drawGroup.Open(); _horzRenderer.Initialize(_drawContext, _context); _vertRenderer.Initialize(_drawContext, _context); _pathRenderer.Initialize(_drawContext, _context); }
public void RenderMarkerEx0(WpfDrawingRenderer renderer, WpfDrawingContext gr, SvgMarkerPosition markerPos, SvgStyleableElement refElement) { //ISharpMarkerHost markerHostElm = (ISharpMarkerHost)refElement; //SvgMarkerElement markerElm = (SvgMarkerElement)element; //SvgPointF[] 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++) //{ // SvgPointF point = vertexPositions[i]; // GdiGraphicsContainer gc = gr.BeginContainer(); // gr.TranslateTransform(point.X, point.Y); // if (markerElm.OrientType.AnimVal.Equals((ushort)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((ushort)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, markerElm.MarkerWidth.AnimVal.Value, // 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); // renderer.RenderChildren(markerElm); // gr.EndContainer(gc); //} }
public override void BeforeRender(WpfDrawingRenderer renderer) { base.BeforeRender(renderer); _isAggregated = false; if (_svgElement.FirstChild == _svgElement.LastChild) { SvgGElement gElement = _svgElement.FirstChild as SvgGElement; if (gElement != null) { string elementId = gElement.GetAttribute("id"); if (!String.IsNullOrEmpty(elementId) && String.Equals(elementId, "IndicateLayer", StringComparison.OrdinalIgnoreCase)) { WpfDrawingContext context = renderer.Context; DrawingGroup animationGroup = context.Links; if (animationGroup != null) { context.Push(animationGroup); } _isLayer = true; } } } }
protected void SetMask(WpfDrawingContext context) { _maskUnits = SvgUnitType.UserSpaceOnUse; _maskContentUnits = SvgUnitType.UserSpaceOnUse; CssPrimitiveValue maskPath = _svgElement.GetComputedCssValue( "mask", String.Empty) as CssPrimitiveValue; if (maskPath != null && maskPath.PrimitiveType == CssPrimitiveType.Uri) { string absoluteUri = _svgElement.ResolveUri(maskPath.GetStringValue()); SvgMaskElement maskElement = _svgElement.OwnerDocument.GetNodeByUri(absoluteUri) as SvgMaskElement; if (maskElement != null) { WpfDrawingRenderer renderer = new WpfDrawingRenderer(); renderer.Window = _svgElement.OwnerDocument.Window as SvgWindow; WpfDrawingSettings settings = context.Settings.Clone(); settings.TextAsGeometry = true; WpfDrawingContext maskContext = new WpfDrawingContext(true, settings); //maskContext.Initialize(null, context.FontFamilyVisitor, null); maskContext.Initialize(context.LinkVisitor, context.FontFamilyVisitor, context.ImageVisitor); renderer.RenderMask(maskElement, maskContext); Drawing image = renderer.Drawing; Rect bounds = new Rect(0, 0, 1, 1); //Rect destRect = GetMaskDestRect(maskElement, bounds); //destRect = bounds; //DrawingImage drawImage = new DrawingImage(image); //DrawingVisual drawingVisual = new DrawingVisual(); //DrawingContext drawingContext = drawingVisual.RenderOpen(); //drawingContext.DrawDrawing(image); //drawingContext.Close(); //RenderTargetBitmap drawImage = new RenderTargetBitmap((int)200, // (int)200, 96, 96, PixelFormats.Pbgra32); //drawImage.Render(drawingVisual); //ImageBrush imageBrush = new ImageBrush(drawImage); //imageBrush.Viewbox = image.Bounds; //imageBrush.Viewport = image.Bounds; //imageBrush.ViewboxUnits = BrushMappingMode.Absolute; //imageBrush.ViewportUnits = BrushMappingMode.Absolute; //imageBrush.TileMode = TileMode.None; //imageBrush.Stretch = Stretch.None; //this.Masking = imageBrush; DrawingBrush maskBrush = new DrawingBrush(image); //tb.Viewbox = new Rect(0, 0, destRect.Width, destRect.Height); //tb.Viewport = new Rect(0, 0, destRect.Width, destRect.Height); maskBrush.Viewbox = image.Bounds; maskBrush.Viewport = image.Bounds; maskBrush.ViewboxUnits = BrushMappingMode.Absolute; maskBrush.ViewportUnits = BrushMappingMode.Absolute; maskBrush.TileMode = TileMode.None; maskBrush.Stretch = Stretch.Uniform; ////maskBrush.AlignmentX = AlignmentX.Center; ////maskBrush.AlignmentY = AlignmentY.Center; this.Masking = maskBrush; _maskUnits = (SvgUnitType)maskElement.MaskUnits.AnimVal; _maskContentUnits = (SvgUnitType)maskElement.MaskContentUnits.AnimVal; } } }
public override void Render(WpfDrawingRenderer renderer) { WpfDrawingContext context = renderer.Context; SvgRenderingHint hint = _svgElement.RenderingHint; if (hint != SvgRenderingHint.Shape || hint == SvgRenderingHint.Clipping) { return; } // We do not directly render the contents of the clip-path, unless specifically requested... if (String.Equals(_svgElement.ParentNode.LocalName, "clipPath") && !context.RenderingClipRegion) { return; } SvgStyleableElement styleElm = (SvgStyleableElement)_svgElement; string sVisibility = styleElm.GetPropertyValue("visibility"); string sDisplay = styleElm.GetPropertyValue("display"); if (String.Equals(sVisibility, "hidden") || String.Equals(sDisplay, "none")) { return; } DrawingGroup drawGroup = context.Peek(); Debug.Assert(drawGroup != null); Geometry geometry = CreateGeometry(_svgElement, context.OptimizePath); if (geometry != null && !geometry.IsEmpty()) { SetClip(context); WpfSvgPaint fillPaint = new WpfSvgPaint(context, styleElm, "fill"); string fileValue = styleElm.GetAttribute("fill"); Brush brush = fillPaint.GetBrush(geometry); WpfSvgPaint strokePaint = new WpfSvgPaint(context, styleElm, "stroke"); Pen pen = strokePaint.GetPen(); if (brush != null || pen != null) { Transform transform = this.Transform; if (transform != null && !transform.Value.IsIdentity) { geometry.Transform = transform; if (brush != null) { Transform brushTransform = brush.Transform; if (brushTransform == null || brushTransform == Transform.Identity) { brush.Transform = transform; } else { TransformGroup groupTransform = new TransformGroup(); groupTransform.Children.Add(brushTransform); groupTransform.Children.Add(transform); brush.Transform = groupTransform; } } } else { transform = null; // render any identity transform useless... } GeometryDrawing drawing = new GeometryDrawing(brush, pen, geometry); string elementId = this.GetElementName(); if (!String.IsNullOrEmpty(elementId) && !context.IsRegisteredId(elementId)) { SvgObject.SetName(drawing, elementId); context.RegisterId(elementId); if (context.IncludeRuntime) { SvgObject.SetId(drawing, elementId); } } Brush maskBrush = this.Masking; Geometry clipGeom = this.ClipGeometry; if (clipGeom != null || maskBrush != null) { //Geometry clipped = Geometry.Combine(geometry, clipGeom, // GeometryCombineMode.Exclude, null); //if (clipped != null && !clipped.IsEmpty()) //{ // geometry = clipped; //} DrawingGroup clipMaskGroup = new DrawingGroup(); Rect geometryBounds = geometry.Bounds; if (clipGeom != null) { clipMaskGroup.ClipGeometry = clipGeom; SvgUnitType clipUnits = this.ClipUnits; if (clipUnits == SvgUnitType.ObjectBoundingBox) { Rect drawingBounds = geometryBounds; if (transform != null) { drawingBounds = transform.TransformBounds(drawingBounds); } TransformGroup transformGroup = new TransformGroup(); // Scale the clip region (at (0, 0)) and translate to the top-left corner of the target. transformGroup.Children.Add( new ScaleTransform(drawingBounds.Width, drawingBounds.Height)); transformGroup.Children.Add( new TranslateTransform(drawingBounds.X, drawingBounds.Y)); clipGeom.Transform = transformGroup; } else { if (transform != null) { clipGeom.Transform = transform; } } } if (maskBrush != null) { SvgUnitType maskUnits = this.MaskUnits; if (maskUnits == SvgUnitType.ObjectBoundingBox) { Rect drawingBounds = geometryBounds; if (transform != null) { drawingBounds = transform.TransformBounds(drawingBounds); } TransformGroup transformGroup = new TransformGroup(); // Scale the clip region (at (0, 0)) and translate to the top-left corner of the target. transformGroup.Children.Add( new ScaleTransform(drawingBounds.Width, drawingBounds.Height)); transformGroup.Children.Add( new TranslateTransform(drawingBounds.X, drawingBounds.Y)); DrawingGroup maskGroup = ((DrawingBrush)maskBrush).Drawing as DrawingGroup; if (maskGroup != null) { DrawingCollection maskDrawings = maskGroup.Children; for (int i = 0; i < maskDrawings.Count; i++) { Drawing maskDrawing = maskDrawings[i]; GeometryDrawing maskGeomDraw = maskDrawing as GeometryDrawing; if (maskGeomDraw != null) { if (maskGeomDraw.Brush != null) { ConvertColors(maskGeomDraw.Brush); } if (maskGeomDraw.Pen != null) { ConvertColors(maskGeomDraw.Pen.Brush); } } } } //if (transformGroup != null) //{ // drawingBounds = transformGroup.TransformBounds(drawingBounds); //} //maskBrush.Viewbox = drawingBounds; //maskBrush.ViewboxUnits = BrushMappingMode.Absolute; //maskBrush.Stretch = Stretch.Uniform; //maskBrush.Viewport = drawingBounds; //maskBrush.ViewportUnits = BrushMappingMode.Absolute; maskBrush.Transform = transformGroup; } else { if (transform != null) { maskBrush.Transform = transform; } } clipMaskGroup.OpacityMask = maskBrush; } clipMaskGroup.Children.Add(drawing); drawGroup.Children.Add(clipMaskGroup); } else { drawGroup.Children.Add(drawing); } } } RenderMarkers(renderer, styleElm, context); }
public override void BeforeRender(WpfDrawingRenderer renderer) { base.BeforeRender(renderer); }
public override void Render(WpfDrawingRenderer renderer) { base.Render(renderer); }
public override void BeforeRender(WpfDrawingRenderer renderer) { base.BeforeRender(renderer); WpfDrawingContext context = renderer.Context; Geometry clipGeom = this.ClipGeometry; Transform transform = this.Transform; SvgUseElement useElement = (SvgUseElement)_svgElement; string elementId = this.GetElementName(); float opacityValue = -1; string opacity = useElement.GetAttribute("opacity"); if (string.IsNullOrWhiteSpace(opacity)) { opacity = useElement.GetPropertyValue("opacity"); } if (!string.IsNullOrWhiteSpace(opacity)) { opacityValue = (float)SvgNumber.ParseNumber(opacity); opacityValue = Math.Min(opacityValue, 1); opacityValue = Math.Max(opacityValue, 0); } _drawGroup = new DrawingGroup(); DrawingGroup currentGroup = context.Peek(); if (currentGroup == null) { throw new InvalidOperationException("An existing group is expected."); } currentGroup.Children.Add(_drawGroup); context.Push(_drawGroup); if (clipGeom != null || transform != null || (opacityValue >= 0 && opacityValue < 1) || (!string.IsNullOrWhiteSpace(elementId) && !context.IsRegisteredId(elementId))) { if (clipGeom != null) { _drawGroup.ClipGeometry = clipGeom; } if (transform != null) { _drawGroup.Transform = transform; } if (opacityValue >= 0 && opacityValue < 1) { _drawGroup.Opacity = opacityValue; } if (!string.IsNullOrWhiteSpace(elementId) && !context.IsRegisteredId(elementId)) { SvgObject.SetName(_drawGroup, elementId); context.RegisterId(elementId); if (context.IncludeRuntime) { SvgObject.SetId(_drawGroup, elementId); } } } }
public override void AfterRender(WpfDrawingRenderer renderer) { if (_horzRenderer != null) { _horzRenderer.Uninitialize(); _horzRenderer = null; } if (_vertRenderer != null) { _vertRenderer.Uninitialize(); _vertRenderer = null; } if (_pathRenderer != null) { _pathRenderer.Uninitialize(); _pathRenderer = null; } if (_drawContext != null) { _drawContext.Close(); _drawContext = null; } WpfDrawingContext context = renderer.Context; // TODO-PAUL: Testing this for validity... // Remove the GuidelineSet from the groups added by the FormattedText to reduced the // size of output XAML... if (_drawGroup != null) { ResetGuidelineSet(_drawGroup); } if (context.IncludeRuntime) { if (_drawGroup != null) { // Add the element/object type... SvgObject.SetType(_drawGroup, SvgObjectType.Text); // Add title for tooltips, if any... SvgTitleElement titleElement = _svgElement.SelectSingleNode("title") as SvgTitleElement; if (titleElement != null) { string titleValue = titleElement.InnerText; if (!string.IsNullOrWhiteSpace(titleValue)) { SvgObject.SetTitle(_drawGroup, titleValue); } } } } if (!_isGroupAdded) { if (_drawGroup != null) { if (_isTextPath || _drawGroup.Transform != null || _drawGroup.ClipGeometry != null) { DrawingGroup curGroup = _context.Peek(); Debug.Assert(curGroup != null); if (curGroup != null) { curGroup.Children.Add(_drawGroup); } } else if (_drawGroup.Children.Count != 0) { DrawingGroup firstGroup = _drawGroup.Children[0] as DrawingGroup; if (firstGroup != null && firstGroup.Children.Count != 0) { //Drawing firstDrawing = firstGroup.Children[0]; DrawingGroup curGroup = _context.Peek(); Debug.Assert(curGroup != null); if (curGroup != null) { curGroup.Children.Add(_drawGroup); } } } } } else { if (_drawGroup != null) { DrawingGroup currentGroup = context.Peek(); if (currentGroup == null || currentGroup != _drawGroup) { throw new InvalidOperationException("An existing group is expected."); } context.Pop(); } } _context = null; _drawGroup = null; base.AfterRender(renderer); }
public override void Render(WpfDrawingRenderer renderer) { if (_drawGroup == null || _drawContext == null) { return; } var comparer = StringComparison.OrdinalIgnoreCase; Point ctp = new Point(0, 0); // current text position WpfTextPlacement placement = WpfTextPlacement.Create(_textElement, ctp); ctp = placement.Location; double rotate = placement.Rotation; if (!placement.HasPositions) { placement = null; // render it useless } string sBaselineShift = _textElement.GetPropertyValue("baseline-shift").Trim(); double shiftBy = 0; if (sBaselineShift.Length > 0) { double textFontSize = WpfTextRenderer.GetComputedFontSize(_textElement); if (sBaselineShift.EndsWith("%", comparer)) { shiftBy = SvgNumber.ParseNumber(sBaselineShift.Substring(0, sBaselineShift.Length - 1)) / 100 * textFontSize; } else if (string.Equals(sBaselineShift, "sub", comparer)) { shiftBy = -0.6F * textFontSize; } else if (string.Equals(sBaselineShift, "super", comparer)) { shiftBy = 0.6F * textFontSize; } else if (string.Equals(sBaselineShift, "baseline", comparer)) { shiftBy = 0; } else { shiftBy = SvgNumber.ParseNumber(sBaselineShift); } } // For for fonts loading in the background... var svgDoc = _svgElement.OwnerDocument; if (svgDoc.IsFontsLoaded == false) { //TODO: Use of SpinUntil is known to CPU heavy, but will work for now... SpinWait.SpinUntil(() => svgDoc.IsFontsLoaded == true); } XmlNodeType nodeType = XmlNodeType.None; bool isVertical = false; string writingMode = _textElement.GetPropertyValue("writing-mode"); if (!string.IsNullOrWhiteSpace(writingMode) && string.Equals(writingMode, "tb", comparer)) { isVertical = true; } if (_svgElement.ChildNodes.Count == 1) { XmlNode child = _svgElement.ChildNodes[0]; nodeType = child.NodeType; if (nodeType == XmlNodeType.Text || nodeType == XmlNodeType.CDATA) { if (isVertical) { ctp.X -= shiftBy; RenderVertText(_textElement, ref ctp, WpfTextRenderer.GetText(_textElement, child), rotate, placement); ctp.X += shiftBy; } else { ctp.Y -= shiftBy; RenderHorzText(_textElement, ref ctp, WpfTextRenderer.GetText(_textElement, child), rotate, placement); ctp.Y += shiftBy; } } else if (nodeType == XmlNodeType.Element) { string nodeName = child.Name; if (string.Equals(nodeName, "tref", comparer)) { AddTRefElementRun((SvgTRefElement)child, ref ctp, isVertical, true); } else if (string.Equals(nodeName, "tspan", comparer)) { AddTSpanElementRun((SvgTSpanElement)child, ref ctp, isVertical, true); } else if (string.Equals(nodeName, "textPath", comparer)) { RenderTextPath((SvgTextPathElement)child, ref ctp, rotate, placement); } else if (string.Equals(nodeName, "altGlyph", comparer)) { AddAltGlyphElementRun((SvgAltGlyphElement)child, ref ctp, isVertical, true); } } else if (nodeType == XmlNodeType.Whitespace) { if (isVertical) { ctp.X -= shiftBy; RenderVertText(_textElement, ref ctp, WpfTextRenderer.GetText(_textElement, child), rotate, placement); ctp.X += shiftBy; } else { ctp.Y -= shiftBy; RenderHorzText(_textElement, ref ctp, WpfTextRenderer.GetText(_textElement, child), rotate, placement); ctp.Y += shiftBy; } } } else { string textAnchor = _textElement.GetPropertyValue("text-anchor"); WpfTextAnchor anchor = WpfTextAnchor.None; if (string.Equals(textAnchor, "middle", comparer)) { anchor = WpfTextAnchor.Middle; } else if (string.Equals(textAnchor, "end", comparer)) { anchor = WpfTextAnchor.End; } XmlNodeList nodeList = _svgElement.ChildNodes; int nodeCount = nodeList.Count; // This is a very simply hack to change centered text to left align, since for // text containing spans, different font weights may be applied to the spans... if (anchor == WpfTextAnchor.Middle) { // Suspend the rendering... _isMeasuring = true; Point savedPt = new Point(ctp.X, ctp.Y); _textContext.BeginMeasure(nodeCount); for (int i = 0; i < nodeCount; i++) { XmlNode child = nodeList[i]; nodeType = child.NodeType; //if (i == 0 && nodeType == XmlNodeType.Whitespace) //{ // continue; //} if (nodeType == XmlNodeType.Text) { var nodeText = WpfTextRenderer.GetText(_textElement, child); if (i == (nodeCount - 1)) { // No need to render the last white space... nodeText = nodeText.TrimEnd(); } if (isVertical) { ctp.X -= shiftBy; RenderVertTextRun(_textElement, ref ctp, nodeText, rotate, placement); ctp.X += shiftBy; } else { ctp.Y -= shiftBy; RenderHorzTextRun(_textElement, ref ctp, nodeText, rotate, placement); ctp.Y += shiftBy; } } else if (nodeType == XmlNodeType.Element) { string nodeName = child.Name; if (string.Equals(nodeName, "tref", comparer)) { AddTRefElementRun((SvgTRefElement)child, ref ctp, isVertical, false); } else if (string.Equals(nodeName, "tspan", comparer)) { bool isAdded = false; if ((i + 1) < nodeCount) { XmlNode nextChild = nodeList[i + 1]; if (nextChild.NodeType == XmlNodeType.Whitespace) { isAdded = true; AddTSpanElementRun((SvgTSpanElement)child, ref ctp, isVertical, false, nextChild); i++; } } if (!isAdded) { AddTSpanElementRun((SvgTSpanElement)child, ref ctp, isVertical, false); } } else if (string.Equals(nodeName, "textPath", comparer)) { RenderTextPath((SvgTextPathElement)child, ref ctp, rotate, placement); } else if (string.Equals(nodeName, "altGlyph", comparer)) { AddAltGlyphElementRun((SvgAltGlyphElement)child, ref ctp, isVertical, false); } } else if (nodeType == XmlNodeType.Whitespace) { if (isVertical) { ctp.X -= shiftBy; RenderVertTextRun(_textElement, ref ctp, Whitespace, rotate, placement, true); ctp.X += shiftBy; } else { ctp.Y -= shiftBy; RenderHorzTextRun(_textElement, ref ctp, Whitespace, rotate, placement, true); ctp.Y += shiftBy; } } } _textContext.EndMeasure(); ctp = savedPt; ctp.X -= (_textWidth / 2d); // Resume the rendering... _isMeasuring = false; } bool textRendered = false; for (int i = 0; i < nodeCount; i++) { XmlNode child = nodeList[i]; nodeType = child.NodeType; //if (i == 0 && nodeType == XmlNodeType.Whitespace) //{ // continue; //} if (nodeType == XmlNodeType.Text) { var nodeText = WpfTextRenderer.GetText(_textElement, child); if (i == (nodeCount - 1)) { // No need to render the last white space... nodeText = nodeText.TrimEnd(); } if (isVertical) { ctp.X -= shiftBy; RenderVertTextRun(_textElement, ref ctp, nodeText, rotate, placement); ctp.X += shiftBy; } else { ctp.Y -= shiftBy; RenderHorzTextRun(_textElement, ref ctp, nodeText, rotate, placement); ctp.Y += shiftBy; } textRendered = true; } else if (nodeType == XmlNodeType.Element) { string nodeName = child.Name; if (string.Equals(nodeName, "tref", comparer)) { AddTRefElementRun((SvgTRefElement)child, ref ctp, isVertical, false); textRendered = true; } else if (string.Equals(nodeName, "tspan", comparer)) { bool isAdded = false; if ((i + 1) < nodeCount) { XmlNode nextChild = nodeList[i + 1]; if (nextChild.NodeType == XmlNodeType.Whitespace) { isAdded = true; AddTSpanElementRun((SvgTSpanElement)child, ref ctp, isVertical, false, nextChild); i++; } } if (!isAdded) { AddTSpanElementRun((SvgTSpanElement)child, ref ctp, isVertical, false); } textRendered = true; } else if (string.Equals(nodeName, "textPath", comparer)) { RenderTextPath((SvgTextPathElement)child, ref ctp, rotate, placement); textRendered = false; } else if (string.Equals(nodeName, "altGlyph", comparer)) { AddAltGlyphElementRun((SvgAltGlyphElement)child, ref ctp, isVertical, false); } } else if (nodeType == XmlNodeType.Whitespace) { if (textRendered) { if (isVertical) { ctp.X -= shiftBy; RenderVertTextRun(_textElement, ref ctp, Whitespace, rotate, placement, true); ctp.X += shiftBy; } else { ctp.Y -= shiftBy; RenderHorzTextRun(_textElement, ref ctp, Whitespace, rotate, placement, true); ctp.Y += shiftBy; } textRendered = false; } } } } }
public override void BeforeRender(WpfDrawingRenderer renderer) { base.BeforeRender(renderer); _isTextPath = false; _isGroupAdded = false; _textWidth = 0; _isMeasuring = false; WpfDrawingContext context = renderer.Context; SvgRenderingHint hint = _svgElement.RenderingHint; if (hint == SvgRenderingHint.Clipping) { return; } var comparer = StringComparison.OrdinalIgnoreCase; // We do not directly render the contents of the clip-path, unless specifically requested... if (string.Equals(_svgElement.ParentNode.LocalName, "clipPath", comparer) && !context.RenderingClipRegion) { return; } _context = renderer.Context; SetQuality(context); SetTransform(context); SetClip(_context); SetMask(_context); _drawGroup = new DrawingGroup(); string sVisibility = _textElement.GetPropertyValue("visibility"); string sDisplay = _textElement.GetPropertyValue("display"); if (string.Equals(sVisibility, "hidden", comparer) || string.Equals(sDisplay, "none", comparer)) { _drawGroup.Opacity = 0; } string elementId = this.GetElementName(); if (!string.IsNullOrWhiteSpace(elementId) && !context.IsRegisteredId(elementId)) { SvgObject.SetName(_drawGroup, elementId); context.RegisterId(elementId); if (context.IncludeRuntime) { SvgObject.SetId(_drawGroup, elementId); } } string elementClass = this.GetElementClass(); if (!string.IsNullOrWhiteSpace(elementClass) && context.IncludeRuntime) { SvgObject.SetClass(_drawGroup, elementClass); } Transform textTransform = this.Transform; if (textTransform != null && !textTransform.Value.IsIdentity) { _drawGroup.Transform = textTransform; } else { textTransform = null; // render any identity transform useless... } Geometry textClip = this.ClipGeometry; if (textClip != null && !textClip.IsEmpty()) { _drawGroup.ClipGeometry = textClip; } else { textClip = null; // render any empty geometry useless... } Brush textMask = this.Masking; if (textMask != null) { _drawGroup.OpacityMask = textMask; } if (textTransform != null || textClip != null || textMask != null) { DrawingGroup curGroup = _context.Peek(); Debug.Assert(curGroup != null); if (curGroup != null) { curGroup.Children.Add(_drawGroup); context.Push(_drawGroup); _isGroupAdded = true; } } _drawContext = _drawGroup.Open(); _horzRenderer.Initialize(_drawContext, _context); _vertRenderer.Initialize(_drawContext, _context); _pathRenderer.Initialize(_drawContext, _context); }
public void RenderMarker0(WpfDrawingRenderer renderer, WpfDrawingContext gr, SvgMarkerPosition markerPos, SvgStyleableElement refElement) { //PathGeometry g; //g.GetPointAtFractionLength( ISharpMarkerHost markerHostElm = (ISharpMarkerHost)refElement; SvgMarkerElement markerElm = (SvgMarkerElement)_svgElement; SvgPointF[] 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++) { SvgPointF point = vertexPositions[i]; Matrix m = GetTransformMatrix(_svgElement); //GraphicsContainer gc = gr.BeginContainer(); this.BeforeRender(renderer); //gr.TranslateTransform(point.X, point.Y); //PAUL: //m.Translate(point.X, point.Y); if (markerElm.OrientType.AnimVal.Equals((ushort)SvgMarkerOrient.Angle)) { m.Rotate(markerElm.OrientAngle.AnimVal.Value); //gr.RotateTransform((double)markerElm.OrientAngle.AnimVal.Value); } else { double 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); m.Rotate(angle); } if (markerElm.MarkerUnits.AnimVal.Equals((ushort)SvgMarkerUnit.StrokeWidth)) { string propValue = refElement.GetPropertyValue("stroke-width"); if (propValue.Length == 0) { propValue = "1"; } SvgLength strokeWidthLength = new SvgLength("stroke-width", propValue, refElement, SvgLengthDirection.Viewport); double strokeWidth = strokeWidthLength.Value; //gr.ScaleTransform(strokeWidth, strokeWidth); m.Scale(strokeWidth, strokeWidth); } SvgPreserveAspectRatio spar = (SvgPreserveAspectRatio)markerElm.PreserveAspectRatio.AnimVal; double[] translateAndScale = spar.FitToViewBox( (SvgRect)markerElm.ViewBox.AnimVal, new SvgRect(0, 0, markerElm.MarkerWidth.AnimVal.Value, markerElm.MarkerHeight.AnimVal.Value)); //PAUL: //m.Translate(-(double)markerElm.RefX.AnimVal.Value * translateAndScale[2], -(double)markerElm.RefY.AnimVal.Value * translateAndScale[3]); //PAUL: m.Scale(translateAndScale[2], translateAndScale[3]); m.Translate(point.X, point.Y); //Matrix oldTransform = TransformMatrix; //TransformMatrix = m; //try //{ //newTransform.Append(m); //TransformGroup tg = new TransformGroup(); //renderer.Canvas.re //gr.TranslateTransform( // -(double)markerElm.RefX.AnimVal.Value * translateAndScale[2], // -(double)markerElm.RefY.AnimVal.Value * translateAndScale[3] // ); //gr.ScaleTransform(translateAndScale[2], translateAndScale[3]); renderer.RenderChildren(markerElm); // markerElm.RenderChildren(renderer); //} //finally //{ // TransformMatrix = oldTransform; //} // //gr.EndContainer(gc); _matrix = m; this.Render(renderer); //gr.EndContainer(gc); this.AfterRender(renderer); } }
protected static void RenderMarkers(WpfDrawingRenderer renderer, SvgStyleableElement styleElm, WpfDrawingContext 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")); if (markerStartUrl.Length > 0) { WpfMarkerRendering markerRenderer = CreateByUri(styleElm.OwnerDocument, styleElm.BaseURI, markerStartUrl) as WpfMarkerRendering; if (markerRenderer != null) { markerRenderer.RenderMarker(renderer, gr, SvgMarkerPosition.Start, styleElm); } } if (markerMiddleUrl.Length > 0) { // TODO markerMiddleUrl != markerStartUrl WpfMarkerRendering markerRenderer = CreateByUri(styleElm.OwnerDocument, styleElm.BaseURI, markerMiddleUrl) as WpfMarkerRendering; if (markerRenderer != null) { markerRenderer.RenderMarker(renderer, gr, SvgMarkerPosition.Mid, styleElm); } } if (markerEndUrl.Length > 0) { // TODO: markerEndUrl != markerMiddleUrl WpfMarkerRendering markerRenderer = CreateByUri(styleElm.OwnerDocument, styleElm.BaseURI, markerEndUrl) as WpfMarkerRendering; if (markerRenderer != null) { markerRenderer.RenderMarker(renderer, gr, SvgMarkerPosition.End, styleElm); } } } }
// define empty handlers by default public virtual void BeforeRender(WpfDrawingRenderer renderer) { }
/// <summary> /// Initializes a new instance of the <see cref="StreamSvgConverter"/> class /// with the specified drawing or rendering settings and the saving options. /// </summary> /// <param name="saveXaml"> /// This specifies whether to save result object tree in image file. /// </param> /// <param name="saveZaml"> /// This specifies whether to save result object tree in ZAML file. The /// ZAML is simply a G-Zip compressed image format, similar to the SVGZ. /// </param> /// <param name="settings"> /// This specifies the settings used by the rendering or drawing engine. /// If this is <see langword="null"/>, the default settings is used. /// </param> public StreamSvgConverter(bool saveXaml, bool saveZaml, WpfDrawingSettings settings) : base(saveXaml, saveZaml, settings) { _encoderType = ImageEncoderType.PngBitmap; _wpfRenderer = new WpfDrawingRenderer(this.DrawingSettings); _wpfWindow = new WpfSvgWindow(640, 480, _wpfRenderer); }
public virtual void AfterRender(WpfDrawingRenderer renderer) { }
public override void Render(WpfDrawingRenderer renderer) { _isAggregated = false; if (_isLayer) { base.Render(renderer); return; } WpfDrawingContext context = renderer.Context; Geometry clipGeom = this.ClipGeometry; Transform transform = this.Transform; float opacityValue = -1; SvgAElement element = (SvgAElement)_svgElement; string opacity = element.GetPropertyValue("opacity"); if (opacity != null && opacity.Length > 0) { opacityValue = (float)SvgNumber.ParseNumber(opacity); opacityValue = Math.Min(opacityValue, 1); opacityValue = Math.Max(opacityValue, 0); } WpfLinkVisitor linkVisitor = context.LinkVisitor; if (linkVisitor != null || clipGeom != null || transform != null || opacityValue >= 0) { _drawGroup = new DrawingGroup(); string elementId = this.GetElementName(); if (!String.IsNullOrEmpty(elementId) && !context.IsRegisteredId(elementId)) { _drawGroup.SetValue(FrameworkElement.NameProperty, elementId); context.RegisterId(elementId); if (context.IncludeRuntime) { SvgObject.SetId(_drawGroup, elementId); } } DrawingGroup currentGroup = context.Peek(); if (currentGroup == null) { throw new InvalidOperationException("An existing group is expected."); } if (linkVisitor != null && linkVisitor.Aggregates && context.Links != null) { if (!linkVisitor.Exists(elementId)) { context.Links.Children.Add(_drawGroup); } } else { currentGroup.Children.Add(_drawGroup); } context.Push(_drawGroup); if (clipGeom != null) { _drawGroup.ClipGeometry = clipGeom; } if (transform != null) { _drawGroup.Transform = transform; } if (opacityValue >= 0) { _drawGroup.Opacity = opacityValue; } if (linkVisitor != null) { linkVisitor.Visit(_drawGroup, element, context, opacityValue); _isAggregated = linkVisitor.IsAggregate; } } base.Render(renderer); }
public override void Render(WpfDrawingRenderer renderer) { if (_drawGroup == null || _drawContext == null) { return; } Point ctp = new Point(0, 0); // current text position WpfTextPlacement placement = WpfTextRenderer.GetCurrentTextPosition(_textElement, ctp); ctp = placement.Location; double rotate = placement.Rotation; if (!placement.HasPositions) { placement = null; // render it useless } string sBaselineShift = _textElement.GetPropertyValue("baseline-shift").Trim(); double shiftBy = 0; if (sBaselineShift.Length > 0) { double textFontSize = WpfTextRenderer.GetComputedFontSize(_textElement); if (sBaselineShift.EndsWith("%", StringComparison.OrdinalIgnoreCase)) { shiftBy = SvgNumber.ParseNumber(sBaselineShift.Substring(0, sBaselineShift.Length - 1)) / 100 * textFontSize; } else if (sBaselineShift == "sub") { shiftBy = -0.6F * textFontSize; } else if (sBaselineShift == "super") { shiftBy = 0.6F * textFontSize; } else if (sBaselineShift == "baseline") { shiftBy = 0; } else { shiftBy = SvgNumber.ParseNumber(sBaselineShift); } } XmlNodeType nodeType = XmlNodeType.None; bool isVertical = false; string writingMode = _textElement.GetPropertyValue("writing-mode"); if (!string.IsNullOrWhiteSpace(writingMode) && string.Equals(writingMode, "tb", StringComparison.OrdinalIgnoreCase)) { isVertical = true; } if (_svgElement.ChildNodes.Count == 1) { XmlNode child = _svgElement.ChildNodes[0]; nodeType = child.NodeType; if (nodeType == XmlNodeType.Text || nodeType == XmlNodeType.CDATA) { if (isVertical) { ctp.X -= shiftBy; RenderSingleLineTextV(_textElement, ref ctp, WpfTextRenderer.GetText(_textElement, child), rotate, placement); ctp.X += shiftBy; } else { ctp.Y -= shiftBy; RenderSingleLineTextH(_textElement, ref ctp, WpfTextRenderer.GetText(_textElement, child), rotate, placement); ctp.Y += shiftBy; } } else if (nodeType == XmlNodeType.Element) { string nodeName = child.Name; if (string.Equals(nodeName, "tref")) { AddTRefElementRun((SvgTRefElement)child, ref ctp, isVertical, true); } else if (string.Equals(nodeName, "tspan")) { AddTSpanElementRun((SvgTSpanElement)child, ref ctp, isVertical, true); } else if (string.Equals(nodeName, "textPath")) { RenderTextPath((SvgTextPathElement)child, ref ctp, rotate, placement); } } else if (nodeType == XmlNodeType.Whitespace) { if (isVertical) { ctp.X -= shiftBy; RenderSingleLineTextV(_textElement, ref ctp, WpfTextRenderer.GetText(_textElement, child), rotate, placement); ctp.X += shiftBy; } else { ctp.Y -= shiftBy; RenderSingleLineTextH(_textElement, ref ctp, WpfTextRenderer.GetText(_textElement, child), rotate, placement); ctp.Y += shiftBy; } } } else { string textAnchor = _textElement.GetPropertyValue("text-anchor"); WpfTextAnchor anchor = WpfTextAnchor.None; if (textAnchor == "middle") { anchor = WpfTextAnchor.Middle; } else if (textAnchor == "end") { anchor = WpfTextAnchor.End; } XmlNodeList nodeList = _svgElement.ChildNodes; // This is a very simply hack to change centered text to left align, since for // text containing spans, different font weights may be applied to the spans... if (anchor == WpfTextAnchor.Middle) { // Suspend the rendering... _isMeasuring = true; foreach (XmlNode child in nodeList) { nodeType = child.NodeType; if (nodeType == XmlNodeType.Text) { if (isVertical) { ctp.X -= shiftBy; RenderTextRunV(_textElement, ref ctp, WpfTextRenderer.GetText(_textElement, child), rotate, placement); ctp.X += shiftBy; } else { ctp.Y -= shiftBy; RenderTextRunH(_textElement, ref ctp, WpfTextRenderer.GetText(_textElement, child), rotate, placement); ctp.Y += shiftBy; } } else if (nodeType == XmlNodeType.Element) { string nodeName = child.Name; if (string.Equals(nodeName, "tref")) { AddTRefElementRun((SvgTRefElement)child, ref ctp, isVertical, false); } else if (string.Equals(nodeName, "tspan")) { AddTSpanElementRun((SvgTSpanElement)child, ref ctp, isVertical, false); } else if (string.Equals(nodeName, "textPath")) { RenderTextPath((SvgTextPathElement)child, ref ctp, rotate, placement); } } else if (nodeType == XmlNodeType.Whitespace) { if (isVertical) { ctp.X -= shiftBy; //RenderTextRunV(_textElement, ref ctp, GetText(_textElement, child)); RenderTextRunV(_textElement, ref ctp, Whitespace, rotate, placement); ctp.X += shiftBy; } else { ctp.Y -= shiftBy; //RenderTextRunH(_textElement, ref ctp, GetText(_textElement, child)); RenderTextRunH(_textElement, ref ctp, Whitespace, rotate, placement); ctp.Y += shiftBy; } } } ctp.X -= (_textWidth / 2d); // Resume the rendering... _isMeasuring = false; } bool textRendered = false; for (int i = 0; i < nodeList.Count; i++) { XmlNode child = nodeList[i]; nodeType = child.NodeType; if (nodeType == XmlNodeType.Text) { if (isVertical) { ctp.X -= shiftBy; RenderTextRunV(_textElement, ref ctp, WpfTextRenderer.GetText(_textElement, child), rotate, placement); ctp.X += shiftBy; } else { ctp.Y -= shiftBy; RenderTextRunH(_textElement, ref ctp, WpfTextRenderer.GetText(_textElement, child), rotate, placement); ctp.Y += shiftBy; } textRendered = true; } else if (nodeType == XmlNodeType.Element) { string nodeName = child.Name; if (string.Equals(nodeName, "tref")) { AddTRefElementRun((SvgTRefElement)child, ref ctp, isVertical, false); textRendered = true; } else if (string.Equals(nodeName, "tspan")) { AddTSpanElementRun((SvgTSpanElement)child, ref ctp, isVertical, false); textRendered = true; } else if (string.Equals(nodeName, "textPath")) { RenderTextPath((SvgTextPathElement)child, ref ctp, rotate, placement); textRendered = false; } } else if (nodeType == XmlNodeType.Whitespace) { if (textRendered) { if (isVertical) { ctp.X -= shiftBy; //RenderTextRunV(_textElement, ref ctp, GetText(_textElement, child)); RenderTextRunV(_textElement, ref ctp, Whitespace, rotate, placement); ctp.X += shiftBy; } else { ctp.Y -= shiftBy; //RenderTextRunH(_textElement, ref ctp, GetText(_textElement, child)); RenderTextRunH(_textElement, ref ctp, Whitespace, rotate, placement); ctp.Y += shiftBy; } textRendered = false; } } } } }
public override void AfterRender(WpfDrawingRenderer renderer) { if (_horzRenderer != null) { _horzRenderer.Uninitialize(); _horzRenderer = null; } if (_vertRenderer != null) { _vertRenderer.Uninitialize(); _vertRenderer = null; } if (_pathRenderer != null) { _pathRenderer.Uninitialize(); _pathRenderer = null; } if (_drawContext != null) { _drawContext.Close(); _drawContext = null; } WpfDrawingContext context = renderer.Context; // TODO-PAUL: Testing this for validity... // Remove the GuidelineSet from the groups added by the FormattedText to reduced the // size of output XAML... if (_drawGroup != null) { ResetGuidelineSet(_drawGroup); } if (context.IncludeRuntime) { if (_drawGroup != null) { // Add the element/object type... SvgObject.SetType(_drawGroup, SvgObjectType.Text); // Add title for tooltips, if any... SvgTitleElement titleElement = _svgElement.SelectSingleNode("title") as SvgTitleElement; if (titleElement != null) { string titleValue = titleElement.InnerText; if (!String.IsNullOrEmpty(titleValue)) { SvgObject.SetTitle(_drawGroup, titleValue); } } } } if (!_isGroupAdded) { if (_drawGroup != null) { if (_isTextPath || _drawGroup.Transform != null || _drawGroup.ClipGeometry != null) { DrawingGroup curGroup = _context.Peek(); Debug.Assert(curGroup != null); if (curGroup != null) { curGroup.Children.Add(_drawGroup); } } else if (_drawGroup.Children.Count != 0) { DrawingGroup firstGroup = _drawGroup.Children[0] as DrawingGroup; if (firstGroup != null && firstGroup.Children.Count != 0) { //Drawing firstDrawing = firstGroup.Children[0]; DrawingGroup curGroup = _context.Peek(); Debug.Assert(curGroup != null); if (curGroup != null) { curGroup.Children.Add(_drawGroup); } } } } } else { if (_drawGroup != null) { DrawingGroup currentGroup = context.Peek(); if (currentGroup == null || currentGroup != _drawGroup) { throw new InvalidOperationException("An existing group is expected."); } context.Pop(); } } _context = null; _drawGroup = null; base.AfterRender(renderer); }
public void RenderMarker0(WpfDrawingRenderer renderer, WpfDrawingContext gr, SvgMarkerPosition markerPos, SvgStyleableElement refElement) { //PathGeometry g; //g.GetPointAtFractionLength( ISharpMarkerHost markerHostElm = (ISharpMarkerHost)refElement; SvgMarkerElement markerElm = (SvgMarkerElement)_svgElement; SvgPointF[] 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++) { SvgPointF point = vertexPositions[i]; Matrix m = GetTransformMatrix(_svgElement); //GraphicsContainer gc = gr.BeginContainer(); this.BeforeRender(renderer); //gr.TranslateTransform(point.X, point.Y); //PAUL: //m.Translate(point.X, point.Y); if (markerElm.OrientType.AnimVal.Equals(SvgMarkerOrient.Angle)) { m.Rotate(markerElm.OrientAngle.AnimVal.Value); //gr.RotateTransform((double)markerElm.OrientAngle.AnimVal.Value); } else { double 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); m.Rotate(angle); } if (markerElm.MarkerUnits.AnimVal.Equals(SvgMarkerUnit.StrokeWidth)) { string propValue = refElement.GetPropertyValue("stroke-width"); if (propValue.Length == 0) propValue = "1"; SvgLength strokeWidthLength = new SvgLength("stroke-width", propValue, refElement, SvgLengthDirection.Viewport); double strokeWidth = strokeWidthLength.Value; //gr.ScaleTransform(strokeWidth, strokeWidth); m.Scale(strokeWidth, strokeWidth); } SvgPreserveAspectRatio spar = (SvgPreserveAspectRatio)markerElm.PreserveAspectRatio.AnimVal; double[] translateAndScale = spar.FitToViewBox( (SvgRect)markerElm.ViewBox.AnimVal, new SvgRect(0, 0, markerElm.MarkerWidth.AnimVal.Value, markerElm.MarkerHeight.AnimVal.Value)); //PAUL: //m.Translate(-(double)markerElm.RefX.AnimVal.Value * translateAndScale[2], -(double)markerElm.RefY.AnimVal.Value * translateAndScale[3]); //PAUL: m.Scale(translateAndScale[2], translateAndScale[3]); m.Translate(point.X, point.Y); //Matrix oldTransform = TransformMatrix; //TransformMatrix = m; //try //{ //newTransform.Append(m); //TransformGroup tg = new TransformGroup(); //renderer.Canvas.re //gr.TranslateTransform( // -(double)markerElm.RefX.AnimVal.Value * translateAndScale[2], // -(double)markerElm.RefY.AnimVal.Value * translateAndScale[3] // ); //gr.ScaleTransform(translateAndScale[2], translateAndScale[3]); renderer.RenderChildren(markerElm); // markerElm.RenderChildren(renderer); //} //finally //{ // TransformMatrix = oldTransform; //} // //gr.EndContainer(gc); _matrix = m; this.Render(renderer); //gr.EndContainer(gc); this.AfterRender(renderer); } }
public override void Render(WpfDrawingRenderer renderer) { if (_drawGroup == null || _drawContext == null) { return; } Point ctp = new Point(0, 0); // current text position WpfTextPlacement placement = WpfTextRenderer.GetCurrentTextPosition(_textElement, ctp); ctp = placement.Location; double rotate = placement.Rotation; if (!placement.HasPositions) { placement = null; // render it useless } string sBaselineShift = _textElement.GetPropertyValue("baseline-shift").Trim(); double shiftBy = 0; if (sBaselineShift.Length > 0) { double textFontSize = WpfTextRenderer.GetComputedFontSize(_textElement); if (sBaselineShift.EndsWith("%")) { shiftBy = SvgNumber.ParseNumber(sBaselineShift.Substring(0, sBaselineShift.Length - 1)) / 100 * textFontSize; } else if (sBaselineShift == "sub") { shiftBy = -0.6F * textFontSize; } else if (sBaselineShift == "super") { shiftBy = 0.6F * textFontSize; } else if (sBaselineShift == "baseline") { shiftBy = 0; } else { shiftBy = SvgNumber.ParseNumber(sBaselineShift); } } XmlNodeType nodeType = XmlNodeType.None; bool isVertical = false; string writingMode = _textElement.GetPropertyValue("writing-mode"); if (!String.IsNullOrEmpty(writingMode) && String.Equals(writingMode, "tb", StringComparison.OrdinalIgnoreCase)) { isVertical = true; } if (_svgElement.ChildNodes.Count == 1) { XmlNode child = _svgElement.ChildNodes[0]; nodeType = child.NodeType; if (nodeType == XmlNodeType.Text) { if (isVertical) { ctp.X -= shiftBy; RenderSingleLineTextV(_textElement, ref ctp, WpfTextRenderer.GetText(_textElement, child), rotate, placement); ctp.X += shiftBy; } else { ctp.Y -= shiftBy; RenderSingleLineTextH(_textElement, ref ctp, WpfTextRenderer.GetText(_textElement, child), rotate, placement); ctp.Y += shiftBy; } } else if (nodeType == XmlNodeType.Element) { string nodeName = child.Name; if (String.Equals(nodeName, "tref")) { AddTRefElementRun((SvgTRefElement)child, ref ctp, isVertical, true); } else if (String.Equals(nodeName, "tspan")) { AddTSpanElementRun((SvgTSpanElement)child, ref ctp, isVertical, true); } else if (String.Equals(nodeName, "textPath")) { RenderTextPath(_textElement, (SvgTextPathElement)child, ref ctp, rotate, placement); } } else if (nodeType == XmlNodeType.Whitespace) { if (isVertical) { ctp.X -= shiftBy; RenderSingleLineTextV(_textElement, ref ctp, WpfTextRenderer.GetText(_textElement, child), rotate, placement); ctp.X += shiftBy; } else { ctp.Y -= shiftBy; RenderSingleLineTextH(_textElement, ref ctp, WpfTextRenderer.GetText(_textElement, child), rotate, placement); ctp.Y += shiftBy; } } } else { string textAnchor = _textElement.GetPropertyValue("text-anchor"); WpfTextAnchor anchor = WpfTextAnchor.None; if (textAnchor == "middle") anchor = WpfTextAnchor.Middle; else if (textAnchor == "end") anchor = WpfTextAnchor.End; XmlNodeList nodeList = _svgElement.ChildNodes; // This is a very simply hack to change centered text to left align, since for // text containing spans, different font weights may be applied to the spans... if (anchor == WpfTextAnchor.Middle) { // Suspend the rendering... _isMeasuring = true; foreach (XmlNode child in nodeList) { nodeType = child.NodeType; if (nodeType == XmlNodeType.Text) { if (isVertical) { ctp.X -= shiftBy; RenderTextRunV(_textElement, ref ctp, WpfTextRenderer.GetText(_textElement, child), rotate, placement); ctp.X += shiftBy; } else { ctp.Y -= shiftBy; RenderTextRunH(_textElement, ref ctp, WpfTextRenderer.GetText(_textElement, child), rotate, placement); ctp.Y += shiftBy; } } else if (nodeType == XmlNodeType.Element) { string nodeName = child.Name; if (String.Equals(nodeName, "tref")) { AddTRefElementRun((SvgTRefElement)child, ref ctp, isVertical, false); } else if (String.Equals(nodeName, "tspan")) { AddTSpanElementRun((SvgTSpanElement)child, ref ctp, isVertical, false); } else if (String.Equals(nodeName, "textPath")) { RenderTextPath(_textElement, (SvgTextPathElement)child, ref ctp, rotate, placement); } } else if (nodeType == XmlNodeType.Whitespace) { if (isVertical) { ctp.X -= shiftBy; //RenderTextRunV(_textElement, ref ctp, GetText(_textElement, child)); RenderTextRunV(_textElement, ref ctp, Whitespace, rotate, placement); ctp.X += shiftBy; } else { ctp.Y -= shiftBy; //RenderTextRunH(_textElement, ref ctp, GetText(_textElement, child)); RenderTextRunH(_textElement, ref ctp, Whitespace, rotate, placement); ctp.Y += shiftBy; } } } ctp.X -= (_textWidth / 2d); // Resume the rendering... _isMeasuring = false; } bool textRendered = false; for (int i = 0; i < nodeList.Count; i++) { XmlNode child = nodeList[i]; nodeType = child.NodeType; if (nodeType == XmlNodeType.Text) { if (isVertical) { ctp.X -= shiftBy; RenderTextRunV(_textElement, ref ctp, WpfTextRenderer.GetText(_textElement, child), rotate, placement); ctp.X += shiftBy; } else { ctp.Y -= shiftBy; RenderTextRunH(_textElement, ref ctp, WpfTextRenderer.GetText(_textElement, child), rotate, placement); ctp.Y += shiftBy; } textRendered = true; } else if (nodeType == XmlNodeType.Element) { string nodeName = child.Name; if (String.Equals(nodeName, "tref")) { AddTRefElementRun((SvgTRefElement)child, ref ctp, isVertical, false); textRendered = true; } else if (String.Equals(nodeName, "tspan")) { AddTSpanElementRun((SvgTSpanElement)child, ref ctp, isVertical, false); textRendered = true; } else if (String.Equals(nodeName, "textPath")) { RenderTextPath(_textElement, (SvgTextPathElement)child, ref ctp, rotate, placement); textRendered = false; } } else if (nodeType == XmlNodeType.Whitespace) { if (textRendered) { if (isVertical) { ctp.X -= shiftBy; //RenderTextRunV(_textElement, ref ctp, GetText(_textElement, child)); RenderTextRunV(_textElement, ref ctp, Whitespace, rotate, placement); ctp.X += shiftBy; } else { ctp.Y -= shiftBy; //RenderTextRunH(_textElement, ref ctp, GetText(_textElement, child)); RenderTextRunH(_textElement, ref ctp, Whitespace, rotate, placement); ctp.Y += shiftBy; } textRendered = false; } } } } }
public void RenderMarker2(WpfDrawingRenderer renderer, WpfDrawingContext gr, SvgMarkerPosition markerPos, SvgStyleableElement refElement) { ISharpMarkerHost markerHostElm = (ISharpMarkerHost)refElement; SvgMarkerElement markerElm = (SvgMarkerElement)_svgElement; SvgPointF[] 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++) { SvgPointF point = vertexPositions[i]; //GdiGraphicsContainer gc = gr.BeginContainer(); this.BeforeRender(renderer); //Matrix matrix = Matrix.Identity; Matrix matrix = GetTransformMatrix(_svgElement); if (markerElm.OrientType.AnimVal.Equals((ushort)SvgMarkerOrient.Angle)) { matrix.Rotate(markerElm.OrientAngle.AnimVal.Value); } else { double angle = 0; 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; } matrix.Rotate(angle); } if (markerElm.MarkerUnits.AnimVal.Equals((ushort)SvgMarkerUnit.StrokeWidth)) { SvgLength strokeWidthLength = new SvgLength(refElement, "stroke-width", SvgLengthSource.Css, SvgLengthDirection.Viewport, "1"); double strokeWidth = strokeWidthLength.Value; matrix.Scale(strokeWidth, strokeWidth); } SvgPreserveAspectRatio spar = (SvgPreserveAspectRatio)markerElm.PreserveAspectRatio.AnimVal; double[] translateAndScale = spar.FitToViewBox((SvgRect)markerElm.ViewBox.AnimVal, new SvgRect(0, 0, markerElm.MarkerWidth.AnimVal.Value, markerElm.MarkerHeight.AnimVal.Value)); matrix.Translate(-markerElm.RefX.AnimVal.Value * translateAndScale[2], -markerElm.RefY.AnimVal.Value * translateAndScale[3]); matrix.Scale(translateAndScale[2], translateAndScale[3]); matrix.Translate(point.X, point.Y); _matrix = matrix; this.Render(renderer); //Clip(gr); renderer.RenderChildren(markerElm); //gr.EndContainer(gc); this.AfterRender(renderer); } }
public override void BeforeRender(WpfDrawingRenderer renderer) { base.BeforeRender(renderer); WpfDrawingContext context = renderer.Context; Geometry clipGeom = this.ClipGeometry; Transform transform = this.Transform; if (transform == null && (_svgElement.FirstChild != null && _svgElement.FirstChild == _svgElement.LastChild)) { try { SvgUseElement useElement = (SvgUseElement)_svgElement; // If none of the following attribute exists, an exception is thrown... double x = useElement.X.AnimVal.Value; double y = useElement.Y.AnimVal.Value; double width = useElement.Width.AnimVal.Value; double height = useElement.Height.AnimVal.Value; if (width > 0 && height > 0) { Rect elementBounds = new Rect(x, y, width, height); // Try handling the cases of "symbol" and "svg" sources within the "use"... XmlNode childNode = _svgElement.FirstChild; string childName = childNode.Name; if (String.Equals(childName, "symbol", StringComparison.OrdinalIgnoreCase)) { SvgSymbolElement symbolElement = (SvgSymbolElement)childNode; this.FitToViewbox(context, symbolElement, elementBounds); } } transform = this.Transform; } catch { } } if (transform != null) { try { SvgUseElement useElement = (SvgUseElement)_svgElement; // If none of the following attribute exists, an exception is thrown... double x = useElement.X.AnimVal.Value; double y = useElement.Y.AnimVal.Value; double width = useElement.Width.AnimVal.Value; double height = useElement.Height.AnimVal.Value; if (width > 0 && height > 0) { Rect elementBounds = new Rect(x, y, width, height); // Try handling the cases of "symbol" and "svg" sources within the "use"... XmlNode childNode = _svgElement.FirstChild; string childName = childNode.Name; if (String.Equals(childName, "symbol", StringComparison.OrdinalIgnoreCase)) { SvgSymbolElement symbolElement = (SvgSymbolElement)childNode; this.FitToViewbox(context, symbolElement, elementBounds); } } Transform symbolTransform = this.Transform; if (symbolTransform != null && !symbolTransform.Value.IsIdentity) { TransformGroup combinedTransform = new TransformGroup(); combinedTransform.Children.Add(transform); combinedTransform.Children.Add(symbolTransform); transform = combinedTransform; } } catch { } } if (clipGeom != null || transform != null) { _drawGroup = new DrawingGroup(); DrawingGroup currentGroup = context.Peek(); if (currentGroup == null) { throw new InvalidOperationException("An existing group is expected."); } currentGroup.Children.Add(_drawGroup); context.Push(_drawGroup); if (clipGeom != null) { _drawGroup.ClipGeometry = clipGeom; } if (transform != null) { _drawGroup.Transform = transform; } } }
public virtual bool NeedRender(WpfDrawingRenderer renderer) { if (_svgElement.GetAttribute("display") == "none") { return false; } return true; }
public void RenderMarker(WpfDrawingRenderer renderer, WpfDrawingContext gr, SvgMarkerPosition markerPos, SvgStyleableElement refElement) { ISharpMarkerHost markerHostElm = (ISharpMarkerHost)refElement; SvgMarkerElement markerElm = (SvgMarkerElement)_svgElement; SvgPointF[] 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++) { SvgPointF point = vertexPositions[i]; //GdiGraphicsContainer gc = gr.BeginContainer(); this.BeforeRender(renderer); //Matrix matrix = Matrix.Identity; Matrix matrix = GetTransformMatrix(_svgElement); if (markerElm.OrientType.AnimVal.Equals(SvgMarkerOrient.Angle)) { matrix.Rotate(markerElm.OrientAngle.AnimVal.Value); } else { double angle = 0; 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; } matrix.Rotate(angle); } if (markerElm.MarkerUnits.AnimVal.Equals(SvgMarkerUnit.StrokeWidth)) { SvgLength strokeWidthLength = new SvgLength(refElement, "stroke-width", SvgLengthSource.Css, SvgLengthDirection.Viewport, "1"); double strokeWidth = strokeWidthLength.Value; matrix.Scale(strokeWidth, strokeWidth); } SvgPreserveAspectRatio spar = (SvgPreserveAspectRatio)markerElm.PreserveAspectRatio.AnimVal; double[] translateAndScale = spar.FitToViewBox((SvgRect)markerElm.ViewBox.AnimVal, new SvgRect(0, 0, markerElm.MarkerWidth.AnimVal.Value, markerElm.MarkerHeight.AnimVal.Value)); matrix.Translate(-markerElm.RefX.AnimVal.Value * translateAndScale[2], -markerElm.RefY.AnimVal.Value * translateAndScale[3]); matrix.Scale(translateAndScale[2], translateAndScale[3]); matrix.Translate(point.X, point.Y); _matrix = matrix; this.Render(renderer); //Clip(gr); renderer.RenderChildren(markerElm); //gr.EndContainer(gc); this.AfterRender(renderer); } }
protected static void RenderMarkers(WpfDrawingRenderer renderer, SvgStyleableElement styleElm, WpfDrawingContext 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")); string markerAll = ExtractMarkerUrl(styleElm.GetPropertyValue("marker", "marker")); // The SVG specification defines three properties to reference markers: marker-start, // marker -mid, marker-end. It also provides a shorthand property, marker. Using the marker // property from a style sheet is equivalent to using all three (start, mid, end). // However, shorthand properties cannot be used as presentation attributes. if (!string.IsNullOrWhiteSpace(markerAll) && !IsPresentationMarker(styleElm)) { if (string.IsNullOrWhiteSpace(markerStartUrl)) { markerStartUrl = markerAll; } if (string.IsNullOrWhiteSpace(markerMiddleUrl)) { markerMiddleUrl = markerAll; } if (string.IsNullOrWhiteSpace(markerEndUrl)) { markerEndUrl = markerAll; } } if (markerStartUrl.Length > 0) { WpfMarkerRendering markerRenderer = CreateByUri(styleElm.OwnerDocument, styleElm.BaseURI, markerStartUrl) as WpfMarkerRendering; if (markerRenderer != null) { markerRenderer.RenderMarker(renderer, gr, SvgMarkerPosition.Start, styleElm); } } if (markerMiddleUrl.Length > 0) { // TODO markerMiddleUrl != markerStartUrl WpfMarkerRendering markerRenderer = CreateByUri(styleElm.OwnerDocument, styleElm.BaseURI, markerMiddleUrl) as WpfMarkerRendering; if (markerRenderer != null) { markerRenderer.RenderMarker(renderer, gr, SvgMarkerPosition.Mid, styleElm); } } if (markerEndUrl.Length > 0) { // TODO: markerEndUrl != markerMiddleUrl WpfMarkerRendering markerRenderer = CreateByUri(styleElm.OwnerDocument, styleElm.BaseURI, markerEndUrl) as WpfMarkerRendering; if (markerRenderer != null) { markerRenderer.RenderMarker(renderer, gr, SvgMarkerPosition.End, styleElm); } } } }
public void RenderMarkerEx0(WpfDrawingRenderer renderer, WpfDrawingContext gr, SvgMarkerPosition markerPos, SvgStyleableElement refElement) { //ISharpMarkerHost markerHostElm = (ISharpMarkerHost)refElement; //SvgMarkerElement markerElm = (SvgMarkerElement)element; //SvgPointF[] 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++) //{ // SvgPointF point = vertexPositions[i]; // GdiGraphicsContainer 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, markerElm.MarkerWidth.AnimVal.Value, // 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); // renderer.RenderChildren(markerElm); // gr.EndContainer(gc); //} }
private Drawing GetImage(WpfDrawingContext context) { WpfDrawingRenderer renderer = new WpfDrawingRenderer(); renderer.Window = _patternElement.OwnerDocument.Window as SvgWindow; WpfDrawingSettings settings = context.Settings.Clone(); settings.TextAsGeometry = true; WpfDrawingContext patternContext = new WpfDrawingContext(true, settings); patternContext.Initialize(null, context.FontFamilyVisitor, null); SvgSvgElement elm = MoveIntoSvgElement(); renderer.Render((SvgElement)elm, patternContext); Drawing img = renderer.Drawing; MoveOutOfSvgElement(elm); return img; }
public override void Render(WpfDrawingRenderer renderer) { WpfDrawingContext context = renderer.Context; SvgRenderingHint hint = _svgElement.RenderingHint; if (hint != SvgRenderingHint.Shape || hint == SvgRenderingHint.Clipping) { return; } // We do not directly render the contents of the clip-path, unless specifically requested... if (String.Equals(_svgElement.ParentNode.LocalName, "clipPath") && !context.RenderingClipRegion) { return; } SvgStyleableElement styleElm = (SvgStyleableElement)_svgElement; string sVisibility = styleElm.GetPropertyValue("visibility"); string sDisplay = styleElm.GetPropertyValue("display"); if (String.Equals(sVisibility, "hidden") || String.Equals(sDisplay, "none")) { return; } DrawingGroup drawGroup = context.Peek(); Debug.Assert(drawGroup != null); Geometry geometry = CreateGeometry(_svgElement, context.OptimizePath); if (geometry != null && !geometry.IsEmpty()) { SetClip(context); WpfSvgPaint fillPaint = new WpfSvgPaint(context, styleElm, "fill"); string fileValue = styleElm.GetAttribute("fill"); Brush brush = fillPaint.GetBrush(geometry); WpfSvgPaint strokePaint = new WpfSvgPaint(context, styleElm, "stroke"); Pen pen = strokePaint.GetPen(); if (brush != null || pen != null) { Transform transform = this.Transform; if (transform != null && !transform.Value.IsIdentity) { geometry.Transform = transform; if (brush != null) { Transform brushTransform = brush.Transform; if (brushTransform == null || brushTransform == Transform.Identity) { brush.Transform = transform; } else { TransformGroup groupTransform = new TransformGroup(); groupTransform.Children.Add(brushTransform); groupTransform.Children.Add(transform); brush.Transform = groupTransform; } } } else { transform = null; // render any identity transform useless... } GeometryDrawing drawing = new GeometryDrawing(brush, pen, geometry); string elementId = this.GetElementName(); if (!String.IsNullOrEmpty(elementId) && !context.IsRegisteredId(elementId)) { drawing.SetValue(FrameworkElement.NameProperty, elementId); context.RegisterId(elementId); if (context.IncludeRuntime) { SvgObject.SetId(drawing, elementId); } } Brush maskBrush = this.Masking; Geometry clipGeom = this.ClipGeometry; if (clipGeom != null || maskBrush != null) { //Geometry clipped = Geometry.Combine(geometry, clipGeom, // GeometryCombineMode.Exclude, null); //if (clipped != null && !clipped.IsEmpty()) //{ // geometry = clipped; //} DrawingGroup clipMaskGroup = new DrawingGroup(); Rect geometryBounds = geometry.Bounds; if (clipGeom != null) { clipMaskGroup.ClipGeometry = clipGeom; SvgUnitType clipUnits = this.ClipUnits; if (clipUnits == SvgUnitType.ObjectBoundingBox) { Rect drawingBounds = geometryBounds; if (transform != null) { drawingBounds = transform.TransformBounds(drawingBounds); } TransformGroup transformGroup = new TransformGroup(); // Scale the clip region (at (0, 0)) and translate to the top-left corner of the target. transformGroup.Children.Add( new ScaleTransform(drawingBounds.Width, drawingBounds.Height)); transformGroup.Children.Add( new TranslateTransform(drawingBounds.X, drawingBounds.Y)); clipGeom.Transform = transformGroup; } else { if (transform != null) { clipGeom.Transform = transform; } } } if (maskBrush != null) { SvgUnitType maskUnits = this.MaskUnits; if (maskUnits == SvgUnitType.ObjectBoundingBox) { Rect drawingBounds = geometryBounds; if (transform != null) { drawingBounds = transform.TransformBounds(drawingBounds); } TransformGroup transformGroup = new TransformGroup(); // Scale the clip region (at (0, 0)) and translate to the top-left corner of the target. transformGroup.Children.Add( new ScaleTransform(drawingBounds.Width, drawingBounds.Height)); transformGroup.Children.Add( new TranslateTransform(drawingBounds.X, drawingBounds.Y)); DrawingGroup maskGroup = ((DrawingBrush)maskBrush).Drawing as DrawingGroup; if (maskGroup != null) { DrawingCollection maskDrawings = maskGroup.Children; for (int i = 0; i < maskDrawings.Count; i++) { Drawing maskDrawing = maskDrawings[i]; GeometryDrawing maskGeomDraw = maskDrawing as GeometryDrawing; if (maskGeomDraw != null) { if (maskGeomDraw.Brush != null) { ConvertColors(maskGeomDraw.Brush); } if (maskGeomDraw.Pen != null) { ConvertColors(maskGeomDraw.Pen.Brush); } } } } //if (transformGroup != null) //{ // drawingBounds = transformGroup.TransformBounds(drawingBounds); //} //maskBrush.Viewbox = drawingBounds; //maskBrush.ViewboxUnits = BrushMappingMode.Absolute; //maskBrush.Stretch = Stretch.Uniform; //maskBrush.Viewport = drawingBounds; //maskBrush.ViewportUnits = BrushMappingMode.Absolute; maskBrush.Transform = transformGroup; } else { if (transform != null) { maskBrush.Transform = transform; } } clipMaskGroup.OpacityMask = maskBrush; } clipMaskGroup.Children.Add(drawing); drawGroup.Children.Add(clipMaskGroup); } else { drawGroup.Children.Add(drawing); } } } RenderMarkers(renderer, styleElm, context); }
// disable default rendering public override void BeforeRender(WpfDrawingRenderer renderer) { base.BeforeRender(renderer); _matrix = Matrix.Identity; WpfDrawingContext context = renderer.Context; //SetQuality(context); //SetTransform(context); //SetClip(_context); //SetMask(_context); _drawGroup = new DrawingGroup(); string sVisibility = _markerElement.GetPropertyValue("visibility"); string sDisplay = _markerElement.GetPropertyValue("display"); if (string.Equals(sVisibility, "hidden") || string.Equals(sDisplay, "none")) { // A 'marker' element with 'display' set to 'none' on that element or any // ancestor is rendered when referenced by another element. // _drawGroup.Opacity = 0; } string elementId = this.GetElementName(); if (!string.IsNullOrWhiteSpace(elementId) && !context.IsRegisteredId(elementId)) { _drawGroup.SetValue(FrameworkElement.NameProperty, elementId); context.RegisterId(elementId); if (context.IncludeRuntime) { SvgObject.SetId(_drawGroup, elementId); } } //Transform markerTransform = this.Transform; //if (markerTransform != null && !markerTransform.Value.IsIdentity) //{ // _drawGroup.Transform = markerTransform; //} //else //{ // markerTransform = null; // render any identity transform useless... //} Geometry markerClip = this.ClipGeometry; if (markerClip != null && !markerClip.IsEmpty()) { _drawGroup.ClipGeometry = markerClip; } else { markerClip = null; // render any empty geometry useless... } Brush markerMask = this.Masking; if (markerMask != null) { _drawGroup.OpacityMask = markerMask; } DrawingGroup currentGroup = context.Peek(); if (currentGroup == null) { throw new InvalidOperationException("An existing group is expected."); } currentGroup.Children.Add(_drawGroup); context.Push(_drawGroup); }
private GeometryCollection GetTextClippingRegion(SvgStyleableElement element, WpfDrawingContext context) { GeometryCollection geomColl = new GeometryCollection(); WpfDrawingRenderer renderer = new WpfDrawingRenderer(); renderer.Window = _svgElement.OwnerDocument.Window as SvgWindow; WpfDrawingSettings settings = context.Settings.Clone(); settings.TextAsGeometry = true; WpfDrawingContext clipContext = new WpfDrawingContext(true, settings); clipContext.RenderingClipRegion = true; clipContext.Initialize(null, context.FontFamilyVisitor, null); renderer.Render(element, clipContext); DrawingGroup rootGroup = renderer.Drawing as DrawingGroup; if (rootGroup != null && rootGroup.Children.Count == 1) { DrawingGroup textGroup = rootGroup.Children[0] as DrawingGroup; if (textGroup != null) { ExtractGeometry(textGroup, geomColl); } } return geomColl; }
public override void AfterRender(WpfDrawingRenderer renderer) { _clipGeometry = null; _transformMatrix = null; _maskBrush = null; _maskUnits = SvgUnitType.UserSpaceOnUse; _clipPathUnits = SvgUnitType.UserSpaceOnUse; _maskContentUnits = SvgUnitType.UserSpaceOnUse; }
public override void Render(WpfDrawingRenderer renderer) { if (_drawGroup != null) { Geometry clipGeom = this.ClipGeometry; if (clipGeom != null) { _drawGroup.ClipGeometry = clipGeom; } Transform transform = this.Transform; if (transform != null) { _drawGroup.Transform = transform; } float opacityValue = -1; SvgGElement element = (SvgGElement)_svgElement; string opacity = element.GetAttribute("opacity"); if (opacity != null && opacity.Length > 0) { opacityValue = (float)SvgNumber.ParseNumber(opacity); opacityValue = Math.Min(opacityValue, 1); opacityValue = Math.Max(opacityValue, 0); } if (opacityValue >= 0) { _drawGroup.Opacity = opacityValue; } } base.Render(renderer); }
public override void BeforeRender(WpfDrawingRenderer renderer) { if (renderer == null) { return; } _maskUnits = SvgUnitType.UserSpaceOnUse; _clipPathUnits = SvgUnitType.UserSpaceOnUse; _maskContentUnits = SvgUnitType.UserSpaceOnUse; WpfDrawingContext context = renderer.Context; SetQuality(context); SetTransform(context); SetClip(context); SetMask(context); }
public virtual void Render(WpfDrawingRenderer renderer) { }
public void RenderMarker(WpfDrawingRenderer renderer, WpfDrawingContext gr, SvgMarkerPosition markerPos, SvgStyleableElement refElement) { ISharpMarkerHost markerHostElm = (ISharpMarkerHost)refElement; SvgPointF[] vertexPositions = markerHostElm.MarkerPositions; int start = 0; int len = 0; // 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; } int end = start + len; TransformGroup transform = new TransformGroup(); for (int i = start; i < end; i++) { SvgPointF point = vertexPositions[i]; //GdiGraphicsContainer gc = gr.BeginContainer(); this.BeforeRender(renderer); //Matrix matrix = Matrix.Identity; Matrix matrix = GetTransformMatrix(_svgElement, transform); ISvgAnimatedEnumeration orientType = _markerElement.OrientType; if (orientType.AnimVal.Equals((ushort)SvgMarkerOrient.Angle)) { double scaleValue = _markerElement.OrientAngle.AnimVal.Value; if (!scaleValue.Equals(0)) { matrix.Rotate(scaleValue); transform.Children.Add(new RotateTransform(scaleValue)); } } else { bool isAutoReverse = orientType.AnimVal.Equals((ushort)SvgMarkerOrient.AutoStartReverse); double angle = 0; switch (markerPos) { case SvgMarkerPosition.Start: angle = markerHostElm.GetStartAngle(i); //angle = markerHostElm.GetStartAngle(i + 1); if (vertexPositions.Length >= 2) { SvgPointF pMarkerPoint1 = vertexPositions[start]; SvgPointF pMarkerPoint2 = vertexPositions[end]; float xDiff = pMarkerPoint2.X - pMarkerPoint1.X; float yDiff = pMarkerPoint2.Y - pMarkerPoint1.Y; double angleMarker = (float)(Math.Atan2(yDiff, xDiff) * 180.0 / Math.PI); if (!angleMarker.Equals(angle)) { angle = angleMarker; } } // A value of 'auto-start-reverse' means the same as 'auto' except that for a // marker placed by 'marker-start', the orientation is 180° different from // the orientation as determined by 'auto'. if (isAutoReverse) { angle += 180; } 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 - 1); //angle = markerHostElm.GetEndAngle(i); if (vertexPositions.Length >= 2) { SvgPointF pMarkerPoint1 = vertexPositions[start - 1]; SvgPointF pMarkerPoint2 = vertexPositions[start]; float xDiff = pMarkerPoint2.X - pMarkerPoint1.X; float yDiff = pMarkerPoint2.Y - pMarkerPoint1.Y; double angleMarker = (float)(Math.Atan2(yDiff, xDiff) * 180.0 / Math.PI); if (!angleMarker.Equals(angle)) { angle = angleMarker; } } break; } matrix.Rotate(angle); transform.Children.Add(new RotateTransform(angle)); } // 'viewBox' and 'preserveAspectRatio' attributes // viewBox -> viewport(0, 0, markerWidth, markerHeight) SvgPreserveAspectRatio spar = (SvgPreserveAspectRatio)_markerElement.PreserveAspectRatio.AnimVal; double[] translateAndScale = spar.FitToViewBox((SvgRect)_markerElement.ViewBox.AnimVal, new SvgRect(0, 0, _markerElement.MarkerWidth.AnimVal.Value, _markerElement.MarkerHeight.AnimVal.Value)); // Warning at this time, refX and refY are relative to the painted element's coordinate system. // We need to move the reference point to the marker's coordinate system double refX = _markerElement.RefX.AnimVal.Value; double refY = _markerElement.RefY.AnimVal.Value; if (!(refX.Equals(0) && refY.Equals(0))) { var ptRef = matrix.Transform(new Point(refX, refY)); refX = ptRef.X; refY = ptRef.Y; matrix.Translate(-refX, -refY); transform.Children.Add(new TranslateTransform(-refX, -refY)); } //matrix.Translate(-markerElm.RefX.AnimVal.Value * translateAndScale[2], // -markerElm.RefY.AnimVal.Value * translateAndScale[3]); //transform.Children.Add(new TranslateTransform(-markerElm.RefX.AnimVal.Value * translateAndScale[2], // -markerElm.RefY.AnimVal.Value * translateAndScale[3])); // compute an additional transform for 'strokeWidth' coordinate system ISvgAnimatedEnumeration markerUnits = _markerElement.MarkerUnits; if (markerUnits.AnimVal.Equals((ushort)SvgMarkerUnit.StrokeWidth)) { SvgLength strokeWidthLength = new SvgLength(refElement, "stroke-width", SvgLengthSource.Css, SvgLengthDirection.Viewport, "1"); double strokeWidth = strokeWidthLength.Value; if (!strokeWidth.Equals(1)) { matrix.Scale(strokeWidth, strokeWidth); transform.Children.Add(new ScaleTransform(strokeWidth, strokeWidth)); } } if (!(translateAndScale[2].Equals(1) && translateAndScale[3].Equals(1))) { matrix.Scale(translateAndScale[2], translateAndScale[3]); transform.Children.Add(new ScaleTransform(translateAndScale[2], translateAndScale[3])); } matrix.Translate(point.X, point.Y); transform.Children.Add(new TranslateTransform(point.X, point.Y)); _matrix = matrix; this.Transform = transform; this.Render(renderer); //Clip(gr); renderer.RenderChildren(_markerElement); //gr.EndContainer(gc); this.AfterRender(renderer); } }