NScumm.Core.Graphics.YUVToRGBLookup.YUVToRGBLookup C# (CSharp) Method

YUVToRGBLookup() public method

public YUVToRGBLookup ( PixelFormat format, LuminanceScale scale ) : System
format PixelFormat
scale LuminanceScale
return System
        public YUVToRGBLookup(PixelFormat format, LuminanceScale scale)
        {
            _format = format;
            _scale = scale;

            var r_2_pix_alloc = 0 * 768;
            var g_2_pix_alloc = 1 * 768;
            var b_2_pix_alloc = 2 * 768;

            if (scale == LuminanceScale.ScaleFull)
            {
                // Set up entries 0-255 in rgb-to-pixel value tables.
                for (int i = 0; i < 256; i++)
                {
                    _rgbToPix[r_2_pix_alloc + i + 256] = ColorHelper.RGBToColor((byte)i, 0, 0);
                    _rgbToPix[g_2_pix_alloc + i + 256] = ColorHelper.RGBToColor(0, (byte)i, 0);
                    _rgbToPix[b_2_pix_alloc + i + 256] = ColorHelper.RGBToColor(0, 0, (byte)i);
                }

                // Spread out the values we have to the rest of the array so that we do
                // not need to check for overflow.
                for (int i = 0; i < 256; i++)
                {
                    _rgbToPix[r_2_pix_alloc + i] = _rgbToPix[r_2_pix_alloc + 256];
                    _rgbToPix[r_2_pix_alloc + i + 512] = _rgbToPix[r_2_pix_alloc + 511];
                    _rgbToPix[g_2_pix_alloc + i] = _rgbToPix[g_2_pix_alloc + 256];
                    _rgbToPix[g_2_pix_alloc + i + 512] = _rgbToPix[g_2_pix_alloc + 511];
                    _rgbToPix[b_2_pix_alloc + i] = _rgbToPix[b_2_pix_alloc + 256];
                    _rgbToPix[b_2_pix_alloc + i + 512] = _rgbToPix[b_2_pix_alloc + 511];
                }
            }
            else {
                // Set up entries 16-235 in rgb-to-pixel value tables
                for (int i = 16; i < 236; i++)
                {
                    byte scaledValue = (byte)((i - 16) * 255 / 219);
                    _rgbToPix[r_2_pix_alloc + i + 256] = ColorHelper.RGBToColor(scaledValue, 0, 0);
                    _rgbToPix[g_2_pix_alloc + i + 256] = ColorHelper.RGBToColor(0, scaledValue, 0);
                    _rgbToPix[b_2_pix_alloc + i + 256] = ColorHelper.RGBToColor(0, 0, scaledValue);
                }

                // Spread out the values we have to the rest of the array so that we do
                // not need to check for overflow. We have to do it here in two steps.
                for (int i = 0; i < 256 + 16; i++)
                {
                    _rgbToPix[r_2_pix_alloc + i] = _rgbToPix[r_2_pix_alloc + 256 + 16];
                    _rgbToPix[g_2_pix_alloc + i] = _rgbToPix[g_2_pix_alloc + 256 + 16];
                    _rgbToPix[b_2_pix_alloc + i] = _rgbToPix[b_2_pix_alloc + 256 + 16];
                }

                for (int i = 256 + 236; i < 768; i++)
                {
                    _rgbToPix[r_2_pix_alloc + i] = _rgbToPix[r_2_pix_alloc + 256 + 236 - 1];
                    _rgbToPix[g_2_pix_alloc + i] = _rgbToPix[g_2_pix_alloc + 256 + 236 - 1];
                    _rgbToPix[b_2_pix_alloc + i] = _rgbToPix[b_2_pix_alloc + 256 + 236 - 1];
                }
            }
        }