Use Direct2D for CEF testing
This commit is contained in:
@ -6,6 +6,7 @@ using System.IO.MemoryMappedFiles;
|
||||
using System.Runtime.Remoting;
|
||||
using System.Runtime.Remoting.Channels;
|
||||
using System.Runtime.Remoting.Channels.Ipc;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using CefSharp;
|
||||
using CefSharp.OffScreen;
|
||||
@ -35,16 +36,23 @@ namespace RageCoop.Client.CefHost
|
||||
private static ActivatedClientTypeEntry _controllerEntry;
|
||||
private static IpcChannel _adapterChannel;
|
||||
public static Action<string> OnCefMessage;
|
||||
private object _browser;
|
||||
private ChromiumWebBrowser _browser;
|
||||
private MemoryMappedFile _mmf;
|
||||
private string _mmfName;
|
||||
private CefProcessor _processor;
|
||||
private SafeMemoryMappedViewHandle _mmfView;
|
||||
private BufferMode _mode;
|
||||
public IntPtr PtrBuffer { get; private set; }
|
||||
|
||||
public int FrameRate
|
||||
{
|
||||
get => _browser.GetBrowserHost().WindowlessFrameRate;
|
||||
set => _browser.GetBrowserHost().WindowlessFrameRate = value;
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
(_browser as ChromiumWebBrowser)?.Dispose();
|
||||
_browser?.Dispose();
|
||||
|
||||
_mmf?.Dispose();
|
||||
if (PtrBuffer != IntPtr.Zero) _mmfView?.ReleasePointer();
|
||||
@ -153,28 +161,34 @@ namespace RageCoop.Client.CefHost
|
||||
|
||||
var adapter = new CefAdapter();
|
||||
adapter.Register(id, mode, _mmfName);
|
||||
|
||||
_browser = new ChromiumWebBrowser();
|
||||
((ChromiumWebBrowser)_browser).RenderHandler = new CefProcessor(size, adapter, PtrBuffer, mode);
|
||||
_browser.RenderHandler = _processor = new CefProcessor(size, adapter, PtrBuffer, mode);
|
||||
while (_browser.GetBrowserHost() == null) Thread.Sleep(20); // Wait till the browser is actually created
|
||||
Console.WriteLine("CefController created: " + size);
|
||||
}
|
||||
|
||||
|
||||
public void LoadUrl(string url)
|
||||
{
|
||||
((ChromiumWebBrowser)_browser).LoadUrl(url);
|
||||
_browser.LoadUrl(url);
|
||||
}
|
||||
public void Resize(Size size)
|
||||
{
|
||||
_browser.Size = size;
|
||||
_processor.Size = size;
|
||||
}
|
||||
|
||||
public void SendMouseClick(int x, int y, int modifiers, MouseButton button, bool mouseUp, int clicks)
|
||||
{
|
||||
var e = new MouseEvent(x, y, (CefEventFlags)modifiers);
|
||||
((ChromiumWebBrowser)_browser).GetBrowserHost()
|
||||
_browser.GetBrowserHost()
|
||||
?.SendMouseClickEvent(e, (MouseButtonType)button, mouseUp, clicks);
|
||||
}
|
||||
|
||||
public void SendMouseMove()
|
||||
public void SendMouseMove(int x, int y,bool leave=false)
|
||||
{
|
||||
// _browser.GetBrowserHost() ?.SendMouseMoveEvent(,);
|
||||
var e = new MouseEvent(x, y, 0);
|
||||
|
||||
_browser.GetBrowserHost()?.SendMouseMoveEvent(e,leave);
|
||||
}
|
||||
|
||||
public DateTime Ping()
|
||||
@ -203,7 +217,7 @@ namespace RageCoop.Client.CefHost
|
||||
private MemoryMappedFile _mmf;
|
||||
private SafeMemoryMappedViewHandle _mmfView;
|
||||
public int Id;
|
||||
public Size Size;
|
||||
public Size Size { get; private set; }
|
||||
|
||||
public CefAdapter()
|
||||
{
|
||||
|
@ -10,6 +10,13 @@
|
||||
</AllowedReferenceRelatedFileExtensions>
|
||||
<Configurations>Debug;Release</Configurations>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Compile Remove="Resources\**" />
|
||||
<EmbeddedResource Remove="Resources\**" />
|
||||
<None Remove="Resources\**" />
|
||||
<Page Remove="Resources\**" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Remove="bg.png" />
|
||||
</ItemGroup>
|
||||
@ -51,10 +58,6 @@
|
||||
</EmbeddedResource>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Folder Include="Resources\" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Costura.Fody" Version="5.7.0">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
|
@ -16,7 +16,7 @@ using System.Resources;
|
||||
|
||||
|
||||
// Version informationr(
|
||||
[assembly: AssemblyVersion("1.5.7.351")]
|
||||
[assembly: AssemblyFileVersion("1.5.7.351")]
|
||||
[assembly: AssemblyVersion("1.5.7.356")]
|
||||
[assembly: AssemblyFileVersion("1.5.7.356")]
|
||||
[assembly: NeutralResourcesLanguageAttribute( "en-US" )]
|
||||
|
||||
|
@ -15,7 +15,7 @@ using System.Resources;
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
// Version information
|
||||
[assembly: AssemblyVersion("1.5.8.32")]
|
||||
[assembly: AssemblyFileVersion("1.5.8.32")]
|
||||
[assembly: AssemblyVersion("1.5.8.34")]
|
||||
[assembly: AssemblyFileVersion("1.5.8.34")]
|
||||
[assembly: NeutralResourcesLanguageAttribute( "en-US" )]
|
||||
|
||||
|
@ -38,13 +38,53 @@
|
||||
<Reference Include="BitmapUtil">
|
||||
<HintPath>..\libs\BitmapUtil.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="PInvoke.Kernel32, Version=0.7.0.0, Culture=neutral, PublicKeyToken=9e300f9f87f04a7a, processorArchitecture=MSIL">
|
||||
<HintPath>..\..\packages\PInvoke.Kernel32.0.7.124\lib\net46\PInvoke.Kernel32.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="PInvoke.User32, Version=0.7.0.0, Culture=neutral, PublicKeyToken=9e300f9f87f04a7a, processorArchitecture=MSIL">
|
||||
<HintPath>..\..\packages\PInvoke.User32.0.7.124\lib\net45\PInvoke.User32.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="PInvoke.Windows.Core, Version=0.7.0.0, Culture=neutral, PublicKeyToken=9e300f9f87f04a7a, processorArchitecture=MSIL">
|
||||
<HintPath>..\..\packages\PInvoke.Windows.Core.0.7.124\lib\net45\PInvoke.Windows.Core.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="PInvoke.Windows.ShellScalingApi, Version=0.7.0.0, Culture=neutral, PublicKeyToken=9e300f9f87f04a7a, processorArchitecture=MSIL">
|
||||
<HintPath>..\..\packages\PInvoke.Windows.ShellScalingApi.0.7.124\lib\net45\PInvoke.Windows.ShellScalingApi.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="SharpD2D, Version=0.1.1.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\..\packages\SharpD2D.0.1.1\lib\netstandard2.0\SharpD2D.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="SharpDX, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b4dcf0f35e5521f1, processorArchitecture=MSIL">
|
||||
<HintPath>..\..\packages\SharpDX.4.2.0\lib\net45\SharpDX.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="SharpDX.Direct2D1, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b4dcf0f35e5521f1, processorArchitecture=MSIL">
|
||||
<HintPath>..\..\packages\SharpDX.Direct2D1.4.2.0\lib\net45\SharpDX.Direct2D1.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="SharpDX.DXGI, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b4dcf0f35e5521f1, processorArchitecture=MSIL">
|
||||
<HintPath>..\..\packages\SharpDX.DXGI.4.2.0\lib\net45\SharpDX.DXGI.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Buffers, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||
<HintPath>..\..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Core" />
|
||||
<Reference Include="System.Drawing" />
|
||||
<Reference Include="System.Drawing.Common, Version=4.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Drawing.Common.4.5.0\lib\net461\System.Drawing.Common.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Memory, Version=4.0.1.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||
<HintPath>..\..\packages\System.Memory.4.5.4\lib\net461\System.Memory.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Numerics" />
|
||||
<Reference Include="System.Numerics.Vectors, Version=4.1.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>..\..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=4.0.4.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>..\..\packages\System.Runtime.CompilerServices.Unsafe.4.5.3\lib\net461\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Runtime.Remoting" />
|
||||
<Reference Include="System.Threading.Tasks.Extensions, Version=4.2.0.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||
<HintPath>..\..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Windows.Forms" />
|
||||
<Reference Include="System.Xml.Linq" />
|
||||
<Reference Include="System.Data.DataSetExtensions" />
|
||||
@ -52,8 +92,14 @@
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Net.Http" />
|
||||
<Reference Include="System.Xml" />
|
||||
<Reference Include="Validation, Version=2.4.0.0, Culture=neutral, PublicKeyToken=2fc06f0d701809a7, processorArchitecture=MSIL">
|
||||
<HintPath>..\..\packages\Validation.2.4.15\lib\net45\Validation.dll</HintPath>
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="D2DWindow.cs">
|
||||
<SubType>Component</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Program.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
</ItemGroup>
|
||||
|
45
Tools/CefTest/D2DWindow.cs
Normal file
45
Tools/CefTest/D2DWindow.cs
Normal file
@ -0,0 +1,45 @@
|
||||
using System;
|
||||
using SharpD2D.Drawing;
|
||||
using SharpD2D.Windows;
|
||||
using System.Windows.Forms;
|
||||
using SharpDX.Direct2D1;
|
||||
using Image = SharpD2D.Drawing.Image;
|
||||
|
||||
namespace CefTest
|
||||
{
|
||||
public class D2DMedia:Control
|
||||
{
|
||||
private Canvas _canvas;
|
||||
private Image _img;
|
||||
public D2DMedia()
|
||||
{
|
||||
}
|
||||
|
||||
protected override void OnHandleCreated(EventArgs e)
|
||||
{
|
||||
base.OnHandleCreated(e);
|
||||
Console.WriteLine("Initialize");
|
||||
_canvas = new Canvas(Handle);
|
||||
_canvas.SetupGraphics += _canvas_SetupGraphics;
|
||||
_canvas.Initialize();
|
||||
_canvas.DrawGraphics += _canvas_DrawGraphics;
|
||||
}
|
||||
|
||||
private void _canvas_DrawGraphics(object sender, DrawGraphicsEventArgs e)
|
||||
{
|
||||
e.Graphics.BeginScene();
|
||||
e.Graphics.DrawImage(_img,default(PointF));
|
||||
e.Graphics.EndScene();
|
||||
}
|
||||
|
||||
public void UpdateAndPaint(int width,int height,int pitch,IntPtr scan0,PixelFormat format)
|
||||
{
|
||||
_img.Update(width,height,pitch,scan0,format);
|
||||
_canvas.SafeDraw();
|
||||
}
|
||||
private void _canvas_SetupGraphics(object sender, SetupGraphicsEventArgs e)
|
||||
{
|
||||
_img = e.Graphics.CreateImage();
|
||||
}
|
||||
}
|
||||
}
|
@ -1,9 +1,15 @@
|
||||
using System.Drawing;
|
||||
using System;
|
||||
using System.Drawing;
|
||||
using System.Drawing.Imaging;
|
||||
using System.Security.Permissions;
|
||||
using System.Threading;
|
||||
using System.Windows.Forms;
|
||||
using RageCoop.Client.CefHost;
|
||||
using SharpDX.DXGI;
|
||||
using static System.Windows.Forms.VisualStyles.VisualStyleElement;
|
||||
using AlphaMode = SharpDX.Direct2D1.AlphaMode;
|
||||
using SharpD2D;
|
||||
using SharpD2D.Windows;
|
||||
|
||||
namespace CefTest
|
||||
{
|
||||
@ -12,36 +18,58 @@ namespace CefTest
|
||||
[SecurityPermission(SecurityAction.Demand)]
|
||||
private static void Main(string[] args)
|
||||
{
|
||||
CefController.Initialize();
|
||||
var thread = new Thread(() =>
|
||||
{
|
||||
var controller = CefController.Create(0, new Size(800, 600), out var adapter, BufferMode.Dirty);
|
||||
Application.Run(new Test(adapter, controller));
|
||||
});
|
||||
thread.SetApartmentState(ApartmentState.STA);
|
||||
thread.Start();
|
||||
var controller2 = CefController.Create(1, new Size(800, 600), out var adapter2, BufferMode.Full);
|
||||
Application.Run(new Test2(adapter2, controller2));
|
||||
WindowHelper.DisableScalingGlobal();
|
||||
TimerService.EnableHighPrecisionTimers();
|
||||
CefController.Initialize(@"M:\SandBox-Shared\repos\RAGECOOP\RAGECOOP-V\bin\Debug\Client\SubProcess\RageCoop.Client.CefHost.exe");
|
||||
CefController.OnCefMessage += s => Console.WriteLine(s);
|
||||
Test2();
|
||||
}
|
||||
|
||||
static void Test1()
|
||||
{
|
||||
|
||||
var controller2 = CefController.Create(1, new Size(1920, 1080), out var adapter2, BufferMode.Dirty);
|
||||
Application.Run(new Test(adapter2, controller2));
|
||||
}
|
||||
private static void Test2()
|
||||
{
|
||||
var controller = CefController.Create(0, new Size(1920, 1080), out var adapter, BufferMode.Full);
|
||||
controller.FrameRate = 60;
|
||||
Application.Run(new Test2(adapter, controller));
|
||||
}
|
||||
}
|
||||
|
||||
internal class Test2 : Test
|
||||
{
|
||||
private D2DMedia _con;
|
||||
public Test2(CefAdapter adapter, CefController controller) : base(adapter, controller)
|
||||
{
|
||||
Text = "test2: full update";
|
||||
Text = "test2: d2d";
|
||||
_con = new D2DMedia { Size = Size };
|
||||
Controls.Add(_con);
|
||||
SizeChanged += (s, e) =>
|
||||
{
|
||||
_con.Size = Size;
|
||||
};
|
||||
_con.KeyDown += CefKeyDown;
|
||||
_con.MouseDown += (s, e) => MouseKey(e, false);
|
||||
_con.MouseUp += (s, e) => MouseKey(e, true);
|
||||
_con.MouseMove += (s, e) => controller?.SendMouseMove(Cursor.Position.X, Cursor.Position.Y - (Height - ClientRectangle.Height));
|
||||
|
||||
}
|
||||
|
||||
protected override void CefPaint(int bufferSize, Rectangle dirtyRect)
|
||||
{
|
||||
lock (_adapter)
|
||||
try
|
||||
{
|
||||
var size = _adapter.Size;
|
||||
var draw = new Bitmap(size.Width, size.Height, size.Width * 4, PixelFormat.Format32bppArgb,
|
||||
_adapter.PtrBuffer);
|
||||
_graphics.DrawImage(draw, Point.Empty);
|
||||
draw.Dispose();
|
||||
|
||||
lock (_adapter)
|
||||
{
|
||||
var size = _adapter.Size;
|
||||
_con.UpdateAndPaint(size.Width, size.Height, size.Width * 4, _adapter.PtrBuffer, new SharpDX.Direct2D1.PixelFormat(Format.B8G8R8A8_UNorm, AlphaMode.Premultiplied));
|
||||
}
|
||||
}
|
||||
catch (Exception ex) { Console.WriteLine(ex); }
|
||||
}
|
||||
}
|
||||
|
||||
@ -54,23 +82,24 @@ namespace CefTest
|
||||
public Test(CefAdapter adapter, CefController controller)
|
||||
{
|
||||
Text = "test1: partial update";
|
||||
AutoScaleMode = AutoScaleMode.None;
|
||||
Application.EnableVisualStyles();
|
||||
Size = adapter.Size;
|
||||
_adapter = adapter;
|
||||
_controller = controller;
|
||||
_adapter.OnPaint += CefPaint;
|
||||
controller.LoadUrl("https://www.youtube.com/watch?v=w3rQ3328Tok");
|
||||
KeyDown += TestForm_KeyDown;
|
||||
MouseClick += TestForm_MouseClick;
|
||||
controller.LoadUrl("https://www.youtube.com/watch?v=LXb3EKWsInQ");
|
||||
KeyDown += CefKeyDown;
|
||||
MouseDown += (s, e) => MouseKey(e, false);
|
||||
MouseUp += (s, e) => MouseKey(e, true);
|
||||
MouseMove += (s, e) => controller?.SendMouseMove(Cursor.Position.X, Cursor.Position.Y - (Height - ClientRectangle.Height));
|
||||
BackColor = Color.AliceBlue;
|
||||
_graphics = CreateGraphics();
|
||||
AutoScaleMode = AutoScaleMode.None;
|
||||
SizeChanged += (s, e) => _controller.Resize(ClientRectangle.Size);
|
||||
}
|
||||
|
||||
private void TestForm_MouseClick(object sender, MouseEventArgs e)
|
||||
public void MouseKey(MouseEventArgs e, bool up)
|
||||
{
|
||||
_controller?.SendMouseClick(e.X, e.Y, 0, GetFrom(e.Button), false, 1);
|
||||
_controller?.SendMouseClick(e.X, e.Y, 0, GetFrom(e.Button), true, 1);
|
||||
_controller?.SendMouseClick(e.X, e.Y, 0, GetFrom(e.Button), up, 1);
|
||||
}
|
||||
|
||||
public static MouseButton GetFrom(MouseButtons b)
|
||||
@ -85,9 +114,23 @@ namespace CefTest
|
||||
}
|
||||
}
|
||||
|
||||
private void TestForm_KeyDown(object sender, KeyEventArgs e)
|
||||
public void CefKeyDown(object sender, KeyEventArgs e)
|
||||
{
|
||||
if (e.KeyCode == Keys.R) _controller.LoadUrl("https://www.youtube.com/watch?v=x53lfkuP044/");
|
||||
else if (e.KeyCode == Keys.F11)
|
||||
{
|
||||
if (WindowState != FormWindowState.Maximized)
|
||||
{
|
||||
FormBorderStyle = FormBorderStyle.None;
|
||||
WindowState = FormWindowState.Maximized;
|
||||
}
|
||||
else
|
||||
{
|
||||
FormBorderStyle = FormBorderStyle.Sizable;
|
||||
WindowState = FormWindowState.Normal;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
protected virtual void CefPaint(int bufferSize, Rectangle dirtyRect)
|
||||
|
@ -1,5 +1,18 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<packages>
|
||||
<package id="System.Drawing.Common" version="4.5.0" targetFramework="net48" />
|
||||
<package id="PInvoke.Kernel32" version="0.7.124" targetFramework="net48" />
|
||||
<package id="PInvoke.User32" version="0.7.124" targetFramework="net48" />
|
||||
<package id="PInvoke.Windows.Core" version="0.7.124" targetFramework="net48" />
|
||||
<package id="PInvoke.Windows.ShellScalingApi" version="0.7.124" targetFramework="net48" />
|
||||
<package id="SharpD2D" version="0.1.1" targetFramework="net48" />
|
||||
<package id="SharpDX" version="4.2.0" targetFramework="net48" />
|
||||
<package id="SharpDX.Direct2D1" version="4.2.0" targetFramework="net48" />
|
||||
<package id="SharpDX.DXGI" version="4.2.0" targetFramework="net48" />
|
||||
<package id="System.Buffers" version="4.5.1" targetFramework="net48" />
|
||||
<package id="System.Drawing.Common" version="4.5.0" targetFramework="net48" />
|
||||
<package id="System.Memory" version="4.5.4" targetFramework="net48" />
|
||||
<package id="System.Numerics.Vectors" version="4.5.0" targetFramework="net48" />
|
||||
<package id="System.Runtime.CompilerServices.Unsafe" version="4.5.3" targetFramework="net48" />
|
||||
<package id="System.Threading.Tasks.Extensions" version="4.5.4" targetFramework="net48" />
|
||||
<package id="Validation" version="2.4.15" targetFramework="net48" />
|
||||
</packages>
|
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user