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