Browse Source

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

pull/1552/head
Brian Popow 6 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; int i;
fixed (uint* p = pixelData) fixed (uint* p = pixelData)
{ {
for (i = 0; i < numPixels; i += 4) for (i = 0; i + 4 <= numPixels; i += 4)
{ {
var idx = (ushort*)p + i; var idx = p + i;
Vector128<ushort> input = Sse2.LoadVector128(idx); Vector128<ushort> input = Sse2.LoadVector128((ushort*)idx);
Vector128<ushort> a = Sse2.ShiftRightLogical(input.AsUInt16(), 8); // 0 a 0 g Vector128<ushort> a = Sse2.ShiftRightLogical(input.AsUInt16(), 8); // 0 a 0 g
Vector128<ushort> b = Sse2.ShuffleLow(a, mask); Vector128<ushort> b = Sse2.ShuffleLow(a, mask);
Vector128<ushort> c = Sse2.ShuffleHigh(b, mask); // 0g0g Vector128<ushort> c = Sse2.ShuffleHigh(b, mask); // 0g0g
Vector128<ushort> output = Sse2.Add(input, c); Vector128<byte> output = Sse2.Add(input.AsByte(), c.AsByte());
Sse2.Store(idx, output); Sse2.Store((byte*)idx, output);
} }
if (i != numPixels) if (i != numPixels)
@ -158,15 +158,15 @@ namespace SixLabors.ImageSharp.Formats.Experimental.Webp.Lossless
int i; int i;
fixed (uint* p = pixelData) fixed (uint* p = pixelData)
{ {
for (i = 0; i < numPixels; i += 4) for (i = 0; i + 4 <= numPixels; i += 4)
{ {
var idx = (ushort*)p + i; var idx = p + i;
Vector128<ushort> input = Sse2.LoadVector128(idx); Vector128<ushort> input = Sse2.LoadVector128((ushort*)idx);
Vector128<ushort> a = Sse2.ShiftRightLogical(input.AsUInt16(), 8); // 0 a 0 g Vector128<ushort> a = Sse2.ShiftRightLogical(input.AsUInt16(), 8); // 0 a 0 g
Vector128<ushort> b = Sse2.ShuffleLow(a, mask); Vector128<ushort> b = Sse2.ShuffleLow(a, mask);
Vector128<ushort> c = Sse2.ShuffleHigh(b, mask); // 0g0g Vector128<ushort> c = Sse2.ShuffleHigh(b, mask); // 0g0g
Vector128<ushort> output = Sse2.Subtract(input, c); Vector128<byte> output = Sse2.Subtract(input.AsByte(), c.AsByte());
Sse2.Store(idx, output); Sse2.Store((byte*)idx, output);
} }
if (i != numPixels) 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(WebpConstants.TransformPresent, 1);
this.bitWriter.PutBits((uint)Vp8LTransformType.SubtractGreen, 2); 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) private void ApplyPredictFilter(int width, int height, bool usedSubtractGreen)

Loading…
Cancel
Save