diff --git a/src/ImageSharp/Formats/Png/PngDecoderCore.cs b/src/ImageSharp/Formats/Png/PngDecoderCore.cs
index 2427da257..7c87b9cfc 100644
--- a/src/ImageSharp/Formats/Png/PngDecoderCore.cs
+++ b/src/ImageSharp/Formats/Png/PngDecoderCore.cs
@@ -272,7 +272,7 @@ namespace SixLabors.ImageSharp.Formats.Png
/// is less than or equals than zero.
private static Span ToArrayByBitsLength(Span source, int bytesPerScanline, int bits)
{
- Guard.NotNull(source, nameof(source));
+ Guard.MustBeGreaterThan(source.Length, 0, nameof(source));
Guard.MustBeGreaterThan(bits, 0, nameof(bits));
if (bits >= 8)
diff --git a/src/ImageSharp/MetaData/Profiles/ICC/DataReader/IccDataReader.TagDataEntry.cs b/src/ImageSharp/MetaData/Profiles/ICC/DataReader/IccDataReader.TagDataEntry.cs
index 9d92d5341..5c14448fa 100644
--- a/src/ImageSharp/MetaData/Profiles/ICC/DataReader/IccDataReader.TagDataEntry.cs
+++ b/src/ImageSharp/MetaData/Profiles/ICC/DataReader/IccDataReader.TagDataEntry.cs
@@ -474,19 +474,7 @@ namespace SixLabors.ImageSharp.MetaData.Profiles.Icc
string languageCode = this.ReadAsciiString(2);
string countryCode = this.ReadAsciiString(2);
- if (string.IsNullOrWhiteSpace(languageCode))
- {
- culture[i] = CultureInfo.InvariantCulture;
- }
- else if (string.IsNullOrWhiteSpace(countryCode))
- {
- culture[i] = new CultureInfo(languageCode);
- }
- else
- {
- culture[i] = new CultureInfo($"{languageCode}-{countryCode}");
- }
-
+ culture[i] = ReadCulture(languageCode, countryCode);
length[i] = this.ReadUInt32();
offset[i] = this.ReadUInt32();
}
@@ -498,6 +486,36 @@ namespace SixLabors.ImageSharp.MetaData.Profiles.Icc
}
return new IccMultiLocalizedUnicodeTagDataEntry(text);
+
+ CultureInfo ReadCulture(string language, string country)
+ {
+ if (string.IsNullOrWhiteSpace(language))
+ {
+ return CultureInfo.InvariantCulture;
+ }
+ else if (string.IsNullOrWhiteSpace(country))
+ {
+ try
+ {
+ return new CultureInfo(language);
+ }
+ catch (CultureNotFoundException)
+ {
+ return CultureInfo.InvariantCulture;
+ }
+ }
+ else
+ {
+ try
+ {
+ return new CultureInfo($"{language}-{country}");
+ }
+ catch (CultureNotFoundException)
+ {
+ return ReadCulture(language, null);
+ }
+ }
+ }
}
///
diff --git a/tests/ImageSharp.Benchmarks/ImageSharp.Benchmarks.csproj b/tests/ImageSharp.Benchmarks/ImageSharp.Benchmarks.csproj
index 0db2fe569..4be2c67d5 100644
--- a/tests/ImageSharp.Benchmarks/ImageSharp.Benchmarks.csproj
+++ b/tests/ImageSharp.Benchmarks/ImageSharp.Benchmarks.csproj
@@ -15,7 +15,7 @@
-
+
diff --git a/tests/ImageSharp.Sandbox46/ImageSharp.Sandbox46.csproj b/tests/ImageSharp.Sandbox46/ImageSharp.Sandbox46.csproj
index 93336b2b4..9659ad0f5 100644
--- a/tests/ImageSharp.Sandbox46/ImageSharp.Sandbox46.csproj
+++ b/tests/ImageSharp.Sandbox46/ImageSharp.Sandbox46.csproj
@@ -20,6 +20,10 @@
+
+
+
+
diff --git a/tests/ImageSharp.Tests/ImageSharp.Tests.csproj b/tests/ImageSharp.Tests/ImageSharp.Tests.csproj
index f936fa984..a89168606 100644
--- a/tests/ImageSharp.Tests/ImageSharp.Tests.csproj
+++ b/tests/ImageSharp.Tests/ImageSharp.Tests.csproj
@@ -25,6 +25,10 @@
+
+
+
+
diff --git a/tests/ImageSharp.Tests/TestDataIcc/IccTestDataTagDataEntry.cs b/tests/ImageSharp.Tests/TestDataIcc/IccTestDataTagDataEntry.cs
index 9d5e621aa..f7c4efa92 100644
--- a/tests/ImageSharp.Tests/TestDataIcc/IccTestDataTagDataEntry.cs
+++ b/tests/ImageSharp.Tests/TestDataIcc/IccTestDataTagDataEntry.cs
@@ -454,15 +454,46 @@ namespace SixLabors.ImageSharp.Tests
#region MultiLocalizedUnicodeTagDataEntry
- private static readonly IccLocalizedString LocalizedString_Rand_enUs = new IccLocalizedString(new CultureInfo("en-US"), IccTestDataPrimitives.Unicode_ValRand2);
- private static readonly IccLocalizedString LocalizedString_Rand_deDE = new IccLocalizedString(new CultureInfo("de-DE"), IccTestDataPrimitives.Unicode_ValRand3);
- private static readonly IccLocalizedString LocalizedString_Rand2_deDE = new IccLocalizedString(new CultureInfo("de-DE"), IccTestDataPrimitives.Unicode_ValRand2);
- private static readonly IccLocalizedString LocalizedString_Rand_en = new IccLocalizedString(new CultureInfo("en"), IccTestDataPrimitives.Unicode_ValRand2);
+ private static readonly IccLocalizedString LocalizedString_Rand_enUS = CreateLocalizedString("en", "US", IccTestDataPrimitives.Unicode_ValRand2);
+ private static readonly IccLocalizedString LocalizedString_Rand_deDE = CreateLocalizedString("de", "DE", IccTestDataPrimitives.Unicode_ValRand3);
+ private static readonly IccLocalizedString LocalizedString_Rand2_deDE = CreateLocalizedString("de", "DE", IccTestDataPrimitives.Unicode_ValRand2);
+ private static readonly IccLocalizedString LocalizedString_Rand2_esXL = CreateLocalizedString("es", "XL", IccTestDataPrimitives.Unicode_ValRand2);
+ private static readonly IccLocalizedString LocalizedString_Rand2_xyXL = CreateLocalizedString("xy", "XL", IccTestDataPrimitives.Unicode_ValRand2);
+ private static readonly IccLocalizedString LocalizedString_Rand_en = CreateLocalizedString("en", null, IccTestDataPrimitives.Unicode_ValRand2);
private static readonly IccLocalizedString LocalizedString_Rand_Invariant = new IccLocalizedString(CultureInfo.InvariantCulture, IccTestDataPrimitives.Unicode_ValRand3);
- private static readonly IccLocalizedString[] LocalizedString_RandArr_enUs_deDE = new IccLocalizedString[]
+ private static IccLocalizedString CreateLocalizedString(string language, string country, string text)
{
- LocalizedString_Rand_enUs,
+ CultureInfo culture;
+ if (country == null)
+ {
+ try
+ {
+ culture = new CultureInfo(language);
+ }
+ catch (CultureNotFoundException)
+ {
+ culture = CultureInfo.InvariantCulture;
+ }
+ }
+ else
+ {
+ try
+ {
+ culture = new CultureInfo($"{language}-{country}");
+ }
+ catch (CultureNotFoundException)
+ {
+ return CreateLocalizedString(language, null, text);
+ }
+ }
+
+ return new IccLocalizedString(culture, text);
+ }
+
+ private static readonly IccLocalizedString[] LocalizedString_RandArr_enUS_deDE = new IccLocalizedString[]
+ {
+ LocalizedString_Rand_enUS,
LocalizedString_Rand_deDE,
};
private static readonly IccLocalizedString[] LocalizedString_RandArr_en_Invariant = new IccLocalizedString[]
@@ -470,13 +501,15 @@ namespace SixLabors.ImageSharp.Tests
LocalizedString_Rand_en,
LocalizedString_Rand_Invariant,
};
- private static readonly IccLocalizedString[] LocalizedString_SameArr_enUs_deDE = new IccLocalizedString[]
+ private static readonly IccLocalizedString[] LocalizedString_SameArr_enUS_deDE_esXL_xyXL = new IccLocalizedString[]
{
- LocalizedString_Rand_enUs,
- LocalizedString_Rand2_deDE
+ LocalizedString_Rand_enUS,
+ LocalizedString_Rand2_deDE,
+ LocalizedString_Rand2_esXL,
+ LocalizedString_Rand2_xyXL,
};
- public static readonly IccMultiLocalizedUnicodeTagDataEntry MultiLocalizedUnicode_Val = new IccMultiLocalizedUnicodeTagDataEntry(LocalizedString_RandArr_enUs_deDE);
+ public static readonly IccMultiLocalizedUnicodeTagDataEntry MultiLocalizedUnicode_Val = new IccMultiLocalizedUnicodeTagDataEntry(LocalizedString_RandArr_enUS_deDE);
public static readonly byte[] MultiLocalizedUnicode_Arr = ArrayHelper.Concat
(
IccTestDataPrimitives.UInt32_2,
@@ -529,19 +562,27 @@ namespace SixLabors.ImageSharp.Tests
IccTestDataPrimitives.Unicode_Rand3
);
- public static readonly IccMultiLocalizedUnicodeTagDataEntry MultiLocalizedUnicode_Val3 = new IccMultiLocalizedUnicodeTagDataEntry(LocalizedString_SameArr_enUs_deDE);
+ public static readonly IccMultiLocalizedUnicodeTagDataEntry MultiLocalizedUnicode_Val3 = new IccMultiLocalizedUnicodeTagDataEntry(LocalizedString_SameArr_enUS_deDE_esXL_xyXL);
public static readonly byte[] MultiLocalizedUnicode_Arr3 = ArrayHelper.Concat
(
- IccTestDataPrimitives.UInt32_2,
+ IccTestDataPrimitives.UInt32_4,
new byte[] { 0x00, 0x00, 0x00, 0x0C }, // 12
new byte[] { (byte)'e', (byte)'n', (byte)'U', (byte)'S' },
new byte[] { 0x00, 0x00, 0x00, 0x0C }, // 12
- new byte[] { 0x00, 0x00, 0x00, 0x28 }, // 40
+ new byte[] { 0x00, 0x00, 0x00, 0x40 }, // 64
new byte[] { (byte)'d', (byte)'e', (byte)'D', (byte)'E' },
new byte[] { 0x00, 0x00, 0x00, 0x0C }, // 12
- new byte[] { 0x00, 0x00, 0x00, 0x28 }, // 40
+ new byte[] { 0x00, 0x00, 0x00, 0x40 }, // 64
+
+ new byte[] { (byte)'e', (byte)'s', (byte)'X', (byte)'L' },
+ new byte[] { 0x00, 0x00, 0x00, 0x0C }, // 12
+ new byte[] { 0x00, 0x00, 0x00, 0x40 }, // 64
+
+ new byte[] { (byte)'x', (byte)'y', (byte)'X', (byte)'L' },
+ new byte[] { 0x00, 0x00, 0x00, 0x0C }, // 12
+ new byte[] { 0x00, 0x00, 0x00, 0x40 }, // 64
IccTestDataPrimitives.Unicode_Rand2
);
@@ -669,8 +710,8 @@ namespace SixLabors.ImageSharp.Tests
(
new IccProfileSequenceIdentifier[]
{
- new IccProfileSequenceIdentifier(IccTestDataNonPrimitives.ProfileId_ValRand, LocalizedString_RandArr_enUs_deDE),
- new IccProfileSequenceIdentifier(IccTestDataNonPrimitives.ProfileId_ValRand, LocalizedString_RandArr_enUs_deDE),
+ new IccProfileSequenceIdentifier(IccTestDataNonPrimitives.ProfileId_ValRand, LocalizedString_RandArr_enUS_deDE),
+ new IccProfileSequenceIdentifier(IccTestDataNonPrimitives.ProfileId_ValRand, LocalizedString_RandArr_enUS_deDE),
}
);
public static readonly byte[] ProfileSequenceIdentifier_Arr = ArrayHelper.Concat