mirror of
https://github.com/ZuneDev/Xune.git
synced 2026-07-27 13:13:10 -07:00
Update SKSurface every host UI cycle
This commit is contained in:
@@ -35,7 +35,7 @@ namespace Microsoft.Iris.Render.Graphics
|
||||
private bool m_fBeginCaptureBackBuffer;
|
||||
private bool m_fEndCaptureBackBuffer;
|
||||
|
||||
internal GraphicsDevice(RenderSession session, string stDisplayName)
|
||||
internal GraphicsDevice(RenderSession session, string stDisplayName) : base(session.EngineInfo)
|
||||
{
|
||||
this.m_session = session;
|
||||
this.m_stDisplayName = stDisplayName;
|
||||
@@ -138,7 +138,9 @@ namespace Microsoft.Iris.Render.Graphics
|
||||
|
||||
internal virtual void CreateVideoPoolWorker(object oSurfacePool, object oHandle) => Debug2.Validate(false, null, "GraphicsDevice type does not support Video Pool");
|
||||
|
||||
[Obsolete]
|
||||
internal void RegisterWindow(RenderWindow win) => this.m_trackerWindows.AddObject(win);
|
||||
internal void RegisterWindow(RenderWindowBase win) => this.m_trackerWindows.AddObject(win);
|
||||
|
||||
public virtual bool CanPlayAnimationType(AnimationInputType type) => false;
|
||||
|
||||
@@ -215,6 +217,11 @@ namespace Microsoft.Iris.Render.Graphics
|
||||
|
||||
public virtual void RenderNowIfPossible()
|
||||
{
|
||||
RenderWindowBase window = (RenderWindowBase)m_trackerWindows.LiveObjects[0];
|
||||
window.RunOnUI(() =>
|
||||
{
|
||||
System.Diagnostics.Debug.WriteLine(EngineInfo.Surface);
|
||||
});
|
||||
}
|
||||
|
||||
public void BeginCaptureBackBuffer(string stFileName)
|
||||
|
||||
@@ -976,6 +976,11 @@ namespace Microsoft.Iris.Render.Internal
|
||||
m_remoteWindow.SendSetCursors(cursor1.ResourceId, cursor3.ResourceId);
|
||||
}
|
||||
|
||||
public override void RunOnUI(Action action)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public bool IsPreProcessedInput => m_fPreProcessedInput;
|
||||
|
||||
public delegate void RendererSuspendedHandler(object sender, RendererSuspendedArgs args);
|
||||
|
||||
@@ -16,7 +16,12 @@ namespace Microsoft.Iris.Render
|
||||
private SKSurface m_skSurface;
|
||||
private ConnectionInfo m_connectionInfo;
|
||||
|
||||
public static EngineInfo CreateLocal(SKSurface skSurface, RenderWindowBase renderWindow) => new IrisEngineInfo(skSurface, renderWindow, true);
|
||||
public static EngineInfo CreateLocal(SKSurface skSurface, RenderWindowBase renderWindow)
|
||||
{
|
||||
var info = new IrisEngineInfo(skSurface, renderWindow, true);
|
||||
Current = info;
|
||||
return info;
|
||||
}
|
||||
|
||||
public static EngineInfo CreateRemote(SKSurface skSurface, RenderWindowBase renderWindow) => new IrisEngineInfo(skSurface, renderWindow, true, TransportProtocol.TCP, "127.0.0.1", false);
|
||||
|
||||
@@ -48,5 +53,9 @@ namespace Microsoft.Iris.Render
|
||||
internal ConnectionInfo ConnectionInfo => this.m_connectionInfo;
|
||||
internal RenderWindowBase Window => this.m_renderWindow;
|
||||
internal SKSurface Surface => this.m_skSurface;
|
||||
|
||||
public static IrisEngineInfo Current { get; private set; }
|
||||
|
||||
public static void UpdateSurface(SKSurface surface) => Current.m_skSurface = surface;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,6 +21,7 @@ namespace Microsoft.Iris.Render
|
||||
m_session = session;
|
||||
if (graphicsDeviceType.FulfillsRequirement(GraphicsDeviceType.Skia))
|
||||
m_graphicsDevice = new SkiaGraphicsDevice(session);
|
||||
m_graphicsDevice.RegisterWindow(this);
|
||||
|
||||
m_visualRoot = new VisualContainer(true, session, this, new Object(), out var visual);
|
||||
InvokePaint();
|
||||
@@ -103,7 +104,6 @@ namespace Microsoft.Iris.Render
|
||||
public abstract void Close(FormCloseReason fcrCloseReason);
|
||||
public abstract IHwndHostWindow CreateHwndHostWindow();
|
||||
public abstract void ForceMouseIdle(bool fIdle);
|
||||
public abstract void Initialize();
|
||||
public abstract void LockMouseActive(bool fActive);
|
||||
public abstract void RefreshHitTarget();
|
||||
public abstract void Restore();
|
||||
@@ -119,6 +119,7 @@ namespace Microsoft.Iris.Render
|
||||
public abstract void TakeFocus();
|
||||
public abstract void TakeForeground(bool fForce);
|
||||
public abstract void TemporarilyExitExclusiveMode();
|
||||
public abstract void RunOnUI(Action action);
|
||||
|
||||
protected virtual void OnForwardWndMsg(uint msg, IntPtr wParam, IntPtr lParam) => ForwardMessageEvent?.Invoke(msg, wParam, lParam);
|
||||
protected virtual void FireLoadEvent() => LoadEvent?.Invoke();
|
||||
@@ -136,11 +137,16 @@ namespace Microsoft.Iris.Render
|
||||
protected virtual void OnCloseRequest() => CloseRequestEvent?.Invoke();
|
||||
protected virtual void OnSetFocus(bool focused) => SetFocusEvent?.Invoke(focused);
|
||||
|
||||
public virtual void Initialize()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public virtual void InvokePaint()
|
||||
{
|
||||
Session?.DeferredInvoke(new DeferredHandler((obj) =>
|
||||
{
|
||||
Debug2.WriteLine(DebugCategory.FormWindow, 0, (string)obj);
|
||||
System.Diagnostics.Debug.WriteLine((string)obj);
|
||||
}), "Howdy from dispatcher!", DeferredInvokePriority.VisualUpdate);
|
||||
return;
|
||||
|
||||
|
||||
@@ -3,14 +3,12 @@
|
||||
using Microsoft.Iris.Input;
|
||||
using Microsoft.Iris.Render.Graphics;
|
||||
using Microsoft.Iris.Render.Internal;
|
||||
using Microsoft.Iris.Library;
|
||||
using System;
|
||||
using System.Globalization;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Interop;
|
||||
using System.Windows.Media;
|
||||
using WpfCursor = System.Windows.Input.Cursor;
|
||||
using WpfCursors = System.Windows.Input.Cursors;
|
||||
|
||||
namespace Microsoft.Iris.Render
|
||||
@@ -187,7 +185,7 @@ namespace Microsoft.Iris.Render
|
||||
}
|
||||
set
|
||||
{
|
||||
WpfWindow.Dispatcher.Invoke(() =>
|
||||
RunOnUI(() =>
|
||||
{
|
||||
WpfWindow.Background = new SolidColorBrush(Color.FromArgb(
|
||||
(byte)(value.A * 255),
|
||||
@@ -203,10 +201,7 @@ namespace Microsoft.Iris.Render
|
||||
get
|
||||
{
|
||||
bool drop = false;
|
||||
WpfWindow.Dispatcher.Invoke(() =>
|
||||
{
|
||||
drop = WpfWindow.AllowDrop;
|
||||
});
|
||||
RunOnUI(() => drop = WpfWindow.AllowDrop);
|
||||
return drop;
|
||||
}
|
||||
set => WpfWindow.AllowDrop = true;
|
||||
@@ -219,7 +214,7 @@ namespace Microsoft.Iris.Render
|
||||
set
|
||||
{
|
||||
|
||||
WpfWindow.Dispatcher.Invoke(() =>
|
||||
RunOnUI(() =>
|
||||
{
|
||||
isFullscreen = value;
|
||||
if (isFullscreen)
|
||||
@@ -322,7 +317,7 @@ namespace Microsoft.Iris.Render
|
||||
public override void ClientToScreen(ref Point point)
|
||||
{
|
||||
var locPoint = point;
|
||||
WpfWindow.Dispatcher.Invoke(() =>
|
||||
RunOnUI(() =>
|
||||
{
|
||||
var p = WpfWindow.PointToScreen(new System.Windows.Point(locPoint.X, locPoint.Y));
|
||||
locPoint = new Point((int)p.X, (int)p.Y);
|
||||
@@ -332,10 +327,7 @@ namespace Microsoft.Iris.Render
|
||||
|
||||
public override void Close(FormCloseReason fcrCloseReason)
|
||||
{
|
||||
WpfWindow.Dispatcher.Invoke(() =>
|
||||
{
|
||||
WpfWindow.Close();
|
||||
});
|
||||
RunOnUI(() => WpfWindow.Close());
|
||||
}
|
||||
|
||||
public override IHwndHostWindow CreateHwndHostWindow()
|
||||
@@ -350,7 +342,14 @@ namespace Microsoft.Iris.Render
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
|
||||
var timer = new System.Timers.Timer(10);
|
||||
timer.Elapsed += (object sender, System.Timers.ElapsedEventArgs e) =>
|
||||
{
|
||||
//Iris.Session.UIDispatcher.Post(Iris.Session.DispatchPriority.Render, new Queues.QueueItem());
|
||||
};
|
||||
timer.Start();
|
||||
}
|
||||
|
||||
public override void LockMouseActive(bool fActive)
|
||||
@@ -360,12 +359,12 @@ namespace Microsoft.Iris.Render
|
||||
|
||||
public override void RefreshHitTarget()
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
|
||||
}
|
||||
|
||||
public override void Restore()
|
||||
{
|
||||
WpfWindow.Dispatcher.Invoke(() =>
|
||||
RunOnUI(() =>
|
||||
{
|
||||
WpfWindow.WindowState = System.Windows.WindowState.Normal;
|
||||
});
|
||||
@@ -374,7 +373,7 @@ namespace Microsoft.Iris.Render
|
||||
public override void ScreenToClient(ref Point point)
|
||||
{
|
||||
var locPoint = point;
|
||||
WpfWindow.Dispatcher.Invoke(() =>
|
||||
RunOnUI(() =>
|
||||
{
|
||||
var p = WpfWindow.PointFromScreen(new System.Windows.Point(locPoint.X, locPoint.Y));
|
||||
locPoint = new Point((int)p.X, (int)p.Y);
|
||||
@@ -384,7 +383,7 @@ namespace Microsoft.Iris.Render
|
||||
|
||||
public override void SetCapture(IRawInputSite captureSite, bool state)
|
||||
{
|
||||
WpfWindow.Dispatcher.Invoke(() =>
|
||||
RunOnUI(() =>
|
||||
{
|
||||
if (state)
|
||||
WpfWindow.CaptureMouse();
|
||||
@@ -405,7 +404,7 @@ namespace Microsoft.Iris.Render
|
||||
|
||||
public override void SetIcon(string sModuleName, uint nResourceID, IconFlags nOptions)
|
||||
{
|
||||
WpfWindow.Dispatcher.Invoke(() =>
|
||||
RunOnUI(() =>
|
||||
{
|
||||
WpfWindow.Icon = new System.Windows.Media.Imaging.BitmapImage(new Uri(sModuleName));
|
||||
});
|
||||
@@ -418,7 +417,7 @@ namespace Microsoft.Iris.Render
|
||||
|
||||
public override void SetWindowOptions(WindowOptions options, bool enable)
|
||||
{
|
||||
WpfWindow.Dispatcher.Invoke(() =>
|
||||
RunOnUI(() =>
|
||||
{
|
||||
if (options.HasFlag(WindowOptions.FreeformResize))
|
||||
WpfWindow.ResizeMode = enable ? ResizeMode.CanResize : ResizeMode.NoResize;
|
||||
@@ -427,12 +426,12 @@ namespace Microsoft.Iris.Render
|
||||
});
|
||||
}
|
||||
|
||||
public override void TakeFocus() => WpfWindow.Focus();
|
||||
public override void TakeFocus() => RunOnUI(() => WpfWindow.Focus());
|
||||
|
||||
public override void TakeForeground(bool fForce)
|
||||
{
|
||||
if (fForce)
|
||||
WpfWindow.Activate();
|
||||
RunOnUI(() => WpfWindow.Activate());
|
||||
}
|
||||
|
||||
public override void TemporarilyExitExclusiveMode()
|
||||
@@ -443,6 +442,11 @@ namespace Microsoft.Iris.Render
|
||||
public override void SetCurrentDisplay(IDisplay inputIDisplay) => CurrentDisplay = inputIDisplay;
|
||||
|
||||
public override void SetFullScreenExclusive(bool fNewValue) => FullScreenExclusive = fNewValue;
|
||||
|
||||
public override void RunOnUI(Action action)
|
||||
{
|
||||
WpfWindow.Dispatcher.Invoke(action);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -304,6 +304,11 @@ namespace Microsoft.Iris.Render
|
||||
public override void SetCurrentDisplay(IDisplay inputIDisplay) => CurrentDisplay = inputIDisplay;
|
||||
|
||||
public override void SetFullScreenExclusive(bool fNewValue) => FullScreenExclusive = fNewValue;
|
||||
|
||||
public override async void RunOnUI(Action action)
|
||||
{
|
||||
await XamlWindow.Dispatcher.RunAsync(CoreDispatcherPriority.High, new DispatchedHandler(action));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -33,6 +33,8 @@ namespace Xune.Wpf
|
||||
if (irisInitTask != null || Microsoft.Iris.Application.IsInitialized || Microsoft.Iris.Application.IsInitializing)
|
||||
{
|
||||
Canvas.PaintSurface -= Canvas_InitPaintSurface;
|
||||
Canvas.PaintSurface += Canvas_PaintSurface;
|
||||
Canvas.InvalidateMeasure();
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -41,13 +43,22 @@ namespace Xune.Wpf
|
||||
irisInitTask.Start();
|
||||
}
|
||||
|
||||
private void Canvas_PaintSurface(object sender, SKPaintSurfaceEventArgs e)
|
||||
{
|
||||
//System.Diagnostics.Debug.WriteLine("Canvas invalidated");
|
||||
IrisEngineInfo.UpdateSurface(e.Surface);
|
||||
Canvas.InvalidateMeasure();
|
||||
}
|
||||
|
||||
private void Init()
|
||||
{
|
||||
Microsoft.Iris.Application.Initialize(Surface, IrisWindow);
|
||||
|
||||
string pageUixPath = System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory,
|
||||
"Pages", "Home.uix");
|
||||
Microsoft.Iris.Application.LoadMarkup("file://" + pageUixPath);
|
||||
string uiName = "Default";
|
||||
//Microsoft.Iris.Application.LoadMarkup("file://" + pageUixPath);
|
||||
Microsoft.Iris.Application.Window.RequestLoad("file://" + pageUixPath);
|
||||
|
||||
Microsoft.Iris.Application.Run(new Microsoft.Iris.DeferredInvokeHandler((obj) => System.Diagnostics.Debug.WriteLine("Init done: {0}", obj)));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user