public static Rectangle ToRectangle(TagRECT rect) => new Rectangle(rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top);
public static extern bool GetWindowRect([In()] IntPtr hWnd, [Out()] out TagRECT lpRect);
private unsafe void RenderInternal(Input input) { if (webBrowser.InvokeRequired) { //wait until MathJax is done with rendering while (!mathJaxRenderingDone) { Thread.Sleep(WaitingIntervalMs); } webBrowser.Invoke(new Action <Input>(RenderInternal), input); } else { webBrowser.Width = (int)(input.ZoomScale * ExtensionSettings.Instance.CustomZoomScale * DefaultBrowserWidth); webBrowser.Height = (int)(input.ZoomScale * ExtensionSettings.Instance.CustomZoomScale * DefaultBrowserHeight); const int ExtraMargin = 4; var myDiv = webBrowser.Document.GetElementById("myDiv"); var width = (myDiv.OffsetRectangle.X + myDiv.ScrollRectangle.Width) + ExtraMargin; var height = (myDiv.OffsetRectangle.Y + myDiv.ScrollRectangle.Height) + ExtraMargin; webBrowser.Width = width; webBrowser.Height = height; webBrowser.Document.BackColor = Color.Transparent; const PixelFormat pixelFormat = PixelFormat.Format32bppArgb; using (var bitmap = new Bitmap(width, height, pixelFormat)) { if (webBrowser.Document.DomDocument is IViewObject viewObject) { var webBrowserRectangle = new TagRECT(myDiv.OffsetRectangle); var bitmapRectangle = new TagRECT(0, 0, width, height); using (var gr = Graphics.FromImage(bitmap)) { var hdc = gr.GetHdc(); try { int hr = viewObject.Draw(1 /*DVASPECT_CONTENT*/, -1, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, hdc, ref bitmapRectangle, ref webBrowserRectangle, IntPtr.Zero, 0); } finally { gr.ReleaseHdc(); } } var background = BGRA.From(input.Background); using (var croppedBitmap = CropToContent(bitmap, background)) { MakeBackgroundTransparent(croppedBitmap, background); var bitmapSource = ResourcesManager.CreateBitmapSourceWithCurrentDpi(croppedBitmap); var cacheInfo = new HtmlRendererCache.Info( currentContent, input.Foreground, input.Background, input.Font, input.ZoomScale * ExtensionSettings.Instance.CustomZoomScale, CacheVersion); var errors = objectForScripting.Errors.Count == 0 ? Array.Empty <string>() : objectForScripting.Errors.ToArray(); var cachedImagePath = errors.Length == 0 ? cache.Add(cacheInfo, croppedBitmap) : null; rendererResult = new RendererResult(bitmapSource, cachedImagePath, errors); } } } } }