Blame src/Distinct.c

Packit Service 2b1f13
/*
Packit Service 2b1f13
Packit Service 2b1f13
Copyright 1990, 1998  The Open Group
Packit Service 2b1f13
Packit Service 2b1f13
Permission to use, copy, modify, distribute, and sell this software and its
Packit Service 2b1f13
documentation for any purpose is hereby granted without fee, provided that
Packit Service 2b1f13
the above copyright notice appear in all copies and that both that
Packit Service 2b1f13
copyright notice and this permission notice appear in supporting
Packit Service 2b1f13
documentation.
Packit Service 2b1f13
Packit Service 2b1f13
The above copyright notice and this permission notice shall be included in
Packit Service 2b1f13
all copies or substantial portions of the Software.
Packit Service 2b1f13
Packit Service 2b1f13
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Packit Service 2b1f13
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Packit Service 2b1f13
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
Packit Service 2b1f13
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
Packit Service 2b1f13
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
Packit Service 2b1f13
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Packit Service 2b1f13
Packit Service 2b1f13
Except as contained in this notice, the name of The Open Group shall not be
Packit Service 2b1f13
used in advertising or otherwise to promote the sale, use or other dealings
Packit Service 2b1f13
in this Software without prior written authorization from The Open Group.
Packit Service 2b1f13
Packit Service 2b1f13
*/
Packit Service 2b1f13
Packit Service 2b1f13
/*
Packit Service 2b1f13
 * Author:  Keith Packard, MIT X Consortium
Packit Service 2b1f13
 */
Packit Service 2b1f13
Packit Service 2b1f13
#ifdef HAVE_CONFIG_H
Packit Service 2b1f13
#include <config.h>
Packit Service 2b1f13
#endif
Packit Service 2b1f13
#include <X11/Xlib.h>
Packit Service 2b1f13
#include <stdlib.h>
Packit Service 2b1f13
#include <X11/Xutil.h>
Packit Service 2b1f13
#include <X11/Xmu/StdCmap.h>
Packit Service 2b1f13
Packit Service 2b1f13
/*
Packit Service 2b1f13
 * Distinguishable colors routine.  Determines if two colors are
Packit Service 2b1f13
 * distinguishable or not.  Somewhat arbitrary meaning.
Packit Service 2b1f13
 */
Packit Service 2b1f13
Packit Service 2b1f13
#define MIN_DISTINGUISH	10000.0
Packit Service 2b1f13
Packit Service 2b1f13
Bool
Packit Service 2b1f13
XmuDistinguishableColors(XColor	*colors, int count)
Packit Service 2b1f13
{
Packit Service 2b1f13
    double	    deltaRed, deltaGreen, deltaBlue;
Packit Service 2b1f13
    double	    dist;
Packit Service 2b1f13
    int		    i, j;
Packit Service 2b1f13
Packit Service 2b1f13
    for (i = 0; i < count - 1; i++)
Packit Service 2b1f13
	for (j = i + 1; j < count; j++)
Packit Service 2b1f13
	{
Packit Service 2b1f13
     	    deltaRed = (double)colors[i].red - (double)colors[j].red;
Packit Service 2b1f13
    	    deltaGreen = (double)colors[i].green - (double)colors[j].green;
Packit Service 2b1f13
    	    deltaBlue = (double)colors[i].blue - (double)colors[j].blue;
Packit Service 2b1f13
    	    dist = deltaRed * deltaRed +
Packit Service 2b1f13
	       	   deltaGreen * deltaGreen +
Packit Service 2b1f13
 	       	   deltaBlue * deltaBlue;
Packit Service 2b1f13
	    if (dist <= MIN_DISTINGUISH * MIN_DISTINGUISH)
Packit Service 2b1f13
		return False;
Packit Service 2b1f13
	}
Packit Service 2b1f13
    return True;
Packit Service 2b1f13
}
Packit Service 2b1f13
Packit Service 2b1f13
Bool
Packit Service 2b1f13
XmuDistinguishablePixels(Display *dpy, Colormap cmap,
Packit Service 2b1f13
			 unsigned long *pixels, int  count)
Packit Service 2b1f13
{
Packit Service 2b1f13
    XColor  *defs;
Packit Service 2b1f13
    int	    i, j;
Packit Service 2b1f13
    Bool    ret;
Packit Service 2b1f13
Packit Service 2b1f13
    for (i = 0; i < count - 1; i++)
Packit Service 2b1f13
	for (j = i + 1; j < count; j++)
Packit Service 2b1f13
	    if (pixels[i] == pixels[j])
Packit Service 2b1f13
		return False;
Packit Service 2b1f13
    defs = (XColor *) malloc (count * sizeof (XColor));
Packit Service 2b1f13
    if (!defs)
Packit Service 2b1f13
	return False;
Packit Service 2b1f13
    for (i = 0; i < count; i++)
Packit Service 2b1f13
	defs[i].pixel = pixels[i];
Packit Service 2b1f13
    XQueryColors (dpy, cmap, defs, count);
Packit Service 2b1f13
    ret = XmuDistinguishableColors (defs, count);
Packit Service 2b1f13
    free ((char *) defs);
Packit Service 2b1f13
    return ret;
Packit Service 2b1f13
}