Skip to content

Commit 06bf7ac

Browse files
Merge pull request #1074 from SixLabors/js/fix-1073
Enumerate once on clone. Fix #1073
2 parents dadc274 + 5b7052c commit 06bf7ac

3 files changed

Lines changed: 24 additions & 13 deletions

File tree

src/ImageSharp/ImageFrameCollection.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright (c) Six Labors and contributors.
1+
// Copyright (c) Six Labors and contributors.
22
// Licensed under the Apache License, Version 2.0.
33

44
using System;
@@ -122,7 +122,7 @@ public abstract class ImageFrameCollection : IEnumerable<ImageFrame>
122122
public IEnumerator<ImageFrame> GetEnumerator() => this.NonGenericGetEnumerator();
123123

124124
/// <inheritdoc/>
125-
IEnumerator IEnumerable.GetEnumerator() => this.NonGenericGetEnumerator();
125+
IEnumerator IEnumerable.GetEnumerator() => this.GetEnumerator();
126126

127127
/// <summary>
128128
/// Implements <see cref="GetEnumerator"/>.

src/ImageSharp/Image{TPixel}.cs

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ internal Image(Configuration configuration, ImageMetadata metadata, IEnumerable<
130130
protected override ImageFrameCollection NonGenericFrameCollection => this.Frames;
131131

132132
/// <summary>
133-
/// Gets the frames.
133+
/// Gets the collection of image frames.
134134
/// </summary>
135135
public new ImageFrameCollection<TPixel> Frames { get; }
136136

@@ -166,8 +166,12 @@ public Image<TPixel> Clone(Configuration configuration)
166166
{
167167
this.EnsureNotDisposed();
168168

169-
IEnumerable<ImageFrame<TPixel>> clonedFrames =
170-
this.Frames.Select<ImageFrame<TPixel>, ImageFrame<TPixel>>(x => x.Clone(configuration));
169+
var clonedFrames = new ImageFrame<TPixel>[this.Frames.Count];
170+
for (int i = 0; i < clonedFrames.Length; i++)
171+
{
172+
clonedFrames[i] = this.Frames[i].Clone(configuration);
173+
}
174+
171175
return new Image<TPixel>(configuration, this.Metadata.DeepClone(), clonedFrames);
172176
}
173177

@@ -181,8 +185,12 @@ public override Image<TPixel2> CloneAs<TPixel2>(Configuration configuration)
181185
{
182186
this.EnsureNotDisposed();
183187

184-
IEnumerable<ImageFrame<TPixel2>> clonedFrames =
185-
this.Frames.Select<ImageFrame<TPixel>, ImageFrame<TPixel2>>(x => x.CloneAs<TPixel2>(configuration));
188+
var clonedFrames = new ImageFrame<TPixel2>[this.Frames.Count];
189+
for (int i = 0; i < clonedFrames.Length; i++)
190+
{
191+
clonedFrames[i] = this.Frames[i].CloneAs<TPixel2>(configuration);
192+
}
193+
186194
return new Image<TPixel2>(configuration, this.Metadata.DeepClone(), clonedFrames);
187195
}
188196

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

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -173,16 +173,19 @@ private Image<TPixel> CreateTarget()
173173
Image<TPixel> source = this.Source;
174174
Size targetSize = this.GetTargetSize();
175175

176-
// We will always be creating the clone even for mutate because we may need to resize the canvas
177-
IEnumerable<ImageFrame<TPixel>> frames = source.Frames.Select<ImageFrame<TPixel>, ImageFrame<TPixel>>(
178-
x => new ImageFrame<TPixel>(
176+
// We will always be creating the clone even for mutate because we may need to resize the canvas.
177+
var targetFrames = new ImageFrame<TPixel>[source.Frames.Count];
178+
for (int i = 0; i < targetFrames.Length; i++)
179+
{
180+
targetFrames[i] = new ImageFrame<TPixel>(
179181
this.Configuration,
180182
targetSize.Width,
181183
targetSize.Height,
182-
x.Metadata.DeepClone()));
184+
source.Frames[i].Metadata.DeepClone());
185+
}
183186

184-
// Use the overload to prevent an extra frame being added
185-
return new Image<TPixel>(this.Configuration, source.Metadata.DeepClone(), frames);
187+
// Use the overload to prevent an extra frame being added.
188+
return new Image<TPixel>(this.Configuration, source.Metadata.DeepClone(), targetFrames);
186189
}
187190

188191
private void CheckFrameCount(Image<TPixel> a, Image<TPixel> b)

0 commit comments

Comments
 (0)