示例#1
0
 public static Rectangle ToRectangle(TagRECT rect) => new Rectangle(rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top);
示例#2
0
 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);
                        }
                    }
                }
            }
        }