mysimulation/server/TargaImage/RawTGABitmap.cs
Tony Bark 199256785b Port FSO's Server architecture
- FreeSO's older libaries use .NET Standard
- Added TargaImage, needs to be ported
2024-05-06 06:46:27 -04:00

74 lines
2.7 KiB
C#

using System;
namespace TargaImagePCL
{
public class RawTGABitmap
{
public int Width;
public int Height;
public byte[] Data;
public TGAPixelFormat Format;
public RawTGABitmap(int width, int height, byte[] data, TGAPixelFormat format)
{
Width = width;
Height = height;
Data = data;
Format = format;
}
public byte[] ToBGRA(bool premultiply)
{
//bitorder output: bbbbbbbb gggggggg rrrrrrrr aaaaaaaa
byte[] result = null;
if (Format == TGAPixelFormat.RGB_32bpp || Format == TGAPixelFormat.ARGB_32bpp)
{
bool useAlpha = Format == TGAPixelFormat.ARGB_32bpp;
result = new byte[Data.Length];
for (int i = 0; i < Data.Length; i += 4)
{ //flip red and blue and premultiply alpha
result[i + 3] = (useAlpha)?Data[i + 3]:(byte)255;
float a = (premultiply) ? (Data[i + 3] / 255f) : 1;
result[i + 2] = (byte)(Data[i] * a);
result[i + 1] = (byte)(Data[i + 1] * a);
result[i] = (byte)(Data[i + 2] * a);
}
}
else if (Format == TGAPixelFormat.RGB_24bpp)
{
result = new byte[Width*Height*4];
var j = 0;
for (int i = 0; i < Data.Length; i += 3)
{ //flip red and blue and remove key colour
var a = (byte)((Data[i] > 0xFD && Data[i + 1] < 3 && Data[i + 2] > 0xFD)?0:255);
result[j + 3] = a;
result[j + 2] = (byte)(Data[i] & a);
result[j + 1] = (byte)(Data[i + 1] & a);
result[j] = (byte)(Data[i + 2] & a);
j += 4;
}
}
else if (Format == TGAPixelFormat.ARGB1555_16bpp || Format == TGAPixelFormat.RGB555_16bpp)
{
bool useAlpha = Format == TGAPixelFormat.ARGB1555_16bpp;
result = new byte[Width * Height * 4];
throw new NotImplementedException("16-bit TGA not yet implemented.");
}
else if (Format == TGAPixelFormat.Grayscale_8bpp)
{
result = new byte[Width * Height * 4];
for (int i = 0; i < Data.Length; i ++)
{ //fill with gray
var g = Data[i];
result[i + 3] = 255;
result[i + 2] = g;
result[i + 1] = g;
result[i] = g;
}
}
//else undefined. return null.
return result;
}
}
}