From e332f9e52fdb445af17f0f2bd3fe870df8d103ac Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Mon, 14 Nov 2016 17:29:00 +0100 Subject: [PATCH] Moved the ToFrame method to Image and added a Clone method to ImageFrame. --- src/ImageSharp/Formats/Gif/GifDecoderCore.cs | 35 ++++++++++++-------- src/ImageSharp/Image/Image.cs | 5 +++ src/ImageSharp/Image/ImageBase.cs | 5 --- src/ImageSharp/Image/ImageFrame.cs | 5 +++ src/ImageSharp/ImageFrame.cs | 2 +- 5 files changed, 33 insertions(+), 19 deletions(-) diff --git a/src/ImageSharp/Formats/Gif/GifDecoderCore.cs b/src/ImageSharp/Formats/Gif/GifDecoderCore.cs index 784d05da2..e73774a0c 100644 --- a/src/ImageSharp/Formats/Gif/GifDecoderCore.cs +++ b/src/ImageSharp/Formats/Gif/GifDecoderCore.cs @@ -35,7 +35,7 @@ namespace ImageSharp.Formats /// /// The next frame. /// - private ImageBase nextFrame; + private ImageFrame nextFrame; /// /// The area to restore. @@ -295,18 +295,20 @@ namespace ImageSharp.Formats int imageWidth = this.logicalScreenDescriptor.Width; int imageHeight = this.logicalScreenDescriptor.Height; - ImageBase previousFrame = null; + ImageFrame previousFrame = null; - ImageBase currentFrame; + ImageFrame currentFrame = null; + + ImageBase image; if (this.nextFrame == null) { - currentFrame = this.decodedImage; + image = this.decodedImage; - currentFrame.Quality = colorTable.Length / 3; + image.Quality = colorTable.Length / 3; // This initializes the image to become fully transparent because the alpha channel is zero. - currentFrame.InitPixels(imageWidth, imageHeight); + image.InitPixels(imageWidth, imageHeight); } else { @@ -316,18 +318,18 @@ namespace ImageSharp.Formats previousFrame = this.nextFrame; } - ImageFrame frame = this.nextFrame.ToFrame(); + currentFrame = this.nextFrame.Clone(); - currentFrame = frame; + image = currentFrame; - RestoreToBackground(currentFrame); + RestoreToBackground(image); - this.decodedImage.Frames.Add(frame); + this.decodedImage.Frames.Add(currentFrame); } if (this.graphicsControlExtension != null && this.graphicsControlExtension.DelayTime > 0) { - currentFrame.FrameDelay = this.graphicsControlExtension.DelayTime; + image.FrameDelay = this.graphicsControlExtension.DelayTime; } int i = 0; @@ -335,7 +337,7 @@ namespace ImageSharp.Formats int interlaceIncrement = 8; // The interlacing line increment int interlaceY = 0; // The current interlaced line - using (PixelAccessor pixelAccessor = currentFrame.Lock()) + using (PixelAccessor pixelAccessor = image.Lock()) { using (PixelRow pixelRow = new PixelRow(imageWidth, ComponentOrder.XYZW)) { @@ -409,7 +411,14 @@ namespace ImageSharp.Formats return; } - this.nextFrame = currentFrame; + if (currentFrame == null) + { + this.nextFrame = this.decodedImage.ToFrame(); + } + else + { + this.nextFrame = currentFrame.Clone(); + } if (this.graphicsControlExtension != null && this.graphicsControlExtension.DisposalMethod == DisposalMethod.RestoreToBackground) diff --git a/src/ImageSharp/Image/Image.cs b/src/ImageSharp/Image/Image.cs index 2915b5365..0bcf7c6eb 100644 --- a/src/ImageSharp/Image/Image.cs +++ b/src/ImageSharp/Image/Image.cs @@ -278,6 +278,11 @@ namespace ImageSharp } } + internal virtual ImageFrame ToFrame() + { + return new ImageFrame(this); + } + /// /// Loads the image from the given stream. /// diff --git a/src/ImageSharp/Image/ImageBase.cs b/src/ImageSharp/Image/ImageBase.cs index 72ed9fc3f..7e9ca2701 100644 --- a/src/ImageSharp/Image/ImageBase.cs +++ b/src/ImageSharp/Image/ImageBase.cs @@ -162,10 +162,5 @@ namespace ImageSharp this.Quality = other.Quality; this.FrameDelay = other.FrameDelay; } - - internal virtual ImageFrame ToFrame() - { - return new ImageFrame(this); - } } } diff --git a/src/ImageSharp/Image/ImageFrame.cs b/src/ImageSharp/Image/ImageFrame.cs index 130cbc609..d63618766 100644 --- a/src/ImageSharp/Image/ImageFrame.cs +++ b/src/ImageSharp/Image/ImageFrame.cs @@ -37,5 +37,10 @@ namespace ImageSharp { return $"ImageFrame: {this.Width}x{this.Height}"; } + + internal virtual ImageFrame Clone() + { + return new ImageFrame(this); + } } } diff --git a/src/ImageSharp/ImageFrame.cs b/src/ImageSharp/ImageFrame.cs index 80e255fe6..760e559fd 100644 --- a/src/ImageSharp/ImageFrame.cs +++ b/src/ImageSharp/ImageFrame.cs @@ -38,7 +38,7 @@ namespace ImageSharp } /// - internal override ImageFrame ToFrame() + internal override ImageFrame Clone() { return new ImageFrame(this); }