// 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
// 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;
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.
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;
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)
}
}
- return false; \r
+ return false;
}
public static void StopAnimate (Image img, EventHandler onFrameChangeHandler)
if (evtArgs.ActiveFrameCount < evtArgs.FrameCount-1){
evtArgs.ActiveFrameCount ++;
img.SelectActiveFrame (FrameDimension.Time, evtArgs.ActiveFrameCount);
- } \r
+ }
else
evtArgs.ActiveFrameCount = 0;
ht [img] = evtArgs;
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
+ }
}
+