/// <summary> /// /// </summary> /// <param name="dc"></param> /// <param name="path"></param> /// <param name="dx"></param> /// <param name="dy"></param> /// <param name="db"></param> /// <param name="r"></param> public void Draw(object dc, XPath path, double dx, double dy, ImmutableArray<ShapeProperty> db, Record r) { if (path.Geometry == null) return; var _dc = dc as DrawingContext; var style = path.Style; if (style == null) return; double thickness = style.Thickness / _state.Zoom; double half = thickness / 2.0; Tuple<Brush, Pen> cache = null; Brush fill; Pen stroke; if (_enableStyleCache && _styleCache.TryGetValue(style, out cache)) { fill = cache.Item1; stroke = cache.Item2; } else { fill = CreateBrush(style.Fill); stroke = CreatePen(style, thickness); if (_enableStyleCache) _styleCache.Add(style, Tuple.Create(fill, stroke)); } Tuple<XPathGeometry, StreamGeometry, ShapeStyle> pcache = null; StreamGeometry sg; if (_enablePathCache && _pathCache.TryGetValue(path, out pcache) && pcache.Item1 == path.Geometry && pcache.Item3 == style) { sg = pcache.Item2; _dc.DrawGeometry(path.IsFilled ? fill : null, path.IsStroked ? stroke : null, sg); } else { sg = path.Geometry.ToStreamGeometry(); if (_enablePathCache) { var tuple = Tuple.Create(path.Geometry, sg, style); if (_pathCache.ContainsKey(path)) { _pathCache[path] = tuple; } else { _pathCache.Add(path, tuple); } } _dc.DrawGeometry(path.IsFilled ? fill : null, path.IsStroked ? stroke : null, sg); } }
private void InitializeWorkingPath(XPoint start) { _geometry = XPathGeometry.Create( new List<XPathFigure>(), _editor.Project.Options.DefaultFillRule); _geometry.BeginFigure( start, _editor.Project.Options.DefaultIsFilled, _editor.Project.Options.DefaultIsClosed); _path = XPath.Create( "Path", _editor.Project.CurrentStyleLibrary.CurrentStyle, _geometry, _editor.Project.Options.DefaultIsStroked, _editor.Project.Options.DefaultIsFilled); _editor.Project.CurrentContainer.WorkingLayer.Shapes = _editor.Project.CurrentContainer.WorkingLayer.Shapes.Add(_path); _previousPathTool = _editor.CurrentPathTool; _isInitialized = true; }
/// <summary> /// /// </summary> /// <param name="gfx"></param> /// <param name="path"></param> /// <param name="dx"></param> /// <param name="dy"></param> /// <param name="db"></param> /// <param name="r"></param> public void Draw(object gfx, XPath path, double dx, double dy, ImmutableArray<ShapeProperty> db, Record r) { var _gfx = gfx as Graphics; var gp = path.Geometry.ToGraphicsPath(dx, dy, _scaleToPage); if (path.IsFilled && path.IsStroked) { var brush = ToSolidBrush(path.Style.Fill); var pen = ToPen(path.Style, _scaleToPage); _gfx.FillPath( brush, gp); _gfx.DrawPath( pen, gp); brush.Dispose(); pen.Dispose(); } else if (path.IsFilled && !path.IsStroked) { var brush = ToSolidBrush(path.Style.Fill); _gfx.FillPath( brush, gp); brush.Dispose(); } else if (!path.IsFilled && path.IsStroked) { var pen = ToPen(path.Style, _scaleToPage); _gfx.DrawPath( pen, gp); pen.Dispose(); } }
private void DeInitializeWorkingPath() { _isInitialized = false; _geometry = null; _path = null; }