Browse Source

Merge pull request #1074 from SixLabors/js/fix-1073

Enumerate once on clone. Fix #1073
pull/1075/head
James Jackson-South 6 years ago
committed by GitHub
parent
commit
06bf7ace63
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 4
      src/ImageSharp/ImageFrameCollection.cs
  2. 18
      src/ImageSharp/Image{TPixel}.cs
  3. 15
      src/ImageSharp/Processing/Processors/CloningImageProcessor{TPixel}.cs

4
src/ImageSharp/ImageFrameCollection.cs

@ -1,4 +1,4 @@
// Copyright (c) Six Labors and contributors. // Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0. // Licensed under the Apache License, Version 2.0.
using System; using System;
@ -122,7 +122,7 @@ namespace SixLabors.ImageSharp
public IEnumerator<ImageFrame> GetEnumerator() => this.NonGenericGetEnumerator(); public IEnumerator<ImageFrame> GetEnumerator() => this.NonGenericGetEnumerator();
/// <inheritdoc/> /// <inheritdoc/>
IEnumerator IEnumerable.GetEnumerator() => this.NonGenericGetEnumerator(); IEnumerator IEnumerable.GetEnumerator() => this.GetEnumerator();
/// <summary> /// <summary>
/// Implements <see cref="GetEnumerator"/>. /// Implements <see cref="GetEnumerator"/>.

18
src/ImageSharp/Image{TPixel}.cs

@ -130,7 +130,7 @@ namespace SixLabors.ImageSharp
protected override ImageFrameCollection NonGenericFrameCollection => this.Frames; protected override ImageFrameCollection NonGenericFrameCollection => this.Frames;
/// <summary> /// <summary>
/// Gets the frames. /// Gets the collection of image frames.
/// </summary> /// </summary>
public new ImageFrameCollection<TPixel> Frames { get; } public new ImageFrameCollection<TPixel> Frames { get; }
@ -166,8 +166,12 @@ namespace SixLabors.ImageSharp
{ {
this.EnsureNotDisposed(); this.EnsureNotDisposed();
IEnumerable<ImageFrame<TPixel>> clonedFrames = var clonedFrames = new ImageFrame<TPixel>[this.Frames.Count];
this.Frames.Select<ImageFrame<TPixel>, ImageFrame<TPixel>>(x => x.Clone(configuration)); for (int i = 0; i < clonedFrames.Length; i++)
{
clonedFrames[i] = this.Frames[i].Clone(configuration);
}
return new Image<TPixel>(configuration, this.Metadata.DeepClone(), clonedFrames); return new Image<TPixel>(configuration, this.Metadata.DeepClone(), clonedFrames);
} }
@ -181,8 +185,12 @@ namespace SixLabors.ImageSharp
{ {
this.EnsureNotDisposed(); this.EnsureNotDisposed();
IEnumerable<ImageFrame<TPixel2>> clonedFrames = var clonedFrames = new ImageFrame<TPixel2>[this.Frames.Count];
this.Frames.Select<ImageFrame<TPixel>, ImageFrame<TPixel2>>(x => x.CloneAs<TPixel2>(configuration)); for (int i = 0; i < clonedFrames.Length; i++)
{
clonedFrames[i] = this.Frames[i].CloneAs<TPixel2>(configuration);
}
return new Image<TPixel2>(configuration, this.Metadata.DeepClone(), clonedFrames); return new Image<TPixel2>(configuration, this.Metadata.DeepClone(), clonedFrames);
} }

15
src/ImageSharp/Processing/Processors/CloningImageProcessor{TPixel}.cs

@ -173,16 +173,19 @@ namespace SixLabors.ImageSharp.Processing.Processors
Image<TPixel> source = this.Source; Image<TPixel> source = this.Source;
Size targetSize = this.GetTargetSize(); Size targetSize = this.GetTargetSize();
// We will always be creating the clone even for mutate because we may need to resize the canvas // We will always be creating the clone even for mutate because we may need to resize the canvas.
IEnumerable<ImageFrame<TPixel>> frames = source.Frames.Select<ImageFrame<TPixel>, ImageFrame<TPixel>>( var targetFrames = new ImageFrame<TPixel>[source.Frames.Count];
x => new ImageFrame<TPixel>( for (int i = 0; i < targetFrames.Length; i++)
{
targetFrames[i] = new ImageFrame<TPixel>(
this.Configuration, this.Configuration,
targetSize.Width, targetSize.Width,
targetSize.Height, targetSize.Height,
x.Metadata.DeepClone())); source.Frames[i].Metadata.DeepClone());
}
// Use the overload to prevent an extra frame being added // Use the overload to prevent an extra frame being added.
return new Image<TPixel>(this.Configuration, source.Metadata.DeepClone(), frames); return new Image<TPixel>(this.Configuration, source.Metadata.DeepClone(), targetFrames);
} }
private void CheckFrameCount(Image<TPixel> a, Image<TPixel> b) private void CheckFrameCount(Image<TPixel> a, Image<TPixel> b)

Loading…
Cancel
Save