Browse Source

Use memset equivalent in LossyUtils

pull/1552/head
Brian Popow 6 years ago
parent
commit
73611ea1f2
  1. 45
      src/ImageSharp/Formats/WebP/LossyUtils.cs
  2. 4
      src/ImageSharp/Formats/WebP/WebPLossyDecoder.cs

45
src/ImageSharp/Formats/WebP/LossyUtils.cs

@ -11,11 +11,7 @@ namespace SixLabors.ImageSharp.Formats.WebP
{ {
for (int j = 0; j < 16; ++j) for (int j = 0; j < 16; ++j)
{ {
Span<byte> tmp = dst.Slice(j * WebPConstants.Bps); Memset(dst.Slice(j * WebPConstants.Bps), (byte)v, 0, 16);
for (int i = 0; i < 16; i++)
{
tmp[i] = (byte)v;
}
} }
} }
@ -54,14 +50,10 @@ namespace SixLabors.ImageSharp.Formats.WebP
for (int j = 16; j > 0; --j) for (int j = 16; j > 0; --j)
{ {
// memset(dst, dst[-1], 16); // memset(dst, dst[-1], 16);
dst = dst.Slice(WebPConstants.Bps);
byte v = yuv[offset - 1]; byte v = yuv[offset - 1];
for (int i = 0; i < 16; i++) Memset(dst, v, 0, 16);
{
dst[i] = v;
}
offset += WebPConstants.Bps; offset += WebPConstants.Bps;
dst = dst.Slice(WebPConstants.Bps);
} }
} }
@ -131,10 +123,8 @@ namespace SixLabors.ImageSharp.Formats.WebP
{ {
// memset(dst, dst[-1], 8); // memset(dst, dst[-1], 8);
byte v = yuv[offset - 1]; byte v = yuv[offset - 1];
for (int i = 0; i < 8; i++) Memset(dst, v, 0, 8);
{ dst = dst.Slice(WebPConstants.Bps);
yuv[offset + i] = v;
}
} }
} }
@ -164,17 +154,10 @@ namespace SixLabors.ImageSharp.Formats.WebP
Put8x8uv((byte)(dc0 >> 3), dst); Put8x8uv((byte)(dc0 >> 3), dst);
} }
public static void DC8uvNoTopLeft_C(Span<byte> dst, byte[] yuv, int offset) public static void DC8uvNoTopLeft_C(Span<byte> dst)
{ {
// DC with no top samples. // DC with nothing.
int dc0 = 4; Put8x8uv(0x80, dst);
for (int i = 0; i < 8; ++i)
{
// dc0 += dst[-1 + i * BPS];
dc0 += yuv[offset - 1 + (i * WebPConstants.Bps)];
}
Put8x8uv((byte)(dc0 >> 3), dst);
} }
public static void DC4_C(Span<byte> dst) public static void DC4_C(Span<byte> dst)
@ -366,10 +349,18 @@ namespace SixLabors.ImageSharp.Formats.WebP
private static void Put8x8uv(byte value, Span<byte> dst) private static void Put8x8uv(byte value, Span<byte> dst)
{ {
// memset(dst + j * BPS, value, 8);
for (int j = 0; j < 8; ++j) for (int j = 0; j < 8; ++j)
{ {
dst[j * WebPConstants.Bps] = value; // memset(dst + j * BPS, value, 8);
Memset(dst, value, j * WebPConstants.Bps, 8);
}
}
private static void Memset(Span<byte> dst, byte value, int startIdx, int count)
{
for (int i = 0; i < count; i++)
{
dst[startIdx + i] = value;
} }
} }

4
src/ImageSharp/Formats/WebP/WebPLossyDecoder.cs

@ -414,8 +414,8 @@ namespace SixLabors.ImageSharp.Formats.WebP
LossyUtils.DC8uvNoLeft_C(vDst, yuv, vOff); LossyUtils.DC8uvNoLeft_C(vDst, yuv, vOff);
break; break;
case 6: case 6:
LossyUtils.DC8uvNoTopLeft_C(uDst, yuv, uOff); LossyUtils.DC8uvNoTopLeft_C(uDst);
LossyUtils.DC8uvNoTopLeft_C(vDst, yuv, vOff); LossyUtils.DC8uvNoTopLeft_C(vDst);
break; break;
} }

Loading…
Cancel
Save