From bd4cbef68cde53e2378970df278f111ad49e1739 Mon Sep 17 00:00:00 2001 From: Tomas Linhart Date: Sun, 4 Sep 2011 17:13:07 +0200 Subject: [PATCH] Fix memory leak with drawing to bitmap. --- .../CodeQuality/Src/Controls/MatrixControl.cs | 22 ++++++++++--------- .../CodeQuality/Src/Utility/Helper.cs | 9 ++++++-- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/AddIns/Analysis/CodeQuality/Src/Controls/MatrixControl.cs b/src/AddIns/Analysis/CodeQuality/Src/Controls/MatrixControl.cs index c44e28d6a2..ef48f837c5 100644 --- a/src/AddIns/Analysis/CodeQuality/Src/Controls/MatrixControl.cs +++ b/src/AddIns/Analysis/CodeQuality/Src/Controls/MatrixControl.cs @@ -11,6 +11,8 @@ using System.Windows.Controls; using System.Windows.Controls.Primitives; using System.Windows.Media; using System.Windows.Media.Imaging; +using System.Windows.Interop; +using PointF = System.Drawing.PointF; namespace ICSharpCode.CodeQualityAnalysis.Controls { @@ -138,6 +140,8 @@ namespace ICSharpCode.CodeQualityAnalysis.Controls var maxHeight = ((int) viewport.Height / CellHeight) + 1; // how many cells we will draw + // sometimes happens when half of cell is hidden in scroll so text isnt drawn + // so lets drawn one more cell var cellsHorizontally = maxWidth > matrixWidth ? matrixWidth : maxWidth + 1; var cellsVertically = maxHeight > matrixHeight ? matrixHeight : maxHeight + 1; @@ -155,11 +159,6 @@ namespace ICSharpCode.CodeQualityAnalysis.Controls backgroundColor.Freeze(); drawingContext.DrawRectangle(backgroundColor, null, background); - // sometimes happens when half of cell is hidden in scroll so text isnt drawn - // so lets drawn one more cell -// cellsHorizontally = maxWidth > matrixWidth ? matrixWidth : maxWidth + 1; -// cellsVertically = maxHeight > matrixHeight ? matrixHeight : maxHeight + 1; - var currentXLine = (currentCell.X - scaledOffsetX) * CellWidth - offsetDiffX; var currentYLine = (currentCell.Y - scaledOffsetY) * CellHeight - offsetDiffY; @@ -264,16 +263,19 @@ namespace ICSharpCode.CodeQualityAnalysis.Controls var spanWidth = (CellWidth - size.Width) / 2; var spanHeight = (CellHeight - size.Height) / 2; - g.DrawString(text, fontOjb, System.Drawing.Brushes.Black, new System.Drawing.PointF(spanWidth, spanHeight)); + g.DrawString(text, fontOjb, System.Drawing.Brushes.Black, new PointF(spanWidth, spanHeight)); g.Dispose(); - var img = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(bmp.GetHbitmap(), - IntPtr.Zero, - Int32Rect.Empty, - BitmapSizeOptions.FromWidthAndHeight(bmp.Width, bmp.Height)); + var bitmap = bmp.GetHbitmap(); + var img = Imaging.CreateBitmapSourceFromHBitmap(bitmap, + IntPtr.Zero, + Int32Rect.Empty, + BitmapSizeOptions.FromWidthAndHeight(bmp.Width, bmp.Height)); img.Freeze(); imgs.Add(text, img); + Helper.DeleteObject(bitmap); + return img; } diff --git a/src/AddIns/Analysis/CodeQuality/Src/Utility/Helper.cs b/src/AddIns/Analysis/CodeQuality/Src/Utility/Helper.cs index 48b9e67bd2..25d0bbc478 100644 --- a/src/AddIns/Analysis/CodeQuality/Src/Utility/Helper.cs +++ b/src/AddIns/Analysis/CodeQuality/Src/Utility/Helper.cs @@ -4,15 +4,20 @@ using System; using System.Windows; using System.Windows.Media; +using ICSharpCode.TreeView; +using System.Runtime.InteropServices; -namespace ICSharpCode.CodeQualityAnalysis +namespace ICSharpCode.CodeQualityAnalysis.Utility { /// /// Description of Helper. /// public static class Helper { - public static void FillTree(ICSharpCode.TreeView.SharpTreeView tree,Module module) + [DllImport("gdi32.dll")] + public static extern bool DeleteObject(IntPtr hObject); + + public static void FillTree(SharpTreeView tree, Module module) { var root = CreateTreeItem(module); tree.Root = root;