static float computeAlphaError(BC5Block src, BC5Block dst, float bestError = float.MaxValue) { //byte[] alphas = new byte[8]; //dst.evaluatePalette(alphas, false); // @@ Use target decoder. float totalError = 0; //for (uint i = 0; i< 16; i++) //{ // byte alpha = src.alpha[i]; // int minDist = int.MaxValue; // for (uint p = 0; p< 8; p++) // { // int dist = alphaDistance(alpha, alphas[p]); // minDist = Math.Min(dist, minDist); // } // totalError += minDist* src.weights[i]; // if (totalError > bestError) // { // // early out // return totalError; // } //} return(totalError); }
internal static void CompressBC5Block(BC5Block src, BC5Block dst) { //byte mina = 255; //byte maxa = 0; //byte mina_no01 = 255; //byte maxa_no01 = 0; //// Get min/max alpha. //for (uint i = 0; i < 16; i++) //{ // byte alpha = src.alpha[i]; // mina = Math.Min(mina, alpha); // maxa = Math.Max(maxa, alpha); // if (alpha != 0 && alpha != 255) // { // mina_no01 = Math.Min(mina_no01, alpha); // maxa_no01 = Math.Max(maxa_no01, alpha); // } //} //if (maxa - mina < 8) //{ // dst.alpha0 = maxa; // dst.alpha1 = mina; // //nvDebugCheck(computeAlphaError(src, dst) == 0); //} //else if (maxa_no01 - mina_no01 < 6) //{ // dst.alpha0 = mina_no01; // dst.alpha1 = maxa_no01; // //nvDebugCheck(computeAlphaError(src, dst) == 0); //} //else //{ // float besterror = computeAlphaError(src, dst); // int besta0 = maxa; // int besta1 = mina; // // Expand search space a bit. // const byte alphaExpand = 8; // mina = (byte)((mina <= alphaExpand) ? 0 : mina - alphaExpand); // maxa = (byte)((maxa >= 255 - alphaExpand) ? (byte)255 : maxa + alphaExpand); // for (int a0 = mina + 9; a0 < maxa; a0++) // { // for (int a1 = mina; a1 < a0 - 8; a1++) // { // //nvDebugCheck(a0 - a1 > 8); // dst.alpha0 = (byte)a0; // dst.alpha1 = (byte)a1; // float error = computeAlphaError(src, dst, besterror); // if (error < besterror) // { // besterror = error; // besta0 = a0; // besta1 = a1; // } // } // } // // Try using the 6 step encoding. // /*if (mina == 0 || maxa == 255)*/ // { // // Expand search space a bit. // const int alphaExpand = 6; // mina_no01 = (mina_no01 <= alphaExpand) ? 0 : mina_no01 - alphaExpand; // maxa_no01 = (maxa_no01 >= 255 - alphaExpand) ? 255 : maxa_no01 + alphaExpand; // for (int a0 = mina_no01 + 9; a0 < maxa_no01; a0++) // { // for (int a1 = mina_no01; a1 < a0 - 8; a1++) // { // nvDebugCheck(a0 - a1 > 8); // dst->alpha0 = a1; // dst->alpha1 = a0; // float error = computeAlphaError(src, dst, besterror); // if (error < besterror) // { // besterror = error; // besta0 = a1; // besta1 = a0; // } // } // } // } // dst->alpha0 = besta0; // dst->alpha1 = besta1; //} //computeAlphaIndices(src, dst); }