Пример #1
0
        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]);
                    }
                }
            }
        }