Blame src/VisCmap.c

Packit Service 2b1f13
/*
Packit Service 2b1f13
Packit Service 2b1f13
Copyright 1989, 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:  Donna Converse, 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 <stdio.h>
Packit Service 2b1f13
#include <math.h>
Packit Service 2b1f13
#include <X11/Xlib.h>
Packit Service 2b1f13
#include <X11/Xatom.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
 * To create all of the appropriate standard colormaps for a given visual on
Packit Service 2b1f13
 * a given screen, use XmuVisualStandardColormaps.
Packit Service 2b1f13
 *
Packit Service 2b1f13
 * Define all appropriate standard colormap properties for the given visual.
Packit Service 2b1f13
 * If replace is true, any previous definition will be removed.
Packit Service 2b1f13
 * If retain is true, new properties will be retained for the duration of
Packit Service 2b1f13
 * the server session.  Return 0 on failure, non-zero on success.
Packit Service 2b1f13
 * On failure, no new properties will be defined, and, old ones may have
Packit Service 2b1f13
 * been removed if replace was True.
Packit Service 2b1f13
 *
Packit Service 2b1f13
 * Not all standard colormaps are meaningful to all visual classes.  This
Packit Service 2b1f13
 * routine will check and define the following properties for the following
Packit Service 2b1f13
 * classes, provided that the size of the colormap is not too small.
Packit Service 2b1f13
 *
Packit Service 2b1f13
 *	DirectColor and PseudoColor
Packit Service 2b1f13
 *	    RGB_DEFAULT_MAP
Packit Service 2b1f13
 *	    RGB_BEST_MAP
Packit Service 2b1f13
 *	    RGB_RED_MAP
Packit Service 2b1f13
 *	    RGB_GREEN_MAP
Packit Service 2b1f13
 * 	    RGB_BLUE_MAP
Packit Service 2b1f13
 *          RGB_GRAY_MAP
Packit Service 2b1f13
 *
Packit Service 2b1f13
 *	TrueColor and StaticColor
Packit Service 2b1f13
 *	    RGB_BEST_MAP
Packit Service 2b1f13
 *
Packit Service 2b1f13
 *	GrayScale and StaticGray
Packit Service 2b1f13
 *	    RGB_GRAY_MAP
Packit Service 2b1f13
 */
Packit Service 2b1f13
Packit Service 2b1f13
Status
Packit Service 2b1f13
XmuVisualStandardColormaps(Display *dpy, int screen, VisualID visualid,
Packit Service 2b1f13
			   unsigned int depth, Bool replace, Bool retain)
Packit Service 2b1f13
     /*
Packit Service 2b1f13
      * dpy			- specifies server connection
Packit Service 2b1f13
      * screen			- specifies screen number
Packit Service 2b1f13
      * visualid		- specifies the visual
Packit Service 2b1f13
      * depth			- specifies the visual
Packit Service 2b1f13
      * replace	specifies	- whether to replace
Packit Service 2b1f13
      * retain			- specifies whether to retain
Packit Service 2b1f13
      */
Packit Service 2b1f13
{
Packit Service 2b1f13
    Status		status;
Packit Service 2b1f13
    int			n;
Packit Service 2b1f13
    long		vinfo_mask;
Packit Service 2b1f13
    XVisualInfo		vinfo_template, *vinfo;
Packit Service 2b1f13
Packit Service 2b1f13
    status = 0;
Packit Service 2b1f13
    vinfo_template.screen = screen;
Packit Service 2b1f13
    vinfo_template.visualid = visualid;
Packit Service 2b1f13
    vinfo_template.depth = depth;
Packit Service 2b1f13
    vinfo_mask = VisualScreenMask | VisualIDMask | VisualDepthMask;
Packit Service 2b1f13
    if ((vinfo = XGetVisualInfo(dpy, vinfo_mask, &vinfo_template, &n)) == NULL)
Packit Service 2b1f13
	return 0;
Packit Service 2b1f13
Packit Service 2b1f13
    if (vinfo->colormap_size <= 2) {
Packit Service 2b1f13
	/* Monochrome visuals have no standard maps; considered successful */
Packit Service 2b1f13
	XFree((char *) vinfo);
Packit Service 2b1f13
	return 1;
Packit Service 2b1f13
    }
Packit Service 2b1f13
Packit Service 2b1f13
    switch (vinfo->class)
Packit Service 2b1f13
    {
Packit Service 2b1f13
      case PseudoColor:
Packit Service 2b1f13
      case DirectColor:
Packit Service 2b1f13
	status = XmuLookupStandardColormap(dpy, screen, visualid, depth,
Packit Service 2b1f13
					   XA_RGB_DEFAULT_MAP, replace,retain);
Packit Service 2b1f13
	if (!status) break;
Packit Service 2b1f13
Packit Service 2b1f13
	status = XmuLookupStandardColormap(dpy, screen, visualid, depth,
Packit Service 2b1f13
					   XA_RGB_GRAY_MAP, replace, retain);
Packit Service 2b1f13
	if (!status) {
Packit Service 2b1f13
	    XmuDeleteStandardColormap(dpy, screen, XA_RGB_DEFAULT_MAP);
Packit Service 2b1f13
	    break;
Packit Service 2b1f13
	}
Packit Service 2b1f13
Packit Service 2b1f13
	status = XmuLookupStandardColormap(dpy, screen, visualid, depth,
Packit Service 2b1f13
					   XA_RGB_RED_MAP, replace, retain);
Packit Service 2b1f13
	if (!status) {
Packit Service 2b1f13
	    XmuDeleteStandardColormap(dpy, screen, XA_RGB_DEFAULT_MAP);
Packit Service 2b1f13
	    XmuDeleteStandardColormap(dpy, screen, XA_RGB_GRAY_MAP);
Packit Service 2b1f13
	    break;
Packit Service 2b1f13
	}
Packit Service 2b1f13
Packit Service 2b1f13
	status = XmuLookupStandardColormap(dpy, screen, visualid, depth,
Packit Service 2b1f13
					   XA_RGB_GREEN_MAP, replace, retain);
Packit Service 2b1f13
	if (!status) {
Packit Service 2b1f13
	    XmuDeleteStandardColormap(dpy, screen, XA_RGB_DEFAULT_MAP);
Packit Service 2b1f13
	    XmuDeleteStandardColormap(dpy, screen, XA_RGB_GRAY_MAP);
Packit Service 2b1f13
	    XmuDeleteStandardColormap(dpy, screen, XA_RGB_RED_MAP);
Packit Service 2b1f13
	    break;
Packit Service 2b1f13
	}
Packit Service 2b1f13
Packit Service 2b1f13
	status = XmuLookupStandardColormap(dpy, screen, visualid, depth,
Packit Service 2b1f13
					   XA_RGB_BLUE_MAP, replace, retain);
Packit Service 2b1f13
	if (!status) {
Packit Service 2b1f13
	    XmuDeleteStandardColormap(dpy, screen, XA_RGB_DEFAULT_MAP);
Packit Service 2b1f13
	    XmuDeleteStandardColormap(dpy, screen, XA_RGB_GRAY_MAP);
Packit Service 2b1f13
	    XmuDeleteStandardColormap(dpy, screen, XA_RGB_RED_MAP);
Packit Service 2b1f13
	    XmuDeleteStandardColormap(dpy, screen, XA_RGB_GREEN_MAP);
Packit Service 2b1f13
	    break;
Packit Service 2b1f13
	}
Packit Service 2b1f13
	/* fall through */
Packit Service 2b1f13
Packit Service 2b1f13
      case StaticColor:
Packit Service 2b1f13
      case TrueColor:
Packit Service 2b1f13
Packit Service 2b1f13
	status = XmuLookupStandardColormap(dpy, screen, visualid, depth,
Packit Service 2b1f13
					   XA_RGB_BEST_MAP, replace, retain);
Packit Service 2b1f13
	if (!status && (vinfo->class == PseudoColor ||
Packit Service 2b1f13
			vinfo->class == DirectColor)) {
Packit Service 2b1f13
	    XmuDeleteStandardColormap(dpy, screen, XA_RGB_DEFAULT_MAP);
Packit Service 2b1f13
	    XmuDeleteStandardColormap(dpy, screen, XA_RGB_GRAY_MAP);
Packit Service 2b1f13
	    XmuDeleteStandardColormap(dpy, screen, XA_RGB_RED_MAP);
Packit Service 2b1f13
	    XmuDeleteStandardColormap(dpy, screen, XA_RGB_GREEN_MAP);
Packit Service 2b1f13
	    XmuDeleteStandardColormap(dpy, screen, XA_RGB_BLUE_MAP);
Packit Service 2b1f13
	}
Packit Service 2b1f13
	break;
Packit Service 2b1f13
	/* the end for PseudoColor, DirectColor, StaticColor, and TrueColor */
Packit Service 2b1f13
Packit Service 2b1f13
      case GrayScale:
Packit Service 2b1f13
	status = XmuLookupStandardColormap(dpy, screen, visualid, depth,
Packit Service 2b1f13
					   XA_RGB_DEFAULT_MAP, replace,
Packit Service 2b1f13
					   retain);
Packit Service 2b1f13
	if (! status) break;
Packit Service 2b1f13
	/*FALLTHROUGH*/
Packit Service 2b1f13
Packit Service 2b1f13
      case StaticGray:
Packit Service 2b1f13
Packit Service 2b1f13
	status = XmuLookupStandardColormap(dpy, screen, visualid, depth,
Packit Service 2b1f13
					   XA_RGB_GRAY_MAP, replace, retain);
Packit Service 2b1f13
	if (! status && vinfo->class == GrayScale) {
Packit Service 2b1f13
	    XmuDeleteStandardColormap(dpy, screen, XA_RGB_DEFAULT_MAP);
Packit Service 2b1f13
	    break;
Packit Service 2b1f13
	}
Packit Service 2b1f13
    }
Packit Service 2b1f13
Packit Service 2b1f13
    XFree((char *) vinfo);
Packit Service 2b1f13
    return status;
Packit Service 2b1f13
}