internal static void CompressRGBTexel(byte[] imgData, int sourcePosition, int sourceLineLength, byte[] destination, int destPosition, bool isDXT1, double alphaRef, AlphaSettings alphaSetting)
{
int uSteps = 4;
// Determine if texel is fully and entirely transparent. If so, can set to white and continue.
if (isDXT1)
{
uSteps = CheckDXT1TexelFullTransparency(imgData, sourcePosition, sourceLineLength, destination, destPosition, alphaSetting, alphaRef);
if (uSteps == -1)
return;
}
RGBColour[] Colour = new RGBColour[16];
// Some kind of colour adjustment. Not sure what it does, especially if it wasn't dithering...
DoColourFixErrorCorrection(Colour, imgData, sourcePosition, sourceLineLength, alphaSetting);
// Palette colours
RGBColour ColourA, ColourB, ColourC, ColourD;
ColourA = new RGBColour();
ColourB = new RGBColour();
ColourC = new RGBColour();
ColourD = new RGBColour();
// OPTIMISER
RGBColour[] minmax = OptimiseRGB(Colour, uSteps);
ColourA = minmax[0];
ColourB = minmax[1];
// Create interstitial colours?
ColourC.r = ColourA.r * LuminanceInv.r;
ColourC.g = ColourA.g * LuminanceInv.g;
ColourC.b = ColourA.b * LuminanceInv.b;
ColourD.r = ColourB.r * LuminanceInv.r;
ColourD.g = ColourB.g * LuminanceInv.g;
ColourD.b = ColourB.b * LuminanceInv.b;
// Yeah...dunno
uint wColourA = Encode565(ColourC);
uint wColourB = Encode565(ColourD);
// Min max are equal - only interpolate 4 interstitial colours
if (uSteps == 4 && wColourA == wColourB)
{
var c2 = BitConverter.GetBytes(wColourA);
var c1 = BitConverter.GetBytes(wColourB); ///////////////////// MIN MAX
destination[destPosition] = c2[0];
destination[destPosition + 1] = c2[1];
destination[destPosition + 2] = c1[0];
destination[destPosition + 3] = c1[1];
return;
}
// Interpolate 6 colours or something
ColourC = Decode565(wColourA);
ColourD = Decode565(wColourB);
ColourA.r = ColourC.r * Luminance.r;
ColourA.g = ColourC.g * Luminance.g;
ColourA.b = ColourC.b * Luminance.b;
ColourB.r = ColourD.r * Luminance.r;
ColourB.g = ColourD.g * Luminance.g;
ColourB.b = ColourD.b * Luminance.b;
var step = DoSomethingWithPalette(uSteps, wColourA, wColourB, ColourA, ColourB);
// Calculating colour direction apparently
RGBColour Dir = new RGBColour()
{
r = step[1].r - step[0].r,
g = step[1].g - step[0].g,
b = step[1].b - step[0].b
};
float fscale = (wColourA != wColourB) ? ((uSteps - 1) / (Dir.r * Dir.r + Dir.g * Dir.g + Dir.b * Dir.b)) : 0.0f;
Dir.r *= fscale;
Dir.g *= fscale;
Dir.b *= fscale;
// Encoding colours apparently
uint dw = DoOtherColourFixErrorCorrection(imgData, sourcePosition, sourceLineLength, uSteps, alphaRef, alphaSetting, step, Dir);
uint Min = (uSteps == 3) == (wColourA <= wColourB) ? wColourA : wColourB;
uint Max = (uSteps == 3) == (wColourA <= wColourB) ? wColourB : wColourA;
var colour1 = BitConverter.GetBytes(Min);
var colour2 = BitConverter.GetBytes(Max);
destination[destPosition] = colour1[0];
destination[destPosition + 1] = colour1[1];
destination[destPosition + 2] = colour2[0];
destination[destPosition + 3] = colour2[1];
var indicies = BitConverter.GetBytes(dw);
destination[destPosition + 4] = indicies[0];
destination[destPosition + 5] = indicies[1];
destination[destPosition + 6] = indicies[2];
destination[destPosition + 7] = indicies[3];
}