Skip to content

Commit 5d50298

Browse files
memory improvements
1 parent 855d1aa commit 5d50298

File tree

3 files changed

+21
-22
lines changed

3 files changed

+21
-22
lines changed

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

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -69,17 +69,25 @@ public static bool TryParse(ReadOnlySpan<byte> buffer, out EncodedString encoded
6969
public static uint GetDataLength(EncodedString encodedString) =>
7070
(uint)GetEncoding(encodedString.Code).GetByteCount(encodedString.Text) + CharacterCodeBytesLength;
7171

72-
public static byte[] GetData(EncodedString encodedString)
72+
public static int Write(EncodedString encodedString, Span<byte> destination)
7373
{
74-
int length = (int)GetDataLength(encodedString);
75-
byte[] buffer = new byte[length];
76-
77-
GetCodeBytes(encodedString.Code).CopyTo(buffer);
74+
GetCodeBytes(encodedString.Code).CopyTo(destination);
7875

7976
string text = encodedString.Text;
80-
GetEncoding(encodedString.Code).GetBytes(text, 0, text.Length, buffer, CharacterCodeBytesLength);
77+
int count = Write(GetEncoding(encodedString.Code), text, destination.Slice(CharacterCodeBytesLength));
78+
79+
return CharacterCodeBytesLength + count;
80+
}
8181

82-
return buffer;
82+
public static unsafe int Write(Encoding encoding, string value, Span<byte> destination)
83+
{
84+
fixed (char* c = value)
85+
{
86+
fixed (byte* b = destination)
87+
{
88+
return encoding.GetBytes(c, value.Length, b, destination.Length);
89+
}
90+
}
8391
}
8492

8593
private static bool TryDetect(ReadOnlySpan<byte> buffer, out CharacterCode code)

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,7 @@ internal static class ExifUcs2StringHelpers
1515
ExifTagValue.XPAuthor or ExifTagValue.XPComment or ExifTagValue.XPKeywords or ExifTagValue.XPSubject or ExifTagValue.XPTitle => true,
1616
_ => false,
1717
};
18+
19+
public static int Write(string value, Span<byte> destination) => ExifEncodedStringHelpers.Write(Ucs2Encoding, value, destination);
1820
}
1921
}

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

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
using System;
55
using System.Buffers.Binary;
66
using System.Collections.Generic;
7-
using System.Text;
87

98
namespace SixLabors.ImageSharp.Metadata.Profiles.Exif
109
{
@@ -388,18 +387,8 @@ private static int WriteValue(ExifDataType dataType, object value, Span<byte> de
388387
return offset + 1;
389388
case ExifDataType.Byte:
390389
case ExifDataType.Undefined:
391-
if (value is byte[] array)
392-
{
393-
// used by encoded strings (which dataType is Byte/Undefined)
394-
offset = Write(array, destination, offset);
395-
return offset;
396-
}
397-
else
398-
{
399-
destination[offset] = (byte)value;
400-
return offset + 1;
401-
}
402-
390+
destination[offset] = (byte)value;
391+
return offset + 1;
403392
case ExifDataType.DoubleFloat:
404393
return WriteDouble((double)value, destination, offset);
405394
case ExifDataType.Short:
@@ -446,11 +435,11 @@ internal static int WriteValue(IExifValue exifValue, Span<byte> destination, int
446435

447436
if (ExifUcs2StringHelpers.IsUcs2Tag((ExifTagValue)(ushort)exifValue.Tag))
448437
{
449-
value = ExifUcs2StringHelpers.Ucs2Encoding.GetBytes((string)value);
438+
return offset + ExifUcs2StringHelpers.Write((string)value, destination.Slice(offset));
450439
}
451440
else if (value is EncodedString encodedString)
452441
{
453-
value = ExifEncodedStringHelpers.GetData(encodedString);
442+
return offset + ExifEncodedStringHelpers.Write(encodedString, destination.Slice(offset));
454443
}
455444

456445
if (exifValue.IsArray)

0 commit comments

Comments
 (0)