diff --git a/Artemis/Artemis/Profiles/Layers/Models/LayerModel.cs b/Artemis/Artemis/Profiles/Layers/Models/LayerModel.cs index 014cde054..8007936f5 100644 --- a/Artemis/Artemis/Profiles/Layers/Models/LayerModel.cs +++ b/Artemis/Artemis/Profiles/Layers/Models/LayerModel.cs @@ -25,7 +25,7 @@ namespace Artemis.Profiles.Layers.Models var model = Properties as KeyboardPropertiesModel; if (model != null) - GifImage = new GifImage(model.GifFile); + GifImage = new GifImage(model.GifFile, Properties.AnimationSpeed); } [JsonIgnore] diff --git a/Artemis/Artemis/Profiles/Layers/Types/KeyboardGif/KeyboardGifType.cs b/Artemis/Artemis/Profiles/Layers/Types/KeyboardGif/KeyboardGifType.cs index 19c0f5611..c8d2d7c22 100644 --- a/Artemis/Artemis/Profiles/Layers/Types/KeyboardGif/KeyboardGifType.cs +++ b/Artemis/Artemis/Profiles/Layers/Types/KeyboardGif/KeyboardGifType.cs @@ -42,9 +42,9 @@ namespace Artemis.Profiles.Layers.Types.KeyboardGif // Only reconstruct GifImage if the underlying source has changed if (layerModel.GifImage == null) - layerModel.GifImage = new GifImage(props.GifFile); + layerModel.GifImage = new GifImage(props.GifFile, props.AnimationSpeed); if (layerModel.GifImage.Source != props.GifFile) - layerModel.GifImage = new GifImage(props.GifFile); + layerModel.GifImage = new GifImage(props.GifFile, props.AnimationSpeed); var rect = new Rect(layerModel.X*4, layerModel.Y*4, layerModel.Width*4, layerModel.Height*4); @@ -61,6 +61,9 @@ namespace Artemis.Profiles.Layers.Types.KeyboardGif public void Update(LayerModel layerModel, ModuleDataModel dataModel, bool isPreview = false) { layerModel.ApplyProperties(true); + if (layerModel.GifImage != null) + layerModel.GifImage.AnimationSpeed = layerModel.Properties.AnimationSpeed; + if (isPreview || dataModel == null) return; @@ -74,7 +77,8 @@ namespace Artemis.Profiles.Layers.Types.KeyboardGif if (layerModel.Properties is KeyboardPropertiesModel) return; - layerModel.Properties = new KeyboardPropertiesModel(layerModel.Properties); + // Set animation speed to 1.5, this translates back to a GIF playback rate of x1 + layerModel.Properties = new KeyboardPropertiesModel(layerModel.Properties) {AnimationSpeed = 1.5}; } public LayerPropertiesViewModel SetupViewModel(LayerEditorViewModel layerEditorViewModel, diff --git a/Artemis/Artemis/Resources/Keyboards/default-profiles.zip b/Artemis/Artemis/Resources/Keyboards/default-profiles.zip index 9dd65e7aa..298df243e 100644 Binary files a/Artemis/Artemis/Resources/Keyboards/default-profiles.zip and b/Artemis/Artemis/Resources/Keyboards/default-profiles.zip differ diff --git a/Artemis/Artemis/Utilities/GifImage.cs b/Artemis/Artemis/Utilities/GifImage.cs index 085e51165..738c9c183 100644 --- a/Artemis/Artemis/Utilities/GifImage.cs +++ b/Artemis/Artemis/Utilities/GifImage.cs @@ -6,23 +6,22 @@ namespace Artemis.Utilities { public class GifImage { - private readonly int _delay; private readonly FrameDimension _dimension; private readonly Image _gifImage; + private readonly PropertyItem _gifProperties; private DateTime _lastRequest; private int _step = 1; - public GifImage(string path) + public GifImage(string path, double animationSpeed) { _lastRequest = DateTime.Now; _gifImage = Image.FromFile(path); //initialize _dimension = new FrameDimension(_gifImage.FrameDimensionsList[0]); //gets the GUID - FrameCount = _gifImage.GetFrameCount(_dimension); //total frames in the animation + _gifProperties = _gifImage.GetPropertyItem(0x5100); // FrameDelay in libgdiplus Source = path; - - var item = _gifImage.GetPropertyItem(0x5100); // FrameDelay in libgdiplus - _delay = (item.Value[0] + item.Value[1]*256)*10; // Time is in 1/100th of a second + AnimationSpeed = animationSpeed; + FrameCount = _gifImage.GetFrameCount(_dimension); //total frames in the animation } /// @@ -30,6 +29,8 @@ namespace Artemis.Utilities /// public string Source { get; private set; } + public double AnimationSpeed { get; set; } + /// /// Gets or sets the current frame, set to -1 to reset /// @@ -47,8 +48,16 @@ namespace Artemis.Utilities public Image GetNextFrame() { + var animationSpeed = 2 - AnimationSpeed/3 * 2; + var fileDelay = (_gifProperties.Value[0] + _gifProperties.Value[1] * 256) * 10; + // If the file is missing this metadata such as in #319 then default to 100 + if (fileDelay == 0) + fileDelay = 100; + // Apply the animation speed to the delay + var delay = fileDelay * animationSpeed; + // Only pass the next frame if the proper amount of time has passed - if ((DateTime.Now - _lastRequest).Milliseconds > _delay) + if ((DateTime.Now - _lastRequest).Milliseconds > delay) { CurrentFrame += _step; _lastRequest = DateTime.Now; @@ -75,4 +84,4 @@ namespace Artemis.Utilities return _gifImage; } } -} \ No newline at end of file +}