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) =>
(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);
byte[] buffer = new byte[length];
GetCodeBytes(encodedString.Code).CopyTo(buffer);
GetCodeBytes(encodedString.Code).CopyTo(destination);
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)

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,
_ => 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.Buffers.Binary;
using System.Collections.Generic;
using System.Text;
namespace SixLabors.ImageSharp.Metadata.Profiles.Exif
{
@ -388,18 +387,8 @@ namespace SixLabors.ImageSharp.Metadata.Profiles.Exif
return offset + 1;
case ExifDataType.Byte:
case ExifDataType.Undefined:
if (value is byte[] array)
{
// used by encoded strings (which dataType is Byte/Undefined)
offset = Write(array, destination, offset);
return offset;
}
else
{
destination[offset] = (byte)value;
return offset + 1;
}
destination[offset] = (byte)value;
return offset + 1;
case ExifDataType.DoubleFloat:
return WriteDouble((double)value, destination, offset);
case ExifDataType.Short:
@ -446,11 +435,11 @@ namespace SixLabors.ImageSharp.Metadata.Profiles.Exif
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)
{
value = ExifEncodedStringHelpers.GetData(encodedString);
return offset + ExifEncodedStringHelpers.Write(encodedString, destination.Slice(offset));
}
if (exifValue.IsArray)

Loading…
Cancel
Save