New test.
[mono.git] / mcs / class / System.Drawing / System.Drawing / ImageAnimator.cs
index 705efd4ff0dc385a1d60262656e42198cf6617ee..3f403c6acd9a365924efc1bb06ed0e9b04c9357f 100644 (file)
@@ -6,10 +6,7 @@
 //   Sanjay Gupta (gsanjay@novell.com)
 //
 // (C) 2002 Ximian, Inc
-//
-
-//
-// Copyright (C) 2004 Novell, Inc (http://www.novell.com)
+// Copyright (C) 2004,2006 Novell, Inc (http://www.novell.com)
 //
 // Permission is hereby granted, free of charge, to any person obtaining
 // a copy of this software and associated documentation files (the
@@ -30,7 +27,7 @@
 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
-using System;
+
 using System.Drawing.Imaging;
 using System.Threading;
 using System.Collections;
@@ -38,56 +35,56 @@ using System.Collections;
 namespace System.Drawing
 {
        //AnimateEventArgs class
-       class AnimateEventArgs : EventArgs \r
-       {  \r
-               private int frameCount;\r
-               private int activeFrameCount = 0;\r
-               private Thread thread;\r
-      \r
-               //Constructor.\r
-               //\r
-               public AnimateEventArgs(Image img)\r
-               {\r
+       class AnimateEventArgs : EventArgs 
+       {  
+               private int frameCount;
+               private int activeFrameCount = 0;
+               private Thread thread;
+      
+               //Constructor.
+               //
+               public AnimateEventArgs(Image img)
+               {
                        Guid[] dimensionList = img.FrameDimensionsList;
                        int length = dimensionList.Length;
                        for (int i=0; i<length; i++) {
-                               if (dimensionList [i].Equals(FrameDimension.Time.Guid))\r
+                               if (dimensionList [i].Equals(FrameDimension.Time.Guid))
                                        this.frameCount = img.GetFrameCount (FrameDimension.Time);
-                       }                       \r
-               }\r
-      \r
-               public int FrameCount {     \r
-                       get { \r
-                               return frameCount;\r
-                       }      \r
-               }\r
-      \r
-               public int ActiveFrameCount {\r
-                       get {\r
-                               return activeFrameCount;\r
-                       }\r
-\r
-                       set {\r
-                               activeFrameCount = value;\r
-                       }\r
-               }\r
-\r
-               public Thread RunThread{\r
-                       get {\r
-                               return thread;\r
-                       }\r
-\r
-                       set {\r
-                               thread = value;\r
-                       }\r
-               }\r
-       }\r
+                       }                       
+               }
+      
+               public int FrameCount {     
+                       get { 
+                               return frameCount;
+                       }      
+               }
+      
+               public int ActiveFrameCount {
+                       get {
+                               return activeFrameCount;
+                       }
+
+                       set {
+                               activeFrameCount = value;
+                       }
+               }
+
+               public Thread RunThread{
+                       get {
+                               return thread;
+                       }
+
+                       set {
+                               thread = value;
+                       }
+               }
+       }
 
        /// <summary>
        /// Summary description for ImageAnimator.
        /// </summary>
        /// 
-       
+       [MonoTODO]
        public sealed class ImageAnimator
        {
                static Hashtable ht = new Hashtable (); 
@@ -106,7 +103,16 @@ namespace System.Drawing
                        
                        if (!ht.ContainsKey (img)) {
                                AnimateEventArgs evtArgs = new AnimateEventArgs (img);
-                               WorkerThread WT = new WorkerThread(onFrameChangeHandler, evtArgs);
+                               int delay;
+                               try {
+                                       PropertyItem item = img.GetPropertyItem (0x5100); // FrameDelay in libgdiplus
+                                       // Time is in 1/100th of a second
+                                       delay = (item.Value [0] + item.Value [1] * 256) * 10;
+                               } catch {
+                                       delay = 200;
+                               }
+
+                               WorkerThread WT = new WorkerThread (onFrameChangeHandler, evtArgs, delay);
                                ThreadStart TS = new ThreadStart(WT.LoopHandler);       
                                Thread thread = new Thread(TS);
                                thread.IsBackground = true;
@@ -132,9 +138,9 @@ namespace System.Drawing
                        Guid[] dimensionList = img.FrameDimensionsList;
                        int length = dimensionList.Length;
                        int frameCount;
-                       for (int i=0; i<length; i++) \r
+                       for (int i=0; i<length; i++) 
                        {
-                               if (dimensionList [i].Equals(FrameDimension.Time.Guid)) \r
+                               if (dimensionList [i].Equals(FrameDimension.Time.Guid)) 
                                {
                                        frameCount = img.GetFrameCount (FrameDimension.Time);
                                        if (frameCount > 1)
@@ -142,7 +148,7 @@ namespace System.Drawing
                                }
                        }                       
 
-                       return false;           \r
+                       return false;           
                }
 
                public static void StopAnimate (Image img, EventHandler onFrameChangeHandler)
@@ -175,7 +181,7 @@ namespace System.Drawing
                                if (evtArgs.ActiveFrameCount < evtArgs.FrameCount-1){
                                        evtArgs.ActiveFrameCount ++;
                                        img.SelectActiveFrame (FrameDimension.Time, evtArgs.ActiveFrameCount);
-                               } \r
+                               } 
                                else
                                        evtArgs.ActiveFrameCount = 0;
                                ht [img] = evtArgs;
@@ -185,34 +191,28 @@ namespace System.Drawing
 
        class WorkerThread
        {
-               private EventHandler frameChangeHandler;
-               private AnimateEventArgs animateEventArgs;
+               EventHandler frameChangeHandler;
+               AnimateEventArgs animateEventArgs;
+               int delay;
                                
-               public WorkerThread(EventHandler frmChgHandler, AnimateEventArgs aniEvtArgs)
+               public WorkerThread (EventHandler frmChgHandler, AnimateEventArgs aniEvtArgs, int delay)
                {
                        frameChangeHandler = frmChgHandler;
                        animateEventArgs = aniEvtArgs;
+                       this.delay = delay;
                }
     
                public void LoopHandler()
                {
-                       try
-                       {
+                       try {
                                while (true) {
-                                       //Need a way to get the delay during animation
-                                       Thread.Sleep (100);
-                                       frameChangeHandler (null, animateEventArgs);\r
+                                       Thread.Sleep (delay);
+                                       frameChangeHandler (null, animateEventArgs);
                                }                               
-                       }
-                       catch(ThreadAbortException)
-                       { 
-                               //lets not bother ourselves with tae
-                               //it will be thrown anyway
-                       }
-                       catch(Exception er)
-                       {
-                               throw er;
+                       } catch (ThreadAbortException) { 
+                               Thread.ResetAbort (); // we're going to finish anyway
                        }
                }
-       }\r
+       }
 }
+