using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Data;
using Tango.BL.Entities;
using pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #336699; font-weight: bold } /* Name.Property */
.highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #336699 } /* Name.Variable */
.highlight .ow { color: #008800 } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */
.highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
.highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */
.highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */
.highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
.highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
.highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */
.highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */
.highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */
.highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */
.highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */
.highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */
.highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */
.highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */
.highlight .vc { color: #336699 } /* Name.Variable.Class */
.highlight .vg { color: #dd7700 } /* Name.Variable.Global */
.highlight .vi { color: #3333bb } /* Name.Variable.Instance */
.highlight .vm { color: #336699 } /* Name.Variable.Magic */
.highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */namespace RealTimeGraphEx.DX2D
{
using SharpDX;
using SharpDX.Direct2D1;
using SharpDX.Direct3D10;
using SharpDX.DXGI;
using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Threading;
using System.Windows;
using Device = SharpDX.Direct3D10.Device1;
using FeatureLevel = SharpDX.Direct3D10.FeatureLevel;
public abstract class Direct2DControl : System.Windows.Controls.Image
{
private Device Device;
private Texture2D RenderTarget;
private DX10ImageSource D3DSurface;
private readonly Stopwatch RenderTimer;
private RenderTarget m_d2dRenderTarget;
protected SharpDX.Direct2D1.Factory m_d2dFactory;
private bool enableRendering;
//private Stopwatch renderWatch;
//public int FrameRate { get; set; }
public Direct2DControl()
{
//renderWatch = new Stopwatch();
//FrameRate = 60;
this.RenderTimer = new Stopwatch();
this.Loaded += this.Window_Loaded;
this.Unloaded += this.Window_Closing;
this.Stretch = System.Windows.Media.Stretch.Fill;
}
public void EnableRendering()
{
enableRendering = true;
}
public void DisableRendering()
{
enableRendering = false;
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
if (Direct2DControl.IsInDesignMode)
{
return;
}
this.StartD3D();
this.StartRendering();
}
private void Window_Closing(object sender, RoutedEventArgs e)
{
if (Direct2DControl.IsInDesignMode)
{
return;
}
this.StopRendering();
this.EndD3D();
}
private void StartD3D()
{
this.Device = new Device(DriverType.Hardware, DeviceCreationFlags.BgraSupport, FeatureLevel.Level_10_0);
this.D3DSurface = new DX10ImageSource();
this.D3DSurface.IsFrontBufferAvailableChanged += OnIsFrontBufferAvailableChanged;
this.CreateAndBindTargets();
this.Source = this.D3DSurface;
}
private void EndD3D()
{
this.D3DSurface.IsFrontBufferAvailableChanged -= OnIsFrontBufferAvailableChanged;
this.Source = null;
Disposer.SafeDispose(ref this.m_d2dRenderTarget);
Disposer.SafeDispose(ref this.m_d2dFactory);
Disposer.SafeDispose(ref this.D3DSurface);
Disposer.SafeDispose(ref this.RenderTarget);
Disposer.SafeDispose(ref this.Device);
}
private void CreateAndBindTargets()
{
if (this.D3DSurface == null) return;
this.D3DSurface.SetRenderTargetDX10(null);
Disposer.SafeDispose(ref this.m_d2dRenderTarget);
Disposer.SafeDispose(ref this.m_d2dFactory);
Disposer.SafeDispose(ref this.RenderTarget);
var width = Math.Max((int)this.ActualWidth, 100);
var height = Math.Max((int)this.ActualHeight, 100);
var colordesc = new Texture2DDescription
{
BindFlags = BindFlags.RenderTarget | BindFlags.ShaderResource,
Format = Format.B8G8R8A8_UNorm,
Width = width,
Height = height,
MipLevels = 1,
SampleDescription = new SampleDescription(1, 0),
Usage = ResourceUsage.Default,
OptionFlags = ResourceOptionFlags.Shared,
CpuAccessFlags = CpuAccessFlags.None,
ArraySize = 1
};
this.RenderTarget = new Texture2D(this.Device, colordesc);
var surface = this.RenderTarget.QueryInterface<Surface>();
m_d2dFactory = new SharpDX.Direct2D1.Factory();
var rtp = new RenderTargetProperties(new PixelFormat(Format.Unknown, AlphaMode.Premultiplied));
m_d2dRenderTarget = new RenderTarget(m_d2dFactory, surface, rtp);
this.D3DSurface.SetRenderTargetDX10(this.RenderTarget);
}
private void StartRendering()
{
if (this.RenderTimer.IsRunning)
{
return;
}
System.Windows.Media.CompositionTarget.Rendering += OnRendering;
this.RenderTimer.Start();
//renderWatch.Start();
}
private void StopRendering()
{
if (!this.RenderTimer.IsRunning)
{
return;
}
System.Windows.Media.CompositionTarget.Rendering -= OnRendering;
this.RenderTimer.Stop();
RenderTimer.Stop();
}
private void OnRendering(object sender, EventArgs e)
{
if (!this.RenderTimer.IsRunning)
{
return;
}
//if (renderWatch.ElapsedMilliseconds >= (1000 / FrameRate))
//{
//renderWatch.Restart();
if (enableRendering)
{
this.PrepareAndCallRender();
this.D3DSurface.InvalidateD3DImage();
}
//}
}
protected override void OnRenderSizeChanged(SizeChangedInfo sizeInfo)
{
this.CreateAndBindTargets();
base.OnRenderSizeChanged(sizeInfo);
}
private void PrepareAndCallRender()
{
var device = this.Device;
if (device == null)
{
return;
}
var renderTarget = this.RenderTarget;
if (renderTarget == null)
{
return;
}
var targetWidth = renderTarget.Description.Width;
var targetHeight = renderTarget.Description.Height;
device.Rasterizer.SetViewports(new Viewport(0, 0, targetWidth, targetHeight, 0.0f, 1.0f));
// Does the actual rendering
m_d2dRenderTarget.BeginDraw();
this.Render(m_d2dRenderTarget);
m_d2dRenderTarget.EndDraw();
//this.ShowFramesPerSecondsOnDebug();
device.Flush();
}
/// <summary>
/// Does the actual rendering.
/// BeginDraw and EndDraw are already called by the caller.
/// </summary>
public abstract void Render(RenderTarget target);
/// <summary>
/// Shows the number of frames per seconds on the debug line
/// </summary>
private void ShowFramesPerSecondsOnDebug()
{
// Spits out the Frames per second
f++;
if ((DateTime.Now - last).TotalSeconds > 1)
{
System.Diagnostics.Debug.WriteLine(f);
f = 0;
last = DateTime.Now;
}
}
private DateTime last;
private int f;
private void OnIsFrontBufferAvailableChanged(object sender, DependencyPropertyChangedEventArgs e)
{
// this fires when the screensaver kicks in, the machine goes into sleep or hibernate
// and any other catastrophic losses of the d3d device from WPF's point of view
if (this.D3DSurface.IsFrontBufferAvailable)
{
this.StartRendering();
}
else
{
this.StopRendering();
}
}
/// <summary>
/// Gets f value indicating whether the control is in design mode
/// (running in Blend or Visual Studio).
/// </summary>
public static bool IsInDesignMode
{
get
{
var prop = DesignerProperties.IsInDesignModeProperty;
var isDesignMode = (bool)DependencyPropertyDescriptor.FromProperty(prop, typeof(FrameworkElement)).Metadata.DefaultValue;
return isDesignMode;
}
}
}
}