private static unsafe void _sRGBColor( void *src, int srcWidth, int srcHeight, int srcStrideBytes, void *dest, int destWidth, int destHeight, int destStrideBytes ) { if ((destWidth < srcWidth / 2) || (destHeight < srcHeight / 2)) { throw new ArgumentOutOfRangeException(); } byte *pSrc = (byte *)src, pDest = (byte *)dest; unchecked { for (var y = 0; y < destHeight; y++) { byte *srcRow = pSrc + ((y * 2) * srcStrideBytes); byte *destRow = pDest + (y * destStrideBytes); for (var x = 0; x < destWidth; x++) { var a = srcRow + ((x * 2) * 4); var b = a + 4; var c = a + srcStrideBytes; var d = b + srcStrideBytes; var result = destRow + (x * 4); result[0] = ColorSpace.AveragesRGB(a[0], b[0], c[0], d[0]); result[1] = ColorSpace.AveragesRGB(a[1], b[1], c[1], d[1]); result[2] = ColorSpace.AveragesRGB(a[2], b[2], c[2], d[2]); // The alpha channel is always linear result[3] = Average(a[3], b[3], c[3], d[3]); } } } }