Ejemplo n.º 1
0
        public bool Draw(WallpaperRenderer renderer, IntPtr hdc, IntPtr memDc)
        {
            if (!BrowserManager.Browser.ShouldDraw)
            {
                return(false);
            }

            BrowserManager.Browser.ShouldDraw = false;

            Size wallpaperSize = renderer.ScreenManager.WallpaperSize;

            if (!BrowserManager.Browser.Size.Equals(wallpaperSize))
            {
                BrowserManager.Browser.Size = wallpaperSize;
            }

            Bitmap bitmap = BrowserManager.Browser.GetRenderData();

            if (bitmap == null)
            {
                if (lastRenderData != null)
                {
                    bitmap = lastRenderData;
                }
                else
                {
                    return(false);
                }
            }
            else
            {
                lastRenderData?.Dispose();
            }

            IntPtr hBitmap = bitmap.GetHbitmap();

            NativeWin32.SelectObject(memDc, hBitmap);

            Point offset = renderer.ScreenManager.WallpaperOffset;

            bool flag = NativeWin32.BitBlt(hdc,
                                           offset.X, offset.Y,
                                           wallpaperSize.Width, wallpaperSize.Height,
                                           memDc,
                                           0, 0,
                                           NativeWin32.TernaryRasterOperations.SRCCOPY);

            NativeWin32.DeleteObject(hBitmap);

            lastRenderData = bitmap;

            return(flag);
        }
        public int Run()
        {
            if (Running)
            {
                return(-1);
            }

            Running = true;

            Graphics graphics = DesktopTool.GetWallpaperGraphics();

            IntPtr hdc   = graphics.GetHdc();
            IntPtr memDc = NativeWin32.CreateCompatibleDC(hdc);

            LastRender = DateTime.Now.Ticks;

            try
            {
                while (Running)
                {
                    if (RenderEnabled.Value && RenderTarget != null && RenderTarget.CanDraw)
                    {
                        RenderTarget.Draw(this, hdc, memDc);
                    }

                    long now = DateTime.Now.Ticks;

                    FPS        = (now - LastRender) / 1000;
                    LastRender = now;

                    if (VSyncEnabled.Value)
                    {
                        System.Threading.Thread.Sleep(1000 / ScreenManager.WallpaperRefreshRate);
                    }
                }
            } catch (Exception e)
            {
                Logger.Error("Wallpaper rendering failed retrying after 1 seconds " + e);

                NativeWin32.DeleteObject(memDc);

                System.Threading.Thread.Sleep(1000);

                if (Running)
                {
                    Run();
                }
            }

            return(0);
        }