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