Exemplo n.º 1
0
 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);
 }
Exemplo n.º 2
0
        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;
        }
Exemplo n.º 3
0
        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;
                }
            }
        }
Exemplo n.º 4
0
 private ExqFloat SortByAlpha(ExqHistogramEntry pHist)
 {
     return(pHist.color.a);
 }
Exemplo n.º 5
0
 private ExqFloat SortByBlue(ExqHistogramEntry pHist)
 {
     return(pHist.color.b);
 }
Exemplo n.º 6
0
 private ExqFloat SortByGreen(ExqHistogramEntry pHist)
 {
     return(pHist.color.g);
 }
Exemplo n.º 7
0
 private ExqFloat SortByRed(ExqHistogramEntry pHist)
 {
     return(pHist.color.r);
 }