Exemplo n.º 1
0
        public Color32BppArgb[] RenderPixels()
        {
            if (Palette is null)
            {
                throw new InvalidOperationException();
            }

            var result = new Color32BppArgb[0x100 * 0x100];

            for (var row = 0; row < 0x10; row++)
            {
                var pixelRow = row * 0x10 * 0x100;
                for (var column = 0; column < 0x10; column++)
                {
                    var columnIndex = pixelRow + (column * 0x10);
                    var color       = Palette[(row * 0x10) + column];
                    for (var y = 0; y < 0x10; y++)
                    {
                        var index = columnIndex + (y * 0x100);
                        for (var x = 0; x < 0x10; x++)
                        {
                            result[index++] = color;
                        }
                    }
                }
            }

            return(result);
        }
Exemplo n.º 2
0
        public Color32BppArgb[] RenderPixels()
        {
            if (Palette is null || PixelData is null)
            {
                throw new InvalidOperationException();
            }

            var result  = new Color32BppArgb[0x80 * 0x80];
            var palette = new Color32BppArgb[0x10];

            Array.Copy(
                sourceArray: Palette,
                sourceIndex: PaletteIndex,
                destinationArray: palette,
                destinationIndex: 0,
                length: Math.Min(0x10, Palette.Length - PaletteIndex));

            Parallel.For(0, 0x10, RenderRow);

            void RenderRow(int row)
            {
                var pixelRow   = row * 8 * 0x80;
                var pixelIndex = (StartTile + (row * 0x10)) * 0x40;

                for (var column = 0; column < 0x10; column++)
                {
                    var columnIndex = pixelRow + (column * 8);
                    for (var y = 0; y < 8; y++)
                    {
                        var index = columnIndex + (y * 0x80);
                        for (var x = 0; x < 8; x++)
                        {
                            var pixel = PixelData[pixelIndex++];
                            result[index++] = palette[pixel];
                        }
                    }
                }
            }

            return(Upscale.Simple(result, 0x80, 2));
        }
Exemplo n.º 3
0
        private static int GetResult(
            Color32BppArgb a,
            Color32BppArgb b,
            Color32BppArgb c,
            Color32BppArgb d)
        {
            var x = 0;
            var y = 0;
            var r = 0;

            if (a == c)
            {
                x += 1;
            }
            else if (b == c)
            {
                y += 1;
            }

            if (a == d)
            {
                x += 1;
            }
            else if (b == d)
            {
                y += 1;
            }

            if (x <= 1)
            {
                r += 1;
            }

            if (y <= 1)
            {
                r -= 1;
            }

            return(r);
        }
Exemplo n.º 4
0
        public Color32BppArgb[] RenderPixels()
        {
            if (Palette is null || PixelData is null || BG1 is null)
            {
                throw new InvalidOperationException();
            }

            var startTime  = DateTime.Now;
            var viewWidth  = ((ClientSize.Width - 1) / 8) + 1;
            var imageWidth = viewWidth * 8;

            var result  = new Color32BppArgb[imageWidth * 0xF0];
            var bgColor = new Color32BppArgb(0xFF, 0, 0, 0);

            Parallel.For(0, result.Length, i => result[i] = bgColor);
            Parallel.For(0, 0x1E, row => RenderBg2Row(row, LayerPriority.Priority0));
            Parallel.ForEach(Sprites, sprite => RenderSprite(sprite, LayerPriority.Priority0));
            Parallel.For(0, 0x1E, row => RenderRow(row, LayerPriority.Priority0));
            Parallel.ForEach(Sprites, sprite => RenderSprite(sprite, LayerPriority.Priority2));
            Parallel.For(0, 0x1E, row => RenderRow(row, LayerPriority.Priority1));
            Parallel.ForEach(Sprites, sprite => RenderSprite(sprite, LayerPriority.Priority3));

            var end      = DateTime.Now;
            var elspaded = end - startTime;

            Parent.Text = $"{elspaded.Milliseconds} ms";

            return(result);

            void RenderRow(int row, LayerPriority layerPriority)
            {
                var rowIndex = row * 0x400;
                var pixelRow = row * 8 * imageWidth;

                for (var column = 0; column < viewWidth; column++, pixelRow += 8)
                {
                    var tile8 = BG1[rowIndex + column + StartX];
                    if (tile8.Priority != layerPriority)
                    {
                        continue;
                    }

                    var xFlip        = tile8.XFlipped ? 7 : 0;
                    var yFlip        = tile8.YFlipped ? 7 : 0;
                    var paletteIndex = tile8.PaletteNumber * 0x10;
                    var pixelIndex   = tile8.TileIndex * 0x40;

                    for (var y = 0; y < 8; y++, pixelIndex += 8)
                    {
                        var index = pixelRow + ((y ^ yFlip) * imageWidth);
                        for (var x = 0; x < 8; x++, index++)
                        {
                            var pixel = PixelData[
                                pixelIndex + (x ^ xFlip)];

                            if (pixel != 0)
                            {
                                result[index] = Palette[paletteIndex + pixel];
                            }
                        }
                    }
                }
            }

            void RenderBg2Row(int row, LayerPriority layerPriority)
            {
                var rowIndex = row * 0x200;
                var pixelRow = row * 8 * imageWidth;

                for (var column = 0; column < viewWidth; column++, pixelRow += 8)
                {
                    var tile8 = BG2[rowIndex + column + (StartX >> 1)];
                    if (tile8.Priority != layerPriority)
                    {
                        continue;
                    }

                    var xFlip        = tile8.XFlipped ? 7 : 0;
                    var yFlip        = tile8.YFlipped ? 7 : 0;
                    var paletteIndex = tile8.PaletteNumber * 0x10;
                    var pixelIndex   = tile8.TileIndex * 0x40;

                    for (var y = 0; y < 8; y++, pixelIndex += 8)
                    {
                        var index = pixelRow + ((y ^ yFlip) * imageWidth);
                        if (column != 0 && (StartX & 1) != 0)
                        {
                            index -= 4;
                        }

                        for (var x = 0; x < 8; x++, index++)
                        {
                            if (column == 0 && x == 0 && (StartX & 1) != 0)
                            {
                                x += 4;
                            }

                            var pixel = PixelData[
                                pixelIndex + (x ^ xFlip)];

                            if (pixel != 0)
                            {
                                result[index] = Palette[paletteIndex + pixel];
                            }
                        }
                    }
                }
            }

            void RenderSprite(Sprite sprite, LayerPriority layerPriority)
            {
                var spriteX = sprite.X - (StartX * 8);
                var firstX  = 0;

                if (spriteX < 0)
                {
                    firstX = -spriteX;
                    if (firstX >= 8)
                    {
                        return;
                    }
                }

                if (sprite.Y < 0)
                {
                    return;
                }

                if (spriteX + 8 > imageWidth)
                {
                    return;
                }

                if (sprite.Y + 8 >= 0xF0)
                {
                    return;
                }

                var tile8 = sprite.Tile;

                if (tile8.Priority != layerPriority)
                {
                    return;
                }

                var xFlip        = tile8.XFlipMask;
                var yFlip        = tile8.YFlipMask;
                var paletteIndex = (tile8.PaletteIndex * 0x10) + 0x80;
                var pixelIndex   = (tile8.TileIndex + 0x300) * 0x40;
                var func         = TransformPixel(sprite.TileProperties);
                var pixelRow     = (sprite.Y * imageWidth) + sprite.X - (StartX * 8);

                for (var y = 0; y < 8; y++, pixelIndex += 8)
                {
                    var index = pixelRow + ((y ^ yFlip) * imageWidth);
                    for (var x = firstX; x < 8; x++, index++)
                    {
                        var pixel = PixelData[
                            pixelIndex + (x ^ xFlip)];

                        if (pixel != 0)
                        {
                            result[index] = func(
                                Palette[paletteIndex + pixel],
                                result[index]);
                        }
                    }
                }
            }
        }