Browse Source

Sse2.Subtract and Sse2.Add need to operate on bytes

pull/1552/head
Brian Popow 5 years ago
parent
commit
469c5d6264
  1. 20
      src/ImageSharp/Formats/WebP/Lossless/LosslessUtils.cs
  2. 2
      src/ImageSharp/Formats/WebP/Lossless/Vp8LEncoder.cs

20
src/ImageSharp/Formats/WebP/Lossless/LosslessUtils.cs

@ -110,15 +110,15 @@ namespace SixLabors.ImageSharp.Formats.Experimental.Webp.Lossless
int i;
fixed (uint* p = pixelData)
{
for (i = 0; i < numPixels; i += 4)
for (i = 0; i + 4 <= numPixels; i += 4)
{
var idx = (ushort*)p + i;
Vector128<ushort> input = Sse2.LoadVector128(idx);
var idx = p + i;
Vector128<ushort> input = Sse2.LoadVector128((ushort*)idx);
Vector128<ushort> a = Sse2.ShiftRightLogical(input.AsUInt16(), 8); // 0 a 0 g
Vector128<ushort> b = Sse2.ShuffleLow(a, mask);
Vector128<ushort> c = Sse2.ShuffleHigh(b, mask); // 0g0g
Vector128<ushort> output = Sse2.Add(input, c);
Sse2.Store(idx, output);
Vector128<byte> output = Sse2.Add(input.AsByte(), c.AsByte());
Sse2.Store((byte*)idx, output);
}
if (i != numPixels)
@ -158,15 +158,15 @@ namespace SixLabors.ImageSharp.Formats.Experimental.Webp.Lossless
int i;
fixed (uint* p = pixelData)
{
for (i = 0; i < numPixels; i += 4)
for (i = 0; i + 4 <= numPixels; i += 4)
{
var idx = (ushort*)p + i;
Vector128<ushort> input = Sse2.LoadVector128(idx);
var idx = p + i;
Vector128<ushort> input = Sse2.LoadVector128((ushort*)idx);
Vector128<ushort> a = Sse2.ShiftRightLogical(input.AsUInt16(), 8); // 0 a 0 g
Vector128<ushort> b = Sse2.ShuffleLow(a, mask);
Vector128<ushort> c = Sse2.ShuffleHigh(b, mask); // 0g0g
Vector128<ushort> output = Sse2.Subtract(input, c);
Sse2.Store(idx, output);
Vector128<byte> output = Sse2.Subtract(input.AsByte(), c.AsByte());
Sse2.Store((byte*)idx, output);
}
if (i != numPixels)

2
src/ImageSharp/Formats/WebP/Lossless/Vp8LEncoder.cs

@ -567,7 +567,7 @@ namespace SixLabors.ImageSharp.Formats.Experimental.Webp.Lossless
{
this.bitWriter.PutBits(WebpConstants.TransformPresent, 1);
this.bitWriter.PutBits((uint)Vp8LTransformType.SubtractGreen, 2);
LosslessUtils.SubtractGreenFromBlueAndRed(this.Bgra.GetSpan(), width * height);
LosslessUtils.SubtractGreenFromBlueAndRed(this.Bgra.GetSpan());
}
private void ApplyPredictFilter(int width, int height, bool usedSubtractGreen)

Loading…
Cancel
Save