Changed IVideo.CurrentFrameData uint[,] -> byte[]

This commit is contained in:
penev92
2021-08-02 02:26:18 +03:00
committed by Matthias Mailänder
parent 1b5f2f1b39
commit ee29d0f9c7
3 changed files with 32 additions and 13 deletions

View File

@@ -21,7 +21,7 @@ namespace OpenRA.Video
/// <summary> /// <summary>
/// Current frame color data in 32-bit BGRA. /// Current frame color data in 32-bit BGRA.
/// </summary> /// </summary>
uint[,] CurrentFrameData { get; } byte[] CurrentFrameData { get; }
int CurrentFrameNumber { get; } int CurrentFrameNumber { get; }
void AdvanceFrame(); void AdvanceFrame();

View File

@@ -23,7 +23,7 @@ namespace OpenRA.Mods.Cnc.FileFormats
public ushort Width { get; } public ushort Width { get; }
public ushort Height { get; } public ushort Height { get; }
public uint[,] CurrentFrameData { get; } public byte[] CurrentFrameData { get; }
public int CurrentFrameNumber { get; private set; } public int CurrentFrameNumber { get; private set; }
public bool HasAudio { get; set; } public bool HasAudio { get; set; }
@@ -145,8 +145,7 @@ namespace OpenRA.Mods.Cnc.FileFormats
CollectAudioData(); CollectAudioData();
var frameSize = Exts.NextPowerOf2(Math.Max(Width, Height)); CurrentFrameData = new byte[Width * Height * 4];
CurrentFrameData = new uint[frameSize, frameSize];
Reset(); Reset();
} }
@@ -481,8 +480,16 @@ namespace OpenRA.Mods.Cnc.FileFormats
for (var i = 0; i < blockWidth; i++) for (var i = 0; i < blockWidth; i++)
{ {
var cbfi = (mod * 256 + px) * 8 + j * blockWidth + i; var cbfi = (mod * 256 + px) * 8 + j * blockWidth + i;
var color = (mod == 0x0f) ? px : cbf[cbfi]; var colorIndex = (mod == 0x0f) ? px : cbf[cbfi];
CurrentFrameData[y * blockHeight + j, x * blockWidth + i] = palette[color]; 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++) for (var i = 0; i < count; i++)
{ {
var frameX = x * blockWidth;
var frameY = y * blockHeight;
var offset = blockNumber * blockHeight * blockWidth * 3; var offset = blockNumber * blockHeight * blockWidth * 3;
for (var by = 0; by < blockHeight; by++) for (var by = 0; by < blockHeight; by++)
for (var bx = 0; bx < blockWidth; bx++) for (var bx = 0; bx < blockWidth; bx++)
{ {
var p = (bx + by * blockWidth) * 3; 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++; x++;

View File

@@ -22,7 +22,7 @@ namespace OpenRA.Mods.Cnc.FileFormats
public ushort Width { get; } public ushort Width { get; }
public ushort Height { get; } public ushort Height { get; }
public uint[,] CurrentFrameData { get; } public byte[] CurrentFrameData { get; }
public int CurrentFrameNumber { get; private set; } public int CurrentFrameNumber { get; private set; }
public bool HasAudio => false; public bool HasAudio => false;
@@ -78,8 +78,7 @@ namespace OpenRA.Mods.Cnc.FileFormats
frameOffsets[i] += 768; frameOffsets[i] += 768;
} }
var frameSize = Exts.NextPowerOf2(Math.Max(Width, Height)); CurrentFrameData = new byte[Width * Height * 4];
CurrentFrameData = new uint[frameSize, frameSize];
Reset(); Reset();
} }
@@ -123,9 +122,18 @@ namespace OpenRA.Mods.Cnc.FileFormats
XORDeltaCompression.DecodeInto(intermediateData, currentFramePaletteIndexData, 0); XORDeltaCompression.DecodeInto(intermediateData, currentFramePaletteIndexData, 0);
var c = 0; var c = 0;
var position = 0;
for (var y = 0; y < Height; y++) for (var y = 0; y < Height; y++)
{
for (var x = 0; x < Width; x++) 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);
}
}
} }
} }
} }