Browse Source

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

Enumerate once on clone. Fix #1073
af/merge-core
James Jackson-South 6 years ago
committed by GitHub
parent
commit
40ddabb0cb
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.
using System;
@ -122,7 +122,7 @@ namespace SixLabors.ImageSharp
public IEnumerator<ImageFrame> GetEnumerator() => this.NonGenericGetEnumerator();
/// <inheritdoc/>
IEnumerator IEnumerable.GetEnumerator() => this.NonGenericGetEnumerator();
IEnumerator IEnumerable.GetEnumerator() => this.GetEnumerator();
/// <summary>
/// Implements <see cref="GetEnumerator"/>.

18
src/ImageSharp/Image{TPixel}.cs

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

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

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

Loading…
Cancel
Save