summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Vrhel <michael.vrhel@artifex.com>2015-01-20 11:37:59 -0800
committerMichael Vrhel <michael.vrhel@artifex.com>2015-01-20 11:37:59 -0800
commitf24f164f25b66df32d7e584ba9993c1519386aac (patch)
treea68b42373791f14f8126f48228cac93ef442867b
parent90c560641d9b459a658029eefc4cbb02fdbca0b5 (diff)
downloadmupdf-f24f164f25b66df32d7e584ba9993c1519386aac.tar.xz
Rework of gsview printing with addition of new Print control dialog
This adds an additional project (gsprint.vxcproj) which will do the necessary native calls to bring up the custom print dialog for the output device. We can then obtain the settings and make the appropriate page size adjustments in creating our xps content.
-rw-r--r--platform/windows/gsprint.vcxproj164
-rw-r--r--platform/windows/gsprint/dllmain.cpp19
-rw-r--r--platform/windows/gsprint/gsprint.cpp73
-rw-r--r--platform/windows/gsprint/gsprint.h12
-rw-r--r--platform/windows/gsview/MainWindow.xaml.cs164
-rw-r--r--platform/windows/gsview/PrintControl.xaml247
-rw-r--r--platform/windows/gsview/PrintControl.xaml.cs697
-rw-r--r--platform/windows/gsview/ghostsharp.cs17
-rw-r--r--platform/windows/gsview/gsprint.cs315
-rw-r--r--platform/windows/gsview/gsview.csproj7
-rw-r--r--platform/windows/mupdf.sln65
11 files changed, 1739 insertions, 41 deletions
diff --git a/platform/windows/gsprint.vcxproj b/platform/windows/gsprint.vcxproj
new file mode 100644
index 00000000..c191599d
--- /dev/null
+++ b/platform/windows/gsprint.vcxproj
@@ -0,0 +1,164 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{09FE8E75-9952-44E7-95F8-E8D74707FBA1}</ProjectGuid>
+ <Keyword>Win32Proj</Keyword>
+ <RootNamespace>gsprint</RootNamespace>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <PlatformToolset>v120</PlatformToolset>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <PlatformToolset>v120</PlatformToolset>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <PlatformToolset>v120</PlatformToolset>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <PlatformToolset>v120</PlatformToolset>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <LinkIncremental>true</LinkIncremental>
+ <OutDir>$(SolutionDir)\gsview\bin\$(Configuration)\</OutDir>
+ <IntDir>$(Platform)\$(Configuration)\</IntDir>
+ <TargetName>$(ProjectName)32</TargetName>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <LinkIncremental>true</LinkIncremental>
+ <OutDir>$(SolutionDir)\gsview\bin\$(Configuration)\</OutDir>
+ <TargetName>$(ProjectName)64</TargetName>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <LinkIncremental>false</LinkIncremental>
+ <TargetName>$(ProjectName)32</TargetName>
+ <OutDir>$(SolutionDir)\gsview\bin\$(Configuration)\</OutDir>
+ <IntDir>$(Platform)\$(Configuration)\</IntDir>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <LinkIncremental>false</LinkIncremental>
+ <OutDir>$(SolutionDir)\gsview\bin\$(Configuration)\</OutDir>
+ <TargetName>$(ProjectName)64</TargetName>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <PrecompiledHeader>NotUsing</PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;GSPRINT_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <SDLCheck>true</SDLCheck>
+ </ClCompile>
+ <Link>
+ <SubSystem>Windows</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <ClCompile>
+ <PrecompiledHeader>NotUsing</PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;GSPRINT_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <SDLCheck>true</SDLCheck>
+ </ClCompile>
+ <Link>
+ <SubSystem>Windows</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <PrecompiledHeader>NotUsing</PrecompiledHeader>
+ <Optimization>MaxSpeed</Optimization>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;GSPRINT_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <SDLCheck>true</SDLCheck>
+ </ClCompile>
+ <Link>
+ <SubSystem>Windows</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <OptimizeReferences>true</OptimizeReferences>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <PrecompiledHeader>NotUsing</PrecompiledHeader>
+ <Optimization>MaxSpeed</Optimization>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;GSPRINT_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <SDLCheck>true</SDLCheck>
+ </ClCompile>
+ <Link>
+ <SubSystem>Windows</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <OptimizeReferences>true</OptimizeReferences>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <Text Include="ReadMe.txt" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="gsprint\gsprint.h" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="gsprint\dllmain.cpp" />
+ <ClCompile Include="gsprint\gsprint.cpp" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/platform/windows/gsprint/dllmain.cpp b/platform/windows/gsprint/dllmain.cpp
new file mode 100644
index 00000000..bfaa6519
--- /dev/null
+++ b/platform/windows/gsprint/dllmain.cpp
@@ -0,0 +1,19 @@
+// dllmain.cpp : Defines the entry point for the DLL application.
+#include <windows.h>
+
+BOOL APIENTRY DllMain( HMODULE hModule,
+ DWORD ul_reason_for_call,
+ LPVOID lpReserved
+ )
+{
+ switch (ul_reason_for_call)
+ {
+ case DLL_PROCESS_ATTACH:
+ case DLL_THREAD_ATTACH:
+ case DLL_THREAD_DETACH:
+ case DLL_PROCESS_DETACH:
+ break;
+ }
+ return TRUE;
+}
+
diff --git a/platform/windows/gsprint/gsprint.cpp b/platform/windows/gsprint/gsprint.cpp
new file mode 100644
index 00000000..813364a8
--- /dev/null
+++ b/platform/windows/gsprint/gsprint.cpp
@@ -0,0 +1,73 @@
+// gsprint.cpp : Defines the exported functions for the DLL application.
+//
+#include "gsprint.h"
+#include "stdlib.h"
+
+#define FAIL -1
+
+/* Code to handle the special device properties window as well as make sure
+ * that the values are maintained when we leave */
+SYMBOL_DECLSPEC int __stdcall ShowPropertiesDialog(void *hptr, void *printername, bool show_win)
+{
+ HWND hWnd = (HWND)hptr;
+ HANDLE hPrinter = NULL;
+ LPDEVMODE pDevMode;
+ DWORD dwNeeded, dwRet;
+ wchar_t *output = NULL;
+
+ int lenA = lstrlenA((char*)printername);
+ int lenW = ::MultiByteToWideChar(CP_ACP, 0, (char*)printername, lenA, NULL, 0);
+ if (lenW > 0)
+ {
+ output = new wchar_t[lenW + 1];
+ if (output == NULL)
+ return -1;
+ ::MultiByteToWideChar(CP_ACP, 0, (char*)printername, lenA, output, lenW);
+ output[lenW] = 0;
+ }
+ else
+ return FAIL;
+
+ if (!OpenPrinter(output, &hPrinter, NULL))
+ {
+ free(output);
+ return FAIL;
+ }
+
+ /* First get the size needed */
+ dwNeeded = DocumentProperties(hWnd, hPrinter, output, NULL, NULL, 0);
+ pDevMode = (LPDEVMODE)malloc(dwNeeded);
+ if (pDevMode == NULL)
+ {
+ free(output);
+ ClosePrinter(hPrinter);
+ return FAIL;
+ }
+
+ /* Now actually get the DEVMODE data. DM_IN_PROMPT brings up the window.
+ * DM_OUT_BUFFER ensures that we get the values that have been set */
+ DWORD fMode = DM_OUT_BUFFER;
+ if (show_win)
+ fMode = fMode | DM_IN_PROMPT;
+
+ dwRet = DocumentProperties(hWnd, hPrinter, output, pDevMode, NULL, fMode);
+ if (dwRet != IDOK)
+ {
+ free(output);
+ ClosePrinter(hPrinter);
+ free(pDevMode);
+ return FAIL;
+ }
+
+ /* This is the secret to ensure that the DEVMODE settings are saved. Fun
+ * finding this bit of information in the MS literature */
+ PRINTER_INFO_9 new_info;
+ new_info.pDevMode = pDevMode;
+ SetPrinter(hPrinter, 9, (LPBYTE)&new_info, 0);
+
+ /* Clean up */
+ free(pDevMode);
+ free(output);
+ ClosePrinter(hPrinter);
+ return 0;
+}
diff --git a/platform/windows/gsprint/gsprint.h b/platform/windows/gsprint/gsprint.h
new file mode 100644
index 00000000..cfc2c7b3
--- /dev/null
+++ b/platform/windows/gsprint/gsprint.h
@@ -0,0 +1,12 @@
+#include <windows.h>
+#include <winspool.h>
+
+#ifdef __cplusplus
+#define EXTERNC extern "C"
+#else
+#define EXTERNC
+#endif
+
+#define SYMBOL_DECLSPEC __declspec(dllexport)
+
+EXTERN_C SYMBOL_DECLSPEC int __stdcall ShowPropertiesDialog(void *ctx, void *printername, bool show_win);
diff --git a/platform/windows/gsview/MainWindow.xaml.cs b/platform/windows/gsview/MainWindow.xaml.cs
index 6e6ee855..fd26a50b 100644
--- a/platform/windows/gsview/MainWindow.xaml.cs
+++ b/platform/windows/gsview/MainWindow.xaml.cs
@@ -153,6 +153,7 @@ static class Constants
public const int SCROLL_EDGE_BUFFER = 90;
public const int VERT_SCROLL_STEP = 48;
public const int PAGE_MARGIN = 1;
+ public const int MAX_PRINT_PREVIEW_LENGTH = 250;
}
public static class DocumentTypes
@@ -205,6 +206,15 @@ namespace gsview
public int num_rects;
}
+ public struct printPreviewPage_t
+ {
+ public Byte[] bitmap;
+ public int width;
+ public int height;
+ public double width_inches;
+ public double height_inches;
+ }
+
public struct textSelectInfo_t
{
public int pagenum;
@@ -282,6 +292,7 @@ namespace gsview
List<DocPage> m_thumbnails;
List<List<RectList>> m_page_link_list = null;
IList<RectList> m_text_list;
+ DocPage m_PrintPreviewPage;
public List<LinesText> m_lineptrs = null;
public List<BlocksText> m_textptrs = null;
List<Boolean> m_textset = null;
@@ -308,12 +319,14 @@ namespace gsview
Convert m_convertwin;
PageExtractSave m_extractwin;
Password m_password = null;
+ PrintControl m_printcontrol = null;
String m_currpassword = null;
BackgroundWorker m_thumbworker = null;
BackgroundWorker m_textsearch = null;
BackgroundWorker m_linksearch = null;
BackgroundWorker m_openfile = null;
BackgroundWorker m_initrender = null;
+ BackgroundWorker m_printerpreview = null;
BackgroundWorker m_copytext = null;
String m_document_type;
Info m_infowindow;
@@ -349,6 +362,7 @@ namespace gsview
{
m_docPages = new Pages();
m_thumbnails = new List<DocPage>();
+ m_PrintPreviewPage = new DocPage();
m_lineptrs = new List<LinesText>();
m_textptrs = new List<BlocksText>();
m_textset = new List<Boolean>();
@@ -426,6 +440,8 @@ namespace gsview
m_gsoutput.RealWindowClosing();
if (m_outputintents != null)
m_outputintents.RealWindowClosing();
+ if (m_printcontrol != null)
+ m_printcontrol.RealWindowClosing();
}
else
{
@@ -433,6 +449,8 @@ namespace gsview
m_gsoutput.Hide();
if (m_outputintents != null)
m_outputintents.Hide();
+ if (m_printcontrol != null)
+ m_printcontrol.Hide();
}
}
@@ -707,6 +725,12 @@ namespace gsview
if (m_password != null && m_password.IsActive)
m_password.Close();
+ if (m_printcontrol != null && m_printcontrol.IsActive)
+ {
+ m_printcontrol.Close();
+ m_printcontrol = null;
+ }
+
if (m_infowindow != null && m_infowindow.IsActive)
m_infowindow.Close();
@@ -1743,47 +1767,40 @@ namespace gsview
if (!m_file_open)
return;
- /* If file is already xps then gs need not do this */
- if (!m_isXPS)
+ if (m_printcontrol == null)
{
- xaml_DistillProgress.Value = 0;
- if (m_ghostscript.CreateXPS(m_currfile, Constants.DEFAULT_GS_RES, m_num_pages) == gsStatus.GS_BUSY)
- {
- ShowMessage(NotifyType_t.MESS_STATUS, "GS currently busy");
- return;
- }
- else
- {
- /* Right now this is not possible to cancel due to the way
- * that gs is run for xpswrite from pdf */
- xaml_CancelDistill.Visibility = System.Windows.Visibility.Collapsed;
- xaml_DistillName.Text = "Convert to XPS";
- xaml_DistillName.FontWeight = FontWeights.Bold;
- xaml_DistillGrid.Visibility = System.Windows.Visibility.Visible;
- }
+ m_printcontrol = new PrintControl(m_num_pages, m_currpage);
+ m_printcontrol.PrintDiagUpdatePreview += new PrintControl.PrintDiagCallBackPreview(PrintDiagUpdatePreview);
+ m_printcontrol.PrintDiagPrint += new PrintControl.PrintDiagCallBackPrint(PrintDiagPrint);
+ m_printcontrol.PrintDLLProblemMain += new PrintControl.PrintDLLProblem(gsDLL);
+ m_printcontrol.Activate();
+ m_printcontrol.Show(); /* Makes it modal */
+ PrintDiagEventArgs args = new PrintDiagEventArgs(0);
+ PrintDiagUpdatePreview(null, args);
}
else
- PrintXPS(m_currfile);
+ m_printcontrol.Show();
+ return;
}
private void PrintXPS(String file)
{
gsprint ghostprint = new gsprint();
- System.Windows.Controls.PrintDialog pDialog = ghostprint.GetPrintDialog();
- if (pDialog == null)
- return;
/* We have to create the XPS document on a different thread */
XpsDocument xpsDocument = new XpsDocument(file, FileAccess.Read);
FixedDocumentSequence fixedDocSeq = xpsDocument.GetFixedDocumentSequence();
- PrintQueue printQueue = pDialog.PrintQueue;
+ System.Windows.Size temp = new Size(200, 200);
+ fixedDocSeq.DocumentPaginator.PageSize = temp;
+
+ PrintQueue printq = m_printcontrol.m_selectedPrinter;
m_ghostprint = ghostprint;
xaml_PrintGrid.Visibility = System.Windows.Visibility.Visible;
xaml_PrintProgress.Value = 0;
- ghostprint.Print(printQueue, fixedDocSeq);
+ ghostprint.Print(printq, fixedDocSeq, m_printcontrol);
}
private void PrintProgress(object printHelper, gsPrintEventArgs Information)
@@ -4902,5 +4919,106 @@ namespace gsview
m_showannot = false;
RenderRange(m_currpage, false, zoom_t.NO_ZOOM, 0);
}
+
+ /* Print preview rendering and control */
+ private void RenderPrintPreview(object sender, DoWorkEventArgs e)
+ {
+ BackgroundWorker worker = sender as BackgroundWorker;
+ List<object> genericlist = e.Argument as List<object>;
+ int k = (int)genericlist[0];
+ int desiredMax = Constants.MAX_PRINT_PREVIEW_LENGTH;
+
+ Point ras_size;
+ double scale_factor = 1.0;
+ Byte[] bitmap;
+ BlocksText charlist;
+ status_t code;
+ Annotate_t annot;
+
+ if (ComputePageSize(k, scale_factor, out ras_size) == status_t.S_ISOK)
+ {
+ /* Adjust the scale factor to ensure max length is set as desired */
+ int maxSize = Math.Max((int)ras_size.X, (int)ras_size.Y);
+ scale_factor = (double)desiredMax / (double)maxSize;
+ ComputePageSize(k, scale_factor, out ras_size);
+ printPreviewPage_t result;
+
+ try
+ {
+ bitmap = new byte[(int)ras_size.X * (int)ras_size.Y * 4];
+ code = (status_t)mu_doc.RenderPage(k, bitmap, (int)ras_size.X,
+ (int)ras_size.Y, scale_factor, false, true,
+ false, out charlist, m_showannot, out annot);
+ result.width = (int)ras_size.X;
+ result.height = (int)ras_size.Y;
+ result.bitmap = bitmap;
+ ComputePageSize(k, 1.0, out ras_size);
+ result.height_inches = ras_size.Y / 72.0;
+ result.width_inches = ras_size.X / 72.0;
+ e.Result = result;
+ }
+ catch (OutOfMemoryException em)
+ {
+ Console.WriteLine("Memory allocation failed print preview page " + k + em.Message + "\n");
+ }
+ }
+ }
+
+ private void RenderPrintPreviewCompleted(object sender, RunWorkerCompletedEventArgs e)
+ {
+ BitmapSource BitMapSrc;
+ printPreviewPage_t Result = (printPreviewPage_t)e.Result;
+
+ int stride = Result.width * 4;
+ BitMapSrc = BitmapSource.Create(Result.width, Result.height,
+ 72, 72, PixelFormats.Pbgra32, BitmapPalettes.Halftone256, Result.bitmap, stride);
+
+ m_printcontrol.SetImage(BitMapSrc, Result.height_inches, Result.width_inches);
+ }
+
+ private bool PrintDiagUpdatePreview(object PrintDiag, PrintDiagEventArgs args)
+ {
+ try
+ {
+ m_printerpreview = new BackgroundWorker();
+ m_printerpreview.WorkerReportsProgress = false;
+ m_printerpreview.WorkerSupportsCancellation = false;
+ m_printerpreview.DoWork += new DoWorkEventHandler(RenderPrintPreview);
+ m_printerpreview.RunWorkerCompleted += new RunWorkerCompletedEventHandler(RenderPrintPreviewCompleted);
+ var arguments = new List<object>();
+ arguments.Add(args.m_page);
+ m_printerpreview.RunWorkerAsync(arguments);
+ }
+ catch (OutOfMemoryException e)
+ {
+ Console.WriteLine("Memory allocation failed during printpreview render\n");
+ ShowMessage(NotifyType_t.MESS_ERROR, "Out of memory: " + e.Message);
+ }
+ return true;
+ }
+
+ private void PrintDiagPrint(object PrintDiag)
+ {
+
+ /* If file is already xps then gs need not do this */
+ if (!m_isXPS)
+ {
+ xaml_DistillProgress.Value = 0;
+ if (m_ghostscript.CreateXPS(m_currfile, Constants.DEFAULT_GS_RES, m_num_pages, m_printcontrol) == gsStatus.GS_BUSY)
+ {
+ ShowMessage(NotifyType_t.MESS_STATUS, "GS currently busy");
+ return;
+ }
+ else
+ {
+ xaml_CancelDistill.Visibility = System.Windows.Visibility.Collapsed;
+ xaml_DistillName.Text = "Convert to XPS";
+ xaml_DistillName.FontWeight = FontWeights.Bold;
+ xaml_DistillGrid.Visibility = System.Windows.Visibility.Visible;
+ }
+ }
+ else
+ PrintXPS(m_currfile);
+ }
}
} \ No newline at end of file
diff --git a/platform/windows/gsview/PrintControl.xaml b/platform/windows/gsview/PrintControl.xaml
new file mode 100644
index 00000000..8b9c30ae
--- /dev/null
+++ b/platform/windows/gsview/PrintControl.xaml
@@ -0,0 +1,247 @@
+<Window x:Class="gsview.PrintControl"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ Title="gsview print" Height="650" Width="653"
+ SizeToContent="WidthAndHeight" ResizeMode="NoResize">
+
+
+ <Window.Resources>
+ <Style x:Key="MySimpleScrollBar" TargetType="{x:Type ScrollBar}">
+ <Setter Property="Stylus.IsFlicksEnabled" Value="false"/>
+ <Setter Property="Width" Value="Auto"/>
+ <Setter Property="MinHeight" Value="30"/>
+ <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
+ <Setter Property="Template">
+ <Setter.Value>
+ <ControlTemplate TargetType="{x:Type ScrollBar}">
+ <Border BorderThickness="1" BorderBrush="Gray">
+ <Grid Margin="2">
+ <Grid.ColumnDefinitions>
+ <ColumnDefinition/>
+ <ColumnDefinition />
+ </Grid.ColumnDefinitions>
+ <TextBox VerticalAlignment="Center" FontSize="12" MinWidth="25" Text="{Binding Value, RelativeSource={RelativeSource TemplatedParent}}"/>
+ <Grid Grid.Column="1" x:Name="GridRoot" Width="{DynamicResource {x:Static SystemParameters.VerticalScrollBarWidthKey}}" Background="{TemplateBinding Background}">
+ <Grid.RowDefinitions>
+ <RowDefinition MaxHeight="18"/>
+ <RowDefinition Height="0.00001*"/>
+ <RowDefinition MaxHeight="18"/>
+ </Grid.RowDefinitions>
+ <RepeatButton x:Name="DecreaseRepeat" Command="ScrollBar.LineDownCommand" Focusable="False">
+ <Grid>
+ <Path x:Name="DecreaseArrow" Stroke="{TemplateBinding Foreground}" StrokeThickness="1" Data="M 0 4 L 8 4 L 4 0 Z"/>
+ </Grid>
+ </RepeatButton>
+ <RepeatButton Grid.Row="2" x:Name="IncreaseRepeat" Command="ScrollBar.LineUpCommand" Focusable="False">
+ <Grid>
+ <Path x:Name="IncreaseArrow" Stroke="{TemplateBinding Foreground}" StrokeThickness="1" Data="M 0 0 L 4 4 L 8 0 Z"/>
+ </Grid>
+ </RepeatButton>
+ </Grid>
+ </Grid>
+ </Border>
+ </ControlTemplate>
+ </Setter.Value>
+ </Setter>
+ </Style>
+ </Window.Resources>
+
+ <DockPanel Background="WhiteSmoke" LastChildFill="False" Margin="0,0,0,0">
+ <GroupBox Header="Printer" Height="100" Width="500" DockPanel.Dock="Top" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="15,15,0,0">
+ <Grid Background="WhiteSmoke" Visibility="Visible" >
+ <Grid.ColumnDefinitions>
+ <ColumnDefinition Width="Auto" />
+ <ColumnDefinition Width="*" />
+ <ColumnDefinition Width="Auto" />
+ </Grid.ColumnDefinitions>
+ <Grid Grid.Column="0" Grid.Row="0" Background="WhiteSmoke">
+ <Grid.RowDefinitions>
+ <RowDefinition Height="30" />
+ <RowDefinition Height="30" />
+ </Grid.RowDefinitions>
+ <TextBox Grid.Column="0" Grid.Row="0" Text="Name:" FontSize="12" FontFamily="Segoe UI" Background="WhiteSmoke" BorderThickness="0" VerticalAlignment="Center"/>
+ <TextBox Grid.Column="0" Grid.Row="1" Text="Status:" FontSize="12" FontFamily="Segoe UI" Background="WhiteSmoke" BorderThickness="0" VerticalAlignment="Center"/>
+ </Grid>
+ <Grid Grid.Column="1" Grid.Row="0" Background="WhiteSmoke">
+ <Grid.RowDefinitions>
+ <RowDefinition Height="30" />
+ <RowDefinition Height="30" />
+ </Grid.RowDefinitions>
+ <ComboBox Grid.Column="0" Grid.Row="0" x:Name="xaml_selPrinter" SelectionChanged="selPrinterChanged" Width="225" HorizontalAlignment="Left" Margin="10,0,0,0" VerticalAlignment="Center" >
+ <ComboBox.ItemTemplate>
+ <DataTemplate>
+ <StackPanel Orientation="Horizontal">
+ <TextBlock FontSize="11" FontFamily="Segoe UI" Text="{Binding Name}" />
+ </StackPanel>
+ </DataTemplate>
+ </ComboBox.ItemTemplate>
+ </ComboBox>
+ <TextBox Grid.Column="0" Grid.Row="1" x:Name="xaml_Status" FontSize="12" FontFamily="Segoe UI" Text="" Margin="105,92,497,301" Background="WhiteSmoke" BorderThickness="0"/>
+ </Grid>
+ <Grid Grid.Column="2" Grid.Row="0" Background="WhiteSmoke">
+ <Grid.RowDefinitions>
+ <RowDefinition Height="30" />
+ </Grid.RowDefinitions>
+ <Button Grid.Column="0" Grid.Row="0" Content="Properties" FontSize="12" FontFamily="Segoe UI" HorizontalAlignment="Center" Margin="0, 0, 30, 0" VerticalAlignment="Center" Width="75" Click="ShowProperties"/>
+ </Grid>
+ </Grid>
+ </GroupBox>
+ <Grid DockPanel.Dock="Left" Background="WhiteSmoke" Visibility="Visible">
+ <Grid.RowDefinitions>
+ <RowDefinition Height="Auto" />
+ <RowDefinition Height="Auto" />
+ <RowDefinition Height="Auto" />
+ </Grid.RowDefinitions>
+ <GroupBox Grid.Column="0" Grid.Row="0" Header="Print Range" Height="150" Width="250" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="15,15,0,0">
+ <Grid Background="WhiteSmoke" Visibility="Visible" >
+ <Grid.RowDefinitions>
+ <RowDefinition Height="30" />
+ <RowDefinition Height="30" />
+ <RowDefinition Height="30" />
+ <RowDefinition Height="30" />
+ </Grid.RowDefinitions>
+ <Grid.ColumnDefinitions>
+ <ColumnDefinition Width="90" />
+ <ColumnDefinition Width="Auto" />
+ </Grid.ColumnDefinitions>
+ <RadioButton Grid.Column="0" Grid.Row="0" Name="xaml_rbAll" VerticalAlignment="Center" GroupName="PageRange" Checked="AllPages">All</RadioButton>
+ <RadioButton Grid.Column="0" Grid.Row="1" Name="xaml_rbCurrent" VerticalAlignment="Center" GroupName="PageRange" Checked="CurrentPage">Current page</RadioButton>
+ <RadioButton Grid.Column="0" Grid.Row="2" Name="xaml_rbPages" VerticalAlignment="Center" GroupName="PageRange" Checked="PageRange">Pages</RadioButton>
+
+ <TextBox x:Name="xaml_pagerange" Grid.Column="1" Grid.Row="2" Width="100" Height="20" VerticalScrollBarVisibility="Hidden" HorizontalAlignment="Left"
+ HorizontalScrollBarVisibility="Hidden" VerticalAlignment="Center" FontSize="12" FontFamily="Segoe UI" Margin="0,0,0,0" PreviewKeyDown="PageNumberEnter"/>
+
+ <TextBox x:Name="xaml_invalid" Grid.Column="1" Grid.Row="1" Width="Auto" Height="Auto" VerticalScrollBarVisibility="Hidden" HorizontalAlignment="Center" Background="WhiteSmoke" Visibility="Collapsed"
+ HorizontalScrollBarVisibility="Hidden" VerticalAlignment="Center" Foreground="Red" Text="Invalid Range! (3-5, 7) e.g." FontSize="12" FontFamily="Segoe UI" Margin="0,0,0,0" PreviewKeyDown="PageNumberEnter"/>
+
+
+ <TextBox Grid.Column="0" Grid.Row="3" VerticalAlignment="Center" Text="Subset:" FontSize="12" FontFamily="Segoe UI" Background="WhiteSmoke" BorderThickness="0"/>
+ <ComboBox Grid.Column="1" Grid.Row="3" x:Name="xaml_Subset" SelectionChanged="Subset_SelectionChanged" Width="140" Height="Auto" VerticalAlignment="Center" HorizontalAlignment="Left">
+ <ComboBoxItem Name="all" FontSize="11" FontFamily="Segoe UI">All pages in range</ComboBoxItem>
+ <ComboBoxItem Name="odd" FontSize="11" FontFamily="Segoe UI">Odd pages only</ComboBoxItem>
+ <ComboBoxItem Name="even" FontSize="11" FontFamily="Segoe UI">Even pages only</ComboBoxItem>
+ </ComboBox>
+ </Grid>
+ </GroupBox>
+
+ <GroupBox Grid.Column="0" Grid.Row="1" Header="Page Handling" Height="90" Width="250" Margin="15,15,0,0" DockPanel.Dock="Left" HorizontalAlignment="Center" VerticalAlignment="Center" >
+ <Grid Background="WhiteSmoke" Visibility="Visible" Height="103" VerticalAlignment="Top">
+ <Grid.RowDefinitions>
+ <RowDefinition Height="Auto" />
+ <RowDefinition Height="Auto" />
+ </Grid.RowDefinitions>
+ <Grid.ColumnDefinitions>
+ <ColumnDefinition Width="90" />
+ <ColumnDefinition Width="Auto" />
+ </Grid.ColumnDefinitions>
+ <TextBox Grid.Column="0" Grid.Row="0" VerticalAlignment="Center" Text="Copies:" FontSize="12" FontFamily="Segoe UI" Background="WhiteSmoke" BorderThickness="0" />
+ <ScrollBar Grid.Column="1" Grid.Row="0" x:Name="xaml_Copies" HorizontalAlignment="Left" Style="{DynamicResource MySimpleScrollBar}" VerticalAlignment="Top" Value="1" Maximum="999" SmallChange="1" Height="15" ValueChanged="xaml_Copies_ValueChanged"/>
+ <CheckBox x:Name="xaml_autofit" Grid.Column="0" Grid.Row="2" Content="Auto-Fit" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Checked="AutoFit_Checked" Unchecked="AutoFit_Unchecked" Grid.ColumnSpan="2"/>
+ </Grid>
+ </GroupBox>
+ <Grid Background="WhiteSmoke" Grid.Column="0" Grid.Row="2" Visibility="Visible" Margin="0, 50, 0, 0" HorizontalAlignment="Center">
+ <Grid.ColumnDefinitions>
+ <ColumnDefinition Width="Auto" />
+ <ColumnDefinition Width="Auto" />
+ </Grid.ColumnDefinitions>
+ <Button Grid.Column="0" Grid.Row="0" Content="OK" FontSize="12" FontFamily="Segoe UI" HorizontalAlignment="Center" VerticalAlignment="Center" Width="74" Click="ClickOK" Margin="20,0,0,0"/>
+ <Button Grid.Column="1" Grid.Row="0" Content="Cancel" FontSize="12" FontFamily="Segoe UI" HorizontalAlignment="Center" VerticalAlignment="Center" Width="74" Click="ClickCancel" Margin="40,0,0,0"/>
+ </Grid>
+ </Grid>
+
+
+ <GroupBox Header="Preview" Height="450" Width="350" DockPanel.Dock="Right" HorizontalAlignment="Center" VerticalAlignment="Top" Margin="0,15,15,0">
+ <Grid Background="WhiteSmoke" Visibility="Visible" >
+ <Grid.RowDefinitions>
+ <RowDefinition Height="Auto" />
+ <RowDefinition Height="*" />
+ <RowDefinition Height="40" />
+ <RowDefinition Height="40" />
+ <RowDefinition Height="40" />
+ </Grid.RowDefinitions>
+ <Grid.ColumnDefinitions>
+ <ColumnDefinition Width="Auto" />
+ <ColumnDefinition Width="*" />
+ </Grid.ColumnDefinitions>
+ <Canvas x:Name="xaml_TopArrowCanvas" Grid.Row="0" Grid.Column="1" VerticalAlignment="Bottom" HorizontalAlignment="Left" Margin="0,0,0,25" Height="0" Width="0" Visibility="Collapsed">
+ <Grid Background="WhiteSmoke" HorizontalAlignment="Center">
+ <Grid.RowDefinitions>
+ <RowDefinition Height="*" />
+ <RowDefinition Height="*" />
+ </Grid.RowDefinitions>
+ <Line x:Name="xaml_topsize" Grid.Row="1" Y1="0" X1="0" X2="100" Y2="0" Stroke="Black" StrokeThickness="1"/>
+ <Line x:Name="xaml_topleftbottomarrow" Grid.Row="1" Y1="0" X1="0" X2="7" Y2="7" Stroke="Black" StrokeThickness="1" />
+ <Line x:Name="xaml_toplefttoparrow" Grid.Row="1" Y1="0" X1="0" X2="7" Y2="-7" Stroke="Black" StrokeThickness="1" />
+ <Line x:Name="xaml_toprighttoparrow" Grid.Row="1" Y1="-7" X1="93" X2="100" Y2="0" Stroke="Black" StrokeThickness="1" />
+ <Line x:Name="xaml_toprightbottomarrow" Grid.Row="1" Y1="7" X1="93" X2="100" Y2="0" Stroke="Black" StrokeThickness="1" />
+ <TextBlock x:Name="xaml_topsizevalue" Text="100" Grid.Row="0" HorizontalAlignment="Center"/>
+ </Grid>
+ </Canvas>
+
+ <Canvas x:Name="xaml_LeftArrowCanvas" Grid.Row="1" Grid.Column="0" Height="Auto" Width="40" VerticalAlignment="Top" HorizontalAlignment="Center" Visibility="Collapsed">
+ <Grid Background="WhiteSmoke" VerticalAlignment="Top" HorizontalAlignment="Center">
+ <Grid.ColumnDefinitions>
+ <ColumnDefinition Width="*" />
+ <ColumnDefinition Width="*" />
+ </Grid.ColumnDefinitions>
+ <Line x:Name="xaml_leftsize" Grid.Column="1" Y1="0" X1="0" X2="0" Y2="100" Stroke="Black" StrokeThickness="1" />
+ <Line x:Name="xaml_lefttopleft" Grid.Column="1" Y1="0" X1="0" X2="-7" Y2="7" Stroke="Black" StrokeThickness="1" />
+ <Line x:Name="xaml_lefttopright" Grid.Column="1" Y1="0" X1="0" X2="7" Y2="7" Stroke="Black" StrokeThickness="1" />
+ <Line x:Name="xaml_leftbottomleft" Grid.Column="1" Y1="93" X1="-7" X2="0" Y2="100" Stroke="Black" StrokeThickness="1" />
+ <Line x:Name="xaml_leftbottomright" Grid.Column="1" Y1="93" X1="7" X2="0" Y2="100" Stroke="Black" StrokeThickness="1" />
+ <TextBlock x:Name="xaml_leftsizevalue" Text="100" Grid.Column="0" VerticalAlignment="Center" Margin="0,0,10,0"/>
+ </Grid>
+ </Canvas>
+
+ <!-- Draw the white paper full size white -->
+ <Rectangle x:Name="xaml_PreviewPaper" Visibility="Collapsed" Fill="White" Grid.Column="1" Grid.Row="1" Height="0" Width="0" VerticalAlignment="Top" HorizontalAlignment="Left"/>
+
+ <!-- Draw the whole image -->
+ <Rectangle x:Name="xaml_PreviewImageRect" Visibility="Collapsed" Stroke="Red" Grid.Column="1" Grid.Row="1" Height="0" Width="0" VerticalAlignment="Top" HorizontalAlignment="Left">
+ <Rectangle.Fill>
+ <ImageBrush x:Name="xaml_ImagePreview">
+ </ImageBrush>
+ </Rectangle.Fill>
+ </Rectangle>
+
+ <!-- Draw the gray shade over it -->
+ <Rectangle x:Name="xaml_PreviewGrayRect" Visibility="Collapsed" Stroke="Green" Fill="#7f7f7f7f" Grid.Column="1" Grid.Row="1" Height="0" Width="0" VerticalAlignment="Top" HorizontalAlignment="Left"/>
+
+ <!-- Redraw with clipping -->
+ <Rectangle x:Name="xaml_PreviewImageRectClip" Visibility="Collapsed" Stroke="Blue" Grid.Column="1" Grid.Row="1" Height="0" Width="0" VerticalAlignment="Top" HorizontalAlignment="Left">
+ <Rectangle.Fill>
+ <ImageBrush x:Name="xaml_ImagePreviewClip">
+ </ImageBrush>
+ </Rectangle.Fill>
+ <Rectangle.Clip>
+ <RectangleGeometry x:Name="xaml_ImagePreviewClipGeom" Rect="0 0 50 100"/>
+ </Rectangle.Clip>
+ </Rectangle>
+
+ <!-- Draw the final full black bounding rect for the paper-->
+ <Rectangle x:Name="xaml_PreviewPaperOuterRect" Stroke="Black" Fill="#00000000" Grid.Column="1" Grid.Row="1" Height="0" Width="0" VerticalAlignment="Top" HorizontalAlignment="Left"/>
+
+ <Grid Grid.Column="1" Grid.Row="2" Height="Auto">
+ <Grid.RowDefinitions>
+ <RowDefinition Height="Auto" />
+ <RowDefinition Height="Auto" />
+ </Grid.RowDefinitions>
+ <TextBox Visibility="Collapsed" x:Name="xaml_pagesize" Grid.Column="0" Grid.Row="1" VerticalAlignment="Center" HorizontalAlignment="Left" FontSize="12" FontFamily="Segoe UI" Background="WhiteSmoke" BorderThickness="0" Height="16" Width="Auto" />
+ <TextBox Visibility="Collapsed" x:Name="xaml_docsize" Grid.Column="0" Grid.Row="0" VerticalAlignment="Center" HorizontalAlignment="Left" FontSize="12" FontFamily="Segoe UI" Background="WhiteSmoke" BorderThickness="0" Height="16" Width="Auto" />
+ </Grid>
+
+ <TextBox x:Name="xaml_pagecount" Grid.Column="0" Grid.Row="3" VerticalAlignment="Center" HorizontalAlignment="Right" Text="1/1" FontSize="12" FontFamily="Segoe UI" Background="WhiteSmoke" BorderThickness="0" Height="16" Margin="0,12" Width="Auto" />
+ <Slider x:Name="xaml_pageslider" IsSnapToTickEnabled="True" Grid.Column="1" Grid.Row="3" Maximum="100" VerticalAlignment="Center" Margin="15,11,36,11" Height="18" PreviewMouseUp="PageSelect_DragCompleted"/>
+ <TextBox Grid.Column="0" Grid.Row="4" VerticalAlignment="Center" HorizontalAlignment="Right" Text="Units:" FontSize="12" FontFamily="Segoe UI" Background="WhiteSmoke" BorderThickness="0" Height="16" Margin="0,12" Width="Auto" />
+ <Grid Grid.Column="1" Grid.Row="4">
+ <Grid.ColumnDefinitions>
+ <ColumnDefinition Width="Auto" />
+ <ColumnDefinition Width="Auto" />
+ </Grid.ColumnDefinitions>
+ <RadioButton Grid.Column="0" Grid.Row="0" Name="xaml_inches" VerticalAlignment="Center" GroupName="units" Checked="Inches" Margin="5,0,0,0">inches</RadioButton>
+ <RadioButton Grid.Column="1" Grid.Row="0" Name="xaml_cm" VerticalAlignment="Center" GroupName="units" Checked="Centimeters" Margin="5,0,0,0">cm</RadioButton>
+ </Grid>
+ </Grid>
+ </GroupBox>
+ </DockPanel>
+</Window>
diff --git a/platform/windows/gsview/PrintControl.xaml.cs b/platform/windows/gsview/PrintControl.xaml.cs
new file mode 100644
index 00000000..c24fad17
--- /dev/null
+++ b/platform/windows/gsview/PrintControl.xaml.cs
@@ -0,0 +1,697 @@
+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;
+using System.Printing;
+using System.Drawing.Printing;
+using System.Runtime.InteropServices;
+using System.Windows.Interop;
+using System.Text.RegularExpressions;
+
+namespace gsview
+{
+ /// <summary>
+ /// Interaction logic for PrintControl.xaml
+ /// </summary>
+ ///
+
+ static class NATIVEWIN
+ {
+ public const int IDOK = 1;
+ public const int IDCANCEL = 2;
+ public const int DM_OUT_BUFFER = 2;
+ public const int DM_IN_BUFFER = 8;
+ public const int DM_IN_PROMPT = 4;
+ public const int DM_ORIENTATION = 1;
+ public const int DM_PAPERSIZE = 2;
+ public const int DM_PAPERLENGTH = 4;
+ public const int DM_WIDTH = 8;
+ public const int DMORIENT_PORTRAIT = 1;
+ public const int DMORIENT_LANDSCAPE = 2;
+ }
+
+ public enum PrintPages_t
+ {
+ RANGE = 2,
+ CURRENT = 1,
+ ALL = 0
+ }
+
+ public enum PageSubset_t
+ {
+ ALL = 0,
+ ODD = 1,
+ EVEN = 2
+ }
+
+ public enum PageScale_t
+ {
+ NONE = 0,
+ FIT = 1,
+ }
+
+ public enum Units_t
+ {
+ INCHES = 0,
+ CM = 1
+ }
+
+ public class PrintDiagEventArgs : EventArgs
+ {
+ public int m_page;
+
+ public PrintDiagEventArgs(int page)
+ {
+ m_page = page;
+ }
+ }
+
+ public class PrintRanges
+ {
+ public List<bool> ToPrint;
+ public bool HasEvens;
+ public bool HasOdds;
+ public int NumberPages;
+
+ public PrintRanges(int number_pages)
+ {
+ ToPrint = new List<bool>(number_pages);
+ NumberPages = 0;
+ HasEvens = false;
+ HasOdds = false;
+ }
+
+ public void InitRange(Match match)
+ {
+ NumberPages = 0;
+ HasEvens = false;
+ HasOdds = false;
+
+ for (int k = 0; k < ToPrint.Count; k++)
+ {
+ if (CheckValue(match, k))
+ {
+ NumberPages = NumberPages + 1;
+ ToPrint[k] = true;
+ if ((k+1) % 2 != 0)
+ HasOdds = true;
+ else
+ HasEvens = true;
+ }
+ else
+ ToPrint[k] = false;
+ }
+ }
+
+ private bool CheckValue(Match match, int k)
+ {
+ return false;
+ }
+ }
+
+ public partial class PrintControl : Window
+ {
+ private LocalPrintServer m_printServer;
+ public PrintQueue m_selectedPrinter = null;
+ String m_status;
+ PrintPages_t m_pages_setting;
+ PageSubset_t m_page_subset;
+ public double m_page_scale;
+ Units_t m_units;
+ int m_numpages;
+ int m_currpage;
+ PrintCapabilities m_printcap;
+ public PageSettings m_pagedetails;
+ TranslateTransform m_trans_pap;
+ TranslateTransform m_trans_doc;
+ double m_doc_height;
+ double m_doc_width;
+ public bool m_isrotated;
+ PrintRanges m_range_pages;
+ public int m_numcopies;
+ bool m_initdone;
+ bool m_is64bit;
+
+ /* Callback to main to get preview images */
+ internal delegate bool PrintDiagCallBackPreview(object gsObject, PrintDiagEventArgs info);
+ internal event PrintDiagCallBackPreview PrintDiagUpdatePreview;
+ /* Callback to perform printing */
+ internal delegate void PrintDiagCallBackPrint(object gsObject);
+ internal event PrintDiagCallBackPrint PrintDiagPrint;
+ /* Callback to report problems */
+ internal delegate void PrintDLLProblem(object gsObject, String mess);
+ internal event PrintDLLProblem PrintDLLProblemMain;
+
+ /* Helper for displaying the custom printer dialog settings */
+ #region DLLInterface
+ [DllImport("gsprint64.dll", EntryPoint = "ShowPropertiesDialog", CharSet = CharSet.Ansi,
+ CallingConvention = CallingConvention.StdCall)]
+ private static extern int ShowPropertiesDialog64(IntPtr hwnd, IntPtr printername, bool show_diag );
+ [DllImport("gsprint32.dll", EntryPoint = "ShowPropertiesDialog", CharSet = CharSet.Ansi,
+ CallingConvention = CallingConvention.StdCall)]
+ private static extern int ShowPropertiesDialog32(IntPtr hwnd, IntPtr printername, bool show_diag);
+
+ #endregion DLLInterface
+
+ #region DLLErrorCatch
+ /* In case the DLL is not found we need to wrap the methods up with
+ * a try/catch. Also select 32 or 64 bit DLL at this time. This
+ * C# code is compiled as ANYCPU type */
+ private int tc_ShowPropertiesDialog(IntPtr hwnd, IntPtr printername, bool show_prop)
+ {
+ int code;
+
+ try
+ {
+ if (m_is64bit)
+ code = ShowPropertiesDialog64(hwnd, printername, show_prop);
+ else
+ code = ShowPropertiesDialog32(hwnd, printername, show_prop);
+ }
+ catch (DllNotFoundException)
+ {
+ /* DLL not found */
+ String output = "DllNotFoundException: gsprint DLL not found";
+ PrintDLLProblemMain(this, output);
+ return -1;
+ }
+ catch (BadImageFormatException)
+ {
+ /* Using 32 bit with 64 or vice versa */
+ String output = "BadImageFormatException: Incorrect gsprint DLL";
+ PrintDLLProblemMain(this, output);
+ return -1;
+ }
+ return code;
+ }
+ #endregion DLLErrorCatch
+
+ /* Populate the printers */
+ private void InitPrinterList()
+ {
+ PrintQueueCollection printQueuesOnLocalServer =
+ m_printServer.GetPrintQueues(new[] {EnumeratedPrintQueueTypes.Local, EnumeratedPrintQueueTypes.Connections});
+
+ this.xaml_selPrinter.ItemsSource = printQueuesOnLocalServer;
+ if (m_selectedPrinter != null)
+ {
+ foreach (PrintQueue pq in printQueuesOnLocalServer)
+ {
+ if (pq.FullName == m_selectedPrinter.FullName)
+ {
+ this.xaml_selPrinter.SelectedItem = pq;
+ break;
+ }
+ }
+ }
+ }
+
+ /* Initialize */
+ public PrintControl(int num_pages, int curr_page)
+ {
+ PrinterSettings ps = new PrinterSettings();
+
+ this.Closing += new System.ComponentModel.CancelEventHandler(FakeWindowClosing);
+ InitializeComponent();
+ m_printServer = new LocalPrintServer();
+ m_selectedPrinter = LocalPrintServer.GetDefaultPrintQueue();
+ InitPrinterList();
+ ps.PrinterName = m_selectedPrinter.FullName;
+ m_pagedetails = ps.DefaultPageSettings;
+
+
+ xaml_rbAll.IsChecked = true;
+ m_pages_setting = PrintPages_t.ALL;
+ m_page_subset = PageSubset_t.ALL;
+ xaml_Subset.SelectedIndex = (int) m_page_subset;
+
+ xaml_autofit.IsChecked = false;
+
+ xaml_inches.IsChecked = true;
+ m_units = Units_t.INCHES;
+
+ m_currpage = curr_page;
+ m_numpages = num_pages;
+ xaml_pagecount.Text = "1/" + num_pages;
+ xaml_pageslider.Maximum = num_pages - 1;
+
+ m_printcap = m_selectedPrinter.GetPrintCapabilities();
+
+ m_trans_pap = new TranslateTransform(0, 0);
+ m_trans_doc = new TranslateTransform(0, 0);
+ m_isrotated = false;
+
+ /* Data range case */
+ m_range_pages = new PrintRanges(m_numpages);
+ m_page_scale = 1.0;
+
+ m_numcopies = 1;
+ m_initdone = false;
+ m_is64bit = Environment.Is64BitOperatingSystem &&
+ Environment.Is64BitProcess;
+ }
+
+ void FakeWindowClosing(object sender, System.ComponentModel.CancelEventArgs e)
+ {
+ e.Cancel = true;
+ this.Hide();
+ }
+
+ public void RealWindowClosing()
+ {
+ this.Closing -= new System.ComponentModel.CancelEventHandler(FakeWindowClosing);
+ this.Close();
+ }
+
+ /* Displays and updates the custom printer dialog settings. One can
+ * either do this with pinvoke of the various commands in winspool or
+ * go ahead and handle it in our own dll, which is what I decided to
+ * do. */
+ private void ShowProperties(object sender, RoutedEventArgs e)
+ {
+ PrinterChanged(true);
+ }
+
+ private void PrinterChanged(bool show_prop)
+ {
+ if (m_selectedPrinter != null)
+ {
+ var ptrNameGC = new GCHandle();
+ var temp = System.Text.Encoding.UTF8.GetBytes(m_selectedPrinter.FullName.ToCharArray());
+ ptrNameGC = GCHandle.Alloc(temp, GCHandleType.Pinned);
+ int res = tc_ShowPropertiesDialog(new WindowInteropHelper(this).Handle, ptrNameGC.AddrOfPinnedObject(), show_prop);
+ ptrNameGC.Free();
+ if (res >= 0)
+ {
+ PrinterSettings ps = new PrinterSettings();
+ ps.PrinterName = m_selectedPrinter.FullName;
+ m_pagedetails = ps.DefaultPageSettings;
+ UpdateView();
+ }
+ }
+ }
+
+ /* Printer selection changed */
+ private void selPrinterChanged(object sender, SelectionChangedEventArgs e)
+ {
+ m_selectedPrinter = this.xaml_selPrinter.SelectedItem as PrintQueue;
+ GetPrinterStatus();
+ if (m_initdone)
+ PrinterChanged(false);
+ }
+
+ /* Printer Status */
+ private void GetPrinterStatus()
+ {
+ if (m_selectedPrinter.IsBusy)
+ m_status = "Busy";
+ else if (m_selectedPrinter.IsNotAvailable)
+ m_status = "Not Available";
+ else if (m_selectedPrinter.IsOffline)
+ m_status = "Offline";
+ else if (m_selectedPrinter.IsOutOfMemory)
+ m_status = "Out Of Memory";
+ else if (m_selectedPrinter.IsOutOfPaper)
+ m_status = "Out Of Paper";
+ else if (m_selectedPrinter.IsOutputBinFull)
+ m_status = "Output Bin Full";
+ else if (m_selectedPrinter.IsPaperJammed)
+ m_status = "Paper Jam";
+ else if (m_selectedPrinter.IsPaused)
+ m_status = "Paused";
+ else if (m_selectedPrinter.IsPendingDeletion)
+ m_status = "Paused";
+ else if (m_selectedPrinter.IsPrinting)
+ m_status = "Printing";
+ else if (m_selectedPrinter.IsProcessing)
+ m_status = "Processing";
+ else if (m_selectedPrinter.IsWaiting)
+ m_status = "Waiting";
+ else if (m_selectedPrinter.IsWarmingUp)
+ m_status = "Warming Up";
+ else
+ m_status = "Ready";
+ xaml_Status.Text = m_status;
+ }
+
+ private void Subset_SelectionChanged(object sender, SelectionChangedEventArgs e)
+ {
+ /* On current page, only All is allowed */
+ m_page_subset = (PageSubset_t) xaml_Subset.SelectedIndex;
+ if (m_pages_setting == PrintPages_t.CURRENT &&
+ m_page_subset != PageSubset_t.ALL)
+ xaml_Subset.SelectedIndex = (int) PageSubset_t.ALL;
+
+ /* Only one page, can't use even */
+ if (m_pages_setting == PrintPages_t.ALL &&
+ m_page_subset == PageSubset_t.EVEN &&
+ m_numpages == 1)
+ xaml_Subset.SelectedIndex = (int)PageSubset_t.ALL;
+ }
+
+ private void AllPages(object sender, RoutedEventArgs e)
+ {
+ xaml_invalid.Visibility = System.Windows.Visibility.Collapsed;
+ xaml_pageslider.Maximum = m_numpages - 1;
+ xaml_pageslider.Value = m_currpage;
+ xaml_pagecount.Text = (m_currpage + 1) + "/" + m_numpages;
+ m_pages_setting = PrintPages_t.ALL;
+ }
+
+ private void CurrentPage(object sender, RoutedEventArgs e)
+ {
+ xaml_invalid.Visibility = System.Windows.Visibility.Collapsed;
+ m_pages_setting = PrintPages_t.CURRENT;
+ xaml_pagecount.Text = "1/1";
+ xaml_pageslider.Maximum = 0;
+ xaml_pageslider.Value = 0;
+ PrintDiagEventArgs info = new PrintDiagEventArgs(m_currpage);
+ PrintDiagUpdatePreview(this, info);
+ }
+
+ private void PageRange(object sender, RoutedEventArgs e)
+ {
+ xaml_invalid.Visibility = System.Windows.Visibility.Collapsed;
+ m_pages_setting = PrintPages_t.RANGE;
+ }
+
+ private void UpdateScaleInfo()
+ {
+ /*
+ if (m_page_scale_type == PageScale_t.NONE)
+ {
+ double temp_width_doc = Math.Truncate(m_doc_width * 100.0) / 100.0;
+ double temp_height_doc = Math.Truncate(m_doc_height * 100.0) / 100.0;
+ double temp_width_page = m_pagedetails.Bounds.Width / 100;
+ double temp_height_page = m_pagedetails.Bounds.Height / 100;
+
+ if (m_units == Units_t.CM)
+ {
+ temp_height_doc = (Math.Truncate(temp_height_doc * 2.54 * 100) / 100.0);
+ temp_width_doc = (Math.Truncate(temp_width_doc * 2.54 * 100) / 100.0);
+ temp_height_page = (Math.Truncate(temp_height_page * 2.54 * 100) / 100.0);
+ temp_width_page = (Math.Truncate(temp_width_page * 2.54 * 100) / 100.0);
+ }
+ xaml_pagesize.Text = "Paper:\t\t" + temp_width_page + " x " + temp_height_page;
+ xaml_docsize.Text = "Document:\t" + temp_width_doc + " x " + temp_height_doc; ;
+ xaml_pagesize.Visibility = System.Windows.Visibility.Visible;
+ xaml_docsize.Visibility = System.Windows.Visibility.Visible;
+ }
+ else
+ {
+ xaml_pagesize.Visibility = System.Windows.Visibility.Collapsed;
+ xaml_docsize.Visibility = System.Windows.Visibility.Collapsed;
+ }
+ * */
+ }
+
+ private void Inches(object sender, RoutedEventArgs e)
+ {
+ m_units = Units_t.INCHES;
+ UpdateUnits();
+ UpdateScaleInfo();
+ }
+
+ private void Centimeters(object sender, RoutedEventArgs e)
+ {
+ m_units = Units_t.CM;
+ UpdateUnits();
+ UpdateScaleInfo();
+ }
+
+ public void SetImage(BitmapSource image_in, double doc_height_in,
+ double doc_width_in)
+ {
+ xaml_PreviewImageRect.Visibility = System.Windows.Visibility.Collapsed;
+ xaml_PreviewGrayRect.Visibility = System.Windows.Visibility.Collapsed;
+ xaml_PreviewPaper.Visibility = System.Windows.Visibility.Collapsed;
+
+ m_doc_width = doc_width_in;
+ m_doc_height = doc_height_in;
+ xaml_ImagePreview.ImageSource = image_in;
+ xaml_ImagePreviewClip.ImageSource = image_in;
+
+ UpdateView();
+ }
+
+ private void UpdateView()
+ {
+ /* For our display we compute the page size as well as the paper size */
+ /* The max length sets our scaling of each component */
+ /* We then determine if any additional scaling is needed or translation
+ * based upon the settings of m_page_scale_type as well as the autofit
+ * and scale setting */
+ double page_height = m_pagedetails.Bounds.Height;
+ double page_width = m_pagedetails.Bounds.Width;
+ double doc_height = m_doc_height * 100;
+ double doc_width = m_doc_width * 100;
+ bool autofit = (xaml_autofit.IsChecked == true);
+ bool center;
+ /* bool center = (xaml_center.IsChecked == true); */
+ double scale_height;
+ double scale_width;
+ double max_scale;
+ double doc_offset_x = 0;
+ double doc_offset_y = 0;
+ double pap_offset_x = 0;
+ double pap_offset_y = 0;
+ Rect clip_rect;
+
+ center = autofit; /* I may separate these later */
+ m_page_scale = 1.0;
+ m_isrotated = false;
+ if (autofit &&
+ ((m_pagedetails.Bounds.Height > m_pagedetails.Bounds.Width && doc_height < doc_width) ||
+ (m_pagedetails.Bounds.Height < m_pagedetails.Bounds.Width && doc_height > doc_width)))
+ {
+ page_width = m_pagedetails.Bounds.Height;
+ page_height = m_pagedetails.Bounds.Width;
+ m_isrotated = true;
+ }
+
+ /* Scale page data if needed. */
+
+ if (xaml_autofit.IsChecked == true)
+ {
+ scale_height = page_height / doc_height;
+ scale_width = page_width / doc_width;
+ max_scale = Math.Min(scale_height, scale_width);
+
+ /* Adjust the doc size to fit in the page */
+ doc_height = doc_height * max_scale;
+ doc_width = doc_width * max_scale;
+ m_page_scale = max_scale;
+ }
+
+ /* Now figure out our preview scaling to ensure everything fits
+ * in the display window */
+ double max_height = Math.Max(doc_height, page_height);
+ double max_width = Math.Max(doc_width, page_width);
+ double max_length = Math.Max(max_height, max_width);
+ double previewscale = (double)Constants.MAX_PRINT_PREVIEW_LENGTH / max_length;
+
+ /* Adjust size of everything */
+ doc_height = doc_height * previewscale;
+ doc_width = doc_width * previewscale;
+ page_height = page_height * previewscale;
+ page_width = page_width * previewscale;
+
+ xaml_PreviewImageRect.Visibility = System.Windows.Visibility.Collapsed;
+ xaml_PreviewGrayRect.Visibility = System.Windows.Visibility.Collapsed;
+ xaml_PreviewPaper.Visibility = System.Windows.Visibility.Collapsed;
+
+ /* Compute any offsets if needed due to centering */
+ if (center)
+ {
+ if (doc_height > page_height)
+ pap_offset_y = (doc_height - page_height) / 2.0;
+ else
+ doc_offset_y = (page_height - doc_height) / 2.0;
+ if (doc_width > page_width)
+ pap_offset_x = (doc_width - page_width) / 2.0;
+ else
+ doc_offset_x = (page_width - doc_width) / 2.0;
+ }
+
+ double offset_y = 0;
+
+ if (!autofit)
+ offset_y = doc_height - page_height;
+
+ /* See if the paper needs to translate */
+ if (page_height < doc_height)
+ m_trans_pap = new TranslateTransform(pap_offset_x, pap_offset_y + offset_y);
+ else
+ m_trans_pap = new TranslateTransform(pap_offset_x, pap_offset_y);
+
+ /* See if the doc needs to translate */
+ if (page_height > doc_height)
+ m_trans_doc = new TranslateTransform(doc_offset_x, doc_offset_y - offset_y);
+ else
+ m_trans_doc = new TranslateTransform(doc_offset_x, doc_offset_y);
+
+ /* Page black outer rect */
+ xaml_PreviewPaperOuterRect.RenderTransform = m_trans_pap;
+ xaml_PreviewPaperOuterRect.Height = page_height;
+ xaml_PreviewPaperOuterRect.Width = page_width;
+ xaml_PreviewPaperOuterRect.Visibility = System.Windows.Visibility.Visible;
+
+ /* Paper white fill */
+ xaml_PreviewPaper.RenderTransform = m_trans_pap;
+ xaml_PreviewPaper.Height = page_height;
+ xaml_PreviewPaper.Width = page_width;
+ xaml_PreviewPaper.Visibility = System.Windows.Visibility.Visible;
+
+ /* The image */
+ xaml_PreviewImageRect.RenderTransform = m_trans_doc;
+ xaml_PreviewImageRect.Height = doc_height;
+ xaml_PreviewImageRect.Width = doc_width;
+ xaml_PreviewImageRect.Visibility = System.Windows.Visibility.Visible;
+
+ /* The gray fill (not visible) */
+ xaml_PreviewGrayRect.RenderTransform = m_trans_doc;
+ xaml_PreviewGrayRect.Height = doc_height;
+ xaml_PreviewGrayRect.Width = doc_width;
+ xaml_PreviewGrayRect.Visibility = System.Windows.Visibility.Visible;
+
+ /* The visible portion */
+ xaml_PreviewImageRectClip.RenderTransform = m_trans_doc;
+ xaml_PreviewImageRectClip.Height = doc_height;
+ xaml_PreviewImageRectClip.Width = doc_width;
+ clip_rect = new Rect(pap_offset_x, pap_offset_y + offset_y, page_width, page_height);
+ xaml_ImagePreviewClipGeom.Rect = clip_rect;
+ xaml_PreviewImageRectClip.Visibility = System.Windows.Visibility.Visible;
+ UpdateSizes();
+ UpdateScaleInfo();
+ m_initdone = true;
+ }
+
+ private void PageSelect_DragCompleted(object sender, MouseButtonEventArgs e)
+ {
+ if (m_pages_setting == PrintPages_t.CURRENT)
+ return;
+
+ /* Get the current page view */
+ int page = (int) xaml_pageslider.Value;
+ PrintDiagEventArgs info = new PrintDiagEventArgs(page);
+ PrintDiagUpdatePreview(this, info);
+ page = page + 1;
+ xaml_pagecount.Text = page + "/" + m_numpages;
+ }
+
+ private void AdjustPageSize()
+ {
+ m_printcap = m_selectedPrinter.GetPrintCapabilities();
+ }
+
+ private void UpdateSizes()
+ {
+ xaml_TopArrowCanvas.RenderTransform = new TranslateTransform(m_trans_pap.X, 0);
+ xaml_topsize.X2 = xaml_PreviewPaper.Width;
+ xaml_toprighttoparrow.X1 = xaml_PreviewPaper.Width - 7;
+ xaml_toprighttoparrow.X2 = xaml_PreviewPaper.Width;
+ xaml_toprightbottomarrow.X1 = xaml_PreviewPaper.Width - 7;
+ xaml_toprightbottomarrow.X2 = xaml_PreviewPaper.Width;
+
+ xaml_LeftArrowCanvas.RenderTransform = new TranslateTransform(0, m_trans_pap.Y);
+ xaml_leftsize.Y2 = xaml_PreviewPaper.Height;
+ xaml_leftbottomleft.Y1 = xaml_PreviewPaper.Height - 7;
+ xaml_leftbottomleft.Y2 = xaml_PreviewPaper.Height;
+ xaml_leftbottomright.Y1 = xaml_PreviewPaper.Height - 7;
+ xaml_leftbottomright.Y2 = xaml_PreviewPaper.Height;
+
+ xaml_LeftArrowCanvas.Visibility = System.Windows.Visibility.Visible;
+ xaml_TopArrowCanvas.Visibility = System.Windows.Visibility.Visible;
+
+ UpdateUnits();
+ }
+
+ private void UpdateUnits()
+ {
+
+ double valHeight = m_pagedetails.Bounds.Height;
+ double valWidth = m_pagedetails.Bounds.Width;
+
+ if (m_units == Units_t.INCHES)
+ {
+ if (m_isrotated)
+ {
+ xaml_topsizevalue.Text = (Math.Truncate(valHeight) / 100.0).ToString();
+ xaml_leftsizevalue.Text = (Math.Truncate(valWidth) / 100.0).ToString();
+ }
+ else
+ {
+ xaml_leftsizevalue.Text = (Math.Truncate(valHeight) / 100.0).ToString();
+ xaml_topsizevalue.Text = (Math.Truncate(valWidth) / 100.0).ToString();
+ }
+ }
+ else
+ {
+ if (m_isrotated)
+ {
+ xaml_topsizevalue.Text = (Math.Truncate(valHeight * 2.54) / 100.0).ToString();
+ xaml_leftsizevalue.Text = (Math.Truncate(valWidth * 2.54) / 100.0).ToString();
+ }
+ else
+ {
+ xaml_leftsizevalue.Text = (Math.Truncate(valHeight * 2.54) / 100.0).ToString();
+ xaml_topsizevalue.Text = (Math.Truncate(valWidth * 2.54) / 100.0).ToString();
+ }
+ }
+ }
+
+ private void PageNumberEnter(object sender, KeyEventArgs e)
+ {
+ if (e.Key == Key.Return)
+ {
+ e.Handled = true;
+ string desired_page = xaml_pagerange.Text;
+
+ Regex rangePattern = new Regex(@"^\s*\d+\s*(\-\s*\d+\s*)?(\,\s*\d+\s*(\-\s*\d+\s*)?)*$");
+
+ Match m = rangePattern.Match(desired_page);
+ if (!m.Success)
+ xaml_invalid.Visibility = System.Windows.Visibility.Visible;
+ else
+ {
+ xaml_invalid.Visibility = System.Windows.Visibility.Collapsed;
+ }
+ }
+ }
+
+ private void ClickOK(object sender, RoutedEventArgs e)
+ {
+ PrintDiagPrint(this);
+ this.Hide();
+ }
+
+ private void ClickCancel(object sender, RoutedEventArgs e)
+ {
+ this.Hide();
+ }
+
+ private void xaml_Copies_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
+ {
+ m_numcopies = (int) e.NewValue;
+ }
+
+ private void AutoFit_Checked(object sender, RoutedEventArgs e)
+ {
+ UpdateView();
+ }
+
+ private void AutoFit_Unchecked(object sender, RoutedEventArgs e)
+ {
+ UpdateView();
+ }
+ }
+}
diff --git a/platform/windows/gsview/ghostsharp.cs b/platform/windows/gsview/ghostsharp.cs
index 168ce476..099239e9 100644
--- a/platform/windows/gsview/ghostsharp.cs
+++ b/platform/windows/gsview/ghostsharp.cs
@@ -1047,10 +1047,10 @@ namespace gsview
return RunGhostscript(gsparams);
}
- public gsStatus CreateXPS(String fileName, int resolution, int num_pages)
+ public gsStatus CreateXPS(String fileName, int resolution, int num_pages,
+ PrintControl printsettings)
{
gsParams_t gsparams = new gsParams_t();
-
gsparams.init_file = null;
gsparams.init_string = null;
gsparams.device = gsDevice_t.xpswrite;
@@ -1065,6 +1065,19 @@ namespace gsview
gsparams.firstpage = -1;
gsparams.lastpage = -1;
gsparams.currpage = -1;
+
+ if (printsettings != null)
+ {
+ double paperheight = printsettings.m_pagedetails.PaperSize.Height;
+ double paperwidth = printsettings.m_pagedetails.PaperSize.Width;
+ double width = paperwidth * 72.0 / 100.0;
+ double height = paperheight * 72.0 / 100.0;
+ String temp = " -dDEVICEWIDTHPOINTS=" + width + " -dDEVICEHEIGHTPOINTS=" + height + " -dFIXEDMEDIA";
+ /* Scale and translate and rotate if needed */
+ if (printsettings.xaml_autofit.IsChecked == true)
+ temp = temp + " -dFitPage";
+ gsparams.options = gsparams.options + temp;
+ }
return RunGhostscript(gsparams);
}
diff --git a/platform/windows/gsview/gsprint.cs b/platform/windows/gsview/gsprint.cs
index 27976bc0..7d7c68fd 100644
--- a/platform/windows/gsview/gsprint.cs
+++ b/platform/windows/gsview/gsprint.cs
@@ -10,6 +10,7 @@ using System.Windows.Media;
using System.Windows.Xps;
using System.Windows.Xps.Packaging;
using System.Windows.Xps.Serialization;
+using System.Drawing.Printing;
namespace gsview
{
@@ -74,8 +75,8 @@ namespace gsview
PrintDialog dlg = new PrintDialog();
/* Current page and page ranges is going to require a little work */
dlg.PageRangeSelection = PageRangeSelection.AllPages;
- //dlg.UserPageRangeEnabled = true;
- //dlg.CurrentPageEnabled = true;
+ dlg.UserPageRangeEnabled = true;
+ dlg.CurrentPageEnabled = true;
dlg.SelectedPagesEnabled = false;
m_busy = false;
if (dlg.ShowDialog() == true)
@@ -84,30 +85,71 @@ namespace gsview
}
/* Main print entry point */
- public void Print(PrintQueue queu, FixedDocumentSequence fixdoc)
+ public void Print(PrintQueue queu, FixedDocumentSequence fixdoc, PrintControl printcontrol)
{
- XpsDocumentWriter docwrite = GetDocWriter(queu);
-
+ XpsDocumentWriter docwrite;
+ PrintTicket Ticket = SetUpTicket(queu, printcontrol, fixdoc);
+ docwrite = GetDocWriter(queu);
m_busy = true;
+#if DISABLED_FOR_NOW
docwrite.WritingPrintTicketRequired +=
- new WritingPrintTicketRequiredEventHandler(PrintTicket);
- PrintPages(docwrite, fixdoc);
+ new WritingPrintTicketRequiredEventHandler(PrintTicket);
+#endif
+ PrintPages(docwrite, fixdoc, Ticket);
+ }
+
+ /* Set up the print ticket */
+ private PrintTicket SetUpTicket(PrintQueue queue, PrintControl printcontrol, FixedDocumentSequence fixdoc)
+ {
+ PrintTicket Ticket = new PrintTicket();
+
+ PageMediaSizeName name = PaperKindToPageMediaSize(printcontrol.m_pagedetails.PaperSize.Kind);
+ PageMediaSize mediasize = new PageMediaSize(name, printcontrol.m_pagedetails.PaperSize.Width, printcontrol.m_pagedetails.PaperSize.Height);
+
+ /* Media size */
+ Ticket.PageMediaSize = mediasize;
+ /* Scale to fit */
+ Ticket.PageScalingFactor = (int)Math.Round(printcontrol.m_page_scale * 100.0);
+
+ System.Windows.Size page_size = new System.Windows.Size(mediasize.Width.Value, mediasize.Height.Value);
+ DocumentPaginator paginator = fixdoc.DocumentPaginator;
+ paginator.PageSize = page_size;
+
+ /* Copy Count */
+ Ticket.CopyCount = printcontrol.m_numcopies;
+
+ /* Orientation */
+ if (printcontrol.m_isrotated)
+ if (printcontrol.m_pagedetails.Landscape)
+ Ticket.PageOrientation = PageOrientation.Portrait;
+ else
+ Ticket.PageOrientation = PageOrientation.Landscape;
+ else
+ if (printcontrol.m_pagedetails.Landscape)
+ Ticket.PageOrientation = PageOrientation.Landscape;
+ else
+ Ticket.PageOrientation = PageOrientation.Portrait;
+
+ System.Printing.ValidationResult result = queue.MergeAndValidatePrintTicket(queue.UserPrintTicket, Ticket);
+ queue.UserPrintTicket = result.ValidatedPrintTicket;
+ queue.Commit();
+ return result.ValidatedPrintTicket;
}
/* Send it */
- private void PrintPages(XpsDocumentWriter xpsdw, FixedDocumentSequence fixdoc)
+ private void PrintPages(XpsDocumentWriter xpsdw, FixedDocumentSequence fixdoc, PrintTicket Ticket)
{
m_docWriter = xpsdw;
xpsdw.WritingCompleted +=
new WritingCompletedEventHandler(AsyncCompleted);
xpsdw.WritingProgressChanged +=
new WritingProgressChangedEventHandler(AsyncProgress);
- xpsdw.WriteAsync(fixdoc);
+ xpsdw.WriteAsync(fixdoc, Ticket);
}
public void CancelAsync()
{
- /* ick. This does not work in windows 8. causes crash */
+ /* ick. This does not work in windows 8. causes crash. */
/* https://connect.microsoft.com/VisualStudio/feedback/details/778145/xpsdocumentwriter-cancelasync-cause-crash-in-win8 */
m_docWriter.CancelAsync();
}
@@ -142,26 +184,269 @@ namespace gsview
PrintUpdate(this, info);
}
}
-
+#if DISABLED_FOR_NOW
/* Print ticket handling. You can customize for PrintTicketLevel at
- FixedDocumentSequencePrintTicket, FixedDocumentPrintTicket,
- or FixedPagePrintTicket. We may want to play around with this some */
+ FixedDocumentSequencePrintTicket, FixedDocumentPrintTicket,
+ or FixedPagePrintTicket. We may want to play around with this some */
private void PrintTicket(Object sender, WritingPrintTicketRequiredEventArgs e)
{
if (e.CurrentPrintTicketLevel ==
PrintTicketLevel.FixedDocumentSequencePrintTicket)
{
PrintTicket pts = new PrintTicket();
- pts.PageOrientation = PageOrientation.Portrait;
e.CurrentPrintTicket = pts;
}
}
-
+#endif
/* Create the document write */
private XpsDocumentWriter GetDocWriter(PrintQueue pq)
{
XpsDocumentWriter xpsdw = PrintQueue.CreateXpsDocumentWriter(pq);
return xpsdw;
}
+
+ /* Two paths for designating printing = a pain in the ass.*/
+ static PageMediaSizeName PaperKindToPageMediaSize(PaperKind paperKind)
+ {
+ switch (paperKind)
+ {
+ case PaperKind.Custom:
+ return PageMediaSizeName.Unknown;
+ case PaperKind.Letter:
+ return PageMediaSizeName.NorthAmericaLetter;
+ case PaperKind.Legal:
+ return PageMediaSizeName.NorthAmericaLegal;
+ case PaperKind.A4:
+ return PageMediaSizeName.ISOA4;
+ case PaperKind.CSheet:
+ return PageMediaSizeName.NorthAmericaCSheet;
+ case PaperKind.DSheet:
+ return PageMediaSizeName.NorthAmericaDSheet;
+ case PaperKind.ESheet:
+ return PageMediaSizeName.NorthAmericaESheet;
+ case PaperKind.LetterSmall:
+ return PageMediaSizeName.Unknown;
+ case PaperKind.Tabloid:
+ return PageMediaSizeName.NorthAmericaTabloid;
+ case PaperKind.Ledger:
+ return PageMediaSizeName.Unknown;
+ case PaperKind.Statement:
+ return PageMediaSizeName.NorthAmericaStatement;
+ case PaperKind.Executive:
+ return PageMediaSizeName.NorthAmericaExecutive;
+ case PaperKind.A3:
+ return PageMediaSizeName.ISOA3;
+ case PaperKind.A4Small:
+ return PageMediaSizeName.Unknown;
+ case PaperKind.A5:
+ return PageMediaSizeName.ISOA5;
+ case PaperKind.B4:
+ return PageMediaSizeName.ISOB4;
+ case PaperKind.B5:
+ return PageMediaSizeName.Unknown;
+ case PaperKind.Folio:
+ return PageMediaSizeName.OtherMetricFolio;
+ case PaperKind.Quarto:
+ return PageMediaSizeName.NorthAmericaQuarto;
+ case PaperKind.Standard10x14:
+ return PageMediaSizeName.Unknown;
+ case PaperKind.Standard11x17:
+ return PageMediaSizeName.Unknown;
+ case PaperKind.Note:
+ return PageMediaSizeName.NorthAmericaNote;
+ case PaperKind.Number9Envelope:
+ return PageMediaSizeName.NorthAmericaNumber9Envelope;
+ case PaperKind.Number10Envelope:
+ return PageMediaSizeName.NorthAmericaNumber10Envelope;
+ case PaperKind.Number11Envelope:
+ return PageMediaSizeName.NorthAmericaNumber11Envelope;
+ case PaperKind.Number12Envelope:
+ return PageMediaSizeName.NorthAmericaNumber12Envelope;
+ case PaperKind.Number14Envelope:
+ return PageMediaSizeName.NorthAmericaNumber14Envelope;
+ case PaperKind.DLEnvelope:
+ return PageMediaSizeName.ISODLEnvelope;
+ case PaperKind.C5Envelope:
+ return PageMediaSizeName.ISOC5Envelope;
+ case PaperKind.C3Envelope:
+ return PageMediaSizeName.ISOC3Envelope;
+ case PaperKind.C4Envelope:
+ return PageMediaSizeName.ISOC4Envelope;
+ case PaperKind.C6Envelope:
+ return PageMediaSizeName.ISOC6Envelope;
+ case PaperKind.C65Envelope:
+ return PageMediaSizeName.ISOC6C5Envelope;
+ case PaperKind.B4Envelope:
+ return PageMediaSizeName.ISOB4Envelope;
+ case PaperKind.B5Envelope:
+ return PageMediaSizeName.ISOB5Envelope;
+ case PaperKind.B6Envelope:
+ return PageMediaSizeName.Unknown;
+ case PaperKind.ItalyEnvelope:
+ return PageMediaSizeName.OtherMetricItalianEnvelope;
+ case PaperKind.MonarchEnvelope:
+ return PageMediaSizeName.NorthAmericaMonarchEnvelope;
+ case PaperKind.PersonalEnvelope:
+ return PageMediaSizeName.NorthAmericaPersonalEnvelope;
+ case PaperKind.USStandardFanfold:
+ return PageMediaSizeName.Unknown;
+ case PaperKind.GermanStandardFanfold:
+ return PageMediaSizeName.NorthAmericaGermanStandardFanfold;
+ case PaperKind.GermanLegalFanfold:
+ return PageMediaSizeName.NorthAmericaGermanLegalFanfold;
+ case PaperKind.IsoB4:
+ return PageMediaSizeName.ISOB4;
+ case PaperKind.JapanesePostcard:
+ return PageMediaSizeName.JapanHagakiPostcard;
+ case PaperKind.Standard9x11:
+ return PageMediaSizeName.Unknown;
+ case PaperKind.Standard10x11:
+ return PageMediaSizeName.Unknown;
+ case PaperKind.Standard15x11:
+ return PageMediaSizeName.Unknown;
+ case PaperKind.InviteEnvelope:
+ return PageMediaSizeName.OtherMetricInviteEnvelope;
+ case PaperKind.LetterExtra:
+ return PageMediaSizeName.NorthAmericaLetterExtra;
+ case PaperKind.LegalExtra:
+ return PageMediaSizeName.NorthAmericaLegalExtra;
+ case PaperKind.TabloidExtra:
+ return PageMediaSizeName.NorthAmericaTabloidExtra;
+ case PaperKind.A4Extra:
+ return PageMediaSizeName.ISOA4Extra;
+ case PaperKind.LetterTransverse:
+ return PageMediaSizeName.Unknown;
+ case PaperKind.A4Transverse:
+ return PageMediaSizeName.Unknown;
+ case PaperKind.LetterExtraTransverse:
+ return PageMediaSizeName.Unknown;
+ case PaperKind.APlus:
+ return PageMediaSizeName.Unknown;
+ case PaperKind.BPlus:
+ return PageMediaSizeName.Unknown;
+ case PaperKind.LetterPlus:
+ return PageMediaSizeName.NorthAmericaLetterPlus;
+ case PaperKind.A4Plus:
+ return PageMediaSizeName.OtherMetricA4Plus;
+ case PaperKind.A5Transverse:
+ return PageMediaSizeName.Unknown;
+ case PaperKind.B5Transverse:
+ return PageMediaSizeName.Unknown;
+ case PaperKind.A3Extra:
+ return PageMediaSizeName.ISOA3Extra;
+ case PaperKind.A5Extra:
+ return PageMediaSizeName.ISOA5Extra;
+ case PaperKind.B5Extra:
+ return PageMediaSizeName.ISOB5Extra;
+ case PaperKind.A2:
+ return PageMediaSizeName.ISOA2;
+ case PaperKind.A3Transverse:
+ return PageMediaSizeName.Unknown;
+ case PaperKind.A3ExtraTransverse:
+ return PageMediaSizeName.Unknown;
+ case PaperKind.JapaneseDoublePostcard:
+ return PageMediaSizeName.JapanDoubleHagakiPostcard;
+ case PaperKind.A6:
+ return PageMediaSizeName.ISOA6;
+ case PaperKind.JapaneseEnvelopeKakuNumber2:
+ return PageMediaSizeName.JapanKaku2Envelope;
+ case PaperKind.JapaneseEnvelopeKakuNumber3:
+ return PageMediaSizeName.JapanKaku3Envelope;
+ case PaperKind.JapaneseEnvelopeChouNumber3:
+ return PageMediaSizeName.JapanChou3Envelope;
+ case PaperKind.JapaneseEnvelopeChouNumber4:
+ return PageMediaSizeName.JapanChou4Envelope;
+ case PaperKind.LetterRotated:
+ return PageMediaSizeName.NorthAmericaLetterRotated;
+ case PaperKind.A3Rotated:
+ return PageMediaSizeName.ISOA3Rotated;
+ case PaperKind.A4Rotated:
+ return PageMediaSizeName.ISOA4Rotated;
+ case PaperKind.A5Rotated:
+ return PageMediaSizeName.ISOA5Rotated;
+ case PaperKind.B4JisRotated:
+ return PageMediaSizeName.JISB4Rotated;
+ case PaperKind.B5JisRotated:
+ return PageMediaSizeName.JISB5Rotated;
+ case PaperKind.JapanesePostcardRotated:
+ return PageMediaSizeName.JapanHagakiPostcardRotated;
+ case PaperKind.JapaneseDoublePostcardRotated:
+ return PageMediaSizeName.JapanHagakiPostcardRotated;
+ case PaperKind.A6Rotated:
+ return PageMediaSizeName.ISOA6Rotated;
+ case PaperKind.JapaneseEnvelopeKakuNumber2Rotated:
+ return PageMediaSizeName.JapanKaku2EnvelopeRotated;
+ case PaperKind.JapaneseEnvelopeKakuNumber3Rotated:
+ return PageMediaSizeName.JapanKaku3EnvelopeRotated;
+ case PaperKind.JapaneseEnvelopeChouNumber3Rotated:
+ return PageMediaSizeName.JapanChou3EnvelopeRotated;
+ case PaperKind.JapaneseEnvelopeChouNumber4Rotated:
+ return PageMediaSizeName.JapanChou4EnvelopeRotated;
+ case PaperKind.B6Jis:
+ return PageMediaSizeName.JISB6;
+ case PaperKind.B6JisRotated:
+ return PageMediaSizeName.JISB6Rotated;
+ case PaperKind.Standard12x11:
+ return PageMediaSizeName.Unknown;
+ case PaperKind.JapaneseEnvelopeYouNumber4:
+ return PageMediaSizeName.JapanYou4Envelope;
+ case PaperKind.JapaneseEnvelopeYouNumber4Rotated:
+ return PageMediaSizeName.JapanYou4EnvelopeRotated;
+ case PaperKind.Prc16K:
+ return PageMediaSizeName.PRC16K;
+ case PaperKind.Prc32K:
+ return PageMediaSizeName.PRC32K;
+ case PaperKind.Prc32KBig:
+ return PageMediaSizeName.PRC32KBig;
+ case PaperKind.PrcEnvelopeNumber1:
+ return PageMediaSizeName.PRC1Envelope;
+ case PaperKind.PrcEnvelopeNumber2:
+ return PageMediaSizeName.PRC2Envelope;
+ case PaperKind.PrcEnvelopeNumber3:
+ return PageMediaSizeName.PRC3Envelope;
+ case PaperKind.PrcEnvelopeNumber4:
+ return PageMediaSizeName.PRC4Envelope;
+ case PaperKind.PrcEnvelopeNumber5:
+ return PageMediaSizeName.PRC5Envelope;
+ case PaperKind.PrcEnvelopeNumber6:
+ return PageMediaSizeName.PRC6Envelope;
+ case PaperKind.PrcEnvelopeNumber7:
+ return PageMediaSizeName.PRC7Envelope;
+ case PaperKind.PrcEnvelopeNumber8:
+ return PageMediaSizeName.PRC8Envelope;
+ case PaperKind.PrcEnvelopeNumber9:
+ return PageMediaSizeName.PRC9Envelope;
+ case PaperKind.PrcEnvelopeNumber10:
+ return PageMediaSizeName.PRC10Envelope;
+ case PaperKind.Prc16KRotated:
+ return PageMediaSizeName.PRC16KRotated;
+ case PaperKind.Prc32KRotated:
+ return PageMediaSizeName.PRC32KRotated;
+ case PaperKind.Prc32KBigRotated:
+ return PageMediaSizeName.Unknown;
+ case PaperKind.PrcEnvelopeNumber1Rotated:
+ return PageMediaSizeName.PRC1EnvelopeRotated;
+ case PaperKind.PrcEnvelopeNumber2Rotated:
+ return PageMediaSizeName.PRC2EnvelopeRotated;
+ case PaperKind.PrcEnvelopeNumber3Rotated:
+ return PageMediaSizeName.PRC3EnvelopeRotated;
+ case PaperKind.PrcEnvelopeNumber4Rotated:
+ return PageMediaSizeName.PRC4EnvelopeRotated;
+ case PaperKind.PrcEnvelopeNumber5Rotated:
+ return PageMediaSizeName.PRC5EnvelopeRotated;
+ case PaperKind.PrcEnvelopeNumber6Rotated:
+ return PageMediaSizeName.PRC6EnvelopeRotated;
+ case PaperKind.PrcEnvelopeNumber7Rotated:
+ return PageMediaSizeName.PRC7EnvelopeRotated;
+ case PaperKind.PrcEnvelopeNumber8Rotated:
+ return PageMediaSizeName.PRC8EnvelopeRotated;
+ case PaperKind.PrcEnvelopeNumber9Rotated:
+ return PageMediaSizeName.PRC9EnvelopeRotated;
+ case PaperKind.PrcEnvelopeNumber10Rotated:
+ return PageMediaSizeName.PRC10EnvelopeRotated;
+ default:
+ throw new ArgumentOutOfRangeException("paperKind");
+ }
+ }
}
}
diff --git a/platform/windows/gsview/gsview.csproj b/platform/windows/gsview/gsview.csproj
index 31f40f51..b57c86f0 100644
--- a/platform/windows/gsview/gsview.csproj
+++ b/platform/windows/gsview/gsview.csproj
@@ -111,6 +111,9 @@
<Compile Include="Password.xaml.cs">
<DependentUpon>Password.xaml</DependentUpon>
</Compile>
+ <Compile Include="PrintControl.xaml.cs">
+ <DependentUpon>PrintControl.xaml</DependentUpon>
+ </Compile>
<Compile Include="RectList.cs" />
<Compile Include="Selection.xaml.cs">
<DependentUpon>Selection.xaml</DependentUpon>
@@ -163,6 +166,10 @@
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
+ <Page Include="PrintControl.xaml">
+ <SubType>Designer</SubType>
+ <Generator>MSBuild:Compile</Generator>
+ </Page>
<Page Include="Selection.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
diff --git a/platform/windows/mupdf.sln b/platform/windows/mupdf.sln
index 65818c0e..7fb74446 100644
--- a/platform/windows/mupdf.sln
+++ b/platform/windows/mupdf.sln
@@ -1,7 +1,7 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2013
-VisualStudioVersion = 12.0.21005.1
+VisualStudioVersion = 12.0.31101.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "generated", "generated.vcxproj", "{A5053AA7-02E5-4903-B596-04F17AEB1526}"
EndProject
@@ -25,6 +25,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mupdf_cpp", "mupdf_cpp\mupd
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "gsview", "gsview\gsview.csproj", "{5DA0ECC9-4026-4427-862F-E3226EFEFEB1}"
ProjectSection(ProjectDependencies) = postProject
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1} = {09FE8E75-9952-44E7-95F8-E8D74707FBA1}
{4468C2E0-6C90-4FA5-8A48-0A9629776167} = {4468C2E0-6C90-4FA5-8A48-0A9629776167}
EndProjectSection
EndProject
@@ -53,6 +54,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libmupdf", "libmupdf\libmup
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libthirdparty", "libthirdparty\libthirdparty.vcxproj", "{DF87E242-8B2C-4F04-9A7E-61C578FD994C}"
EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gsprint", "gsprint.vcxproj", "{09FE8E75-9952-44E7-95F8-E8D74707FBA1}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
CD_ROM|Any CPU = CD_ROM|Any CPU
@@ -755,6 +758,66 @@ Global
{DF87E242-8B2C-4F04-9A7E-61C578FD994C}.SingleImage|x64.Build.0 = Release|x64
{DF87E242-8B2C-4F04-9A7E-61C578FD994C}.SingleImage|x86.ActiveCfg = Release|Win32
{DF87E242-8B2C-4F04-9A7E-61C578FD994C}.SingleImage|x86.Build.0 = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.CD_ROM|Any CPU.ActiveCfg = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.CD_ROM|ARM.ActiveCfg = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.CD_ROM|Mixed Platforms.ActiveCfg = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.CD_ROM|Mixed Platforms.Build.0 = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.CD_ROM|Win32.ActiveCfg = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.CD_ROM|Win32.Build.0 = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.CD_ROM|x64.ActiveCfg = Release|x64
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.CD_ROM|x64.Build.0 = Release|x64
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.CD_ROM|x86.ActiveCfg = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.CD_ROM|x86.Build.0 = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.Debug|Any CPU.ActiveCfg = Debug|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.Debug|ARM.ActiveCfg = Debug|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.Debug|Mixed Platforms.Build.0 = Debug|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.Debug|Win32.ActiveCfg = Debug|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.Debug|Win32.Build.0 = Debug|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.Debug|x64.ActiveCfg = Debug|x64
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.Debug|x64.Build.0 = Debug|x64
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.Debug|x86.ActiveCfg = Debug|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.Debug|x86.Build.0 = Debug|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.DVD-5|Any CPU.ActiveCfg = Debug|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.DVD-5|ARM.ActiveCfg = Debug|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.DVD-5|Mixed Platforms.ActiveCfg = Debug|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.DVD-5|Mixed Platforms.Build.0 = Debug|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.DVD-5|Win32.ActiveCfg = Debug|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.DVD-5|Win32.Build.0 = Debug|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.DVD-5|x64.ActiveCfg = Debug|x64
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.DVD-5|x64.Build.0 = Debug|x64
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.DVD-5|x86.ActiveCfg = Debug|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.DVD-5|x86.Build.0 = Debug|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.Memento|Any CPU.ActiveCfg = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.Memento|ARM.ActiveCfg = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.Memento|Mixed Platforms.ActiveCfg = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.Memento|Mixed Platforms.Build.0 = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.Memento|Win32.ActiveCfg = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.Memento|Win32.Build.0 = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.Memento|x64.ActiveCfg = Release|x64
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.Memento|x64.Build.0 = Release|x64
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.Memento|x86.ActiveCfg = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.Memento|x86.Build.0 = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.Release|Any CPU.ActiveCfg = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.Release|ARM.ActiveCfg = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.Release|Mixed Platforms.ActiveCfg = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.Release|Mixed Platforms.Build.0 = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.Release|Win32.ActiveCfg = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.Release|Win32.Build.0 = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.Release|x64.ActiveCfg = Release|x64
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.Release|x64.Build.0 = Release|x64
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.Release|x86.ActiveCfg = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.Release|x86.Build.0 = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.SingleImage|Any CPU.ActiveCfg = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.SingleImage|ARM.ActiveCfg = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.SingleImage|Mixed Platforms.ActiveCfg = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.SingleImage|Mixed Platforms.Build.0 = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.SingleImage|Win32.ActiveCfg = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.SingleImage|Win32.Build.0 = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.SingleImage|x64.ActiveCfg = Release|x64
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.SingleImage|x64.Build.0 = Release|x64
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.SingleImage|x86.ActiveCfg = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.SingleImage|x86.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE