/////////////////////////////////////////////////////////////////////////////////
// Paint.NET
// Copyright (C) Rick Brewster, Chris Crosetto, Dennis Dietrich, Tom Jackson, 
//               Michael Kelsey, Brandon Ortiz, Craig Taylor, Chris Trevino, 
//               and Luke Walker
// Portions Copyright (C) Microsoft Corporation. All Rights Reserved.
// See src/setup/License.rtf for complete licensing and attribution information.
/////////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////
// Copied for Paint.NET PCX Plugin
// Copyright (C) Joshua Bell
/////////////////////////////////////////////////////////////////////////////////

//Bizhawk says: adapted from https://github.com/inexorabletash/PcxFileType/blob/master/Quantize

using System.Drawing;

namespace BizHawk.Client.EmuHawk
{
    public sealed class PaletteTable
    {
        private Color[] palette;

        public Color this[int index]
        {
            get
            {
                return this.palette[index];
            }

            set
            {
                this.palette[index] = value;
            }
        }

        private int GetDistanceSquared(Color a, Color b)
        {
            int dsq = 0; // delta squared
            int v; 

            v = a.B - b.B;
            dsq += v * v;
            v = a.G - b.G;
            dsq += v * v;
            v = a.R - b.R;
            dsq += v * v;

            return dsq;
        }

        public int FindClosestPaletteIndex(Color pixel)
        {
            int dsqBest = int.MaxValue;
            int ret = 0;

            for (int i = 0; i < this.palette.Length; ++i)
            {
                int dsq = GetDistanceSquared(this.palette[i], pixel);

                if (dsq < dsqBest)
                {
                    dsqBest = dsq;
                    ret = i;
                }
            }

            return ret;
        }

        public PaletteTable(Color[] palette)
        {
            this.palette = (Color[])palette.Clone();
        }
    }
}
