diff --git a/src/ImageSharp/Formats/Gif/MetadataExtensions.cs b/src/ImageSharp/Formats/Gif/MetadataExtensions.cs
index 7280024e2..e20b9dd17 100644
--- a/src/ImageSharp/Formats/Gif/MetadataExtensions.cs
+++ b/src/ImageSharp/Formats/Gif/MetadataExtensions.cs
@@ -1,6 +1,7 @@
// Copyright (c) Six Labors.
// Licensed under the Six Labors Split License.
+using System.Diagnostics.CodeAnalysis;
using SixLabors.ImageSharp.Formats.Gif;
using SixLabors.ImageSharp.Metadata;
@@ -37,5 +38,5 @@ public static partial class MetadataExtensions
///
/// if the gif frame metadata exists; otherwise, .
///
- public static bool TryGetGifMetadata(this ImageFrameMetadata source, out GifFrameMetadata metadata) => source.TryGetFormatMetadata(GifFormat.Instance, out metadata);
+ public static bool TryGetGifMetadata(this ImageFrameMetadata source, [NotNullWhen(true)] out GifFrameMetadata? metadata) => source.TryGetFormatMetadata(GifFormat.Instance, out metadata);
}
diff --git a/src/ImageSharp/Metadata/ImageFrameMetadata.cs b/src/ImageSharp/Metadata/ImageFrameMetadata.cs
index 08a3dc74d..03f628afa 100644
--- a/src/ImageSharp/Metadata/ImageFrameMetadata.cs
+++ b/src/ImageSharp/Metadata/ImageFrameMetadata.cs
@@ -1,6 +1,5 @@
// Copyright (c) Six Labors.
// Licensed under the Six Labors Split License.
-#nullable disable
using SixLabors.ImageSharp.Formats;
using SixLabors.ImageSharp.Metadata.Profiles.Exif;
@@ -49,22 +48,22 @@ public sealed class ImageFrameMetadata : IDeepCloneable
///
/// Gets or sets the Exif profile.
///
- public ExifProfile ExifProfile { get; set; }
+ public ExifProfile? ExifProfile { get; set; }
///
/// Gets or sets the XMP profile.
///
- public XmpProfile XmpProfile { get; set; }
+ public XmpProfile? XmpProfile { get; set; }
///
/// Gets or sets the ICC profile.
///
- public IccProfile IccProfile { get; set; }
+ public IccProfile? IccProfile { get; set; }
///
/// Gets or sets the iptc profile.
///
- public IptcProfile IptcProfile { get; set; }
+ public IptcProfile? IptcProfile { get; set; }
///
public ImageFrameMetadata DeepClone() => new(this);
@@ -83,7 +82,7 @@ public sealed class ImageFrameMetadata : IDeepCloneable
where TFormatMetadata : class
where TFormatFrameMetadata : class, IDeepCloneable
{
- if (this.formatMetadata.TryGetValue(key, out IDeepCloneable meta))
+ if (this.formatMetadata.TryGetValue(key, out IDeepCloneable? meta))
{
return (TFormatFrameMetadata)meta;
}
@@ -107,11 +106,11 @@ public sealed class ImageFrameMetadata : IDeepCloneable
///
/// if the frame metadata exists for the specified key; otherwise, .
///
- public bool TryGetFormatMetadata(IImageFormat key, out TFormatFrameMetadata metadata)
+ public bool TryGetFormatMetadata(IImageFormat key, out TFormatFrameMetadata? metadata)
where TFormatMetadata : class
where TFormatFrameMetadata : class, IDeepCloneable
{
- if (this.formatMetadata.TryGetValue(key, out IDeepCloneable meta))
+ if (this.formatMetadata.TryGetValue(key, out IDeepCloneable? meta))
{
metadata = (TFormatFrameMetadata)meta;
return true;
diff --git a/src/ImageSharp/Metadata/Profiles/IPTC/IptcProfile.cs b/src/ImageSharp/Metadata/Profiles/IPTC/IptcProfile.cs
index 1aff9cc5d..162fae96b 100644
--- a/src/ImageSharp/Metadata/Profiles/IPTC/IptcProfile.cs
+++ b/src/ImageSharp/Metadata/Profiles/IPTC/IptcProfile.cs
@@ -1,9 +1,9 @@
// Copyright (c) Six Labors.
// Licensed under the Six Labors Split License.
-#nullable disable
using System.Buffers.Binary;
using System.Collections.ObjectModel;
+using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.Text;
using SixLabors.ImageSharp.Metadata.Profiles.IPTC;
@@ -15,7 +15,7 @@ namespace SixLabors.ImageSharp.Metadata.Profiles.Iptc;
///
public sealed class IptcProfile : IDeepCloneable
{
- private Collection values;
+ private readonly Collection values = new();
private const byte IptcTagMarkerByte = 0x1c;
@@ -30,7 +30,7 @@ public sealed class IptcProfile : IDeepCloneable
/// Initializes a new instance of the class.
///
public IptcProfile()
- : this((byte[])null)
+ : this((byte[]?)null)
{
}
@@ -38,7 +38,7 @@ public sealed class IptcProfile : IDeepCloneable
/// Initializes a new instance of the class.
///
/// The byte array to read the iptc profile from.
- public IptcProfile(byte[] data)
+ public IptcProfile(byte[]? data)
{
this.Data = data;
this.Initialize();
@@ -53,14 +53,9 @@ public sealed class IptcProfile : IDeepCloneable
{
Guard.NotNull(other, nameof(other));
- if (other.values != null)
+ foreach (IptcValue value in other.Values)
{
- this.values = new Collection();
-
- foreach (IptcValue value in other.Values)
- {
- this.values.Add(value.DeepClone());
- }
+ this.values.Add(value.DeepClone());
}
if (other.Data != null)
@@ -78,19 +73,12 @@ public sealed class IptcProfile : IDeepCloneable
///
/// Gets the byte data of the IPTC profile.
///
- public byte[] Data { get; private set; }
+ public byte[]? Data { get; private set; }
///
/// Gets the values of this iptc profile.
///
- public IEnumerable Values
- {
- get
- {
- this.Initialize();
- return this.values;
- }
- }
+ public IEnumerable Values => this.values;
///
public IptcProfile DeepClone() => new(this);
@@ -121,8 +109,6 @@ public sealed class IptcProfile : IDeepCloneable
/// True when the value was found and removed.
public bool RemoveValue(IptcTag tag)
{
- this.Initialize();
-
bool removed = false;
for (int i = this.values.Count - 1; i >= 0; i--)
{
@@ -144,8 +130,6 @@ public sealed class IptcProfile : IDeepCloneable
/// True when the value was found and removed.
public bool RemoveValue(IptcTag tag, string value)
{
- this.Initialize();
-
bool removed = false;
for (int i = this.values.Count - 1; i >= 0; i--)
{
@@ -312,13 +296,6 @@ public sealed class IptcProfile : IDeepCloneable
private void Initialize()
{
- if (this.values != null)
- {
- return;
- }
-
- this.values = new Collection();
-
if (this.Data == null || this.Data[0] != IptcTagMarkerByte)
{
return;
diff --git a/src/ImageSharp/Metadata/Profiles/IPTC/IptcValue.cs b/src/ImageSharp/Metadata/Profiles/IPTC/IptcValue.cs
index d39697e89..1a75ecba2 100644
--- a/src/ImageSharp/Metadata/Profiles/IPTC/IptcValue.cs
+++ b/src/ImageSharp/Metadata/Profiles/IPTC/IptcValue.cs
@@ -1,6 +1,5 @@
// Copyright (c) Six Labors.
// Licensed under the Six Labors Split License.
-#nullable disable
using System.Text;
@@ -22,10 +21,7 @@ public sealed class IptcValue : IDeepCloneable
other.data.AsSpan().CopyTo(this.data);
}
- if (other.Encoding != null)
- {
- this.Encoding = (Encoding)other.Encoding.Clone();
- }
+ this.encoding = (Encoding)other.Encoding.Clone();
this.Tag = other.Tag;
this.Strict = other.Strict;
@@ -133,7 +129,7 @@ public sealed class IptcValue : IDeepCloneable
///
/// The object to compare this with.
/// True when the specified object is equal to the current .
- public override bool Equals(object obj)
+ public override bool Equals(object? obj)
{
if (ReferenceEquals(this, obj))
{
@@ -148,7 +144,7 @@ public sealed class IptcValue : IDeepCloneable
///
/// The iptc value to compare this with.
/// True when the specified iptc value is equal to the current .
- public bool Equals(IptcValue other)
+ public bool Equals(IptcValue? other)
{
if (other is null)
{
diff --git a/src/ImageSharp/Metadata/Profiles/XMP/XmpProfile.cs b/src/ImageSharp/Metadata/Profiles/XMP/XmpProfile.cs
index 5e9024cf0..77ff35df0 100644
--- a/src/ImageSharp/Metadata/Profiles/XMP/XmpProfile.cs
+++ b/src/ImageSharp/Metadata/Profiles/XMP/XmpProfile.cs
@@ -1,7 +1,7 @@
// Copyright (c) Six Labors.
// Licensed under the Six Labors Split License.
-#nullable disable
+using System.Diagnostics;
using System.Text;
using System.Xml.Linq;
@@ -17,7 +17,7 @@ public sealed class XmpProfile : IDeepCloneable
/// Initializes a new instance of the class.
///
public XmpProfile()
- : this((byte[])null)
+ : this((byte[]?)null)
{
}
@@ -25,7 +25,7 @@ public sealed class XmpProfile : IDeepCloneable
/// Initializes a new instance of the class.
///
/// The UTF8 encoded byte array to read the XMP profile from.
- public XmpProfile(byte[] data) => this.Data = data;
+ public XmpProfile(byte[]? data) => this.Data = data;
///
/// Initializes a new instance of the class
@@ -42,15 +42,15 @@ public sealed class XmpProfile : IDeepCloneable
///
/// Gets the XMP raw data byte array.
///
- internal byte[] Data { get; private set; }
+ internal byte[]? Data { get; private set; }
///
/// Gets the raw XML document containing the XMP profile.
///
/// The
- public XDocument GetDocument()
+ public XDocument? GetDocument()
{
- byte[] byteArray = this.Data;
+ byte[]? byteArray = this.Data;
if (byteArray is null)
{
return null;
@@ -77,6 +77,7 @@ public sealed class XmpProfile : IDeepCloneable
/// The
public byte[] ToByteArray()
{
+ Guard.NotNull(this.Data);
byte[] result = new byte[this.Data.Length];
this.Data.AsSpan().CopyTo(result);
return result;