Browse Source

cache Image dimensions into a field + re-enable all target frameworks

af/merge-core
Anton Firszov 7 years ago
parent
commit
fa1e0baced
  1. 4
      src/ImageSharp.Drawing/ImageSharp.Drawing.csproj
  2. 39
      src/ImageSharp/Image.cs
  3. 3
      src/ImageSharp/ImageSharp.csproj
  4. 45
      src/ImageSharp/Image{TPixel}.cs

4
src/ImageSharp.Drawing/ImageSharp.Drawing.csproj

@ -10,8 +10,8 @@
<VersionPrefix Condition="$(packageversion) != ''">$(packageversion)</VersionPrefix>
<VersionPrefix Condition="$(packageversion) == ''">0.0.1</VersionPrefix>
<!--<TargetFrameworks>netcoreapp2.1;netstandard1.3;netstandard2.0</TargetFrameworks>-->
<TargetFramework>netcoreapp2.1</TargetFramework>
<TargetFrameworks>netcoreapp2.1;netstandard1.3;netstandard2.0</TargetFrameworks>
<TargetFramework>netstandard2.0</TargetFramework>
<LangVersion>7.3</LangVersion>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>

39
src/ImageSharp/Image.cs

@ -7,6 +7,7 @@ using SixLabors.ImageSharp.Advanced;
using SixLabors.ImageSharp.Formats;
using SixLabors.ImageSharp.Metadata;
using SixLabors.ImageSharp.PixelFormats;
using SixLabors.Primitives;
namespace SixLabors.ImageSharp
{
@ -17,19 +18,36 @@ namespace SixLabors.ImageSharp
/// </summary>
public abstract partial class Image : IImage, IConfigurable
{
private Size size;
/// <summary>
/// Initializes a new instance of the <see cref="Image"/> class.
/// </summary>
/// <param name="configuration">The <see cref="Configuration"/>.</param>
/// <param name="pixelType">The <see cref="PixelTypeInfo"/>.</param>
/// <param name="metadata">The <see cref="ImageMetadata"/>.</param>
protected Image(Configuration configuration, PixelTypeInfo pixelType, ImageMetadata metadata)
/// <param name="size">The <see cref="size"/>.</param>
protected Image(Configuration configuration, PixelTypeInfo pixelType, ImageMetadata metadata, Size size)
{
this.Configuration = configuration ?? Configuration.Default;
this.PixelType = pixelType;
this.size = size;
this.Metadata = metadata ?? new ImageMetadata();
}
/// <summary>
/// Initializes a new instance of the <see cref="Image"/> class.
/// </summary>
internal Image(
Configuration configuration,
PixelTypeInfo pixelType,
ImageMetadata metadata,
int width,
int height)
: this(configuration, pixelType, metadata, new Size(width, height))
{
}
/// <summary>
/// Gets the <see cref="Configuration"/>.
/// </summary>
@ -39,10 +57,10 @@ namespace SixLabors.ImageSharp
public PixelTypeInfo PixelType { get; }
/// <inheritdoc />
public abstract int Width { get; }
public int Width => this.size.Width;
/// <inheritdoc />
public abstract int Height { get; }
public int Height => this.size.Height;
/// <inheritdoc/>
public ImageMetadata Metadata { get; }
@ -55,8 +73,6 @@ namespace SixLabors.ImageSharp
/// <inheritdoc />
public abstract void Dispose();
internal abstract void AcceptVisitor(IImageVisitor visitor);
/// <summary>
/// Saves the image to the given stream using the given image encoder.
/// </summary>
@ -72,6 +88,19 @@ namespace SixLabors.ImageSharp
this.AcceptVisitor(visitor);
}
/// <summary>
/// Accept a <see cref="IImageVisitor"/>.
/// Implemented by <see cref="Image{TPixel}"/> invoking <see cref="IImageVisitor.Visit{TPixel}"/>
/// with the pixel type of the image.
/// </summary>
internal abstract void AcceptVisitor(IImageVisitor visitor);
/// <summary>
/// Update the size of the image after mutation.
/// </summary>
/// <param name="size">The <see cref="Size"/>.</param>
protected void UpdateSize(Size size) => this.size = size;
private class EncodeVisitor : IImageVisitor
{
private readonly IImageEncoder encoder;

3
src/ImageSharp/ImageSharp.csproj

@ -11,8 +11,7 @@
<VersionPrefix Condition="$(packageversion) != ''">$(packageversion)</VersionPrefix>
<VersionPrefix Condition="$(packageversion) == ''">0.0.1</VersionPrefix>
<!--<TargetFrameworks>netcoreapp2.1;netstandard1.3;netstandard2.0;net472</TargetFrameworks>-->
<TargetFramework>netcoreapp2.1</TargetFramework>
<TargetFrameworks>netcoreapp2.1;netstandard1.3;netstandard2.0;net472</TargetFrameworks>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<GenerateDocumentationFile>true</GenerateDocumentationFile>

45
src/ImageSharp/Image{TPixel}.cs

@ -3,14 +3,13 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.CompilerServices;
using SixLabors.ImageSharp.Advanced;
using SixLabors.ImageSharp.Formats;
using SixLabors.ImageSharp.Memory;
using SixLabors.ImageSharp.Metadata;
using SixLabors.ImageSharp.PixelFormats;
using SixLabors.Primitives;
namespace SixLabors.ImageSharp
{
@ -67,14 +66,14 @@ namespace SixLabors.ImageSharp
/// <param name="height">The height of the image in pixels.</param>
/// <param name="metadata">The images metadata.</param>
internal Image(Configuration configuration, int width, int height, ImageMetadata metadata)
: base(configuration, PixelTypeInfo.Create<TPixel>(), metadata)
: base(configuration, PixelTypeInfo.Create<TPixel>(), metadata, width, height)
{
this.Frames = new ImageFrameCollection<TPixel>(this, width, height, default(TPixel));
}
/// <summary>
/// Initializes a new instance of the <see cref="Image{TPixel}"/> class
/// wrapping an external <see cref="MemorySource{T}"/>
/// wrapping an external <see cref="MemorySource{T}"/>.
/// </summary>
/// <param name="configuration">The configuration providing initialization code which allows extending the library.</param>
/// <param name="memorySource">The memory source.</param>
@ -82,7 +81,7 @@ namespace SixLabors.ImageSharp
/// <param name="height">The height of the image in pixels.</param>
/// <param name="metadata">The images metadata.</param>
internal Image(Configuration configuration, MemorySource<TPixel> memorySource, int width, int height, ImageMetadata metadata)
: base(configuration, PixelTypeInfo.Create<TPixel>(), metadata)
: base(configuration, PixelTypeInfo.Create<TPixel>(), metadata, width, height)
{
this.Frames = new ImageFrameCollection<TPixel>(this, width, height, memorySource);
}
@ -97,7 +96,7 @@ namespace SixLabors.ImageSharp
/// <param name="backgroundColor">The color to initialize the pixels with.</param>
/// <param name="metadata">The images metadata.</param>
internal Image(Configuration configuration, int width, int height, TPixel backgroundColor, ImageMetadata metadata)
: base(configuration, PixelTypeInfo.Create<TPixel>(), metadata)
: base(configuration, PixelTypeInfo.Create<TPixel>(), metadata, width, height)
{
this.Frames = new ImageFrameCollection<TPixel>(this, width, height, backgroundColor);
}
@ -110,17 +109,11 @@ namespace SixLabors.ImageSharp
/// <param name="metadata">The images metadata.</param>
/// <param name="frames">The frames that will be owned by this image instance.</param>
internal Image(Configuration configuration, ImageMetadata metadata, IEnumerable<ImageFrame<TPixel>> frames)
: base(configuration, PixelTypeInfo.Create<TPixel>(), metadata)
: base(configuration, PixelTypeInfo.Create<TPixel>(), metadata, ValidateFramesAndGetSize(frames))
{
this.Frames = new ImageFrameCollection<TPixel>(this, frames);
}
/// <inheritdoc/>
public override int Width => this.Frames.RootFrame.Width;
/// <inheritdoc/>
public override int Height => this.Frames.RootFrame.Height;
/// <summary>
/// Gets the frames.
/// </summary>
@ -173,7 +166,7 @@ namespace SixLabors.ImageSharp
/// </summary>
/// <typeparam name="TPixel2">The pixel format.</typeparam>
/// <param name="configuration">The configuration providing initialization code which allows extending the library.</param>
/// <returns>The <see cref="Image{TPixel2}"/></returns>
/// <returns>The <see cref="Image{TPixel2}"/>.</returns>
public Image<TPixel2> CloneAs<TPixel2>(Configuration configuration)
where TPixel2 : struct, IPixel<TPixel2>
{
@ -184,6 +177,7 @@ namespace SixLabors.ImageSharp
/// <inheritdoc/>
public override void Dispose() => this.Frames.Dispose();
/// <inheritdoc />
internal override void AcceptVisitor(IImageVisitor visitor)
{
visitor.Visit(this);
@ -204,6 +198,29 @@ namespace SixLabors.ImageSharp
{
this.Frames[i].SwapOrCopyPixelsBufferFrom(pixelSource.Frames[i]);
}
this.UpdateSize(pixelSource.Size());
}
private static Size ValidateFramesAndGetSize(IEnumerable<ImageFrame<TPixel>> frames)
{
Guard.NotNull(frames, nameof(frames));
ImageFrame<TPixel> rootFrame = frames.FirstOrDefault();
if (rootFrame == null)
{
throw new ArgumentException("Must not be empty.", nameof(frames));
}
Size rootSize = rootFrame.Size();
if (frames.Any(f => f.Size() != rootSize))
{
throw new ArgumentException("The provided frames must be of the same size.", nameof(frames));
}
return rootSize;
}
}
}
Loading…
Cancel
Save