Use Direct2D for CEF testing

This commit is contained in:
sardelka9515
2022-11-13 12:41:26 +08:00
parent 71195e93c2
commit 23e4151b2e
10 changed files with 211 additions and 47 deletions

View File

@ -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()
{

View File

@ -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>

View File

@ -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" )]

View File

@ -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" )]

View File

@ -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>

View 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();
}
}
}

View File

@ -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)

View File

@ -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.