mirror of
https://github.com/simtactics/mysimulation.git
synced 2025-03-15 14:51:21 +00:00
75 lines
2.7 KiB
C#
75 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;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|