summaryrefslogtreecommitdiff
blob: 102bb76432f901b33554158b5066bb3e703717d8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
using System;
using System.Collections.Generic;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Runtime.InteropServices;
using GhostNET;

namespace ghostnet_wpf_example
{
	public partial class MainWindow
	{
	    private static List<DocPage> m_thumbnails;

		/* Assign current pages to blown up thumbnail images */
		private void ThumbAssignMain(int page_num, int width, int height, double zoom_in, ref int offset)
		{
			m_pageType.Add(Page_Content_t.THUMBNAIL);
			DocPage doc_page = new DocPage();
			doc_page.Content = Page_Content_t.THUMBNAIL;
			doc_page.Zoom = zoom_in;
			doc_page.AA = m_aa;
			doc_page.BitMap = m_thumbnails[page_num - 1].BitMap;
			doc_page.Width = (int)(width / (Constants.SCALE_THUMB));
			doc_page.Height = (int)(height / (Constants.SCALE_THUMB));
			doc_page.PageNum = page_num;
			m_docPages.Add(doc_page);

			/* Set the page offsets.  Used for determining which pages
			 * will be visible within viewport. */
			m_toppage_pos.Add(offset + Constants.PAGE_VERT_MARGIN);
			offset += doc_page.Height + 2 * Constants.PAGE_VERT_MARGIN;

			/* Set page sizes for 1.0 scaling. This is used to quick
			 * rescale of pages prior to rendering at new zoom. */
			pagesizes_t page_size = new pagesizes_t();
			page_size.size.X = doc_page.Width;
			page_size.size.Y = doc_page.Height;
			m_page_sizes.Add(page_size);
		}

		/* Rendered all the thumbnail pages.  Stick them in the appropriate lists */
		private void ThumbsDone()
		{
			int offset = 0;
			m_toppage_pos = new List<int>(m_list_thumb.Count);

			for (int k = 0; k < m_list_thumb.Count; k++)
			{
				DocPage doc_page = new DocPage();
				m_thumbnails.Add(doc_page);

				doc_page.Width = m_list_thumb[k].width;
				doc_page.Height = m_list_thumb[k].height;
				doc_page.Content = Page_Content_t.THUMBNAIL;
				doc_page.Zoom = m_list_thumb[k].zoom;
				doc_page.BitMap = BitmapSource.Create(doc_page.Width, doc_page.Height,
					72, 72, PixelFormats.Bgr24, BitmapPalettes.Halftone256, m_list_thumb[k].bitmap, m_list_thumb[k].raster);
				doc_page.PageNum = m_list_thumb[k].page_num;
				ThumbAssignMain(m_list_thumb[k].page_num, m_list_thumb[k].width, m_list_thumb[k].height, 1.0, ref offset);
			}

			m_toppage_pos.Add(offset);
			xaml_ProgressGrid.Visibility = System.Windows.Visibility.Collapsed;
			xaml_RenderProgress.Value = 0;
			xaml_PageList.ItemsSource = m_docPages;
			xaml_ThumbList.ItemsSource = m_thumbnails;
			xaml_ThumbList.Items.Refresh();
			xaml_ThumbGrid.Visibility = System.Windows.Visibility.Visible;

			m_ghostscript.gsPageRenderedMain -= new ghostsharp.gsCallBackPageRenderedMain(gsThumbRendered);

			m_numpages = m_list_thumb.Count;
			if (m_numpages < 1)
			{
				ShowMessage(NotifyType_t.MESS_STATUS, "File failed to open properly");
				CleanUp();
			}
			else
			{
				xaml_TotalPages.Text = "/" + m_numpages;
				xaml_currPage.Text = m_currpage.ToString();
				m_list_thumb.Clear();

				if (m_doc_type_has_page_access)
					RenderMainRange();
				else
					RenderMainAll();
			}
		}

		/* Callback from ghostscript with the rendered thumbnail.  Also update progress */
		private void ThumbPageCallback(int width, int height, int raster, double zoom_in,
			int page_num, IntPtr data)
		{
			Byte[] bitmap = new byte[raster * height];
			idata_t thumb = new idata_t();

			Marshal.Copy(data, bitmap, 0, raster * height);

			thumb.bitmap = bitmap;
			thumb.page_num = page_num;
			thumb.width = width;
			thumb.height = height;
			thumb.raster = raster;
			thumb.zoom = zoom_in;
			m_list_thumb.Add(thumb);

			/* Dispatch progress bar update on UI thread */
			System.Windows.Application.Current.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Send, new Action(() =>
			{
				/* Logrithmic but it will show progress */
				xaml_RenderProgress.Value = ((double) page_num / ((double) page_num + 1))* 100.0;
			}));
		}

		/* Render the thumbnail images */
		private void RenderThumbs()
		{
			xaml_RenderProgress.Value = 0;
			xaml_RenderProgressText.Text = "Creating Thumbs";
			xaml_ProgressGrid.Visibility = System.Windows.Visibility.Visible;

			m_ghostscript.gsPageRenderedMain += new ghostsharp.gsCallBackPageRenderedMain(gsThumbRendered);
			m_ghostscript.gsDisplayDeviceRenderThumbs(m_currfile, Constants.SCALE_THUMB, false, GS_Task_t.DISPLAY_DEV_THUMBS);
		}
	}
}