Decodes GIF files from stream.
Inheritance: IImageDecoder
		private void init(Stream stream, GIFFrameUpdatedCallbackMethod frameUpdatedCallback)
		{
			// set gif frame update callback
			this.FrameUpdatedCallback = frameUpdatedCallback;

			// decode gif image
			var gifDecoder = new GifDecoder();
			var image = new ExtendedImage();
			gifDecoder.Decode(image, stream);

			// add frames and load unity textures
			frames = new List<TextureGIFFrame>();
			var firstFrame = new TextureGIFFrame(createTexture(image.PixelWidth, image.PixelHeight, image.Pixels), TimeSpan.FromSeconds(image.DelayTime / 100d));
			frames.Add(firstFrame);
			var lastFrame = firstFrame;
			foreach (var frame in image.Frames)
			{
				var newFrame = new TextureGIFFrame(createTexture(frame.PixelWidth, frame.PixelHeight, frame.Pixels), TimeSpan.FromSeconds(frame.DelayTime / 100d));
				frames.Add(newFrame);
				if (lastFrame != null) lastFrame.nextFrame = newFrame;
				lastFrame = newFrame;
			}

			// set starting image
			CurrentFrame = frames[0];
			lastFrame.nextFrame = firstFrame;
		}
        private void DoWork(object sender, DoWorkEventArgs args)
        {
            string url = args.Argument.ToString();
            string name = string.Format("image-{0}.jpg", DateTime.Now.Ticks);

            if (url.Contains("/") && !url.Contains("attachment.php"))
            {
                var tokens = url.Split('/');
                name = tokens[tokens.Length - 1];
            }

            HttpWebRequest request = HttpWebRequest.Create(url) as HttpWebRequest;
            Stream data = null;

            request.BeginGetResponse(state =>
                {
                    try
                    {
                        var response = request.EndGetResponse(state);
                        data = response.GetResponseStream();
                    }
                    catch (Exception ex) { Console.WriteLine(ex.Message); }
                    finally { signal.Set(); }

                }, request);

            signal.WaitOne(App.Settings.ThreadTimeout);

            if (worker.CancellationPending) { args.Cancel = true; return; }

            if (data == null)
            {
                args.Result = Awful.Core.Models.ActionResult.Failure;
                return;
            }

             if (worker.CancellationPending) { args.Cancel = true; return; }
             IsolatedStorageFileStream fileStream = null;

            try
            {
                MediaLibrary lib = new MediaLibrary();

                string tempFile = name;
                var dispatch = Deployment.Current.Dispatcher;
                var dispatchSignal = new AutoResetEvent(false);
                var store = IsolatedStorageFile.GetUserStoreForApplication();

                dispatch.BeginInvoke(() =>
                    {
                        try
                        {
                            if (store.FileExists(tempFile))
                                store.DeleteFile(tempFile);

                            fileStream = store.CreateFile(tempFile);
                            WriteableBitmap bitmap;

                            try
                            {
                                var decoder = new GifDecoder();
                                var image = new ExtendedImage();
                                decoder.Decode(image, data);
                                bitmap = image.ToBitmap();
                            }
                            catch (Exception ex)
                            {
                                var image = new BitmapImage();
                                image.SetSource(data);
                                bitmap = new WriteableBitmap(image);
                            }

                            bitmap.SaveJpeg(fileStream, bitmap.PixelWidth, bitmap.PixelHeight, 0, 100);
                            fileStream.Close();
                            dispatchSignal.Set();
                        }
                        catch (Exception ex) { dispatchSignal.Set(); }
                    });

                dispatchSignal.WaitOne();
                fileStream = store.OpenFile(tempFile, FileMode.Open, FileAccess.Read);
                lib.SavePicture(name, fileStream);
                fileStream.Close();
                store.DeleteFile(tempFile);

                args.Result = Awful.Core.Models.ActionResult.Success;
            }
            catch (Exception ex)
            {
                if (fileStream != null)
                    fileStream.Close();

                Console.WriteLine(ex.Message);
                args.Result = Awful.Core.Models.ActionResult.Failure;
            }
        }
        private ArticleImage CreateFakeArticleImage(Chapter chapter)
        {
            var image = new ArticleImage();
          //  image.Chapter = chapter;

            var bitMapImage = new BitmapImage();

            GifDecoder gd = new GifDecoder();
            var img = new ImageTools.ExtendedImage();

            gd.Decode(img, Application.GetResourceStream(
                new Uri("/SmartReader.Library;component/Resource/8004887.gif", UriKind.Relative)
                ).Stream);

            var png = new PngEncoder();
            BitmapImage bitmap = new BitmapImage();
            bitmap.CreateOptions = BitmapCreateOptions.None;
            using (MemoryStream stream = new MemoryStream())
            {
                png.Encode(img, stream);
                bitmap.SetSource(stream);
            }

            image.ImageBytes = ConvertToBytes(bitmap);
            Storage.SaveArticleImages(new[] { image });

            return image;
        }