diff --git a/Greenshot/Destinations/PrinterDestination.cs b/Greenshot/Destinations/PrinterDestination.cs index 88840f077..e85988901 100644 --- a/Greenshot/Destinations/PrinterDestination.cs +++ b/Greenshot/Destinations/PrinterDestination.cs @@ -106,15 +106,21 @@ namespace Greenshot.Destinations { /// /// ExportInformation public override ExportInformation ExportCapture(bool manuallyInitiated, ISurface surface, ICaptureDetails captureDetails) { - ExportInformation exportInformation = new ExportInformation(this.Designation, this.Description); - PrinterSettings printerSettings = null; + ExportInformation exportInformation = new ExportInformation(this.Designation, this.Description); + PrinterSettings printerSettings = null; if (!string.IsNullOrEmpty(printerName)) { - printerSettings = new PrintHelper(surface, captureDetails).PrintTo(printerName); + using (PrintHelper printHelper = new PrintHelper(surface, captureDetails)) { + printerSettings = printHelper.PrintTo(printerName); + } } else if (!manuallyInitiated) { PrinterSettings settings = new PrinterSettings(); - printerSettings = new PrintHelper(surface, captureDetails).PrintTo(settings.PrinterName); + using (PrintHelper printHelper = new PrintHelper(surface, captureDetails)) { + printerSettings = printHelper.PrintTo(settings.PrinterName); + } } else { - printerSettings = new PrintHelper(surface, captureDetails).PrintWithDialog(); + using (PrintHelper printHelper = new PrintHelper(surface, captureDetails)) { + printerSettings = printHelper.PrintWithDialog(); + } } if (printerSettings != null) { exportInformation.ExportMade = true; diff --git a/Greenshot/Helpers/PrintHelper.cs b/Greenshot/Helpers/PrintHelper.cs index 63941bb9a..044c2ac1e 100644 --- a/Greenshot/Helpers/PrintHelper.cs +++ b/Greenshot/Helpers/PrintHelper.cs @@ -39,13 +39,13 @@ namespace Greenshot.Helpers { private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(PrintHelper)); private static CoreConfiguration conf = IniConfig.GetIniSection(); - private ISurface surface; + private ISurface surface; private ICaptureDetails captureDetails; private PrintDocument printDocument = new PrintDocument(); private PrintDialog printDialog = new PrintDialog(); public PrintHelper(ISurface surface, ICaptureDetails captureDetails) { - this.surface = surface; + this.surface = surface; this.captureDetails = captureDetails; printDialog.UseEXDialog = true; printDocument.DocumentName = FilenameHelper.GetFilenameWithoutExtensionFromPattern(conf.OutputFileFilenamePattern, captureDetails); @@ -75,9 +75,6 @@ namespace Greenshot.Helpers { */ protected virtual void Dispose(bool disposing) { if (disposing) { - if (surface != null) { - surface.Dispose(); - } if (printDocument != null) { printDocument.Dispose(); } @@ -85,7 +82,7 @@ namespace Greenshot.Helpers { printDialog.Dispose(); } } - surface = null; + surface = null; printDocument = null; printDialog = null; } @@ -111,8 +108,6 @@ namespace Greenshot.Helpers { LOG.Error("An error ocurred while trying to print", e); MessageBox.Show(Language.GetString(LangKey.print_error), Language.GetString(LangKey.error)); } - surface.Dispose(); - surface = null; return returnPrinterSettings; } @@ -127,7 +122,7 @@ namespace Greenshot.Helpers { DialogResult? printOptionsResult = ShowPrintOptionsDialog(); try { if (printOptionsResult == null || printOptionsResult == DialogResult.OK) { - if (IsColorPrint()) { + if (IsColorPrint()) { printDocument.DefaultPageSettings.Color = false; } printDocument.Print(); @@ -139,14 +134,12 @@ namespace Greenshot.Helpers { } } - surface.Dispose(); - surface = null; return returnPrinterSettings; } - private bool IsColorPrint() { - return !conf.OutputPrintGrayscale && !conf.OutputPrintMonochrome; - } + private bool IsColorPrint() { + return !conf.OutputPrintGrayscale && !conf.OutputPrintMonochrome; + } /// /// display print options dialog (if the user has not configured Greenshot not to) @@ -165,93 +158,92 @@ namespace Greenshot.Helpers { void DrawImageForPrint(object sender, PrintPageEventArgs e) { - // Create the output settins - SurfaceOutputSettings printOutputSettings = new SurfaceOutputSettings(OutputFormat.png, 100, false); + // Create the output settins + SurfaceOutputSettings printOutputSettings = new SurfaceOutputSettings(OutputFormat.png, 100, false); - ApplyEffects(printOutputSettings); + ApplyEffects(printOutputSettings); - Image image; - Boolean disposeImage = ImageOutput.CreateImageFromSurface(surface, printOutputSettings, out image); - try { - ContentAlignment alignment = conf.OutputPrintCenter ? ContentAlignment.MiddleCenter : ContentAlignment.TopLeft; + Image image; + bool disposeImage = ImageOutput.CreateImageFromSurface(surface, printOutputSettings, out image); + try { + ContentAlignment alignment = conf.OutputPrintCenter ? ContentAlignment.MiddleCenter : ContentAlignment.TopLeft; - // prepare timestamp - float footerStringWidth = 0; - float footerStringHeight = 0; - string footerString = null; //DateTime.Now.ToLongDateString() + " " + DateTime.Now.ToLongTimeString(); - if (conf.OutputPrintFooter) { - footerString = FilenameHelper.FillPattern(conf.OutputPrintFooterPattern, captureDetails, false); - using (Font f = new Font(FontFamily.GenericSansSerif, 10, FontStyle.Regular)) { - footerStringWidth = e.Graphics.MeasureString(footerString, f).Width; - footerStringHeight = e.Graphics.MeasureString(footerString, f).Height; - } - } + // prepare timestamp + float footerStringWidth = 0; + float footerStringHeight = 0; + string footerString = null; //DateTime.Now.ToLongDateString() + " " + DateTime.Now.ToLongTimeString(); + if (conf.OutputPrintFooter) { + footerString = FilenameHelper.FillPattern(conf.OutputPrintFooterPattern, captureDetails, false); + using (Font f = new Font(FontFamily.GenericSansSerif, 10, FontStyle.Regular)) { + footerStringWidth = e.Graphics.MeasureString(footerString, f).Width; + footerStringHeight = e.Graphics.MeasureString(footerString, f).Height; + } + } - // Get a rectangle representing the printable Area - RectangleF pageRect = e.PageSettings.PrintableArea; - if(e.PageSettings.Landscape) { - float origWidth = pageRect.Width; - pageRect.Width = pageRect.Height; - pageRect.Height = origWidth; - } + // Get a rectangle representing the printable Area + RectangleF pageRect = e.PageSettings.PrintableArea; + if(e.PageSettings.Landscape) { + float origWidth = pageRect.Width; + pageRect.Width = pageRect.Height; + pageRect.Height = origWidth; + } - // Subtract the dateString height from the available area, this way the area stays free - pageRect.Height -= footerStringHeight; + // Subtract the dateString height from the available area, this way the area stays free + pageRect.Height -= footerStringHeight; - GraphicsUnit gu = GraphicsUnit.Pixel; - RectangleF imageRect = image.GetBounds(ref gu); - // rotate the image if it fits the page better - if (conf.OutputPrintAllowRotate) { - if ((pageRect.Width > pageRect.Height && imageRect.Width < imageRect.Height) || (pageRect.Width < pageRect.Height && imageRect.Width > imageRect.Height)) { - image.RotateFlip(RotateFlipType.Rotate90FlipNone); - imageRect = image.GetBounds(ref gu); - if (alignment.Equals(ContentAlignment.TopLeft)) { - alignment = ContentAlignment.TopRight; - } - } - } + GraphicsUnit gu = GraphicsUnit.Pixel; + RectangleF imageRect = image.GetBounds(ref gu); + // rotate the image if it fits the page better + if (conf.OutputPrintAllowRotate) { + if ((pageRect.Width > pageRect.Height && imageRect.Width < imageRect.Height) || (pageRect.Width < pageRect.Height && imageRect.Width > imageRect.Height)) { + image.RotateFlip(RotateFlipType.Rotate90FlipNone); + imageRect = image.GetBounds(ref gu); + if (alignment.Equals(ContentAlignment.TopLeft)) { + alignment = ContentAlignment.TopRight; + } + } + } - RectangleF printRect = new RectangleF(0, 0, imageRect.Width, imageRect.Height); - // scale the image to fit the page better - if (conf.OutputPrintAllowEnlarge || conf.OutputPrintAllowShrink) { - SizeF resizedRect = ScaleHelper.GetScaledSize(imageRect.Size, pageRect.Size, false); - if ((conf.OutputPrintAllowShrink && resizedRect.Width < printRect.Width) || conf.OutputPrintAllowEnlarge && resizedRect.Width > printRect.Width) { - printRect.Size = resizedRect; - } - } + RectangleF printRect = new RectangleF(0, 0, imageRect.Width, imageRect.Height); + // scale the image to fit the page better + if (conf.OutputPrintAllowEnlarge || conf.OutputPrintAllowShrink) { + SizeF resizedRect = ScaleHelper.GetScaledSize(imageRect.Size, pageRect.Size, false); + if ((conf.OutputPrintAllowShrink && resizedRect.Width < printRect.Width) || conf.OutputPrintAllowEnlarge && resizedRect.Width > printRect.Width) { + printRect.Size = resizedRect; + } + } - // align the image - printRect = ScaleHelper.GetAlignedRectangle(printRect, new RectangleF(0, 0, pageRect.Width, pageRect.Height), alignment); - if (conf.OutputPrintFooter) { - //printRect = new RectangleF(0, 0, printRect.Width, printRect.Height - (dateStringHeight * 2)); - using (Font f = new Font(FontFamily.GenericSansSerif, 10, FontStyle.Regular)) { - e.Graphics.DrawString(footerString, f, Brushes.Black, pageRect.Width / 2 - (footerStringWidth / 2), pageRect.Height); - } - } - e.Graphics.DrawImage(image, printRect, imageRect, GraphicsUnit.Pixel); + // align the image + printRect = ScaleHelper.GetAlignedRectangle(printRect, new RectangleF(0, 0, pageRect.Width, pageRect.Height), alignment); + if (conf.OutputPrintFooter) { + //printRect = new RectangleF(0, 0, printRect.Width, printRect.Height - (dateStringHeight * 2)); + using (Font f = new Font(FontFamily.GenericSansSerif, 10, FontStyle.Regular)) { + e.Graphics.DrawString(footerString, f, Brushes.Black, pageRect.Width / 2 - (footerStringWidth / 2), pageRect.Height); + } + } + e.Graphics.DrawImage(image, printRect, imageRect, GraphicsUnit.Pixel); - } finally { + } finally { if (disposeImage && image != null) { - image.Dispose(); - image = null; + image.Dispose(); + image = null; } } } - private void ApplyEffects(SurfaceOutputSettings printOutputSettings) - { - // TODO: - // add effects here - if (conf.OutputPrintMonochrome) { - byte threshold = conf.OutputPrintMonochromeThreshold; - printOutputSettings.Effects.Add(new MonochromeEffect(threshold)); - printOutputSettings.ReduceColors = true; - } + private void ApplyEffects(SurfaceOutputSettings printOutputSettings) { + // TODO: + // add effects here + if (conf.OutputPrintMonochrome) { + byte threshold = conf.OutputPrintMonochromeThreshold; + printOutputSettings.Effects.Add(new MonochromeEffect(threshold)); + printOutputSettings.ReduceColors = true; + } - // the invert effect should probably be the last - if (conf.OutputPrintInverted) { - printOutputSettings.Effects.Add(new InvertEffect()); - } - } + // the invert effect should probably be the last + if (conf.OutputPrintInverted) { + printOutputSettings.Effects.Add(new InvertEffect()); + } + } } }