private ExqFloat SortByDir(ExqHistogramEntry pHist) { return(pHist.color.r * sortDir.r + pHist.color.g * sortDir.g + pHist.color.b * sortDir.b + pHist.color.a * sortDir.a); }
private void Sort(ref ExqHistogramEntry ppHist, SortFunction sortfunc) { ExqHistogramEntry pLow, pHigh, pCur, pNext; int n = 0; ExqFloat sum = 0; for (pCur = ppHist; pCur != null; pCur = pCur.pNext) { n++; sum += sortfunc(pCur); } if (n < 2) { return; } sum /= n; pLow = pHigh = null; for (pCur = ppHist; pCur != null; pCur = pNext) { pNext = pCur.pNext; if (sortfunc(pCur) < sum) { pCur.pNext = pLow; pLow = pCur; } else { pCur.pNext = pHigh; pHigh = pCur; } } if (pLow == null) { ppHist = pHigh; return; } if (pHigh == null) { ppHist = pLow; return; } Sort(ref pLow, sortfunc); Sort(ref pHigh, sortfunc); ppHist = pLow; while (pLow.pNext != null) { pLow = pLow.pNext; } pLow.pNext = pHigh; }
public void Feed(byte[] pData) { byte channelMask = (byte)(0xFF00 >> pExq.numBitsPerChannel); int nPixels = pData.Length / 4; for (int i = 0; i < nPixels; i++) { byte r = pData[i * 4 + 0], g = pData[i * 4 + 1], b = pData[i * 4 + 2], a = pData[i * 4 + 3]; uint hash = MakeHash(ToRGBA(r, g, b, a)); ExqHistogramEntry pCur = pExq.pHash[hash]; while (pCur != null && (pCur.ored != r || pCur.ogreen != g || pCur.oblue != b || pCur.oalpha != a)) { pCur = pCur.pNextInHash; } if (pCur != null) { pCur.num++; } else { pCur = new ExqHistogramEntry(); pCur.pNextInHash = pExq.pHash[hash]; pExq.pHash[hash] = pCur; pCur.ored = r; pCur.ogreen = g; pCur.oblue = b; pCur.oalpha = a; r &= channelMask; g &= channelMask; b &= channelMask; pCur.color.r = r / 255.0f * SCALE_R; pCur.color.g = g / 255.0f * SCALE_G; pCur.color.b = b / 255.0f * SCALE_B; pCur.color.a = a / 255.0f * SCALE_A; if (pExq.transparency) { pCur.color.r *= pCur.color.a; pCur.color.g *= pCur.color.a; pCur.color.b *= pCur.color.a; } pCur.num = 1; pCur.palIndex = -1; pCur.ditherScale.r = pCur.ditherScale.g = pCur.ditherScale.b = pCur.ditherScale.a = -1; pCur.ditherIndex[0] = pCur.ditherIndex[1] = pCur.ditherIndex[2] = pCur.ditherIndex[3] = -1; } } }
private ExqFloat SortByAlpha(ExqHistogramEntry pHist) { return(pHist.color.a); }
private ExqFloat SortByBlue(ExqHistogramEntry pHist) { return(pHist.color.b); }
private ExqFloat SortByGreen(ExqHistogramEntry pHist) { return(pHist.color.g); }
private ExqFloat SortByRed(ExqHistogramEntry pHist) { return(pHist.color.r); }