diff options
author | Michael Vrhel <michael.vrhel@artifex.com> | 2014-03-14 21:43:14 -0700 |
---|---|---|
committer | Michael Vrhel <michael.vrhel@artifex.com> | 2014-09-09 16:39:32 -0700 |
commit | 66d09dd33e030f3533e341ac957134bd7b5d92df (patch) | |
tree | 69910755e2815d8c37f1faf2acf82e410168d1b0 /platform/winrt | |
parent | 8b97a01a1458a3fd7e8a30d6e2741f29893c800b (diff) | |
download | mupdf-66d09dd33e030f3533e341ac957134bd7b5d92df.tar.xz |
Addition of code to allow selection of small region and save
You can save as ps, pdf, or eps. Also add progress feed back in the PDF-A PDF-X creation.
Diffstat (limited to 'platform/winrt')
-rw-r--r-- | platform/winrt/gsview/MainWindow.xaml | 23 | ||||
-rw-r--r-- | platform/winrt/gsview/MainWindow.xaml.cs | 180 | ||||
-rw-r--r-- | platform/winrt/gsview/Selection.xaml | 49 | ||||
-rw-r--r-- | platform/winrt/gsview/Selection.xaml.cs | 235 | ||||
-rw-r--r-- | platform/winrt/gsview/ghostsharp.cs | 44 | ||||
-rw-r--r-- | platform/winrt/gsview/gsview.csproj | 7 | ||||
-rw-r--r-- | platform/winrt/libmupdf_winRT.vcxproj.filters | 3 |
7 files changed, 516 insertions, 25 deletions
diff --git a/platform/winrt/gsview/MainWindow.xaml b/platform/winrt/gsview/MainWindow.xaml index 49464059..45459d02 100644 --- a/platform/winrt/gsview/MainWindow.xaml +++ b/platform/winrt/gsview/MainWindow.xaml @@ -7,9 +7,9 @@ <DataTemplate x:Key="PageTemplate"> <Image Width="{Binding Width}" Height="{Binding Height}" Stretch="Fill" HorizontalAlignment="Center" Source="{Binding BitMap}" Margin="24,24,0,0"> <Image.BitmapEffect> - <DropShadowBitmapEffect Color="Black" Direction="-50" + <DropShadowBitmapEffect Color="Black" Direction="-50" ShadowDepth="40" Softness=".7" /> - </Image.BitmapEffect> + </Image.BitmapEffect> </Image> </DataTemplate> @@ -111,7 +111,7 @@ </MenuItem.Icon> </MenuItem> <Separator /> - <MenuItem Header="Extract Page/Selection..."> + <MenuItem Header="Extract Selection..."> <MenuItem.Icon> <Image Source="Resources/saveHS.png" /> </MenuItem.Icon> @@ -127,7 +127,7 @@ <MenuItem Header="Ghostscript Convert..." Click="ConvertClick"> </MenuItem> <Separator /> - <MenuItem Header="Print..."> + <MenuItem Header="Print..." Click="Print"> <MenuItem.Icon> <Image Source="Resources/printer.ico" /> </MenuItem.Icon> @@ -140,7 +140,7 @@ </MenuItem> </MenuItem> <MenuItem Header="_Edit" > - <MenuItem Header="_Copy" Command="Copy" Click="CopyPage"> + <MenuItem Header="_Copy Page" Command="Copy" Click="CopyPage"> <MenuItem.Icon> <Image Source="Resources/copy.ico" /> </MenuItem.Icon> @@ -468,7 +468,8 @@ ScrollViewer.CanContentScroll="False" Background="DarkGray" ScrollViewer.PanningMode="Both" ScrollViewer.ScrollChanged="ListViewScrollChanged" - PreviewMouseLeftButtonUp="PageSelected" MouseDoubleClick="PageDoubleClick"> + PreviewMouseLeftButtonUp="PageSelected" MouseDoubleClick="PageDoubleClick" + > <!-- This keeps the pages in the center of the panel --> <ListView.ItemContainerStyle> <Style TargetType="ListViewItem"> @@ -477,7 +478,15 @@ </ListView.ItemContainerStyle> </ListView> </Grid> - + + + + + + + + + </DockPanel> </Window> diff --git a/platform/winrt/gsview/MainWindow.xaml.cs b/platform/winrt/gsview/MainWindow.xaml.cs index d54f27bf..c3b89e2f 100644 --- a/platform/winrt/gsview/MainWindow.xaml.cs +++ b/platform/winrt/gsview/MainWindow.xaml.cs @@ -198,6 +198,9 @@ namespace gsview String m_document_type; Info m_infowindow; OutputIntent m_outputintents; + Selection m_selection; + private Point startPoint; + private Rectangle rect; public MainWindow() { @@ -222,6 +225,7 @@ namespace gsview m_outputintents.Activate(); m_ghostscript.gsIOUpdateMain += new ghostsharp.gsIOCallBackMain(gsIO); m_convertwin = null; + m_selection = null; } catch (OutOfMemoryException e) { @@ -232,6 +236,8 @@ namespace gsview void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) { + if (m_selection != null && m_selection.IsActive) + m_selection.Close(); m_gsoutput.RealWindowClosing(); m_outputintents.RealWindowClosing(); } @@ -1080,6 +1086,8 @@ namespace gsview String options = m_convertwin.xaml_options.Text; int resolution = 72; bool multi_page_needed = false; + int first_page = -1; + int last_page = -1; if (pages.Count == 0) { @@ -1116,6 +1124,8 @@ namespace gsview /* Pages are contiguous. Add first and last page * as command line option */ options = options + " -dFirstPage=" + firstpage.Page + " -dLastPage=" + lastpage.Page; + first_page = firstpage.Page; + last_page = lastpage.Page; } else { @@ -1125,13 +1135,19 @@ namespace gsview multi_page_needed = true; /* need to put in separate outputs */ } } + xaml_DistillProgress.Value = 0; if (m_ghostscript.Convert(m_currfile, options, - device.DeviceName, dlg.FileName, m_num_pages, resolution, - multi_page_needed, pages_selected, null, null) == gsStatus.GS_BUSY) + device.DeviceName, dlg.FileName, pages.Count, resolution, + multi_page_needed, pages_selected, first_page, last_page, + null, null) == gsStatus.GS_BUSY) { ShowMessage(NotifyType_t.MESS_STATUS, "GS busy"); return; } + xaml_DistillName.Text = "GS Converting Document"; + xaml_CancelDistill.Visibility = System.Windows.Visibility.Collapsed; + xaml_DistillName.FontWeight = FontWeights.Bold; + xaml_DistillGrid.Visibility = System.Windows.Visibility.Visible; m_convertwin.Close(); } return; @@ -1316,24 +1332,29 @@ namespace gsview } if (use_gs) { + xaml_DistillProgress.Value = 0; if (m_ghostscript.Convert(m_currfile, options, Enum.GetName(typeof(gsDevice_t), gsDevice_t.pdfwrite), - dlg.FileName, m_num_pages, 300, false, null, init_file, null) == - gsStatus.GS_BUSY) + dlg.FileName, m_num_pages, 300, false, null, -1, -1, + init_file, null) == gsStatus.GS_BUSY) { ShowMessage(NotifyType_t.MESS_STATUS, "GS busy"); return; } + xaml_DistillName.Text = "Creating PDF"; + xaml_CancelDistill.Visibility = System.Windows.Visibility.Collapsed; + xaml_DistillName.FontWeight = FontWeights.Bold; + xaml_DistillGrid.Visibility = System.Windows.Visibility.Visible; } } } else { /* Non PDF output */ + gsDevice_t Device = gsDevice_t.xpswrite; + bool use_mupdf = true; switch (type) { - case Save_Type_t.PCLXL: - break; case Save_Type_t.PCLBitmap: break; case Save_Type_t.PNG: @@ -1342,11 +1363,35 @@ namespace gsview break; case Save_Type_t.SVG: break; + case Save_Type_t.PCLXL: + use_mupdf = false; + dlg.Filter = "PCL-XL (*.bin)|*.bin"; + Device = gsDevice_t.pxlcolor; + break; case Save_Type_t.TEXT: + use_mupdf = false; + dlg.Filter = "Text Files(*.txt)|*.txt"; + Device = gsDevice_t.txtwrite; break; case Save_Type_t.XPS: + use_mupdf = false; + dlg.Filter = "XPS Files(*.xps)|*.xps"; break; } + if (!use_mupdf) + { + if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK) + { + if (m_ghostscript.Convert(m_currfile, "", + Enum.GetName(typeof(gsDevice_t), Device), + dlg.FileName, 1, 300, false, null, -1, -1, + null, null) == gsStatus.GS_BUSY) + { + ShowMessage(NotifyType_t.MESS_STATUS, "GS busy"); + return; + } + } + } } } @@ -1466,15 +1511,126 @@ namespace gsview } private void Extract(Extract_Type_t type) { - switch (type) + if (m_selection != null) + return; + + m_selection = new Selection(m_currpage + 1, m_doczoom, type); + m_selection.UpdateMain += new Selection.CallBackMain(SelectionMade); + m_selection.Show(); + m_selection.xaml_Image.Source = m_docPages[m_currpage].BitMap; + m_selection.xaml_Image.Height = m_docPages[m_currpage].Height; + m_selection.xaml_Image.Width = m_docPages[m_currpage].Width; + } + + async private void SelectionZoom(int page_num, double zoom) + { + Point ras_size; + if (ComputePageSize(page_num, zoom, out ras_size) == status_t.S_ISOK) { - case Extract_Type_t.PDF: - break; - case Extract_Type_t.EPS: + try + { + Byte[] bitmap = new byte[(int)ras_size.X * (int)ras_size.Y * 4]; + + Task<int> ren_task = + new Task<int>(() => mu_doc.RenderPage(page_num, bitmap, (int)ras_size.X, (int)ras_size.Y, zoom, false, true)); + ren_task.Start(); + await ren_task.ContinueWith((antecedent) => + { + status_t code = (status_t)ren_task.Result; + if (code == status_t.S_ISOK) + { + if (m_selection != null) + { + int stride = (int) ras_size.X * 4; + m_selection.xaml_Image.Source = BitmapSource.Create((int) ras_size.X, (int) ras_size.Y, 72, 72, PixelFormats.Pbgra32, BitmapPalettes.Halftone256, bitmap, stride); + m_selection.xaml_Image.Height = (int)ras_size.Y; + m_selection.xaml_Image.Width = (int)ras_size.X; + m_selection.UpdateRect(); + m_selection.m_curr_state = SelectStatus_t.OK; + } + } + }, TaskScheduler.FromCurrentSynchronizationContext()); + } + catch (OutOfMemoryException e) + { + Console.WriteLine("Memory allocation failed page " + page_num + "\n"); + ShowMessage(NotifyType_t.MESS_ERROR, "Out of memory: " + e.Message); + } + } + } + private void SelectionMade(object gsObject, SelectEventArgs results) + { + switch (results.State) + { + case SelectStatus_t.CANCEL: + case SelectStatus_t.CLOSE: + m_selection = null; + return; + case SelectStatus_t.SELECT: + /* Get the information we need */ + double zoom = results.ZoomFactor; + Point start = results.TopLeft; + Point size = results.Size; + int page = results.PageNum; + gsDevice_t Device = gsDevice_t.pdfwrite; + + start.X = start.X / zoom; + start.Y = start.Y / zoom; + size.X = size.X / zoom; + size.Y = size.Y / zoom; + + /* Do the actual extraction */ + String options; + SaveFileDialog dlg = new SaveFileDialog(); + dlg.FilterIndex = 1; + + /* Get us set up to do a fixed size */ + options = "-dFirstPage=" + page + " -dLastPage=" + page + + " -dDEVICEWIDTHPOINTS=" + size.X + " -dDEVICEHEIGHTPOINTS=" + + size.Y + " -dFIXEDMEDIA"; + + /* Set up the translation */ + String init_string = "<</Install {-" + start.X + " -" + + start.Y + " translate (testing) == flush}>> setpagedevice"; + + switch (results.Type) + { + case Extract_Type_t.PDF: + dlg.Filter = "PDF Files(*.pdf)|*.pdf"; + break; + case Extract_Type_t.EPS: + dlg.Filter = "EPS Files(*.eps)|*.eps"; + Device = gsDevice_t.eps2write; + break; + case Extract_Type_t.PS: + dlg.Filter = "PostScript Files(*.ps)|*.ps"; + Device = gsDevice_t.ps2write; + break; + case Extract_Type_t.SVG: + dlg.Filter = "SVG Files(*.svg)|*.svg"; + break; + } + if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK) + { + if (m_ghostscript.Convert(m_currfile, options, + Enum.GetName(typeof(gsDevice_t), Device), + dlg.FileName, 1, 300, false, null, page, page, + null, init_string) == gsStatus.GS_BUSY) + { + ShowMessage(NotifyType_t.MESS_STATUS, "GS busy"); + return; + } + } + + m_selection.Close(); break; - case Extract_Type_t.PS: + case SelectStatus_t.ZOOMIN: + /* Render new page at this resolution and hand it off */ + SelectionZoom(results.PageNum - 1, results.ZoomFactor); break; - case Extract_Type_t.SVG: + case SelectStatus_t.ZOOMOUT: + /* Render new page at this resolution and hand it off */ + SelectionZoom(results.PageNum - 1, results.ZoomFactor); break; } } diff --git a/platform/winrt/gsview/Selection.xaml b/platform/winrt/gsview/Selection.xaml new file mode 100644 index 00000000..af67b2d5 --- /dev/null +++ b/platform/winrt/gsview/Selection.xaml @@ -0,0 +1,49 @@ +<Window x:Class="gsview.Selection" + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + Title="Selection" Height="524" Width="452"> + + <DockPanel LastChildFill="True"> + <Menu IsMainMenu="True" DockPanel.Dock="Top"> + <MenuItem Header="OK" Click="ClickOK"/> + <MenuItem Header="Exit" Click="ClickExit"/> + <MenuItem Header="Clear" Click="ClickClear"/> + </Menu> + + <StackPanel Orientation="Horizontal" DockPanel.Dock="Top" Background="WhiteSmoke"> + <Button Margin="10 0 0 0" Width="20" Height="20" Click="ZoomIn" Background="Transparent" BorderBrush="Transparent"> + <Button.Template> + <ControlTemplate TargetType="{x:Type Button}"> + <Grid> + <Ellipse> + <Ellipse.Fill > + <ImageBrush ImageSource="Resources/zoom_in.ico"/> + </Ellipse.Fill> + </Ellipse> + <ContentPresenter Content="{TemplateBinding Content}" HorizontalAlignment="Center" VerticalAlignment="Center"/> + </Grid> + </ControlTemplate> + </Button.Template> + </Button> + <Button Margin="10 0 0 0" Width="20" Height="20" Click="ZoomOut" Background="Transparent" BorderBrush="Transparent"> + <Button.Template> + <ControlTemplate TargetType="{x:Type Button}"> + <Grid> + <Ellipse> + <Ellipse.Fill > + <ImageBrush ImageSource="Resources/zoom_out.ico"/> + </Ellipse.Fill> + </Ellipse> + <ContentPresenter Content="{TemplateBinding Content}" HorizontalAlignment="Center" VerticalAlignment="Center"/> + </Grid> + </ControlTemplate> + </Button.Template> + </Button> + </StackPanel> + <ScrollViewer VerticalScrollBarVisibility="Visible" HorizontalScrollBarVisibility="Visible" HorizontalAlignment="Stretch" Background="DarkGray" DockPanel.Dock="Left"> + <Canvas x:Name="xaml_Canvas" MouseDown="Canvas_MouseDown" MouseMove="Canvas_MouseMove" Background="Transparent" Width="{Binding ActualWidth, ElementName=xaml_Image}" Height="{Binding ActualHeight, ElementName=xaml_Image}"> + <Image x:Name="xaml_Image" Width="{Binding Width}" Height="{Binding Height}" Stretch="Fill" HorizontalAlignment="Center" Source="{Binding BitMap}"/> + </Canvas> + </ScrollViewer> + </DockPanel> +</Window> diff --git a/platform/winrt/gsview/Selection.xaml.cs b/platform/winrt/gsview/Selection.xaml.cs new file mode 100644 index 00000000..39081731 --- /dev/null +++ b/platform/winrt/gsview/Selection.xaml.cs @@ -0,0 +1,235 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Shapes; + +namespace gsview +{ + /// <summary> + /// Interaction logic for Selection.xaml + /// </summary> + /// + + public enum SelectStatus_t + { + OK, + CANCEL, + SELECT, + CLOSE, + ZOOMIN, + ZOOMOUT + } + + public class SelectEventArgs : EventArgs + { + Point m_topleft, m_size; + double m_zoomFactor; + SelectStatus_t m_state; + int m_page_num; + Extract_Type_t m_type; + + public Point TopLeft + { + get { return m_topleft; } + } + + public Point Size + { + get { return m_size; } + } + + public double ZoomFactor + { + get { return m_zoomFactor; } + } + + public int PageNum + { + get { return m_page_num; } + } + + public SelectStatus_t State + { + get { return m_state; } + } + + public Extract_Type_t Type + { + get { return m_type; } + } + + public SelectEventArgs(Point start, Point size, double zoom, + SelectStatus_t state, int page, Extract_Type_t type) + { + m_topleft = start; + m_size = size; + m_zoomFactor = zoom; + m_state = state; + m_page_num = page; + m_type = type; + } + } + + public partial class Selection : Window + { + private Point m_startPoint, m_topleft; + private Point m_size; + public SelectStatus_t m_curr_state; + double m_zoom; + double m_old_zoom; + int m_page_num; + private Rectangle m_rect; + Extract_Type_t m_type; + internal delegate void CallBackMain(object gsObject, SelectEventArgs info); + internal event CallBackMain UpdateMain; + + public Selection(int page, double init_zoom, Extract_Type_t type) + { + InitializeComponent(); + this.Closing += new System.ComponentModel.CancelEventHandler(WindowClosing); + m_page_num = page; + m_zoom = init_zoom; + m_curr_state = SelectStatus_t.OK; + m_type = type; + } + + void WindowClosing(object sender, System.ComponentModel.CancelEventArgs e) + { + var result = new SelectEventArgs(m_topleft, m_size, m_zoom, + SelectStatus_t.CANCEL, m_page_num, m_type); + UpdateMain(this, result); + } + + private void ClickOK(object sender, RoutedEventArgs e) + { + if (m_curr_state != SelectStatus_t.OK) + return; + if (m_rect == null) + Close(); + else + { + m_size.X = m_rect.Width; + m_size.Y = m_rect.Height; + m_topleft.Y = xaml_Image.Height - m_topleft.Y - m_size.Y; + var result = new SelectEventArgs(m_topleft, m_size, m_zoom, + SelectStatus_t.SELECT, m_page_num, m_type); + UpdateMain(this, result); + } + } + + private void ClickExit(object sender, RoutedEventArgs e) + { + var result = new SelectEventArgs(m_topleft, m_size, m_zoom, + SelectStatus_t.CANCEL, m_page_num, m_type); + UpdateMain(this, result); + Close(); + } + + private void ClickClear(object sender, RoutedEventArgs e) + { + if (m_rect != null) + { + xaml_Canvas.Children.Remove(m_rect); + m_rect = null; + } + } + + private void ZoomIn(object sender, RoutedEventArgs e) + { + if (m_curr_state != SelectStatus_t.OK || m_zoom >= Constants.ZOOM_MAX) + return; + m_old_zoom = m_zoom; + m_zoom = m_zoom + Constants.ZOOM_STEP; + if (m_zoom > Constants.ZOOM_MAX) + { + m_zoom = Constants.ZOOM_MAX; + return; + } + m_curr_state = SelectStatus_t.ZOOMIN; + var result = new SelectEventArgs(m_startPoint, m_size, m_zoom, + SelectStatus_t.ZOOMIN, m_page_num, m_type); + UpdateMain(this, result); + } + + private void ZoomOut(object sender, RoutedEventArgs e) + { + if (m_curr_state != SelectStatus_t.OK || m_zoom <= Constants.ZOOM_MIN) + return; + m_old_zoom = m_zoom; + m_zoom = m_zoom - Constants.ZOOM_STEP; + if (m_zoom < Constants.ZOOM_MIN) + { + m_zoom = Constants.ZOOM_MIN; + return; + } + m_curr_state = SelectStatus_t.ZOOMOUT; + var result = new SelectEventArgs(m_startPoint, m_size, m_zoom, + SelectStatus_t.ZOOMOUT, m_page_num, m_type); + UpdateMain(this, result); + } + + /* Called when we have had a zoom change */ + public void UpdateRect() + { + if (m_rect != null) + { + double left = Canvas.GetLeft(m_rect); + double top = Canvas.GetTop(m_rect); + Canvas.SetLeft(m_rect, left * m_zoom / m_old_zoom); + Canvas.SetTop(m_rect, top * m_zoom / m_old_zoom); + m_rect.Width = m_rect.Width * m_zoom / m_old_zoom; + m_rect.Height = m_rect.Height * m_zoom / m_old_zoom; + } + } + + private void Canvas_MouseDown(object sender, MouseButtonEventArgs e) + { + if (m_rect != null) + { + xaml_Canvas.Children.Remove(m_rect); + } + + m_startPoint = e.GetPosition(xaml_Canvas); + + m_rect = new Rectangle + { + Stroke = Brushes.Red, + StrokeThickness = 2 + }; + Canvas.SetLeft(m_rect, m_startPoint.X); + Canvas.SetTop(m_rect, m_startPoint.X); + xaml_Canvas.Children.Add(m_rect); + } + + private void Canvas_MouseMove(object sender, MouseEventArgs e) + { + if (e.LeftButton == MouseButtonState.Released || m_rect == null) + return; + + var pos = e.GetPosition(xaml_Canvas); + + var x = Math.Min(pos.X, m_startPoint.X); + var y = Math.Min(pos.Y, m_startPoint.Y); + + var w = Math.Max(pos.X, m_startPoint.X) - x; + var h = Math.Max(pos.Y, m_startPoint.Y) - y; + + m_rect.Width = w; + m_rect.Height = h; + + m_topleft.X = x; + m_topleft.Y = y; + Canvas.SetLeft(m_rect, x); + Canvas.SetTop(m_rect, y); + } + } +} diff --git a/platform/winrt/gsview/ghostsharp.cs b/platform/winrt/gsview/ghostsharp.cs index eac36002..5922ee00 100644 --- a/platform/winrt/gsview/ghostsharp.cs +++ b/platform/winrt/gsview/ghostsharp.cs @@ -22,7 +22,7 @@ namespace gsview bmp32b, bmpgray, bmpmono, - epswrite, + eps2write, jpeg, jpegcmyk, jpeggray, @@ -88,6 +88,9 @@ namespace gsview public String options; public bool need_multi_page; public System.Collections.IList pages; + public int firstpage; + public int lastpage; + public int currpage; /* valid only when pages != null */ }; public class gsEventArgs : EventArgs @@ -213,7 +216,7 @@ namespace gsview { String output = Marshal.PtrToStringAnsi(pointer); gsIOUpdateMain(this, output, count); - if (m_params.task == GS_Task_t.CREATE_XPS) + if (m_params.task != GS_Task_t.PS_DISTILL) { /* See if we have a page number */ if (count >= 7 && output.Substring(0, 4) == "Page") @@ -222,9 +225,27 @@ namespace gsview int numVal; try { + double perc = 0.0; numVal = System.Convert.ToInt32(page); - - double perc = 100.0 * (double)numVal / (double)m_params.num_pages; + if (m_params.firstpage == -1 && m_params.lastpage == -1 && + m_params.pages == null) + { + /* Doing full document */ + perc = 100.0 * (double)numVal / (double)m_params.num_pages; + } + else + { + if (m_params.pages != null) + { + perc = 100.0 * ((double)numVal - m_params.currpage) / (double)m_params.num_pages; + m_params.currpage = m_params.currpage + 1; + } + else + { + /* continugous set of pages */ + perc = 100.0 * ((double)numVal - m_params.firstpage + 1) / (double)m_params.num_pages; + } + } m_worker.ReportProgress((int)perc); } catch (FormatException e) @@ -303,7 +324,7 @@ namespace gsview if (gsparams.init_file != null) num_params = num_params + 1; if (gsparams.init_string != null) - num_params = num_params + 1; + num_params = num_params + 2; var argParam = new GCHandle[num_params]; var argPtrs = new IntPtr[num_params]; @@ -396,6 +417,8 @@ namespace gsview if (gsparams.init_string != null) { count++; + strParams[count] = "-c"; + count++; strParams[count] = gsparams.init_string; } count++; @@ -652,6 +675,9 @@ namespace gsview gsparams.options = ""; gsparams.need_multi_page = false; gsparams.pages = null; + gsparams.firstpage = -1; + gsparams.lastpage = -1; + gsparams.currpage = -1; return RunGhostscript(gsparams); } @@ -670,13 +696,16 @@ namespace gsview gsparams.options = ""; gsparams.need_multi_page = false; gsparams.pages = null; + gsparams.firstpage = -1; + gsparams.lastpage = -1; + gsparams.currpage = -1; return RunGhostscript(gsparams); } public gsStatus Convert(String fileName, String options, String device, String outputFile, int num_pages, int resolution, bool multi_page_needed, System.Collections.IList pages, - String init_file, String init_string) + int firstpage, int lastpage, String init_file, String init_string) { gsParams_t gsparams = new gsParams_t(); @@ -691,6 +720,9 @@ namespace gsview gsparams.resolution = resolution; gsparams.need_multi_page = multi_page_needed; gsparams.pages = pages; + gsparams.firstpage = firstpage; + gsparams.lastpage = lastpage; + gsparams.currpage = 1; return RunGhostscript(gsparams); } diff --git a/platform/winrt/gsview/gsview.csproj b/platform/winrt/gsview/gsview.csproj index b9bba55d..55e68198 100644 --- a/platform/winrt/gsview/gsview.csproj +++ b/platform/winrt/gsview/gsview.csproj @@ -102,6 +102,9 @@ <DependentUpon>Password.xaml</DependentUpon> </Compile> <Compile Include="RectList.cs" /> + <Compile Include="Selection.xaml.cs"> + <DependentUpon>Selection.xaml</DependentUpon> + </Compile> <Compile Include="Strings\en-US\Messages.Designer.cs"> <AutoGen>True</AutoGen> <DesignTime>True</DesignTime> @@ -139,6 +142,10 @@ <SubType>Designer</SubType> <Generator>MSBuild:Compile</Generator> </Page> + <Page Include="Selection.xaml"> + <SubType>Designer</SubType> + <Generator>MSBuild:Compile</Generator> + </Page> </ItemGroup> <ItemGroup> <Compile Include="Properties\AssemblyInfo.cs"> diff --git a/platform/winrt/libmupdf_winRT.vcxproj.filters b/platform/winrt/libmupdf_winRT.vcxproj.filters index 841edf9d..b89a6288 100644 --- a/platform/winrt/libmupdf_winRT.vcxproj.filters +++ b/platform/winrt/libmupdf_winRT.vcxproj.filters @@ -28,6 +28,9 @@ <Filter Include="tiff"> <UniqueIdentifier>{90cc5056-84ea-40ea-9d8a-66a753c2e637}</UniqueIdentifier> </Filter> + <Filter Include="tools"> + <UniqueIdentifier>{d7d9ecf3-3abb-4238-a833-0c0f8ed08976}</UniqueIdentifier> + </Filter> </ItemGroup> <ItemGroup> <ClCompile Include="..\..\source\cbz\mucbz.c"> |