mirror of
https://github.com/Gericom/EveryFileExplorer.git
synced 2025-06-19 01:15:36 -04:00
78 lines
2.6 KiB
C#
78 lines
2.6 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Drawing;
|
|
|
|
namespace LibEveryFileExplorer.GFX
|
|
{
|
|
public class DTX
|
|
{
|
|
public static uint[] DecodeDTX1(ushort Color0, ushort Color1, uint Data)
|
|
{
|
|
uint[] Palette = new uint[4];
|
|
Palette[0] = GFXUtil.ConvertColorFormat(Color0, ColorFormat.RGB565, ColorFormat.ARGB8888);
|
|
Palette[1] = GFXUtil.ConvertColorFormat(Color1, ColorFormat.RGB565, ColorFormat.ARGB8888);
|
|
Color a = Color.FromArgb((int)Palette[0]);
|
|
Color b = Color.FromArgb((int)Palette[1]);
|
|
if (Color0 > Color1)//1/3 and 2/3
|
|
{
|
|
Palette[2] = GFXUtil.ToColorFormat((a.R * 2 + b.R * 1) / 3, (a.G * 2 + b.G * 1) / 3, (a.B * 2 + b.B * 1) / 3, ColorFormat.ARGB8888);
|
|
Palette[3] = GFXUtil.ToColorFormat((a.R * 1 + b.R * 2) / 3, (a.G * 1 + b.G * 2) / 3, (a.B * 1 + b.B * 2) / 3, ColorFormat.ARGB8888);
|
|
}
|
|
else//1/2 and transparent
|
|
{
|
|
Palette[2] = GFXUtil.ToColorFormat((a.R + b.R) / 2, (a.G + b.G) / 2, (a.B + b.B) / 2, ColorFormat.ARGB8888);
|
|
Palette[3] = 0;
|
|
}
|
|
|
|
uint[] Result = new uint[4 * 4];
|
|
|
|
int q = 30;
|
|
for (int y = 0; y < 4; y++)
|
|
{
|
|
for (int x = 0; x < 4; x++)
|
|
{
|
|
Result[y * 4 + x] = Palette[(Data >> q) & 3];
|
|
q -= 2;
|
|
}
|
|
}
|
|
return Result;
|
|
}
|
|
|
|
public static uint[] DecodeDTX5(ushort Color0, ushort Color1, uint Data, ulong AData)
|
|
{
|
|
uint[] Result = DecodeDTX1(Color0, Color1, Data);
|
|
byte[] AlphaPalette = new byte[8];
|
|
AlphaPalette[0] = (byte)(AData & 0xFF);
|
|
AlphaPalette[1] = (byte)((AData >> 8) & 0xFF);
|
|
AData >>= 16;
|
|
if (AlphaPalette[0] > AlphaPalette[1])
|
|
{
|
|
AlphaPalette[2] = (byte)((6 * AlphaPalette[0] + 1 * AlphaPalette[1]) / 7);
|
|
AlphaPalette[3] = (byte)((5 * AlphaPalette[0] + 2 * AlphaPalette[1]) / 7);
|
|
AlphaPalette[4] = (byte)((4 * AlphaPalette[0] + 3 * AlphaPalette[1]) / 7);
|
|
AlphaPalette[5] = (byte)((3 * AlphaPalette[0] + 4 * AlphaPalette[1]) / 7);
|
|
AlphaPalette[6] = (byte)((2 * AlphaPalette[0] + 5 * AlphaPalette[1]) / 7);
|
|
AlphaPalette[7] = (byte)((1 * AlphaPalette[0] + 6 * AlphaPalette[1]) / 7);
|
|
}
|
|
else
|
|
{
|
|
AlphaPalette[2] = (byte)((4 * AlphaPalette[0] + 1 * AlphaPalette[1]) / 5);
|
|
AlphaPalette[3] = (byte)((3 * AlphaPalette[0] + 2 * AlphaPalette[1]) / 5);
|
|
AlphaPalette[4] = (byte)((2 * AlphaPalette[0] + 3 * AlphaPalette[1]) / 5);
|
|
AlphaPalette[5] = (byte)((1 * AlphaPalette[0] + 4 * AlphaPalette[1]) / 5);
|
|
AlphaPalette[6] = 0;
|
|
AlphaPalette[7] = 255;
|
|
}
|
|
int aq = 45;
|
|
for (int i = 0; i < 16; i++)
|
|
{
|
|
Result[i] = (Result[i] & 0xFFFFFF) | ((uint)AlphaPalette[(AData >> aq) & 7] << 24);
|
|
aq -= 3;
|
|
}
|
|
return Result;
|
|
}
|
|
}
|
|
}
|