diff options
author | Michael Vrhel <michael.vrhel@artifex.com> | 2020-07-15 16:48:25 -0700 |
---|---|---|
committer | Michael Vrhel <michael.vrhel@artifex.com> | 2020-07-19 23:24:28 -0700 |
commit | 0f59de6b3daab30d405ee5c5c4ac943c26721622 (patch) | |
tree | 07891537abee8fd8cec44ae5c855c7f60540e47a /demos/csharp/linux/gtk_viewer/src/MainRender.cs | |
parent | 42b49069c0f87406dcd796183ba719d45dd8ce69 (diff) | |
download | ghostpdl-0f59de6b3daab30d405ee5c5c4ac943c26721622.tar.gz |
Linux Demo Viewer: Various updates to try to get threading working
Diffstat (limited to 'demos/csharp/linux/gtk_viewer/src/MainRender.cs')
-rw-r--r-- | demos/csharp/linux/gtk_viewer/src/MainRender.cs | 118 |
1 files changed, 66 insertions, 52 deletions
diff --git a/demos/csharp/linux/gtk_viewer/src/MainRender.cs b/demos/csharp/linux/gtk_viewer/src/MainRender.cs index 316da5e99..d5f9d5371 100644 --- a/demos/csharp/linux/gtk_viewer/src/MainRender.cs +++ b/demos/csharp/linux/gtk_viewer/src/MainRender.cs @@ -36,69 +36,72 @@ namespace gs_mono_example private void MainPageCallback(int width, int height, int raster, double zoom_in, int page_num, IntPtr data) { - try - { - Byte[] bitmap = new byte[raster * height]; + Byte[] bitmap = new byte[raster * height]; - Marshal.Copy(data, bitmap, 0, raster * height); - DocPage doc_page = m_docPages[page_num - 1]; + idata_t page = new idata_t(); - if (doc_page.Content != Page_Content_t.FULL_RESOLUTION || - m_aa_change) - { - doc_page.Width = width; - doc_page.Height = height; - doc_page.Content = Page_Content_t.FULL_RESOLUTION; - doc_page.Zoom = m_doczoom; - doc_page.PixBuf = new Gdk.Pixbuf(bitmap, Gdk.Colorspace.Rgb, false, 8, width, height, raster); - } + Marshal.Copy(data, bitmap, 0, raster * height); - /* Get the 1.0 page scalings */ - if (m_firstime) - { - pagesizes_t page_size = new pagesizes_t(); - page_size.width = width; - page_size.height = height; - m_page_sizes.Add(page_size); - } - } - catch (Exception except) - { - var t = except.Message; - } + page.bitmap = bitmap; + page.page_num = page_num; + page.width = width; + page.height = height; + page.raster = raster; + page.zoom = zoom_in; + m_images_rendered.Add(page); /* Dispatch progress bar update on UI thread */ Gtk.Application.Invoke(delegate { - m_GtkProgressBar.Fraction = ((double)page_num / ((double)m_numpages)); + m_GtkProgressBar.Fraction = ((double)page_num / ((double)page_num + 1)); }); } - /* Done rendering. Update the pages with the new raster information if needed */ - private void RenderingDone() + /* Done rendering. Again in MS .NET this is on the main UI thread. + In MONO .NET not the case. */ + private void RenderingDone() + { + /* Dispatch on UI thread */ + Gtk.Application.Invoke(delegate { + RenderingDoneMain(); + }); + } + + private void RenderingDoneMain() { - int page_index = m_firstpage - 1; - m_toppage_pos = new List<int>(m_images_rendered.Count + 1); - int offset = 0; Gtk.TreeIter tree_iter; - m_GtkimageStoreMain.GetIterFirst(out tree_iter); - for (int k = 0; k < m_numpages; k++) + + for (int k = 0; k < m_images_rendered.Count; k++) { - m_GtkimageStoreMain.SetValue(tree_iter, 0, m_docPages[k].PixBuf); - m_GtkimageStoreMain.IterNext(ref tree_iter); + DocPage doc_page = m_docPages[k]; + + if (doc_page.Content != Page_Content_t.FULL_RESOLUTION || + m_aa_change) + { + doc_page.Width = m_images_rendered[k].width; + doc_page.Height = m_images_rendered[k].height; + doc_page.Content = Page_Content_t.FULL_RESOLUTION; + + doc_page.Zoom = m_doczoom; + doc_page.PixBuf = new Gdk.Pixbuf(m_images_rendered[k].bitmap, + Gdk.Colorspace.Rgb, false, 8, m_images_rendered[k].width, + m_images_rendered[k].height, m_images_rendered[k].raster); + + m_GtkimageStoreMain.SetValue(tree_iter, 0, m_docPages[k].PixBuf); + m_GtkimageStoreMain.IterNext(ref tree_iter); + } } - m_GtkaaCheck.Sensitive = true; m_aa_change = false; - m_firstime = false; - m_toppage_pos.Add(offset); - m_busy_render = false; - m_images_rendered.Clear(); - m_file_open = true; - m_busy_render = false; - - m_ghostscript.gsPageRenderedMain -= new ghostsharp.gsCallBackPageRenderedMain(gsPageRendered); - } + m_firstime = false; + m_busy_render = false; + m_images_rendered.Clear(); + m_file_open = true; + m_ghostscript.gsPageRenderedMain -= new ghostsharp.gsCallBackPageRenderedMain(gsPageRendered); + m_GtkaaCheck.Sensitive = true; + m_GtkZoomMinus.Sensitive = true; + m_GtkZoomPlus.Sensitive = true; + } /* Render all pages full resolution */ private void RenderMainFirst() @@ -113,10 +116,21 @@ namespace gs_mono_example /* Render all, but only if not already busy, called via zoom or aa changes */ private void RenderMainAll() { - if (m_busy_render || !m_init_done) - return; - m_GtkaaCheck.Sensitive = false; - RenderMainFirst(); - } + try + { + if (!m_init_done) + return; + m_GtkaaCheck.Sensitive = false; + m_GtkZoomMinus.Sensitive = false; + m_GtkZoomPlus.Sensitive = false; + RenderMainFirst(); + } + catch(Exception except) + { + var mess = except.Message; + } + + + } } } |