/// <summary>
        /// Initializes a new instance of the <see cref="SeeingSharpCoreWindowPainter"/> class.
        /// </summary>
        /// <param name="targetWindow">The target window.</param>
        public SeeingSharpCoreWindowPainter(CoreWindow targetWindow)
        {
            // Attach to SizeChanged event (refresh view resources only after a specific time)
            m_targetWindow              = targetWindow;
            m_targetWindow.SizeChanged += OnTargetWindow_SizeChanged;
            m_observerSizeChanged       = Observable.FromEventPattern <WindowSizeChangedEventArgs>(m_targetWindow, "SizeChanged")
                                          .Throttle(TimeSpan.FromSeconds(0.5))
                                          .ObserveOn(SynchronizationContext.Current)
                                          .Subscribe((eArgs) => OnTargetWindow_ThrottledSizeChanged(eArgs.Sender as CoreWindow, eArgs.EventArgs));

            // Attach to display setting changes
            m_displayInfo                     = DisplayInformation.GetForCurrentView();
            m_displayInfo.DpiChanged         += OnDisplayInfo_DpiChanged;
            m_displayInfo.OrientationChanged += OnDisplayInfo_OrientationChanged;

            // Store current dpi setting
            m_dpiScaling = new DpiScaling(m_displayInfo.LogicalDpi, m_displayInfo.LogicalDpi);

            // Create the RenderLoop object
            GraphicsCore.Touch();
            m_renderLoop                       = new Core.RenderLoop(SynchronizationContext.Current, this);
            m_renderLoop.ClearColor            = Color4.CornflowerBlue;
            m_renderLoop.CallPresentInUIThread = true;

            m_lastRefreshTargetSize = new Size(0.0, 0.0);

            UpdateRenderLoopViewSize();

            m_renderLoop.RegisterRenderLoop();
        }
        private void OnDisplayInfo_DpiChanged(DisplayInformation sender, object args)
        {
            if (m_isDisposed)
            {
                return;
            }

            m_dpiScaling = new DpiScaling(m_displayInfo.LogicalDpi, m_displayInfo.LogicalDpi);

            this.UpdateRenderLoopViewSize();
        }
예제 #3
0
        public static void InitializeBaseSystems()
        {
            Settings.Load();
            PlatformUtils.Initialize();
            DpiScaling.Initialize();
            Theme.Initialize();
            NesApu.Initialize();
#if FAMISTUDIO_WINDOWS
            WinUtils.Initialize();
            PerformanceCounter.Initialize();
#endif
        }
예제 #4
0
        void onResized(CSize newSize, double dpi)
        {
            dpiScaling        = new DpiScaling(dpi);
            viewportSize      = new Vector2((float)(newSize.cx / dpi), (float)(newSize.cy / dpi));
            rootTransform.M11 = (float)(2.0 / viewportSize.X);
            rootTransform.M22 = (float)(-2.0 / viewportSize.Y);

            foreach (var sub in resized)
            {
                sub(viewportSize, dpi);
            }
            swapChain?.destroyTargets();
        }
예제 #5
0
        public void ScaleSizeFFromPixelToDpi()
        {
            // Arrange
            var dpiScaling         = DpiScaling.GetByScaleFactors(1.5f, 1.5f);
            var dpiScalingProvider = A.Fake <IDpiScalingProvider>();

            A.CallTo(() => dpiScalingProvider.GetCurrentDpiScaling()).Returns(dpiScaling);

            // Act
            var sizePixel = new SizeF(750f, 1500f);
            var sizeDpi   = dpiScalingProvider.TransformSizeFromPixelToDip(sizePixel);

            // Assert
            Assert.AreEqual(500f, sizeDpi.Width);
            Assert.AreEqual(1000f, sizeDpi.Height);
        }
예제 #6
0
        public void ScalePointFromDpiToPixel()
        {
            // Arrange
            var dpiScaling         = DpiScaling.GetByScaleFactors(1.5f, 1.5f);
            var dpiScalingProvider = A.Fake <IDpiScalingProvider>();

            A.CallTo(() => dpiScalingProvider.GetCurrentDpiScaling()).Returns(dpiScaling);

            // Act
            var pointDpi   = new Point(500, 1000);
            var pointPixel = dpiScalingProvider.TransformPointFromDipToPixel(pointDpi);

            // Assert
            Assert.AreEqual(750, pointPixel.X);
            Assert.AreEqual(1500, pointPixel.Y);
        }
예제 #7
0
        public void ScaleSizeFromDpiToPixel()
        {
            // Arrange
            var dpiScaling         = DpiScaling.GetByScaleFactors(1.5f, 1.5f);
            var dpiScalingProvider = A.Fake <IDpiScalingProvider>();

            A.CallTo(() => dpiScalingProvider.GetCurrentDpiScaling()).Returns(dpiScaling);

            // Act
            var sizeDpi   = new Size(500, 1000);
            var sizePixel = dpiScalingProvider.TransformSizeFromDipToPixel(sizeDpi);

            // Assert
            Assert.AreEqual(750, sizePixel.Width);
            Assert.AreEqual(1500, sizePixel.Height);
        }
예제 #8
0
        public void ScalePointFFromPixelToDpi()
        {
            // Arrange
            var dpiScaling         = DpiScaling.GetByScaleFactors(1.5f, 1.5f);
            var dpiScalingProvider = A.Fake <IDpiScalingProvider>();

            A.CallTo(() => dpiScalingProvider.GetCurrentDpiScaling()).Returns(dpiScaling);

            // Act
            var pointPixel = new PointF(750f, 1500f);
            var pointDpi   = dpiScalingProvider.TransformPointFromPixelToDip(pointPixel);

            // Assert
            Assert.AreEqual(500f, pointDpi.X);
            Assert.AreEqual(1000f, pointDpi.Y);
        }
예제 #9
0
        /// <summary>
        /// Create all view resources.
        /// </summary>
        Tuple <D3D11.Texture2D, D3D11.RenderTargetView, D3D11.Texture2D, D3D11.DepthStencilView, SharpDX.Mathematics.Interop.RawViewportF, Size2, DpiScaling> IRenderLoopHost.OnRenderLoop_CreateViewResources(EngineDevice device)
        {
            int width  = this.Width;
            int height = this.Height;

            if (width <= Constants.MIN_VIEW_WIDTH)
            {
                width = Constants.MIN_VIEW_WIDTH;
            }
            if (height <= Constants.MIN_VIEW_HEIGHT)
            {
                height = Constants.MIN_VIEW_HEIGHT;
            }

            //Get all factories
            m_factory = device.FactoryDxgi;

            //Get all devices
            m_renderDevice        = device.DeviceD3D11_1;
            m_renderDeviceContext = m_renderDevice.ImmediateContext;

            //Create the swap chain and the render target
            m_swapChain    = GraphicsHelper.CreateSwapChainForWinForms(this, device, m_renderLoop.ViewConfiguration);
            m_backBuffer   = D3D11.Texture2D.FromSwapChain <D3D11.Texture2D>(m_swapChain, 0);
            m_renderTarget = new D3D11.RenderTargetView(m_renderDevice, m_backBuffer);

            //Create the depth buffer
            m_depthBuffer       = GraphicsHelper.CreateDepthBufferTexture(device, width, height, m_renderLoop.ViewConfiguration);
            m_renderTargetDepth = new D3D11.DepthStencilView(m_renderDevice, m_depthBuffer);

            //Define the viewport for rendering
            SharpDX.Mathematics.Interop.RawViewportF viewPort = GraphicsHelper.CreateDefaultViewport(width, height);

            // Query for current dpi value
            DpiScaling dpiScaling = DpiScaling.Default;

            using (Graphics graphics = this.CreateGraphics())
            {
                dpiScaling.DpiX = graphics.DpiX;
                dpiScaling.DpiY = graphics.DpiY;
            }

            //Return all generated objects
            return(Tuple.Create(m_backBuffer, m_renderTarget, m_depthBuffer, m_renderTargetDepth, viewPort, new Size2(width, height), dpiScaling));
        }
예제 #10
0
        /// <summary>
        /// Gets the current DpiScaling mode.
        /// </summary>
        public DpiScaling GetDpiScaling()
        {
            PresentationSource source          = PresentationSource.FromVisual(this);
            double             dpiScaleFactorX = 1.0;
            double             dpiScaleFactorY = 1.0;

            if (source != null)
            {
                dpiScaleFactorX = source.CompositionTarget.TransformToDevice.M11;
                dpiScaleFactorY = source.CompositionTarget.TransformToDevice.M22;
            }

            DpiScaling result = DpiScaling.Default;

            result.DpiX = (float)(result.DpiX * dpiScaleFactorX);
            result.DpiY = (float)(result.DpiY * dpiScaleFactorY);
            return(result);
        }
        /// <summary>
        /// Create all view resources.
        /// </summary>
        Tuple <D3D11.Texture2D, D3D11.RenderTargetView, D3D11.Texture2D, D3D11.DepthStencilView, SharpDX.ViewportF, Size2, DpiScaling> IRenderLoopHost.OnRenderLoop_CreateViewResources(EngineDevice engineDevice)
        {
            m_backBufferMultisampled = null;

            Size2 viewSize = GetTargetRenderPixelSize();

            // Create the SwapChain and associate it with the SwapChainBackgroundPanel
            m_swapChain               = GraphicsHelper.CreateSwapChainForComposition(engineDevice, viewSize.Width, viewSize.Height, m_renderLoop.ViewConfiguration);
            m_targetPanel.SwapChain   = m_swapChain;
            m_compositionScaleChanged = true;

            // Get the backbuffer from the SwapChain
            m_backBuffer = D3D11.Texture2D.FromSwapChain <D3D11.Texture2D>(m_swapChain, 0);

            // Define the render target (in case of multisample an own render target)
            D3D11.Texture2D backBufferForRenderloop = null;
            if (m_renderLoop.ViewConfiguration.AntialiasingEnabled)
            {
                m_backBufferMultisampled = GraphicsHelper.CreateRenderTargetTexture(engineDevice, viewSize.Width, viewSize.Height, m_renderLoop.ViewConfiguration);
                m_renderTargetView       = new D3D11.RenderTargetView(engineDevice.DeviceD3D11, m_backBufferMultisampled);
                backBufferForRenderloop  = m_backBufferMultisampled;
            }
            else
            {
                m_renderTargetView      = new D3D11.RenderTargetView(engineDevice.DeviceD3D11, m_backBuffer);
                backBufferForRenderloop = m_backBuffer;
            }

            //Create the depth buffer
            m_depthBuffer       = GraphicsHelper.CreateDepthBufferTexture(engineDevice, viewSize.Width, viewSize.Height, m_renderLoop.ViewConfiguration);
            m_renderTargetDepth = new D3D11.DepthStencilView(engineDevice.DeviceD3D11, m_depthBuffer);

            //Define the viewport for rendering
            SharpDX.ViewportF viewPort = GraphicsHelper.CreateDefaultViewport(viewSize.Width, viewSize.Height);
            m_lastRefreshTargetSize = new Size(viewSize.Width, viewSize.Height);

            DpiScaling dpiScaling = new DpiScaling();

            dpiScaling.DpiX = (float)(96.0 * m_targetPanel.CompositionScaleX);
            dpiScaling.DpiY = (float)(96.0 * m_targetPanel.CompositionScaleY);

            return(Tuple.Create(backBufferForRenderloop, m_renderTargetView, m_depthBuffer, m_renderTargetDepth, viewPort, viewSize, dpiScaling));
        }