summaryrefslogtreecommitdiff
path: root/platform/winrt
diff options
context:
space:
mode:
authorMichael Vrhel <michael.vrhel@artifex.com>2014-03-14 21:43:14 -0700
committerMichael Vrhel <michael.vrhel@artifex.com>2014-09-09 16:39:32 -0700
commit66d09dd33e030f3533e341ac957134bd7b5d92df (patch)
tree69910755e2815d8c37f1faf2acf82e410168d1b0 /platform/winrt
parent8b97a01a1458a3fd7e8a30d6e2741f29893c800b (diff)
downloadmupdf-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.xaml23
-rw-r--r--platform/winrt/gsview/MainWindow.xaml.cs180
-rw-r--r--platform/winrt/gsview/Selection.xaml49
-rw-r--r--platform/winrt/gsview/Selection.xaml.cs235
-rw-r--r--platform/winrt/gsview/ghostsharp.cs44
-rw-r--r--platform/winrt/gsview/gsview.csproj7
-rw-r--r--platform/winrt/libmupdf_winRT.vcxproj.filters3
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">