Browse Source

Moved the ToFrame method to Image<TColor, TPacked> and added a Clone method to ImageFrame.

pull/30/head
Dirk Lemstra 10 years ago
parent
commit
f9f4d4e73d
  1. 35
      src/ImageSharp/Formats/Gif/GifDecoderCore.cs
  2. 5
      src/ImageSharp/Image/Image.cs
  3. 5
      src/ImageSharp/Image/ImageBase.cs
  4. 5
      src/ImageSharp/Image/ImageFrame.cs
  5. 2
      src/ImageSharp/ImageFrame.cs

35
src/ImageSharp/Formats/Gif/GifDecoderCore.cs

@ -35,7 +35,7 @@ namespace ImageSharp.Formats
/// <summary> /// <summary>
/// The next frame. /// The next frame.
/// </summary> /// </summary>
private ImageBase<TColor, TPacked> nextFrame; private ImageFrame<TColor, TPacked> nextFrame;
/// <summary> /// <summary>
/// The area to restore. /// The area to restore.
@ -295,18 +295,20 @@ namespace ImageSharp.Formats
int imageWidth = this.logicalScreenDescriptor.Width; int imageWidth = this.logicalScreenDescriptor.Width;
int imageHeight = this.logicalScreenDescriptor.Height; int imageHeight = this.logicalScreenDescriptor.Height;
ImageBase<TColor, TPacked> previousFrame = null; ImageFrame<TColor, TPacked> previousFrame = null;
ImageBase<TColor, TPacked> currentFrame; ImageFrame<TColor, TPacked> currentFrame = null;
ImageBase<TColor, TPacked> image;
if (this.nextFrame == null) 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. // This initializes the image to become fully transparent because the alpha channel is zero.
currentFrame.InitPixels(imageWidth, imageHeight); image.InitPixels(imageWidth, imageHeight);
} }
else else
{ {
@ -316,18 +318,18 @@ namespace ImageSharp.Formats
previousFrame = this.nextFrame; previousFrame = this.nextFrame;
} }
ImageFrame<TColor, TPacked> 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) if (this.graphicsControlExtension != null && this.graphicsControlExtension.DelayTime > 0)
{ {
currentFrame.FrameDelay = this.graphicsControlExtension.DelayTime; image.FrameDelay = this.graphicsControlExtension.DelayTime;
} }
int i = 0; int i = 0;
@ -335,7 +337,7 @@ namespace ImageSharp.Formats
int interlaceIncrement = 8; // The interlacing line increment int interlaceIncrement = 8; // The interlacing line increment
int interlaceY = 0; // The current interlaced line int interlaceY = 0; // The current interlaced line
using (PixelAccessor<TColor, TPacked> pixelAccessor = currentFrame.Lock()) using (PixelAccessor<TColor, TPacked> pixelAccessor = image.Lock())
{ {
using (PixelRow<TColor, TPacked> pixelRow = new PixelRow<TColor, TPacked>(imageWidth, ComponentOrder.XYZW)) using (PixelRow<TColor, TPacked> pixelRow = new PixelRow<TColor, TPacked>(imageWidth, ComponentOrder.XYZW))
{ {
@ -409,7 +411,14 @@ namespace ImageSharp.Formats
return; return;
} }
this.nextFrame = currentFrame; if (currentFrame == null)
{
this.nextFrame = this.decodedImage.ToFrame();
}
else
{
this.nextFrame = currentFrame.Clone();
}
if (this.graphicsControlExtension != null && if (this.graphicsControlExtension != null &&
this.graphicsControlExtension.DisposalMethod == DisposalMethod.RestoreToBackground) this.graphicsControlExtension.DisposalMethod == DisposalMethod.RestoreToBackground)

5
src/ImageSharp/Image/Image.cs

@ -278,6 +278,11 @@ namespace ImageSharp
} }
} }
internal virtual ImageFrame<TColor, TPacked> ToFrame()
{
return new ImageFrame<TColor, TPacked>(this);
}
/// <summary> /// <summary>
/// Loads the image from the given stream. /// Loads the image from the given stream.
/// </summary> /// </summary>

5
src/ImageSharp/Image/ImageBase.cs

@ -162,10 +162,5 @@ namespace ImageSharp
this.Quality = other.Quality; this.Quality = other.Quality;
this.FrameDelay = other.FrameDelay; this.FrameDelay = other.FrameDelay;
} }
internal virtual ImageFrame<TColor, TPacked> ToFrame()
{
return new ImageFrame<TColor, TPacked>(this);
}
} }
} }

5
src/ImageSharp/Image/ImageFrame.cs

@ -37,5 +37,10 @@ namespace ImageSharp
{ {
return $"ImageFrame: {this.Width}x{this.Height}"; return $"ImageFrame: {this.Width}x{this.Height}";
} }
internal virtual ImageFrame<TColor, TPacked> Clone()
{
return new ImageFrame<TColor, TPacked>(this);
}
} }
} }

2
src/ImageSharp/ImageFrame.cs

@ -38,7 +38,7 @@ namespace ImageSharp
} }
/// <inheritdoc /> /// <inheritdoc />
internal override ImageFrame<Color, uint> ToFrame() internal override ImageFrame<Color, uint> Clone()
{ {
return new ImageFrame(this); return new ImageFrame(this);
} }

Loading…
Cancel
Save