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); }
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)); }
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); }
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]); } } } } }