public void Enqueue8Pixels(int[] pixelLine, TileAttributes tileAttributes)
 {
     foreach (var p in pixelLine)
     {
         _pixels.Enqueue(p);
         _palettes.Enqueue(tileAttributes.GetColorPaletteIndex());
         _priorities.Enqueue(tileAttributes.IsPriority() ? 100 : -1);
     }
 }
        /*
         * lcdc.0
         *
         * when 0 => sprites are always displayed on top of the bg
         *
         * bg tile attribute.7
         *
         * when 0 => use oam priority bit
         * when 1 => bg priority
         *
         * sprite attribute.7
         *
         * when 0 => sprite above bg
         * when 1 => sprite above bg color 0
         */

        public void SetOverlay(int[] pixelLine, int offset, TileAttributes spriteAttr, int oamIndex)
        {
            for (var j = offset; j < pixelLine.Length; j++)
            {
                var p = pixelLine[j];
                var i = j - offset;
                if (p == 0)
                {
                    continue; // color 0 is always transparent
                }

                var oldPriority = _priorities.Get(i);

                var put = false;
                if ((oldPriority == -1 || oldPriority == 100) && !_lcdc.IsBgAndWindowDisplay())
                {
                    // this one takes precedence
                    put = true;
                }
                else if (oldPriority == 100)
                {
                    // bg with priority
                    put = _pixels.Get(i) == 0;
                }
                else if (oldPriority == -1 && !spriteAttr.IsPriority())
                {
                    // bg without priority
                    put = true;
                }
                else if (oldPriority == -1 && spriteAttr.IsPriority() && _pixels.Get(i) == 0)
                {
                    // bg without priority
                    put = true;
                }
                else if (oldPriority >= 0 && oldPriority < 10)
                {
                    // other sprite
                    put = oldPriority > oamIndex;
                }

                if (put)
                {
                    _pixels.Set(i, p);
                    _palettes.Set(i, spriteAttr.GetColorPaletteIndex());
                    _priorities.Set(i, oamIndex);
                }
            }
        }