// Maps image colors to the color map
        protected void AnalyzePixels()
        {
            int len  = m_Pixels.Length;
            int nPix = len / 3;

            m_IndexedPixels = new byte[nPix];
            // Analyze image colors and create color map (original, expensive, Moments Recorder behaviour)
            if (m_FramesPerColorSample == 0)
            {
                nq         = new NeuQuant(m_Pixels, len, (int)m_SampleInterval);
                m_ColorTab = nq.Process();                 // Create reduced palette
            }
            // Map image pixels to new palette
            int k = 0;

            for (int i = 0; i < nPix; i++)
            {
                int index = nq.Map(m_Pixels[k++] & 0xff, m_Pixels[k++] & 0xff, m_Pixels[k++] & 0xff);
                m_UsedEntry[index] = true;
                m_IndexedPixels[i] = (byte)index;
            }

            m_Pixels      = null;
            m_ColorDepth  = 8;
            m_PaletteSize = 7;
        }
        /// <summary>
        /// Builds a colour map out of the combined colours from several frames.
        /// </summary>
        /// <param name="frames">List of frames to sample colour palette from</param>
        public void BuildPalette(ref FixedSizedQueue <GifFrame> frames)
        {
            // Do not build the color palette here if user wants separate palettes created per frame
            if (m_FramesPerColorSample == 0)
            {
                return;
            }

            GifFrame frame = frames.ElementAt(0);

            // Initialize a large image
            Byte[] combinedPixels = new Byte[3 * frame.Width * frame.Height * (1 + frames.Count() / m_FramesPerColorSample)];
            int    count          = 0;

            // Stich the large image together out of pixels from several frames
            for (int i = 0; i < frames.Count(); i += m_FramesPerColorSample)
            {
                frame = frames.ElementAt(0);
                Color32[] p = frame.Data;
                // Texture data is layered down-top, so flip it
                for (int th = frame.Height - 1; th >= 0; th--)
                {
                    for (int tw = 0; tw < frame.Width; tw++)
                    {
                        Color32 color = p[th * frame.Width + tw];
                        combinedPixels[count] = color.r; count++;
                        combinedPixels[count] = color.g; count++;
                        combinedPixels[count] = color.b; count++;
                    }
                }
            }
            // Run the quantizer over our stitched together image and create reduced palette
            nq         = new NeuQuant(combinedPixels, combinedPixels.Length, (int)m_SampleInterval);
            m_ColorTab = nq.Process();
        }