Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

124 linhas
4.7 KiB

  1. using DamnOverSharp.Helpers;
  2. using DamnOverSharp.Renderers.Graphic;
  3. using DamnOverSharp.WPF.UiLibrary;
  4. using System.Drawing;
  5. using System.Drawing.Imaging;
  6. using System.Linq;
  7. using System.Threading;
  8. using System.Threading.Tasks;
  9. using System.Windows;
  10. using System.Windows.Controls;
  11. using System.Windows.Media;
  12. using System.Windows.Media.Imaging;
  13. namespace DamnOverSharp.Renderers.WPF
  14. {
  15. public class WpfRenderer
  16. {
  17. public System.Windows.Size RenderSize = new System.Windows.Size(1920, 1080);
  18. public System.Windows.Point RenderPosition = new System.Windows.Point(0, 0);
  19. public double DpiX = 96;
  20. public double DpiY = 96;
  21. public System.Windows.Point InteractionOffset
  22. {
  23. get => InternalWpfInteractionManager.Offset;
  24. set => InternalWpfInteractionManager.Offset = value;
  25. }
  26. internal GraphicRenderer InternalBitmapRenderer;
  27. internal WpfInteractionManager InternalWpfInteractionManager;
  28. public Viewbox ViewBox;
  29. public Grid MainContentGrid;
  30. public WpfRenderer(string processName, System.Windows.Size renderSize, System.Windows.Point renderPosition, double dpiX = 96, double dpiY = 96)
  31. {
  32. RenderSize = renderSize;
  33. RenderPosition = renderPosition;
  34. DpiX = dpiX;
  35. DpiY = dpiY;
  36. InternalBitmapRenderer = new GraphicRenderer(processName);
  37. InternalWpfInteractionManager = new WpfInteractionManager(this);
  38. MainContentGrid = new Grid() { Width = RenderSize.Width, Height = RenderSize.Height, Name="MainGrid" };
  39. ViewBox = new Viewbox() { Width = RenderSize.Width, Height = RenderSize.Height };
  40. ViewBox.Child = MainContentGrid;
  41. }
  42. public void AddControl(object element)
  43. {
  44. if(element is FrameworkElement)
  45. {
  46. MainContentGrid.Children.Add(element as FrameworkElement);
  47. if (element is UserControl)
  48. {
  49. if ((element as UserControl).Content is FrameworkElement)
  50. {
  51. foreach (VirtualControlBase virtualControl in WPF_VisualHelper.GetAllChildren((element as UserControl).Content as FrameworkElement).OfType<VirtualControlBase>())
  52. {
  53. virtualControl.SetRendererOnce(this);
  54. }
  55. }
  56. }
  57. if (element is VirtualControlBase)
  58. {
  59. (element as VirtualControlBase).SetRendererOnce(this);
  60. foreach (VirtualControlBase virtualControl in WPF_VisualHelper.GetAllChildren(element as VirtualControlBase).OfType<VirtualControlBase>())
  61. {
  62. virtualControl.SetRendererOnce(this);
  63. }
  64. }
  65. if (element is Window)
  66. {
  67. if((element as Window).Content is Window)
  68. {
  69. foreach (VirtualControlBase virtualControl in WPF_VisualHelper.GetAllChildren((element as UserControl).Content as FrameworkElement).OfType<VirtualControlBase>())
  70. {
  71. virtualControl.SetRendererOnce(this);
  72. }
  73. }
  74. }
  75. }
  76. }
  77. public void UpdateVisual()
  78. {
  79. ViewBox.Measure(RenderSize);
  80. ViewBox.Arrange(new Rect(0, 0, RenderSize.Width, RenderSize.Height));
  81. ViewBox.UpdateLayout();
  82. RenderTargetBitmap rtb = new RenderTargetBitmap((int)RenderSize.Width, (int)RenderSize.Height, DpiX, DpiY, PixelFormats.Pbgra32);
  83. rtb.Render(ViewBox);
  84. Bitmap bmp = BitmapSourceToBitmap(rtb);
  85. Task.Run(() => InternalBitmapRenderer.Draw(bmp, new System.Drawing.Point((int)RenderPosition.X, (int)RenderPosition.Y)));
  86. }
  87. private Bitmap BitmapSourceToBitmap(BitmapSource source)
  88. {
  89. Bitmap result = new Bitmap(source.PixelWidth, source.PixelHeight, System.Drawing.Imaging.PixelFormat.Format32bppPArgb);
  90. BitmapData data = result.LockBits(new Rectangle(System.Drawing.Point.Empty, result.Size), ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppPArgb);
  91. source.CopyPixels(Int32Rect.Empty, data.Scan0, data.Height * data.Stride, data.Stride);
  92. result.UnlockBits(data);
  93. return result;
  94. }
  95. public void Destroy()
  96. {
  97. InternalWpfInteractionManager.Destroy();
  98. InternalBitmapRenderer.Destroy();
  99. MainContentGrid = null;
  100. ViewBox = null;
  101. }
  102. }
  103. }