2 using System.Collections.Generic;
5 using System.Windows.Media;
6 using System.Windows.Controls;
8 using System.Windows.Input;
9 using System.Globalization;
10 using SiliconStudio.Paradox.DebugTools.DataStructures;
11 using SiliconStudio.Presentation.Core;
13 namespace SiliconStudio.
Paradox.DebugTools
21 RoutedEvent = ProcessInfoRenderer.RenderEvent;
31 RoutedEvent = ProcessInfoRenderer.LastFrameRenderEvent;
40 public static readonly DependencyProperty ThreadLineHeightProperty = DependencyProperty.Register(
"ThreadLineHeight", typeof(
double), typeof(
ProcessInfoRenderer),
41 new FrameworkPropertyMetadata(32.0, FrameworkPropertyMetadataOptions.AffectsRender));
42 public static readonly DependencyProperty ThreadLineHeightMarginProperty = DependencyProperty.Register(
"ThreadLineHeightMargin", typeof(
double), typeof(
ProcessInfoRenderer),
43 new FrameworkPropertyMetadata(2.0, FrameworkPropertyMetadataOptions.AffectsRender));
44 public static readonly DependencyProperty PixelsPerSecondProperty = DependencyProperty.Register(
"PixelsPerSecond", typeof(
double), typeof(
ProcessInfoRenderer),
45 new FrameworkPropertyMetadata(100.0, FrameworkPropertyMetadataOptions.AffectsRender));
47 private static readonly DependencyPropertyKey LastFrameTimePropertyKey = DependencyProperty.RegisterReadOnly(
"LastFrameTime", typeof(
double), typeof(
ProcessInfoRenderer),
new PropertyMetadata());
48 public static readonly DependencyProperty LastFrameTimeProperty = LastFrameTimePropertyKey.DependencyProperty;
50 private readonly Brush defaultBrush =
new SolidColorBrush(
Color.FromArgb(0xFF, 0x64, 0x95, 0xED));
51 private readonly Pen defaultPen =
new Pen(Brushes.Black, 0.4);
52 private readonly Pen delimiterPen =
new Pen(Brushes.LightGray, 0.5);
55 public static readonly RoutedEvent RenderEvent = EventManager.RegisterRoutedEvent(
"Render", RoutingStrategy.Bubble, typeof(RenderRoutedEventHandler), typeof(
ProcessInfoRenderer));
58 public static readonly RoutedEvent LastFrameRenderEvent = EventManager.RegisterRoutedEvent(
"LastFrameRender", RoutingStrategy.Bubble, typeof(FrameRenderRoutedEventHandler), typeof(
ProcessInfoRenderer));
60 public event RenderRoutedEventHandler Render
62 add { AddHandler(RenderEvent, value); }
63 remove { RemoveHandler(RenderEvent, value); }
66 public event FrameRenderRoutedEventHandler LastFrameRender
68 add { AddHandler(LastFrameRenderEvent, value); }
69 remove { RemoveHandler(LastFrameRenderEvent, value); }
72 private void RaiseRenderEvent(
ProcessInfo processData)
79 RaiseEvent(
new FrameRenderRoutedEventArgs { ProcessData = processData, FrameData = frameData });
82 public double ThreadLineHeight
84 get {
return (
double)GetValue(ThreadLineHeightProperty); }
85 set { SetValue(ThreadLineHeightProperty, value); }
88 public double ThreadLineHeightMargin
90 get {
return (
double)GetValue(ThreadLineHeightMarginProperty); }
91 set { SetValue(ThreadLineHeightMarginProperty, value); }
94 public double PixelsPerSecond
96 get {
return (
double)GetValue(PixelsPerSecondProperty); }
97 set { SetValue(PixelsPerSecondProperty, value); }
102 defaultBrush.Freeze();
116 if (processInfo == null)
117 throw new ArgumentNullException(
"processInfo");
119 if (processInfo.
Frames.Count == 0)
123 Children.RemoveAt(0);
125 FrameInfo lastFrame = processInfo.Frames.Last();
126 SetValue(LastFrameTimePropertyKey, lastFrame.EndTime);
128 double offset = processInfo.Frames[0].BeginTime;
131 offset = lastFrame.EndTime - (ActualWidth / PixelsPerSecond);
133 for (
int i = 0; i < Children.Count; i++)
134 Children[i].SetValue(Canvas.LeftProperty, (processInfo.
Frames[i].BeginTime - offset) * PixelsPerSecond);
136 UIElement frameControl = CreateFrameElement(lastFrame);
138 if (frameControl != null)
140 frameControl.SetValue(Canvas.LeftProperty, (lastFrame.BeginTime - offset) * PixelsPerSecond);
141 Children.Add(frameControl);
144 RaiseLastFrameRenderEvent(processInfo, lastFrame);
153 if (processInfo == null)
154 throw new ArgumentNullException(
"processInfo");
156 if (processInfo.
Frames.Count == 0)
161 double offset = processInfo.Frames[0].BeginTime;
163 foreach (
FrameInfo frame
in processInfo.Frames)
165 UIElement frameControl = CreateFrameElement(frame);
167 if (frameControl != null)
169 frameControl.SetValue(Canvas.LeftProperty, (frame.BeginTime - offset) * PixelsPerSecond);
170 Children.Add(frameControl);
174 RaiseRenderEvent(processInfo);
177 private int maxThreadCount = 0;
184 private FrameworkElement CreateFrameElement(
FrameInfo frame)
187 throw new ArgumentNullException(
"frame");
194 maxThreadCount = frame.ThreadItems.Count;
198 Canvas canvas =
new Canvas();
203 UIElement frameThread = CreateFrameThreadElement(frame.
BeginTime, thread);
205 if (frameThread != null)
207 frameThread.SetValue(Canvas.TopProperty, threadIndex * ThreadLineHeight);
208 canvas.Children.Add(frameThread);
214 VisualElement frameDelimiter =
new VisualElement(CreateLine(maxThreadCount * ThreadLineHeight));
215 frameDelimiter.SetValue(Canvas.LeftProperty, -(delimiterPen.Thickness / 2.0));
216 canvas.Children.Add(frameDelimiter);
218 double w = (frame.EndTime - frame.BeginTime) * PixelsPerSecond;
219 canvas.Children.Add(
new VisualElement(CreateText(frame.
FrameNumber.ToString(), w, ThreadLineHeight)));
224 protected override void OnRender(DrawingContext dc)
228 for (
int i = 0; i < maxThreadCount + 1; i++)
230 double y = i * ThreadLineHeight;
231 dc.DrawLine(delimiterPen,
new Point(0.0, y),
new Point(ActualWidth, y));
241 private UIElement CreateFrameThreadElement(
double frameBeginTime,
ThreadInfo thread)
244 throw new ArgumentNullException(
"thread");
249 double y = ThreadLineHeightMargin;
250 double h = ThreadLineHeight - ThreadLineHeightMargin * 2.0;
252 VisualContainerElement container =
new VisualContainerElement();
256 double x = (microThread.BeginTime - frameBeginTime) * PixelsPerSecond;
257 double w = (microThread.EndTime - microThread.BeginTime) * PixelsPerSecond;
262 container.AddVisual(CreateRectangle(x, y, w, h));
268 private Visual CreateRectangle(
double x,
double y,
double w,
double h)
270 DrawingVisual visual =
new DrawingVisual();
272 using (DrawingContext context = visual.RenderOpen())
274 context.DrawRectangle(defaultBrush, defaultPen,
new Rect(x, y, w, h));
280 private Visual CreateLine(
double h)
282 DrawingVisual visual =
new DrawingVisual();
284 using (DrawingContext context = visual.RenderOpen())
286 context.DrawLine(delimiterPen,
new Point(0.0, 0.0),
new Point(0.0, h));
292 private Visual CreateText(
string text,
double w,
double h)
294 DrawingVisual visual =
new DrawingVisual();
296 using (DrawingContext context = visual.RenderOpen())
298 FormattedText ft =
new FormattedText(text, CultureInfo.InvariantCulture, FlowDirection.LeftToRight,
new Typeface(
"Arial"), 18.0, Brushes.Gray);
299 context.DrawText(ft,
new Point((w - ft.Width) / 2.0, (h - ft.Height) / 2.0));
_In_ size_t _In_ DXGI_FORMAT _In_ size_t _In_ float size_t y
SiliconStudio.Core.Mathematics.Color Color
System.Windows.Point Point