Browse Source

Minor optimization for the PaethFilter decoder.

af/merge-core
Dirk Lemstra 9 years ago
parent
commit
fadb70224d
  1. 29
      src/ImageSharp/Formats/Png/Filters/PaethFilter.cs

29
src/ImageSharp/Formats/Png/Filters/PaethFilter.cs

@ -31,22 +31,21 @@ namespace ImageSharp.Formats
ref byte prevBaseRef = ref previousScanline.DangerousGetPinnableReference(); ref byte prevBaseRef = ref previousScanline.DangerousGetPinnableReference();
// Paeth(x) + PaethPredictor(Raw(x-bpp), Prior(x), Prior(x-bpp)) // Paeth(x) + PaethPredictor(Raw(x-bpp), Prior(x), Prior(x-bpp))
for (int x = 1; x < scanline.Length; x++) int offset = bytesPerPixel + 1;
for (int x = 1; x < offset; x++)
{ {
if (x - bytesPerPixel < 1) ref byte scan = ref Unsafe.Add(ref scanBaseRef, x);
{ byte above = Unsafe.Add(ref prevBaseRef, x);
ref byte scan = ref Unsafe.Add(ref scanBaseRef, x); scan = (byte)(scan + above);
byte above = Unsafe.Add(ref prevBaseRef, x); }
scan = (byte)((scan + PaethPredicator(0, above, 0)) % 256);
} for (int x = offset; x < scanline.Length; x++)
else {
{ ref byte scan = ref Unsafe.Add(ref scanBaseRef, x);
ref byte scan = ref Unsafe.Add(ref scanBaseRef, x); byte left = Unsafe.Add(ref scanBaseRef, x - bytesPerPixel);
byte left = Unsafe.Add(ref scanBaseRef, x - bytesPerPixel); byte above = Unsafe.Add(ref prevBaseRef, x);
byte above = Unsafe.Add(ref prevBaseRef, x); byte upperLeft = Unsafe.Add(ref prevBaseRef, x - bytesPerPixel);
byte upperLeft = Unsafe.Add(ref prevBaseRef, x - bytesPerPixel); scan = (byte)(scan + PaethPredicator(left, above, upperLeft));
scan = (byte)((scan + PaethPredicator(left, above, upperLeft)) % 256);
}
} }
} }

Loading…
Cancel
Save