public override void OnRender(ChartControl chartControl, ChartScale chartScale, ChartBars chartBars) { Bars bars = chartBars.Bars; if (chartBars.FromIndex > 0) { chartBars.FromIndex--; } SharpDX.Direct2D1.PathGeometry lineGeometry = new SharpDX.Direct2D1.PathGeometry(Core.Globals.D2DFactory); GeometrySink sink = lineGeometry.Open(); sink.BeginFigure(new Vector2(chartControl.GetXByBarIndex(chartBars, chartBars.FromIndex > -1 ? chartBars.FromIndex : 0), chartScale.GetYByValue(bars.GetClose(chartBars.FromIndex > -1 ? chartBars.FromIndex : 0))), FigureBegin.Filled); for (int idx = chartBars.FromIndex + 1; idx <= chartBars.ToIndex; idx++) { double closeValue = bars.GetClose(idx); float close = chartScale.GetYByValue(closeValue); float x = chartControl.GetXByBarIndex(chartBars, idx); sink.AddLine(new Vector2(x, close)); } sink.EndFigure(FigureEnd.Open); sink.Close(); AntialiasMode oldAliasMode = RenderTarget.AntialiasMode; RenderTarget.AntialiasMode = AntialiasMode.PerPrimitive; RenderTarget.DrawGeometry(lineGeometry, UpBrushDX, (float)Math.Max(1, chartBars.Properties.ChartStyle.BarWidth)); RenderTarget.AntialiasMode = oldAliasMode; lineGeometry.Dispose(); }
public void DrawCircle(Renderer renderer, Vector2 center, float radius, float step, double a, double b, ref D2D1.PathGeometry outline, int col, float txt) { D2D1.PathGeometry path = new D2D1.PathGeometry(renderer.D2DFactory); D2D1.GeometrySink s = path.Open(); s.SetFillMode(D2D1.FillMode.Winding); s.BeginFigure(center + new Vector2((float)Math.Cos(a) * radius, (float)Math.Sin(a) * radius), D2D1.FigureBegin.Filled); for (double i = a; i <= b; i += Math.PI * .05) { s.AddLine(center + new Vector2((float)Math.Cos(i) * radius, (float)Math.Sin(i) * radius)); } s.AddLine(center + new Vector2((float)Math.Cos(b) * radius, (float)Math.Sin(b) * radius)); s.AddLine(center); s.EndFigure(D2D1.FigureEnd.Closed); s.Close(); s.Dispose(); renderer.D2DContext.FillGeometry(path, renderer.Brushes[Colors[col % Colors.Length]]); if (path.FillContainsPoint(Input.MousePos, 1)) { if (txt == 0) { txt = radius + 50; } RawRectangleF r = new RawRectangleF(center.X - 100, center.Y - txt, center.X + 100, center.Y - txt + 16); renderer.D2DContext.FillRectangle(r, renderer.Brushes["TransparentBlack"]); renderer.Consolas14.TextAlignment = DWrite.TextAlignment.Leading; renderer.D2DContext.DrawText( Name + " (" + Stopwatch.Elapsed.TotalMilliseconds.ToString("F1") + "ms)", renderer.Consolas14, r, renderer.Brushes[Colors[col % Colors.Length]], D2D1.DrawTextOptions.None, D2D1.MeasuringMode.GdiNatural); txt += 16; outline = path; } else { path.Dispose(); } double t = 0; foreach (Profiler p in Children) { col++; //if (p.ParentTickOffset > 0) // t += (p.ParentTickOffset / (double)Stopwatch.Elapsed.Ticks) * (b - a); double f = (p.Stopwatch.Elapsed.Ticks / (double)Stopwatch.Elapsed.Ticks) * (b - a); p.DrawCircle(renderer, center, radius - step, step, a + t, a + t + f, ref outline, col, txt); t += f; } }
public void DrawCircle(Renderer renderer, Vector2 center, float radius) { D2D1.PathGeometry outline = null; DrawCircle(renderer, center, radius, radius * .05f, 0, Math.PI * 2, ref outline, 0, 0); if (outline != null) { renderer.D2DContext.DrawGeometry(outline, renderer.Brushes["Black"], 2); outline.Dispose(); } }
public Result DrawGlyphRun(object clientDrawingContext, float baselineOriginX, float baselineOriginY, MeasuringMode measuringMode, GlyphRun glyphRun, GlyphRunDescription glyphRunDescription, ComObject clientDrawingEffect) { var pathGeometry = new PathGeometry(_d2DFactory); var geometrySink = pathGeometry.Open(); var fontFace = glyphRun.FontFace; if (glyphRun.Indices.Length > 0) fontFace.GetGlyphRunOutline(glyphRun.FontSize, glyphRun.Indices, glyphRun.Advances, glyphRun.Offsets, glyphRun.IsSideways, glyphRun.BidiLevel % 2 != 0, geometrySink); geometrySink.Close(); geometrySink.Dispose(); fontFace.Dispose(); var matrix = new Matrix3x2() { M11 = 1, M12 = 0, M21 = 0, M22 = 1, M31 = baselineOriginX, M32 = baselineOriginY }; var transformedGeometry = new TransformedGeometry(_d2DFactory, pathGeometry, matrix); var brushColor = (Color4)Color.Black; if (clientDrawingEffect != null && clientDrawingEffect is ColorDrawingEffect) brushColor = (clientDrawingEffect as ColorDrawingEffect).Color; var brush = new SolidColorBrush(_renderTarget, brushColor); _renderTarget.DrawGeometry(transformedGeometry, brush); _renderTarget.FillGeometry(transformedGeometry, brush); pathGeometry.Dispose(); transformedGeometry.Dispose(); brush.Dispose(); return SharpDX.Result.Ok; }
private void Update(bool forceUpdate = false) { if (isUpdated || forceUpdate) { isUpdated = false; geometry?.Dispose(); geometry = new d2.PathGeometry(Renderer.Factory); var s = geometry.Open(); s.BeginFigure(Points[0], d2.FigureBegin.Filled); s.AddLines(Points.Select(v2 => new mi.RawVector2(v2.X, v2.Y)).ToArray()); s.EndFigure(d2.FigureEnd.Closed); s.Close(); strokeBrush?.Dispose(); strokeBrush = new d2.SolidColorBrush(Renderer.Device, _stroke.ToColor4()); fillBrush?.Dispose(); fillBrush = new d2.SolidColorBrush(Renderer.Device, _fill.ToColor4()); } }
public override SharpDX.Result DrawGlyphRun(object clientDrawingContext, float baselineOriginX, float baselineOriginY, MeasuringMode measuringMode, GlyphRun glyphRun, GlyphRunDescription glyphRunDescription, SharpDX.ComObject clientDrawingEffect) { Color4 c = Color4.White; if (clientDrawingEffect != null) { if (clientDrawingEffect is SharpDX.Direct2D1.SolidColorBrush) { var sb = (SharpDX.Direct2D1.SolidColorBrush)clientDrawingEffect; c = sb.Color; } } if (glyphRun.Indices.Length > 0) { PathGeometry pg = new PathGeometry(this.factory); GeometrySink sink = pg.Open(); glyphRun.FontFace.GetGlyphRunOutline(glyphRun.FontSize, glyphRun.Indices, glyphRun.Advances, glyphRun.Offsets, glyphRun.IsSideways, glyphRun.BidiLevel % 2 == 1, sink as SimplifiedGeometrySink); sink.Close(); TransformedGeometry tg = new TransformedGeometry(this.factory, pg, Matrix3x2.Translation(baselineOriginX, baselineOriginY) * Matrix3x2.Scaling(1.0f, -1.0f)); pg.Dispose(); //Transform from baseline this.AddGeometry(tg); return SharpDX.Result.Ok; } else { return SharpDX.Result.Ok; } }
public IGeometry Geometry(IRecorder<IGeometryTarget> records) { var path = new PathGeometry(Factory); try { using (var sink = path.Open()) { var target = new GeometryTarget(Factory, sink); records.Replay(target); target.endOpenFigure(); sink.Close(); } return new GeometryImplementation(path); } catch { path.Dispose(); throw; } }
public override Result DrawUnderline(object clientDrawingContext, float baselineOriginX, float baselineOriginY, ref Underline underline, ComObject clientDrawingEffect) { PathGeometry pg = new PathGeometry(this.factory); GeometrySink sink = pg.Open(); Vector2 topLeft = new Vector2(0.0f, underline.Offset); sink.BeginFigure(topLeft, FigureBegin.Filled); topLeft.X += underline.Width; sink.AddLine(topLeft); topLeft.Y += underline.Thickness; sink.AddLine(topLeft); topLeft.X -= underline.Width; sink.AddLine(topLeft); sink.EndFigure(FigureEnd.Closed); sink.Close(); TransformedGeometry tg = new TransformedGeometry(this.factory, pg, Matrix3x2.Translation(baselineOriginX, baselineOriginY) * Matrix3x2.Scaling(1.0f, -1.0f)); pg.Dispose(); this.AddGeometry(tg); return Result.Ok; }
public override void OnRender(ChartControl chartControl, ChartScale chartScale, ChartBars chartBars) { Bars bars = chartBars.Bars; if (chartBars.FromIndex > 0) { chartBars.FromIndex--; } SharpDX.Direct2D1.PathGeometry lineGeometry = new SharpDX.Direct2D1.PathGeometry(Core.Globals.D2DFactory); AntialiasMode oldAliasMode = RenderTarget.AntialiasMode; GeometrySink sink = lineGeometry.Open(); sink.BeginFigure(new Vector2(chartControl.GetXByBarIndex(chartBars, chartBars.FromIndex > -1 ? chartBars.FromIndex : 0), chartScale.GetYByValue(bars.GetClose(chartBars.FromIndex > -1 ? chartBars.FromIndex : 0))), FigureBegin.Filled); for (int idx = chartBars.FromIndex + 1; idx <= chartBars.ToIndex; idx++) { double closeValue = bars.GetClose(idx); float close = chartScale.GetYByValue(closeValue); float x = chartControl.GetXByBarIndex(chartBars, idx); sink.AddLine(new Vector2(x, close)); } sink.EndFigure(FigureEnd.Open); sink.Close(); RenderTarget.AntialiasMode = AntialiasMode.PerPrimitive; RenderTarget.DrawGeometry(lineGeometry, UpBrushDX, (float)Math.Max(1, chartBars.Properties.ChartStyle.BarWidth)); lineGeometry.Dispose(); SharpDX.Direct2D1.SolidColorBrush fillOutline = new SharpDX.Direct2D1.SolidColorBrush(RenderTarget, SharpDX.Color.Transparent); SharpDX.Direct2D1.PathGeometry fillGeometry = new SharpDX.Direct2D1.PathGeometry(Core.Globals.D2DFactory); GeometrySink fillSink = fillGeometry.Open(); fillSink.BeginFigure(new Vector2(chartControl.GetXByBarIndex(chartBars, chartBars.FromIndex > -1 ? chartBars.FromIndex : 0), chartScale.GetYByValue(chartScale.MinValue)), FigureBegin.Filled); float fillx = float.NaN; for (int idx = chartBars.FromIndex; idx <= chartBars.ToIndex; idx++) { double closeValue = bars.GetClose(idx); float close = chartScale.GetYByValue(closeValue); fillx = chartControl.GetXByBarIndex(chartBars, idx); fillSink.AddLine(new Vector2(fillx, close)); } if (!double.IsNaN(fillx)) { fillSink.AddLine(new Vector2(fillx, chartScale.GetYByValue(chartScale.MinValue))); } fillSink.EndFigure(FigureEnd.Open); fillSink.Close(); DownBrushDX.Opacity = Opacity / 100f; if (!(DownBrushDX is SharpDX.Direct2D1.SolidColorBrush)) { TransformBrush(DownBrushDX, new RectangleF(0, 0, (float)chartScale.Width, (float)chartScale.Height)); } RenderTarget.FillGeometry(fillGeometry, DownBrushDX); RenderTarget.DrawGeometry(fillGeometry, fillOutline, (float)chartBars.Properties.ChartStyle.BarWidth); fillOutline.Dispose(); RenderTarget.AntialiasMode = oldAliasMode; fillGeometry.Dispose(); }
/// <summary> /// Fills a Polygon. /// </summary> /// <param name="color">The Color.</param> /// <param name="polygon">The Polygon.</param> public void FillPolygon(Color color, Polygon polygon) { var geometry = new PathGeometry(DirectXHelper.D2DFactory); using (GeometrySink sink = geometry.Open()) { sink.BeginFigure(DirectXHelper.ConvertVector(polygon.Points[0]), FigureBegin.Filled); for (int i = 1; i < polygon.Points.Length; i++) sink.AddLine(DirectXHelper.ConvertVector(polygon.Points[i])); sink.EndFigure(FigureEnd.Closed); sink.Close(); DirectXHelper.RenderTarget.FillGeometry(geometry, new SolidColorBrush(DirectXHelper.RenderTarget, DirectXHelper.ConvertColor(color))); } geometry.Dispose(); }
/// <summary> /// Draws a Polygon. /// </summary> /// <param name="pen">The Pen.</param> /// <param name="polygon">The Polygon.</param> public void DrawPolygon(Pen pen, Polygon polygon) { var dxPen = pen.Instance as DirectXPen; if (dxPen == null) throw new ArgumentException("DirectX11 expects a DirectXPen as resource."); var geometry = new PathGeometry(DirectXHelper.D2DFactory); using (GeometrySink sink = geometry.Open()) { sink.BeginFigure(DirectXHelper.ConvertVector(polygon.Points[0]), FigureBegin.Hollow); for (int i = 1; i < polygon.Points.Length; i++) sink.AddLine(DirectXHelper.ConvertVector(polygon.Points[i])); sink.EndFigure(FigureEnd.Closed); sink.Close(); DirectXHelper.RenderTarget.DrawGeometry(geometry, dxPen.GetPen(), dxPen.Width); } geometry.Dispose(); }