diff --git a/src/ImageSharp/Formats/WebP/LossyUtils.cs b/src/ImageSharp/Formats/WebP/LossyUtils.cs index 6d824793e0..635e8bee1e 100644 --- a/src/ImageSharp/Formats/WebP/LossyUtils.cs +++ b/src/ImageSharp/Formats/WebP/LossyUtils.cs @@ -11,11 +11,7 @@ namespace SixLabors.ImageSharp.Formats.WebP { for (int j = 0; j < 16; ++j) { - Span tmp = dst.Slice(j * WebPConstants.Bps); - for (int i = 0; i < 16; i++) - { - tmp[i] = (byte)v; - } + Memset(dst.Slice(j * WebPConstants.Bps), (byte)v, 0, 16); } } @@ -54,14 +50,10 @@ namespace SixLabors.ImageSharp.Formats.WebP for (int j = 16; j > 0; --j) { // memset(dst, dst[-1], 16); - dst = dst.Slice(WebPConstants.Bps); byte v = yuv[offset - 1]; - for (int i = 0; i < 16; i++) - { - dst[i] = v; - } - + Memset(dst, v, 0, 16); offset += WebPConstants.Bps; + dst = dst.Slice(WebPConstants.Bps); } } @@ -131,10 +123,8 @@ namespace SixLabors.ImageSharp.Formats.WebP { // memset(dst, dst[-1], 8); byte v = yuv[offset - 1]; - for (int i = 0; i < 8; i++) - { - yuv[offset + i] = v; - } + Memset(dst, v, 0, 8); + dst = dst.Slice(WebPConstants.Bps); } } @@ -164,17 +154,10 @@ namespace SixLabors.ImageSharp.Formats.WebP Put8x8uv((byte)(dc0 >> 3), dst); } - public static void DC8uvNoTopLeft_C(Span dst, byte[] yuv, int offset) + public static void DC8uvNoTopLeft_C(Span dst) { - // DC with no top samples. - int dc0 = 4; - for (int i = 0; i < 8; ++i) - { - // dc0 += dst[-1 + i * BPS]; - dc0 += yuv[offset - 1 + (i * WebPConstants.Bps)]; - } - - Put8x8uv((byte)(dc0 >> 3), dst); + // DC with nothing. + Put8x8uv(0x80, dst); } public static void DC4_C(Span dst) @@ -366,10 +349,18 @@ namespace SixLabors.ImageSharp.Formats.WebP private static void Put8x8uv(byte value, Span dst) { - // memset(dst + j * BPS, value, 8); 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 dst, byte value, int startIdx, int count) + { + for (int i = 0; i < count; i++) + { + dst[startIdx + i] = value; } } diff --git a/src/ImageSharp/Formats/WebP/WebPLossyDecoder.cs b/src/ImageSharp/Formats/WebP/WebPLossyDecoder.cs index d5b4d711af..a3c8e409b0 100644 --- a/src/ImageSharp/Formats/WebP/WebPLossyDecoder.cs +++ b/src/ImageSharp/Formats/WebP/WebPLossyDecoder.cs @@ -414,8 +414,8 @@ namespace SixLabors.ImageSharp.Formats.WebP LossyUtils.DC8uvNoLeft_C(vDst, yuv, vOff); break; case 6: - LossyUtils.DC8uvNoTopLeft_C(uDst, yuv, uOff); - LossyUtils.DC8uvNoTopLeft_C(vDst, yuv, vOff); + LossyUtils.DC8uvNoTopLeft_C(uDst); + LossyUtils.DC8uvNoTopLeft_C(vDst); break; }