[mistelix] Fixes preview out of memory issues



commit 82b65abf69bde1fde380625f3de7257b22508005
Author: Dani Hernandez Juarez <dhernandez0 gmail com>
Date:   Wed May 20 20:16:06 2009 +0200

    Fixes preview out of memory issues
---
 src/widgets/SlideShowView.cs |   41 +++++++++++++++++++++++++----------------
 1 files changed, 25 insertions(+), 16 deletions(-)

diff --git a/src/widgets/SlideShowView.cs b/src/widgets/SlideShowView.cs
index 0ab7f01..9872c72 100644
--- a/src/widgets/SlideShowView.cs
+++ b/src/widgets/SlideShowView.cs
@@ -138,8 +138,8 @@ namespace Mistelix.Widgets
 		
 		public void Stop() {
 			CurrentIndex = 0;
-			ClearTransition();
 			Pause();
+			ClearTransition();
 		}
 
 		public void Next()
@@ -164,6 +164,8 @@ namespace Mistelix.Widgets
 		public override void Destroy()
 		{
 			ClearTransition();
+			if(current_image != null)
+				current_image.ReleasePixels();
 			base.Destroy();
 		}
 		#endregion
@@ -187,7 +189,11 @@ namespace Mistelix.Widgets
 		
 		void ClearTransition()
 		{
-			transition = null;
+			if(transition != null) {
+				transition.Source.ReleasePixels();
+				transition.Target.ReleasePixels();
+				transition = null;
+			}
 		}
 		
 		bool PlayingTransition()
@@ -205,19 +211,14 @@ namespace Mistelix.Widgets
 
 		void ShowImage(SlideImage imageToShow)
 		{
-			ShowImage(this.GdkWindow, imageToShow);
-		}
-		
-		void ShowImage(Gdk.Window window, SlideImage imageToShow)
-		{
-			using(ImageSurface newImage = imageToShow.ToDataImageSurface()) {
-				ShowImage(window, newImage);
+			using(DataImageSurface newImage = imageToShow.ToDataImageSurface()) {
+				ShowImage(newImage);
 			}
 		}
 
-		void ShowImage(Gdk.Window window, ImageSurface imageToShow)
+		void ShowImage(DataImageSurface imageToShow)
 		{
-			using(Cairo.Context context = Gdk.CairoHelper.Create(window)) {
+			using(Cairo.Context context = Gdk.CairoHelper.Create(this.GdkWindow)) {
 				context.Source = new Pattern (imageToShow);
 				context.Paint ();
 			}
@@ -230,14 +231,17 @@ namespace Mistelix.Widgets
 			SlideImage oldImage = slide.images[index] as SlideImage;
 			oldImage.LoadSlide();
 			SlideImage newImage = oldImage.GetSlideThumbnail(width, height, true);
+			oldImage.ReleasePixels();
 			return newImage;
 		}
 		#endregion
 		
 		#region event callbacks
-		bool OnExposeEvent (Gdk.EventExpose args)
+		protected override bool OnExposeEvent (Gdk.EventExpose args)
 		{
-			ShowImage(args.Window, current_image);
+			if(current_image != null) {
+				ShowImage(current_image);
+			}
 			return base.OnExposeEvent(args);
 		}
 		
@@ -246,12 +250,17 @@ namespace Mistelix.Widgets
 			if(paused)
 				return true;
 			else if(transition.MoveNext()) {
-				current_image = transition.Current as SlideImage;
-				ShowImage(current_image);
+				SlideImage newImage = transition.Current as SlideImage;
+				if(newImage != current_image) {
+					if(current_image != null)
+						current_image.ReleasePixels();
+					current_image = newImage;
+					ShowImage(current_image);
+				}
 				return true;
 			} else {
-				CurrentIndex++;
 				ClearTransition();
+				CurrentIndex++;
 				Forward();
 				return false;
 			}



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]