Browse Source

memory improvements

pull/1935/head
Ildar Khayrutdinov 4 years ago
parent
commit
5d502980c2
  1. 22
      src/ImageSharp/Metadata/Profiles/Exif/ExifEncodedStringHelpers.cs
  2. 2
      src/ImageSharp/Metadata/Profiles/Exif/ExifUcs2StringHelpers.cs
  3. 19
      src/ImageSharp/Metadata/Profiles/Exif/ExifWriter.cs

22
src/ImageSharp/Metadata/Profiles/Exif/ExifEncodedStringHelpers.cs

@ -69,17 +69,25 @@ namespace SixLabors.ImageSharp.Metadata.Profiles.Exif
public static uint GetDataLength(EncodedString encodedString) => public static uint GetDataLength(EncodedString encodedString) =>
(uint)GetEncoding(encodedString.Code).GetByteCount(encodedString.Text) + CharacterCodeBytesLength; (uint)GetEncoding(encodedString.Code).GetByteCount(encodedString.Text) + CharacterCodeBytesLength;
public static byte[] GetData(EncodedString encodedString) public static int Write(EncodedString encodedString, Span<byte> destination)
{ {
int length = (int)GetDataLength(encodedString); GetCodeBytes(encodedString.Code).CopyTo(destination);
byte[] buffer = new byte[length];
GetCodeBytes(encodedString.Code).CopyTo(buffer);
string text = encodedString.Text; string text = encodedString.Text;
GetEncoding(encodedString.Code).GetBytes(text, 0, text.Length, buffer, CharacterCodeBytesLength); int count = Write(GetEncoding(encodedString.Code), text, destination.Slice(CharacterCodeBytesLength));
return CharacterCodeBytesLength + count;
}
return buffer; public static unsafe int Write(Encoding encoding, string value, Span<byte> destination)
{
fixed (char* c = value)
{
fixed (byte* b = destination)
{
return encoding.GetBytes(c, value.Length, b, destination.Length);
}
}
} }
private static bool TryDetect(ReadOnlySpan<byte> buffer, out CharacterCode code) private static bool TryDetect(ReadOnlySpan<byte> buffer, out CharacterCode code)

2
src/ImageSharp/Metadata/Profiles/Exif/ExifUcs2StringHelpers.cs

@ -15,5 +15,7 @@ namespace SixLabors.ImageSharp.Metadata.Profiles.Exif
ExifTagValue.XPAuthor or ExifTagValue.XPComment or ExifTagValue.XPKeywords or ExifTagValue.XPSubject or ExifTagValue.XPTitle => true, ExifTagValue.XPAuthor or ExifTagValue.XPComment or ExifTagValue.XPKeywords or ExifTagValue.XPSubject or ExifTagValue.XPTitle => true,
_ => false, _ => false,
}; };
public static int Write(string value, Span<byte> destination) => ExifEncodedStringHelpers.Write(Ucs2Encoding, value, destination);
} }
} }

19
src/ImageSharp/Metadata/Profiles/Exif/ExifWriter.cs

@ -4,7 +4,6 @@
using System; using System;
using System.Buffers.Binary; using System.Buffers.Binary;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text;
namespace SixLabors.ImageSharp.Metadata.Profiles.Exif namespace SixLabors.ImageSharp.Metadata.Profiles.Exif
{ {
@ -388,18 +387,8 @@ namespace SixLabors.ImageSharp.Metadata.Profiles.Exif
return offset + 1; return offset + 1;
case ExifDataType.Byte: case ExifDataType.Byte:
case ExifDataType.Undefined: case ExifDataType.Undefined:
if (value is byte[] array) destination[offset] = (byte)value;
{ return offset + 1;
// used by encoded strings (which dataType is Byte/Undefined)
offset = Write(array, destination, offset);
return offset;
}
else
{
destination[offset] = (byte)value;
return offset + 1;
}
case ExifDataType.DoubleFloat: case ExifDataType.DoubleFloat:
return WriteDouble((double)value, destination, offset); return WriteDouble((double)value, destination, offset);
case ExifDataType.Short: case ExifDataType.Short:
@ -446,11 +435,11 @@ namespace SixLabors.ImageSharp.Metadata.Profiles.Exif
if (ExifUcs2StringHelpers.IsUcs2Tag((ExifTagValue)(ushort)exifValue.Tag)) if (ExifUcs2StringHelpers.IsUcs2Tag((ExifTagValue)(ushort)exifValue.Tag))
{ {
value = ExifUcs2StringHelpers.Ucs2Encoding.GetBytes((string)value); return offset + ExifUcs2StringHelpers.Write((string)value, destination.Slice(offset));
} }
else if (value is EncodedString encodedString) else if (value is EncodedString encodedString)
{ {
value = ExifEncodedStringHelpers.GetData(encodedString); return offset + ExifEncodedStringHelpers.Write(encodedString, destination.Slice(offset));
} }
if (exifValue.IsArray) if (exifValue.IsArray)

Loading…
Cancel
Save