private static int DecodeBitmap(
ref byte[] fart,
int height,
int width,
int depth,
int bitsPerPixel,
BitmapType type,
BitmapFormat format,
bool swizzle,
Map map,
int visualchunkindex,
int ident)
{
byte[] poo = new byte[0];
int poolength;
byte[] tempData;
DecodeDXT decode = new DecodeDXT();
int stride = width;
if (swizzle)
{
fart = Swizzler.Swizzle(fart, width, height, depth, bitsPerPixel, true);
}
switch (format)
{
#region DXT1
case (BitmapFormat)14:
if (swizzle)
{
MessageBox.Show("Swizzled");
}
fart = decode.DecodeDXT1(height, width, fart);
stride *= 4;
break;
#endregion
#region DXT2/3
case (BitmapFormat)15:
if (swizzle)
{
MessageBox.Show("Swizzled");
}
fart = decode.DecodeDXT23(height, width, fart);
stride *= 4;
break;
#endregion
#region DXT 4/5
case (BitmapFormat)16:
if (swizzle)
{
MessageBox.Show("Swizzled");
}
fart = decode.DecodeDXT45(height, width, fart);
stride *= 4;
break;
#endregion
#region A8R8G8B8
case (BitmapFormat)11:
stride *= 4;
break;
#endregion
#region X8R8G8B8
case (BitmapFormat)10:
stride *= 4;
/*
poolength = fart.Length;
tempData = new byte[poolength];
for (int e = 0; e < poolength; e++)
tempData[e * 4 + 3] = 255; // Alpha always 255
fart = tempData;
*/
break;
#endregion
#region // 16 bit \\
#region A4R4G4B4
case (BitmapFormat)9:
stride *= 4;
poolength = fart.Length;
tempData = new byte[poolength * 2];
for (int e = 0; e < poolength / 2; e++)
{
int r = e * 2;
tempData[r * 2 + 0] = (byte)((fart[r + 1] & 0xFF) >> 0); // Blue
tempData[r * 2 + 1] = (byte)((fart[r + 0] & 0xFF) >> 0); // Green
tempData[r * 2 + 2] = (byte)((fart[r + 0] & 0xFF) >> 0); // Red
tempData[r * 2 + 3] = 255; // (byte)(((fart[r + 1] & 0xFF) >> 0)); // Alpha
}
fart = tempData;
break;
#endregion
#region G8B8
case (BitmapFormat)22:
stride *= 4;
poolength = fart.Length;
tempData = new byte[poolength / 2 * 4];
// These are actually signed (+/-128), so convert to unsigned
for (int e = 0; e < poolength / 2; e++)
{
int r = e * 2;
tempData[r * 2 + 0] = (byte)(fart[r + 1] + 128); // Blue
tempData[r * 2 + 1] = (byte)(fart[r + 1] + 128); // Green
tempData[r * 2 + 2] = (byte)(fart[r + 0] + 128); // Red
tempData[r * 2 + 3] = (byte)(fart[r + 0] + 128); // Alpha
}
fart = tempData;
break;
#endregion
#region A1R5G5B5
case (BitmapFormat)8:
stride *= 4;
poolength = fart.Length;
tempData = new byte[poolength / 2 * 4];
for (int r = 0; r < fart.Length; r += 2)
{
int temp = fart[r + 0] + (fart[r + 1] << 8);
tempData[r * 2 + 0] = (byte)(((temp >> 0) & 0x1F) * 255 / 0x1F); // 5-bit Blue
tempData[r * 2 + 1] = (byte)(((temp >> 5) & 0x1F) * 255 / 0x1F); // 5-bit Green
tempData[r * 2 + 2] = (byte)(((temp >> 10) & 0x1F) * 255 / 0x1F); // 5-bit Red
tempData[r * 2 + 3] = (byte)(((temp >> 15) & 0x01) * 255); // 1-bit Alpha
}
fart = tempData;
break;
#endregion
#region R5G6B5
case (BitmapFormat)6:
stride *= 4;
poolength = fart.Length;
tempData = new byte[poolength / 2 * 4];
for (int r = 0; r < fart.Length; r += 2)
{
int temp = fart[r + 0] + (fart[r + 1] << 8);
tempData[r * 2 + 0] = (byte)(((temp >> 0) & 0x1F) * 255 / 0x1F); // 5-bit Blue
tempData[r * 2 + 1] = (byte)(((temp >> 5) & 0x3F) * 255 / 0x3F); // 6-bit Green
tempData[r * 2 + 2] = (byte)(((temp >> 11) & 0x1F) * 255 / 0x1F); // 5-bit Red
tempData[r * 2 + 3] = 255; // Alpha always 255
}
fart = tempData;
break;
#endregion
#region A8Y8
case (BitmapFormat)3:
poolength = fart.Length;
tempData = new byte[poolength / 2 * 4];
for (int e = 0; e < poolength / 2; e++)
{
int r = e * 2;
tempData[r * 2 + 0] = fart[r + 1]; // B
tempData[r * 2 + 1] = fart[r + 1]; // G
tempData[r * 2 + 2] = fart[r + 1]; // R
tempData[r * 2 + 3] = fart[r + 0]; // A
}
fart = tempData;
stride *= 4;
break;
#endregion
#region Unknown - Very similar (exactly?) to G8B8
case (BitmapFormat)23:
stride *= 4;
poolength = fart.Length;
tempData = new byte[poolength / 2 * 4];
// These are actually signed (+/-128), so convert to unsigned
for (int e = 0; e < poolength / 2; e++)
{
int r = e * 2;
tempData[r * 2 + 0] = (byte)(fart[r + 1] + 128); // Blue
tempData[r * 2 + 1] = (byte)(fart[r + 1] + 128); // Green
tempData[r * 2 + 2] = (byte)(fart[r + 0] + 128); // Red
tempData[r * 2 + 3] = (byte)(fart[r + 0] + 128); // Alpha
}
fart = tempData;
break;
#endregion
#endregion
#region // 8 bit \\
#region P8
case BitmapFormat.BITM_FORMAT_P8:
poolength = fart.Length;
tempData = new byte[poolength * 4];
for (int e = 0; e < poolength; e++)
{
int r = e * 4;
tempData[r + 0] = fart[e];
tempData[r + 1] = fart[e];
tempData[r + 2] = fart[e];
tempData[r + 3] = 255;
}
fart = tempData;
stride *= 4;
break;
#endregion
#region A8
case BitmapFormat.BITM_FORMAT_A8:
poolength = fart.Length;
tempData = new byte[poolength * 4];
for (int e = 0; e < poolength; e++)
{
int r = e * 4;
tempData[r + 0] = fart[e];
tempData[r + 1] = fart[e];
tempData[r + 2] = fart[e];
tempData[r + 3] = 255;
}
fart = tempData;
stride *= 4;
break;
#endregion
#region AY8
case BitmapFormat.BITM_FORMAT_AY8:
poolength = fart.Length;
tempData = new byte[poolength * 4];
for (int e = 0; e < poolength; e++)
{
int r = e * 4;
tempData[r + 0] = (byte)(fart[e]);
tempData[r + 1] = (byte)(fart[e]);
tempData[r + 2] = (byte)(fart[e]);
tempData[r + 3] = (byte)(fart[e] == 0 ? 0 : 255);
}
fart = tempData;
stride *= 4;
break;
#endregion
#region Y8
case (BitmapFormat)1:
poolength = fart.Length;
tempData = new byte[poolength * 4];
for (int e = 0; e < poolength; e++)
{
int r = e * 4;
tempData[r + 0] = fart[e];
tempData[r + 1] = fart[e];
tempData[r + 2] = fart[e];
tempData[r + 3] = 255;
}
fart = tempData;
stride *= 4;
break;
#endregion
#region LightMap
case BitmapFormat.BITM_FORMAT_LIGHTMAP:
poolength = fart.Length;
tempData = new byte[poolength * 4];
int bspnumber = ident;
int paletteindex = -1;
if (visualchunkindex < 0)
{
int wtf = 0 - (visualchunkindex + 1);
paletteindex = map.BSP.sbsp[bspnumber].SceneryChunk_LightMap_Index[wtf];
}
if (paletteindex == -1)
{
for (int i = 0; i < map.BSP.sbsp[bspnumber].VisualChunk_Bitmap_Index.Length; i++)
{
if (map.BSP.sbsp[bspnumber].VisualChunk_Bitmap_Index[i] == visualchunkindex)
{
paletteindex = map.BSP.sbsp[bspnumber].VisualChunk_LightMap_Index[visualchunkindex];
break;
}
}
}
if (paletteindex == -1)
{
for (int i = 0; i < map.BSP.sbsp[bspnumber].SceneryChunk_Bitmap_Index.Length; i++)
{
if (map.BSP.sbsp[bspnumber].SceneryChunk_Bitmap_Index[i] == visualchunkindex)
{
paletteindex = map.BSP.sbsp[bspnumber].SceneryChunk_LightMap_Index[i];
break;
}
}
}
if (paletteindex != 255)
{
for (int e = 0; e < poolength; e++)
{
int r = e * 4;
tempData[r + 0] = (byte)map.BSP.sbsp[bspnumber].LightMap_Palettes[paletteindex][fart[e]].r;
tempData[r + 1] = (byte)map.BSP.sbsp[bspnumber].LightMap_Palettes[paletteindex][fart[e]].g;
tempData[r + 2] = (byte)map.BSP.sbsp[bspnumber].LightMap_Palettes[paletteindex][fart[e]].b;
tempData[r + 3] = (byte)map.BSP.sbsp[bspnumber].LightMap_Palettes[paletteindex][fart[e]].a;
}
fart = tempData;
stride *= 4;
}
break;
#endregion
#endregion
}
return stride;
}