diff --git a/OpenRA.Game/Graphics/Video.cs b/OpenRA.Game/Graphics/Video.cs index 032951667e..60e60d19ad 100644 --- a/OpenRA.Game/Graphics/Video.cs +++ b/OpenRA.Game/Graphics/Video.cs @@ -21,7 +21,7 @@ namespace OpenRA.Video /// /// Current frame color data in 32-bit BGRA. /// - uint[,] CurrentFrameData { get; } + byte[] CurrentFrameData { get; } int CurrentFrameNumber { get; } void AdvanceFrame(); diff --git a/OpenRA.Mods.Cnc/FileFormats/VqaReader.cs b/OpenRA.Mods.Cnc/FileFormats/VqaReader.cs index 31c6e7a109..1b5ff90593 100644 --- a/OpenRA.Mods.Cnc/FileFormats/VqaReader.cs +++ b/OpenRA.Mods.Cnc/FileFormats/VqaReader.cs @@ -23,7 +23,7 @@ namespace OpenRA.Mods.Cnc.FileFormats public ushort Width { get; } public ushort Height { get; } - public uint[,] CurrentFrameData { get; } + public byte[] CurrentFrameData { get; } public int CurrentFrameNumber { get; private set; } public bool HasAudio { get; set; } @@ -145,8 +145,7 @@ namespace OpenRA.Mods.Cnc.FileFormats CollectAudioData(); - var frameSize = Exts.NextPowerOf2(Math.Max(Width, Height)); - CurrentFrameData = new uint[frameSize, frameSize]; + CurrentFrameData = new byte[Width * Height * 4]; Reset(); } @@ -481,8 +480,16 @@ namespace OpenRA.Mods.Cnc.FileFormats for (var i = 0; i < blockWidth; i++) { var cbfi = (mod * 256 + px) * 8 + j * blockWidth + i; - var color = (mod == 0x0f) ? px : cbf[cbfi]; - CurrentFrameData[y * blockHeight + j, x * blockWidth + i] = palette[color]; + var colorIndex = (mod == 0x0f) ? px : cbf[cbfi]; + var color = palette[colorIndex]; + + var pixelX = x * blockWidth + i; + var pixelY = y * blockHeight + j; + var pos = pixelY * Width + pixelX; + CurrentFrameData[pos * 4] = (byte)(color & 0xFF); + CurrentFrameData[pos * 4 + 1] = (byte)(color >> 8 & 0xFF); + CurrentFrameData[pos * 4 + 2] = (byte)(color >> 16 & 0xFF); + CurrentFrameData[pos * 4 + 3] = (byte)(color >> 24 & 0xFF); } } } @@ -496,15 +503,19 @@ namespace OpenRA.Mods.Cnc.FileFormats { for (var i = 0; i < count; i++) { - var frameX = x * blockWidth; - var frameY = y * blockHeight; var offset = blockNumber * blockHeight * blockWidth * 3; for (var by = 0; by < blockHeight; by++) for (var bx = 0; bx < blockWidth; bx++) { var p = (bx + by * blockWidth) * 3; - CurrentFrameData[frameY + by, frameX + bx] = (uint)(0xFF << 24 | cbf[offset + p] << 16 | cbf[offset + p + 1] << 8 | cbf[offset + p + 2]); + var pixelX = x * blockWidth + bx; + var pixelY = y * blockHeight + by; + var pos = pixelY * Width + pixelX; + CurrentFrameData[pos * 4] = cbf[offset + p + 2]; + CurrentFrameData[pos * 4 + 1] = cbf[offset + p + 1]; + CurrentFrameData[pos * 4 + 2] = cbf[offset + p]; + CurrentFrameData[pos * 4 + 3] = 255; } x++; diff --git a/OpenRA.Mods.Cnc/FileFormats/WsaReader.cs b/OpenRA.Mods.Cnc/FileFormats/WsaReader.cs index afb9ce746c..2075b5648a 100644 --- a/OpenRA.Mods.Cnc/FileFormats/WsaReader.cs +++ b/OpenRA.Mods.Cnc/FileFormats/WsaReader.cs @@ -22,7 +22,7 @@ namespace OpenRA.Mods.Cnc.FileFormats public ushort Width { get; } public ushort Height { get; } - public uint[,] CurrentFrameData { get; } + public byte[] CurrentFrameData { get; } public int CurrentFrameNumber { get; private set; } public bool HasAudio => false; @@ -78,8 +78,7 @@ namespace OpenRA.Mods.Cnc.FileFormats frameOffsets[i] += 768; } - var frameSize = Exts.NextPowerOf2(Math.Max(Width, Height)); - CurrentFrameData = new uint[frameSize, frameSize]; + CurrentFrameData = new byte[Width * Height * 4]; Reset(); } @@ -123,9 +122,18 @@ namespace OpenRA.Mods.Cnc.FileFormats XORDeltaCompression.DecodeInto(intermediateData, currentFramePaletteIndexData, 0); var c = 0; + var position = 0; for (var y = 0; y < Height; y++) + { for (var x = 0; x < Width; x++) - CurrentFrameData[y, x] = palette[currentFramePaletteIndexData[c++]]; + { + var color = palette[currentFramePaletteIndexData[c++]]; + CurrentFrameData[position++] = (byte)(color & 0xFF); + CurrentFrameData[position++] = (byte)(color >> 8 & 0xFF); + CurrentFrameData[position++] = (byte)(color >> 16 & 0xFF); + CurrentFrameData[position++] = (byte)(color >> 24 & 0xFF); + } + } } } }