public void GetResizedPageImage(PDFRendererPageControl page_control, int page, int height, int width, ResizedPageImageItemCallbackDelegate callback)
        {
            WPFDoEvents.AssertThisCodeIsRunningInTheUIThread();

            // Utilities.LockPerfTimer l1_clk = Utilities.LockPerfChecker.Start();
            lock (resized_page_image_item_requests)
            {
                // l1_clk.LockPerfTimerStop();
                Logging.Debug("Queueing page redraw for {0}", page);
                resized_page_image_item_requests[page] = new ResizedPageImageItemRequest
                {
                    page         = page,
                    page_control = page_control,
                    height       = height,
                    width        = width,
                    callback     = callback
                };

                resized_page_image_item_request_orders.Add(page);

                if (num_resized_page_image_item_thread_running < 1)
                {
                    Interlocked.Increment(ref num_resized_page_image_item_thread_running);
                    ResizedPageImageItemThreadEntry();
                }
            }
        }
Esempio n. 2
0
        public void GetResizedPageImage(PDFRendererPageControl page_control, int page, double height, ResizedPageImageItemCallbackDelegate callback)
        {
            lock (resized_page_image_item_requests)
            {
                //Logging.Debug("Queueing page redraw for {0}", page);
                resized_page_image_item_requests[page] = new ResizedPageImageItemRequest
                {
                    page         = page,
                    page_control = page_control,
                    height       = height,
                    callback     = callback
                };

                resized_page_image_item_request_orders.Add(page);

                if (num_resized_page_image_item_thread_running < 1)
                {
                    Interlocked.Increment(ref num_resized_page_image_item_thread_running);
                    SafeThreadPool.QueueUserWorkItem(ResizedPageImageItemThreadEntry);
                }
            }
        }
        private void ResizedPageImageItemThreadEntry(object arg)
        {
            while (true)
            {
                ResizedPageImageItemRequest resized_page_image_item_request = null;

                // Utilities.LockPerfTimer l1_clk = Utilities.LockPerfChecker.Start();
                lock (resized_page_image_item_requests)
                {
                    // l1_clk.LockPerfTimerStop();
                    // If there is nothing more to do...
                    if (0 == resized_page_image_item_request_orders.Count)
                    {
                        Interlocked.Decrement(ref num_resized_page_image_item_thread_running);
                        break;
                    }

                    // Get a piece of work
                    int page = resized_page_image_item_request_orders[resized_page_image_item_request_orders.Count - 1];
                    resized_page_image_item_request_orders.RemoveAt(resized_page_image_item_request_orders.Count - 1);

                    if (resized_page_image_item_requests.TryGetValue(page, out resized_page_image_item_request))
                    {
                        resized_page_image_item_requests.Remove(page);
                    }
                    else
                    {
                        continue;
                    }
                }

                Logging.Debug("Performing page redraw for {0}", resized_page_image_item_request.page);

                // Check that the page is still visible
                if (!resized_page_image_item_request.page_control.PageIsInView)
                {
                    continue;
                }

                try
                {
                    //PngBitmapDecoder decoder = new PngBitmapDecoder(new MemoryStream(pdf_document.PDFRenderer.GetPageByHeightAsImage(resized_page_image_item_request.page, resized_page_image_item_request.height)), BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad);
                    //BitmapSource bitmap = decoder.Frames[0];
                    //bitmap.Freeze();

                    BitmapImage bitmap = new BitmapImage();
                    using (MemoryStream ms = new MemoryStream(pdf_document.PDFRenderer.GetPageByHeightAsImage(resized_page_image_item_request.page, resized_page_image_item_request.height)))
                    {
                        bitmap.BeginInit();
                        bitmap.StreamSource = ms;
                        bitmap.CacheOption  = BitmapCacheOption.OnLoad;
                        bitmap.EndInit();
                        bitmap.Freeze();
                    }

                    if (null != bitmap)
                    {
                        resized_page_image_item_request.callback(bitmap, resized_page_image_item_request.height);
                    }
                }
                catch (Exception ex)
                {
                    Logging.Error(ex, "There was an error while resizing a PDF page image");
                }
            }
        }