Blame lib/Xm/Color.c

Packit b099d7
/* $TOG: Color.c /main/13 1998/09/23 19:36:49 samborn $ */
Packit b099d7
/*
Packit b099d7
 * Motif
Packit b099d7
 *
Packit b099d7
 * Copyright (c) 1987-2012, The Open Group. All rights reserved.
Packit b099d7
 *
Packit b099d7
 * These libraries and programs are free software; you can
Packit b099d7
 * redistribute them and/or modify them under the terms of the GNU
Packit b099d7
 * Lesser General Public License as published by the Free Software
Packit b099d7
 * Foundation; either version 2 of the License, or (at your option)
Packit b099d7
 * any later version.
Packit b099d7
 *
Packit b099d7
 * These libraries and programs are distributed in the hope that
Packit b099d7
 * they will be useful, but WITHOUT ANY WARRANTY; without even the
Packit b099d7
 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
Packit b099d7
 * PURPOSE. See the GNU Lesser General Public License for more
Packit b099d7
 * details.
Packit b099d7
 *
Packit b099d7
 * You should have received a copy of the GNU Lesser General Public
Packit b099d7
 * License along with these librararies and programs; if not, write
Packit b099d7
 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
Packit b099d7
 * Floor, Boston, MA 02110-1301 USA
Packit b099d7
 */
Packit b099d7
/*
Packit b099d7
 * HISTORY
Packit b099d7
 */
Packit b099d7
Packit b099d7
#ifdef HAVE_CONFIG_H
Packit b099d7
#include <config.h>
Packit b099d7
#endif
Packit b099d7
Packit b099d7
Packit b099d7
#include <ctype.h>
Packit b099d7
#include <stdio.h>
Packit b099d7
#include <X11/IntrinsicP.h>
Packit b099d7
#include <X11/ShellP.h>
Packit b099d7
#include <Xm/ManagerP.h>
Packit b099d7
#include <Xm/PrimitiveP.h>
Packit b099d7
#include <Xm/XmP.h>
Packit b099d7
#include <Xm/XmosP.h>		/* for bzero */
Packit b099d7
#include "ColorI.h"
Packit b099d7
#include "ImageCachI.h"
Packit b099d7
#include "MessagesI.h"
Packit b099d7
#include "ScreenI.h"
Packit b099d7
#include "XmI.h"
Packit b099d7
#ifdef FIX_1381
Packit b099d7
#include <Xm/XpmP.h>
Packit b099d7
#endif
Packit b099d7
Packit b099d7
#define FIX_1500
Packit b099d7
Packit b099d7
/* Warning and Error messages */
Packit b099d7
Packit b099d7
#define MESSAGE0	_XmMMsgVisual_0000
Packit b099d7
#define MESSAGE1	_XmMMsgVisual_0001
Packit b099d7
#define MESSAGE2	_XmMMsgVisual_0002
Packit b099d7
Packit b099d7
Packit b099d7
/********    Static Function Declarations    ********/
Packit b099d7
Packit b099d7
static void GetDefaultThresholdsForScreen( 
Packit b099d7
                        Screen *screen) ;
Packit b099d7
static XmColorData * GetDefaultColors( 
Packit b099d7
                        Screen *screen,
Packit b099d7
                        Colormap color_map) ;
Packit b099d7
static Pixel GetBlackPixel( 
Packit b099d7
                        Screen *screen,
Packit b099d7
                        Colormap colormap,
Packit b099d7
                        XColor blackcolor) ;
Packit b099d7
static Pixel GetWhitePixel( 
Packit b099d7
                        Screen *screen,
Packit b099d7
                        Colormap colormap,
Packit b099d7
                        XColor whitecolor) ;
Packit b099d7
static void SetMonochromeColors( 
Packit b099d7
                        XmColorData *colors) ;
Packit b099d7
static int Brightness( 
Packit b099d7
                        XColor *color) ;
Packit b099d7
static void CalculateColorsForLightBackground( 
Packit b099d7
                        XColor *bg_color,
Packit b099d7
                        XColor *fg_color,
Packit b099d7
                        XColor *sel_color,
Packit b099d7
                        XColor *ts_color,
Packit b099d7
                        XColor *bs_color) ;
Packit b099d7
static void CalculateColorsForDarkBackground( 
Packit b099d7
                        XColor *bg_color,
Packit b099d7
                        XColor *fg_color,
Packit b099d7
                        XColor *sel_color,
Packit b099d7
                        XColor *ts_color,
Packit b099d7
                        XColor *bs_color) ;
Packit b099d7
static void CalculateColorsForMediumBackground( 
Packit b099d7
                        XColor *bg_color,
Packit b099d7
                        XColor *fg_color,
Packit b099d7
                        XColor *sel_color,
Packit b099d7
                        XColor *ts_color,
Packit b099d7
                        XColor *bs_color) ;
Packit b099d7
static void CalculateColorsRGB( 
Packit b099d7
                        XColor *bg_color,
Packit b099d7
                        XColor *fg_color,
Packit b099d7
                        XColor *sel_color,
Packit b099d7
                        XColor *ts_color,
Packit b099d7
                        XColor *bs_color) ;
Packit b099d7
static Pixel AccessColorData( 
Packit b099d7
                        XmColorData *cd,
Packit b099d7
                        unsigned char which) ;
Packit b099d7
static XmColorData * GetColors( 
Packit b099d7
                        Screen *screen,
Packit b099d7
                        Colormap color_map,
Packit b099d7
                        Pixel background) ;
Packit b099d7
#ifdef FIX_1381
Packit b099d7
static unsigned int FromColorToBlackAndWhite(
Packit b099d7
                        char *col) ;
Packit b099d7
#endif
Packit b099d7
Packit b099d7
Packit b099d7
/********    End Static Function Declarations    ********/
Packit b099d7
	
Packit b099d7
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * GLOBAL VARIABLES
Packit b099d7
 *
Packit b099d7
 * These variables define the color cache.
Packit b099d7
 */
Packit b099d7
static int Set_Count=0, Set_Size=0;
Packit b099d7
static XmColorData *Color_Set=NULL;
Packit b099d7
Packit b099d7
Packit b099d7
/* Thresholds for brightness
Packit b099d7
   above LITE threshold, LITE color model is used
Packit b099d7
   below DARK threshold, DARK color model is be used
Packit b099d7
   use STD color model in between */
Packit b099d7
Packit b099d7
static int XmCOLOR_LITE_THRESHOLD;
Packit b099d7
static int XmCOLOR_DARK_THRESHOLD;
Packit b099d7
static int XmFOREGROUND_THRESHOLD;
Packit b099d7
static Boolean XmTHRESHOLDS_INITD = FALSE;
Packit b099d7
Packit b099d7
Packit b099d7
/* DEPRECATED : use XmScreen resource now */
Packit b099d7
static XmColorProc ColorRGBCalcProc = CalculateColorsRGB;
Packit b099d7
Packit b099d7
Packit b099d7
static void
Packit b099d7
GetDefaultThresholdsForScreen( Screen *screen )
Packit b099d7
{
Packit b099d7
  XmScreen xmScreen;
Packit b099d7
  int	   default_light_threshold_spec;
Packit b099d7
  int	   default_dark_threshold_spec;
Packit b099d7
  int	   default_foreground_threshold_spec;
Packit b099d7
Packit b099d7
  _XmProcessLock();
Packit b099d7
  XmTHRESHOLDS_INITD = True;
Packit b099d7
  _XmProcessUnlock();
Packit b099d7
Packit b099d7
  xmScreen = (XmScreen) XmGetXmScreen(screen);
Packit b099d7
Packit b099d7
  /* Get resources from the XmScreen */
Packit b099d7
  default_light_threshold_spec = xmScreen->screen.lightThreshold;
Packit b099d7
  default_dark_threshold_spec = xmScreen->screen.darkThreshold;
Packit b099d7
  default_foreground_threshold_spec = xmScreen->screen.foregroundThreshold;
Packit b099d7
Packit b099d7
  if ((default_light_threshold_spec <= 0) || 
Packit b099d7
      (default_light_threshold_spec > 100))
Packit b099d7
    default_light_threshold_spec = XmDEFAULT_LIGHT_THRESHOLD;
Packit b099d7
  
Packit b099d7
  if ((default_dark_threshold_spec <= 0) || 
Packit b099d7
      (default_dark_threshold_spec > 100))
Packit b099d7
    default_dark_threshold_spec = XmDEFAULT_DARK_THRESHOLD;
Packit b099d7
  
Packit b099d7
  if ((default_foreground_threshold_spec <= 0) || 
Packit b099d7
      (default_foreground_threshold_spec > 100))
Packit b099d7
    default_foreground_threshold_spec = XmDEFAULT_FOREGROUND_THRESHOLD;
Packit b099d7
Packit b099d7
  _XmProcessLock();
Packit b099d7
  XmCOLOR_LITE_THRESHOLD = default_light_threshold_spec * XmCOLOR_PERCENTILE;
Packit b099d7
  XmCOLOR_DARK_THRESHOLD = default_dark_threshold_spec * XmCOLOR_PERCENTILE;
Packit b099d7
  XmFOREGROUND_THRESHOLD = default_foreground_threshold_spec * XmCOLOR_PERCENTILE;
Packit b099d7
  _XmProcessUnlock();
Packit b099d7
}
Packit b099d7
Packit b099d7
static XColor *GetDefaultBackgroundColor(Screen *screen, Colormap color_map)
Packit b099d7
{
Packit b099d7
  XrmName names[2];
Packit b099d7
  XrmClass classes[2];
Packit b099d7
  XrmRepresentation rep;
Packit b099d7
  XrmValue db_value;
Packit b099d7
  static XColor color;
Packit b099d7
Packit b099d7
  names[0] = XrmPermStringToQuark(XmNbackground);
Packit b099d7
  names[1] = NULLQUARK;
Packit b099d7
      
Packit b099d7
  classes[0] = XrmPermStringToQuark(XmCBackground);
Packit b099d7
  classes[1] = NULLQUARK;
Packit b099d7
	 
Packit b099d7
  if (XrmQGetResource(XtScreenDatabase(screen), names, classes,
Packit b099d7
		      &rep, &db_value)) 
Packit b099d7
     {
Packit b099d7
       if (rep == XrmPermStringToQuark(XmRString)) {
Packit b099d7
	 if (!XParseColor(DisplayOfScreen(screen), color_map, db_value.addr,
Packit b099d7
			  &color)) return NULL;
Packit b099d7
       }
Packit b099d7
       else if (rep == XrmPermStringToQuark(XmRPixel)) {
Packit b099d7
	 color.pixel = *(Pixel *) db_value.addr;
Packit b099d7
Packit b099d7
	 XQueryColor(DisplayOfScreen(screen), color_map, &color;;
Packit b099d7
       }
Packit b099d7
     }
Packit b099d7
  else {
Packit b099d7
    if (!XParseColor(DisplayOfScreen(screen), color_map, XmDEFAULT_BACKGROUND,
Packit b099d7
		     &color)) return NULL;
Packit b099d7
  }
Packit b099d7
Packit b099d7
  return &color;
Packit b099d7
}
Packit b099d7
Packit b099d7
static XmColorData * 
Packit b099d7
GetDefaultColors(
Packit b099d7
        Screen *screen,
Packit b099d7
        Colormap color_map )
Packit b099d7
{
Packit b099d7
	static XmColorData * default_set = NULL;
Packit b099d7
	static int default_set_count = 0;
Packit b099d7
	static int default_set_size = 0;
Packit b099d7
	register int i;
Packit b099d7
	XColor *color_def;
Packit b099d7
	static Pixel background;
Packit b099d7
        XrmValue fromVal;
Packit b099d7
        XrmValue toVal;
Packit b099d7
        XrmValue args[2];
Packit b099d7
        Cardinal num_args;
Packit b099d7
	String default_string = XtDefaultBackground;
Packit b099d7
	XmColorData *result;
Packit b099d7
Packit b099d7
	_XmProcessLock();
Packit b099d7
Packit b099d7
	/*  Look through  a set of screen / background pairs to see  */
Packit b099d7
	/*  if the default is already in the table.                  */
Packit b099d7
Packit b099d7
	for (i = 0; i < default_set_count; i++)
Packit b099d7
	{
Packit b099d7
	if ((default_set[i].screen == screen) &&
Packit b099d7
		(default_set[i].color_map == color_map))
Packit b099d7
	    {
Packit b099d7
	        result = default_set + i;
Packit b099d7
		_XmProcessUnlock();
Packit b099d7
		return result;
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
Packit b099d7
	/*  See if more space is needed in the array  */
Packit b099d7
  
Packit b099d7
	if (default_set == NULL)
Packit b099d7
	{
Packit b099d7
		default_set_size = 10;
Packit b099d7
		default_set = (XmColorData *) XtRealloc((char *) default_set, 
Packit b099d7
			(sizeof(XmColorData) * default_set_size));
Packit b099d7
		
Packit b099d7
	}
Packit b099d7
	else if (default_set_count == default_set_size)
Packit b099d7
	{
Packit b099d7
		default_set_size += 10;
Packit b099d7
		default_set = (XmColorData *) XtRealloc((char *) default_set, 
Packit b099d7
			sizeof(XmColorData) * default_set_size);
Packit b099d7
	}
Packit b099d7
Packit b099d7
	/* Find the background based on the depth of the screen */
Packit b099d7
	if (DefaultDepthOfScreen(screen) == 1)
Packit b099d7
        {
Packit b099d7
	  /*
Packit b099d7
	   * Fix for 4603 - Convert the string XtDefaultBackground into a Pixel
Packit b099d7
	   *                value using the XToolkit converter.  This converter
Packit b099d7
	   *                will set this value to WhitePixelOfScreen if reverse
Packit b099d7
	   *                video is not on, and to BlackPixelOfScreen if reverse
Packit b099d7
	   *                video is on.
Packit b099d7
	   */
Packit b099d7
	  args[0].addr = (XPointer) &screen;
Packit b099d7
	  args[0].size = sizeof(Screen*);
Packit b099d7
	  args[1].addr = (XPointer) &color_map;
Packit b099d7
	  args[1].size = sizeof(Colormap);
Packit b099d7
	  num_args = 2;
Packit b099d7
	  
Packit b099d7
	  fromVal.addr = default_string;
Packit b099d7
	  fromVal.size = strlen(default_string);
Packit b099d7
	  
Packit b099d7
	  toVal.addr = (XPointer) &background;
Packit b099d7
	  toVal.size = sizeof(Pixel);
Packit b099d7
	  
Packit b099d7
	  if(!XtCallConverter(DisplayOfScreen(screen),XtCvtStringToPixel, 
Packit b099d7
			      args, num_args, &fromVal, &toVal, NULL))
Packit b099d7
	    background = WhitePixelOfScreen(screen);
Packit b099d7
        }
Packit b099d7
Packit b099d7
	else
Packit b099d7
	{
Packit b099d7
		/*  Parse out a color for the default background  */
Packit b099d7
Packit b099d7
		if ((color_def = GetDefaultBackgroundColor(screen, 
Packit b099d7
							   color_map)) !=
Packit b099d7
		    NULL)
Packit b099d7
		{
Packit b099d7
		    XmAllocColorProc aproc =
Packit b099d7
			_XmGetColorAllocationProc(screen);
Packit b099d7
		    if (aproc == NULL)
Packit b099d7
			aproc = DEFAULT_ALLOCCOLOR_PROC;
Packit b099d7
Packit b099d7
			if ((*aproc)(DisplayOfScreen(screen), color_map,
Packit b099d7
				color_def))
Packit b099d7
			{
Packit b099d7
				background = color_def->pixel;
Packit b099d7
			}
Packit b099d7
			else
Packit b099d7
			{
Packit b099d7
				XtWarning(MESSAGE1);
Packit b099d7
				background = WhitePixelOfScreen(screen);
Packit b099d7
			}
Packit b099d7
		}
Packit b099d7
		else
Packit b099d7
		{
Packit b099d7
			XtWarning(MESSAGE2);
Packit b099d7
			background = WhitePixelOfScreen(screen);
Packit b099d7
		}
Packit b099d7
	}
Packit b099d7
Packit b099d7
	/*
Packit b099d7
	 * Get the color data generated and save it in the next open
Packit b099d7
	 * slot in the default set array.  default_set points to a subset
Packit b099d7
	 * of the data pointed to by color_set (defined in GetColors).
Packit b099d7
	 */
Packit b099d7
Packit b099d7
	default_set[default_set_count] = 
Packit b099d7
		*GetColors(screen, color_map, background);
Packit b099d7
	default_set_count++;
Packit b099d7
Packit b099d7
	result = default_set + (default_set_count - 1);
Packit b099d7
	_XmProcessUnlock();
Packit b099d7
	return result;
Packit b099d7
}
Packit b099d7

Packit b099d7
Packit b099d7
Packit b099d7
Boolean 
Packit b099d7
_XmSearchColorCache(
Packit b099d7
        unsigned int which,
Packit b099d7
        XmColorData *values,
Packit b099d7
        XmColorData **ret )
Packit b099d7
{
Packit b099d7
    register int i;
Packit b099d7
    
Packit b099d7
    /* 
Packit b099d7
     * Look through  a set of screen, color_map, background triplets 
Packit b099d7
     * to see if these colors have already been generated.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    _XmProcessLock();   
Packit b099d7
    for (i = 0; i < Set_Count; i++) {
Packit b099d7
	if ( (!(which & XmLOOK_AT_SCREEN) ||
Packit b099d7
	      ((Color_Set + i)->screen == values->screen))
Packit b099d7
	    &&
Packit b099d7
	    (!(which & XmLOOK_AT_CMAP) ||
Packit b099d7
	     ((Color_Set + i)->color_map == values->color_map))
Packit b099d7
	    &&
Packit b099d7
	    (!(which & XmLOOK_AT_BACKGROUND) ||
Packit b099d7
	     (((Color_Set + i)->allocated & XmBACKGROUND) &&
Packit b099d7
	      ((Color_Set + i)->background.pixel == 
Packit b099d7
	       values->background.pixel)))
Packit b099d7
	    &&
Packit b099d7
	    (!(which & XmLOOK_AT_FOREGROUND) ||
Packit b099d7
	     (((Color_Set + i)->allocated & XmFOREGROUND) &&
Packit b099d7
	      ((Color_Set + i)->foreground.pixel ==
Packit b099d7
	       values->foreground.pixel)))
Packit b099d7
	    &&
Packit b099d7
	    (!(which & XmLOOK_AT_TOP_SHADOW) ||
Packit b099d7
	     (((Color_Set + i)->allocated & XmTOP_SHADOW) &&
Packit b099d7
	      ((Color_Set + i)->top_shadow.pixel == 
Packit b099d7
	       values->top_shadow.pixel)))
Packit b099d7
	    &&
Packit b099d7
	    (!(which & XmLOOK_AT_BOTTOM_SHADOW) ||
Packit b099d7
	     (((Color_Set + i)->allocated & XmBOTTOM_SHADOW) &&
Packit b099d7
	      ((Color_Set+ i)->bottom_shadow.pixel == 
Packit b099d7
	       values->bottom_shadow.pixel)))
Packit b099d7
	    &&
Packit b099d7
	    (!(which & XmLOOK_AT_SELECT) ||
Packit b099d7
	     (((Color_Set + i)->allocated & XmSELECT) &&
Packit b099d7
	      ((Color_Set + i)->select.pixel ==
Packit b099d7
	       values->select.pixel))))
Packit b099d7
	    {
Packit b099d7
		*ret = (Color_Set + i);
Packit b099d7
		_XmProcessUnlock();
Packit b099d7
		return (TRUE);
Packit b099d7
	    }
Packit b099d7
    }
Packit b099d7
    
Packit b099d7
    *ret = NULL;
Packit b099d7
    _XmProcessUnlock();
Packit b099d7
    return (FALSE);
Packit b099d7
}
Packit b099d7
Packit b099d7
XmColorData * 
Packit b099d7
_XmAddToColorCache(
Packit b099d7
        XmColorData *new_rec )
Packit b099d7
{
Packit b099d7
       XmColorData *result;
Packit b099d7
Packit b099d7
	/*  See if more space is needed */
Packit b099d7
	_XmProcessLock();
Packit b099d7
	if (Set_Count == Set_Size)
Packit b099d7
	{
Packit b099d7
		Set_Size += 10;
Packit b099d7
		Color_Set = (XmColorData *)XtRealloc((char *) Color_Set, 
Packit b099d7
			sizeof(XmColorData) * Set_Size);
Packit b099d7
	}
Packit b099d7
Packit b099d7
	*(Color_Set + Set_Count) = *new_rec;
Packit b099d7
	Set_Count++;
Packit b099d7
Packit b099d7
	result = Color_Set + (Set_Count - 1);
Packit b099d7
	_XmProcessUnlock();
Packit b099d7
Packit b099d7
	return result;
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
static Pixel
Packit b099d7
GetBlackPixel(
Packit b099d7
	      Screen *screen,
Packit b099d7
	      Colormap colormap,
Packit b099d7
	      XColor blackcolor )
Packit b099d7
{
Packit b099d7
  Pixel p;
Packit b099d7
  XmAllocColorProc aproc = _XmGetColorAllocationProc(screen);
Packit b099d7
Packit b099d7
  if (aproc == NULL)
Packit b099d7
      aproc = DEFAULT_ALLOCCOLOR_PROC;
Packit b099d7
  
Packit b099d7
  blackcolor.red = 0;
Packit b099d7
  blackcolor.green = 0;
Packit b099d7
  blackcolor.blue = 0;
Packit b099d7
Packit b099d7
  if (colormap == DefaultColormapOfScreen(screen))
Packit b099d7
    p = blackcolor.pixel = BlackPixelOfScreen(screen);
Packit b099d7
  else if ((*aproc)(screen->display, colormap, &blackcolor))
Packit b099d7
    p = blackcolor.pixel;
Packit b099d7
  else
Packit b099d7
    p = blackcolor.pixel = BlackPixelOfScreen(screen); /* fallback pixel */
Packit b099d7
  
Packit b099d7
  return (p);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
static Pixel
Packit b099d7
GetWhitePixel(
Packit b099d7
	      Screen *screen,
Packit b099d7
	      Colormap colormap,
Packit b099d7
	      XColor whitecolor )
Packit b099d7
{
Packit b099d7
  Pixel p;
Packit b099d7
  XmAllocColorProc aproc = _XmGetColorAllocationProc(screen);
Packit b099d7
Packit b099d7
  if (aproc == NULL)
Packit b099d7
      aproc = DEFAULT_ALLOCCOLOR_PROC;
Packit b099d7
Packit b099d7
  whitecolor.red = XmMAX_SHORT;
Packit b099d7
  whitecolor.green = XmMAX_SHORT;
Packit b099d7
  whitecolor.blue = XmMAX_SHORT;
Packit b099d7
 
Packit b099d7
  if (colormap == DefaultColormapOfScreen(screen))
Packit b099d7
    p = whitecolor.pixel = WhitePixelOfScreen(screen);
Packit b099d7
  else if ((*aproc)(screen->display, colormap, &whitecolor))
Packit b099d7
    p = whitecolor.pixel;
Packit b099d7
  else
Packit b099d7
    p = whitecolor.pixel = WhitePixelOfScreen(screen); /* fallback pixel */
Packit b099d7
  return (p);
Packit b099d7
}
Packit b099d7
  
Packit b099d7
static Pixel 
Packit b099d7
AccessColorData(
Packit b099d7
        XmColorData *cd,
Packit b099d7
        unsigned char which )
Packit b099d7
{
Packit b099d7
    Pixel p;
Packit b099d7
    XmAllocColorProc aproc = _XmGetColorAllocationProc(cd->screen);
Packit b099d7
    
Packit b099d7
    if (aproc == NULL)
Packit b099d7
	aproc = DEFAULT_ALLOCCOLOR_PROC;
Packit b099d7
    
Packit b099d7
    switch(which) {
Packit b099d7
    case XmBACKGROUND:
Packit b099d7
	if (!(cd->allocated & which) && 
Packit b099d7
	    ((*aproc)(cd->screen->display,
Packit b099d7
		      cd->color_map, &(cd->background)) == 0)) {
Packit b099d7
	    if (Brightness(&(cd->background))
Packit b099d7
		< XmFOREGROUND_THRESHOLD )
Packit b099d7
		cd->background.pixel = GetBlackPixel(cd->screen, 
Packit b099d7
						     cd->color_map,
Packit b099d7
						     cd->background);
Packit b099d7
	    else 
Packit b099d7
		cd->background.pixel = GetWhitePixel(cd->screen, 
Packit b099d7
						     cd->color_map,
Packit b099d7
						     cd->background);				    
Packit b099d7
	    XQueryColor(cd->screen->display, cd->color_map, 
Packit b099d7
			&(cd->background));
Packit b099d7
	}
Packit b099d7
	p = cd->background.pixel;
Packit b099d7
	cd->allocated |= which;
Packit b099d7
	break;
Packit b099d7
    case XmFOREGROUND:
Packit b099d7
	if (!(cd->allocated & which) &&
Packit b099d7
	    ((*aproc)(cd->screen->display,
Packit b099d7
		      cd->color_map, &(cd->foreground)) == 0 )) 
Packit b099d7
	    {
Packit b099d7
		if (Brightness(&(cd->background))
Packit b099d7
		    < XmFOREGROUND_THRESHOLD )
Packit b099d7
		    cd->foreground.pixel = GetWhitePixel(cd->screen, 
Packit b099d7
							 cd->color_map,
Packit b099d7
							 cd->foreground);
Packit b099d7
		else 
Packit b099d7
		    cd->foreground.pixel = GetBlackPixel(cd->screen, 
Packit b099d7
							 cd->color_map,
Packit b099d7
							 cd->foreground);
Packit b099d7
		XQueryColor(cd->screen->display, cd->color_map, 
Packit b099d7
			    &(cd->foreground));
Packit b099d7
	    }
Packit b099d7
	p =  cd->foreground.pixel;	
Packit b099d7
	cd->allocated |= which;
Packit b099d7
	break;
Packit b099d7
    case XmTOP_SHADOW:
Packit b099d7
	if (!(cd->allocated & which) &&
Packit b099d7
	    ((*aproc)(cd->screen->display,
Packit b099d7
		      cd->color_map, &(cd->top_shadow)) == 0))
Packit b099d7
	    {
Packit b099d7
		if (Brightness(&(cd->background))
Packit b099d7
		    > XmCOLOR_LITE_THRESHOLD)
Packit b099d7
		    cd->top_shadow.pixel = 
Packit b099d7
			GetBlackPixel(cd->screen, cd->color_map,
Packit b099d7
				      cd->top_shadow);
Packit b099d7
		else
Packit b099d7
		    cd->top_shadow.pixel =
Packit b099d7
			GetWhitePixel(cd->screen, cd->color_map,
Packit b099d7
				      cd->top_shadow);
Packit b099d7
		XQueryColor(cd->screen->display, cd->color_map, 
Packit b099d7
			    &(cd->top_shadow));
Packit b099d7
		
Packit b099d7
	    }
Packit b099d7
	p = cd->top_shadow.pixel;
Packit b099d7
	cd->allocated |= which;
Packit b099d7
	break;
Packit b099d7
    case XmBOTTOM_SHADOW:
Packit b099d7
	if (!(cd->allocated & which) &&
Packit b099d7
	    ((*aproc)(cd->screen->display,
Packit b099d7
		      cd->color_map, &(cd->bottom_shadow)) == 0))
Packit b099d7
	    {
Packit b099d7
		if (Brightness(&(cd->background))
Packit b099d7
		    < XmCOLOR_DARK_THRESHOLD)
Packit b099d7
		    cd->bottom_shadow.pixel =  
Packit b099d7
			GetWhitePixel(cd->screen, cd->color_map,
Packit b099d7
				      cd->bottom_shadow);
Packit b099d7
		else
Packit b099d7
		    cd->bottom_shadow.pixel = 
Packit b099d7
			GetBlackPixel(cd->screen, cd->color_map,
Packit b099d7
				      cd->bottom_shadow);
Packit b099d7
		XQueryColor(cd->screen->display, cd->color_map, 
Packit b099d7
			    &(cd->bottom_shadow));
Packit b099d7
	    }
Packit b099d7
	p = cd->bottom_shadow.pixel;
Packit b099d7
	cd->allocated |= which;
Packit b099d7
	break;
Packit b099d7
    case XmSELECT:
Packit b099d7
	if (!(cd->allocated & which) &&
Packit b099d7
	    ((*aproc)(cd->screen->display,
Packit b099d7
		      cd->color_map, &(cd->select)) == 0))
Packit b099d7
	    {
Packit b099d7
		if (Brightness(&(cd->background)) 
Packit b099d7
		    < XmFOREGROUND_THRESHOLD)
Packit b099d7
		    cd->select.pixel = GetWhitePixel(cd->screen, 
Packit b099d7
						     cd->color_map, 
Packit b099d7
						     cd->select);
Packit b099d7
		else
Packit b099d7
		    cd->select.pixel = GetBlackPixel(cd->screen, 
Packit b099d7
						     cd->color_map, 
Packit b099d7
						     cd->select);
Packit b099d7
		XQueryColor(cd->screen->display, cd->color_map, 
Packit b099d7
			    &(cd->select));
Packit b099d7
	    }
Packit b099d7
	p = cd->select.pixel;
Packit b099d7
	cd->allocated |= which;
Packit b099d7
	break;
Packit b099d7
    default:
Packit b099d7
	XtWarning(MESSAGE0);
Packit b099d7
	p = GetBlackPixel(cd->screen, cd->color_map, cd->background);
Packit b099d7
	break;
Packit b099d7
    }
Packit b099d7
    
Packit b099d7
    return(p);
Packit b099d7
}
Packit b099d7
Packit b099d7
static void 
Packit b099d7
SetMonochromeColors(
Packit b099d7
        XmColorData *colors )
Packit b099d7
{
Packit b099d7
	Screen *screen = colors->screen;
Packit b099d7
	Pixel background = colors->background.pixel;
Packit b099d7
Packit b099d7
	if (background == BlackPixelOfScreen(screen))
Packit b099d7
	{
Packit b099d7
		colors->foreground.pixel = WhitePixelOfScreen (screen);
Packit b099d7
		colors->foreground.red = colors->foreground.green = 
Packit b099d7
			colors->foreground.blue = XmMAX_SHORT;
Packit b099d7
Packit b099d7
		colors->bottom_shadow.pixel = WhitePixelOfScreen(screen);
Packit b099d7
		colors->bottom_shadow.red = colors->bottom_shadow.green = 
Packit b099d7
			colors->bottom_shadow.blue = XmMAX_SHORT;
Packit b099d7
Packit b099d7
		colors->select.pixel = WhitePixelOfScreen(screen);
Packit b099d7
		colors->select.red = colors->select.green = 
Packit b099d7
			colors->select.blue = XmMAX_SHORT;
Packit b099d7
Packit b099d7
		colors->top_shadow.pixel = BlackPixelOfScreen(screen);
Packit b099d7
		colors->top_shadow.red = colors->top_shadow.green = 
Packit b099d7
			colors->top_shadow.blue = 0;
Packit b099d7
	}
Packit b099d7
	else if (background == WhitePixelOfScreen(screen))
Packit b099d7
	{
Packit b099d7
		colors->foreground.pixel = BlackPixelOfScreen(screen);
Packit b099d7
		colors->foreground.red = colors->foreground.green = 
Packit b099d7
			colors->foreground.blue = 0;
Packit b099d7
Packit b099d7
		colors->top_shadow.pixel = WhitePixelOfScreen(screen);
Packit b099d7
		colors->top_shadow.red = colors->top_shadow.green = 
Packit b099d7
			colors->top_shadow.blue = XmMAX_SHORT;
Packit b099d7
Packit b099d7
		colors->bottom_shadow.pixel = BlackPixelOfScreen(screen);
Packit b099d7
		colors->bottom_shadow.red = colors->bottom_shadow.green = 
Packit b099d7
			colors->bottom_shadow.blue = 0;
Packit b099d7
Packit b099d7
		colors->select.pixel = BlackPixelOfScreen(screen);
Packit b099d7
		colors->select.red = colors->select.green = 
Packit b099d7
			colors->select.blue = 0;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	colors->allocated |= (XmFOREGROUND | XmTOP_SHADOW 
Packit b099d7
		| XmBOTTOM_SHADOW | XmSELECT);
Packit b099d7
}
Packit b099d7
Packit b099d7
static int 
Packit b099d7
Brightness(
Packit b099d7
        XColor *color )
Packit b099d7
{
Packit b099d7
	int brightness;
Packit b099d7
	int intensity;
Packit b099d7
	int light;
Packit b099d7
	int luminosity, maxprimary, minprimary;
Packit b099d7
	int red = color->red;
Packit b099d7
	int green = color->green;
Packit b099d7
	int blue = color->blue;
Packit b099d7
Packit b099d7
	intensity = (red + green + blue) / 3;
Packit b099d7
Packit b099d7
	/* 
Packit b099d7
	 * The casting nonsense below is to try to control the point at
Packit b099d7
	 * the truncation occurs.
Packit b099d7
	 */
Packit b099d7
Packit b099d7
	luminosity = (int) ((XmRED_LUMINOSITY * (float) red)
Packit b099d7
		+ (XmGREEN_LUMINOSITY * (float) green)
Packit b099d7
		+ (XmBLUE_LUMINOSITY * (float) blue));
Packit b099d7
Packit b099d7
	maxprimary = ( (red > green) ?
Packit b099d7
					( (red > blue) ? red : blue ) :
Packit b099d7
					( (green > blue) ? green : blue ) );
Packit b099d7
Packit b099d7
	minprimary = ( (red < green) ?
Packit b099d7
					( (red < blue) ? red : blue ) :
Packit b099d7
					( (green < blue) ? green : blue ) );
Packit b099d7
Packit b099d7
	light = (minprimary + maxprimary) / 2;
Packit b099d7
Packit b099d7
	brightness = ( (intensity * XmINTENSITY_FACTOR) +
Packit b099d7
				   (light * XmLIGHT_FACTOR) +
Packit b099d7
				   (luminosity * XmLUMINOSITY_FACTOR) ) / 100;
Packit b099d7
	return(brightness);
Packit b099d7
}
Packit b099d7
Packit b099d7
static void 
Packit b099d7
CalculateColorsForLightBackground(
Packit b099d7
        XColor *bg_color,
Packit b099d7
        XColor *fg_color,
Packit b099d7
        XColor *sel_color,
Packit b099d7
        XColor *ts_color,
Packit b099d7
        XColor *bs_color )
Packit b099d7
{
Packit b099d7
	int brightness = Brightness(bg_color);
Packit b099d7
	int color_value;
Packit b099d7
Packit b099d7
	if (fg_color)
Packit b099d7
	{
Packit b099d7
/*
Packit b099d7
 * Fix for 4602 - Compare the brightness with the foreground threshold.
Packit b099d7
 *                If its larger, make the foreground color black.
Packit b099d7
 *                Otherwise, make it white.
Packit b099d7
 */
Packit b099d7
          if (brightness > XmFOREGROUND_THRESHOLD)
Packit b099d7
          {
Packit b099d7
                  fg_color->red = 0;
Packit b099d7
                  fg_color->green = 0;
Packit b099d7
                  fg_color->blue = 0;
Packit b099d7
          }
Packit b099d7
          else
Packit b099d7
          {
Packit b099d7
                  fg_color->red = XmMAX_SHORT;
Packit b099d7
                  fg_color->green = XmMAX_SHORT;
Packit b099d7
                  fg_color->blue = XmMAX_SHORT;
Packit b099d7
          }
Packit b099d7
/*
Packit b099d7
 * End Fix 4602
Packit b099d7
 */
Packit b099d7
	}
Packit b099d7
Packit b099d7
	if (sel_color)
Packit b099d7
	{
Packit b099d7
		color_value = bg_color->red;
Packit b099d7
		color_value -= (color_value * XmCOLOR_LITE_SEL_FACTOR) / 100;
Packit b099d7
		sel_color->red = color_value;
Packit b099d7
Packit b099d7
		color_value = bg_color->green;
Packit b099d7
		color_value -= (color_value * XmCOLOR_LITE_SEL_FACTOR) / 100;
Packit b099d7
		sel_color->green = color_value;
Packit b099d7
Packit b099d7
		color_value = bg_color->blue;
Packit b099d7
		color_value -= (color_value * XmCOLOR_LITE_SEL_FACTOR) / 100;
Packit b099d7
		sel_color->blue = color_value;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	if (bs_color)
Packit b099d7
	{
Packit b099d7
		color_value = bg_color->red;
Packit b099d7
		color_value -= (color_value * XmCOLOR_LITE_BS_FACTOR) / 100;
Packit b099d7
		bs_color->red = color_value;
Packit b099d7
Packit b099d7
		color_value = bg_color->green;
Packit b099d7
		color_value -= (color_value * XmCOLOR_LITE_BS_FACTOR) / 100;
Packit b099d7
		bs_color->green = color_value;
Packit b099d7
Packit b099d7
		color_value = bg_color->blue;
Packit b099d7
		color_value -= (color_value * XmCOLOR_LITE_BS_FACTOR) / 100;
Packit b099d7
		bs_color->blue = color_value;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	if (ts_color)
Packit b099d7
	{
Packit b099d7
		color_value = bg_color->red;
Packit b099d7
		color_value -= (color_value * XmCOLOR_LITE_TS_FACTOR) / 100;
Packit b099d7
		ts_color->red = color_value;
Packit b099d7
Packit b099d7
		color_value = bg_color->green;
Packit b099d7
		color_value -= (color_value * XmCOLOR_LITE_TS_FACTOR) / 100;
Packit b099d7
		ts_color->green = color_value;
Packit b099d7
Packit b099d7
		color_value = bg_color->blue;
Packit b099d7
		color_value -= (color_value * XmCOLOR_LITE_TS_FACTOR) / 100;
Packit b099d7
		ts_color->blue = color_value;
Packit b099d7
	}
Packit b099d7
}
Packit b099d7
	
Packit b099d7
static void 
Packit b099d7
CalculateColorsForDarkBackground(
Packit b099d7
        XColor *bg_color,
Packit b099d7
        XColor *fg_color,
Packit b099d7
        XColor *sel_color,
Packit b099d7
        XColor *ts_color,
Packit b099d7
        XColor *bs_color )
Packit b099d7
{
Packit b099d7
	int brightness = Brightness(bg_color);
Packit b099d7
	int color_value;
Packit b099d7
Packit b099d7
	if (fg_color)
Packit b099d7
	{
Packit b099d7
/*
Packit b099d7
 * Fix for 4602 - Compare the brightness with the foreground threshold.
Packit b099d7
 *                If its larger, make the foreground color black.
Packit b099d7
 *                Otherwise, make it white.
Packit b099d7
 */
Packit b099d7
          if (brightness > XmFOREGROUND_THRESHOLD)
Packit b099d7
          {
Packit b099d7
                  fg_color->red = 0;
Packit b099d7
                  fg_color->green = 0;
Packit b099d7
                  fg_color->blue = 0;
Packit b099d7
          }
Packit b099d7
          else
Packit b099d7
          {
Packit b099d7
                  fg_color->red = XmMAX_SHORT;
Packit b099d7
                  fg_color->green = XmMAX_SHORT;
Packit b099d7
                  fg_color->blue = XmMAX_SHORT;
Packit b099d7
          }
Packit b099d7
/*
Packit b099d7
 * End Fix 4602
Packit b099d7
 */
Packit b099d7
	}
Packit b099d7
Packit b099d7
	if (sel_color)
Packit b099d7
	{
Packit b099d7
		color_value = bg_color->red;
Packit b099d7
		color_value += XmCOLOR_DARK_SEL_FACTOR *
Packit b099d7
			(XmMAX_SHORT - color_value) / 100;
Packit b099d7
		sel_color->red = color_value;
Packit b099d7
Packit b099d7
		color_value = bg_color->green;
Packit b099d7
		color_value += XmCOLOR_DARK_SEL_FACTOR *
Packit b099d7
			(XmMAX_SHORT - color_value) / 100;
Packit b099d7
		sel_color->green = color_value;
Packit b099d7
Packit b099d7
		color_value = bg_color->blue;
Packit b099d7
		color_value += XmCOLOR_DARK_SEL_FACTOR *
Packit b099d7
			(XmMAX_SHORT - color_value) / 100;
Packit b099d7
		sel_color->blue = color_value;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	if (bs_color)
Packit b099d7
	{
Packit b099d7
		color_value = bg_color->red;
Packit b099d7
		color_value += XmCOLOR_DARK_BS_FACTOR *
Packit b099d7
			(XmMAX_SHORT - color_value) / 100;
Packit b099d7
		bs_color->red = color_value;
Packit b099d7
Packit b099d7
		color_value = bg_color->green;
Packit b099d7
		color_value += XmCOLOR_DARK_BS_FACTOR *
Packit b099d7
			(XmMAX_SHORT - color_value) / 100;
Packit b099d7
		bs_color->green = color_value;
Packit b099d7
Packit b099d7
		color_value = bg_color->blue;
Packit b099d7
		color_value += XmCOLOR_DARK_BS_FACTOR *
Packit b099d7
			(XmMAX_SHORT - color_value) / 100;
Packit b099d7
		bs_color->blue = color_value;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	if (ts_color)
Packit b099d7
	{
Packit b099d7
		color_value = bg_color->red;
Packit b099d7
		color_value += XmCOLOR_DARK_TS_FACTOR *
Packit b099d7
			(XmMAX_SHORT - color_value) / 100;
Packit b099d7
		ts_color->red = color_value;
Packit b099d7
Packit b099d7
		color_value = bg_color->green;
Packit b099d7
		color_value += XmCOLOR_DARK_TS_FACTOR *
Packit b099d7
			(XmMAX_SHORT - color_value) / 100;
Packit b099d7
		ts_color->green = color_value;
Packit b099d7
Packit b099d7
		color_value = bg_color->blue;
Packit b099d7
		color_value += XmCOLOR_DARK_TS_FACTOR *
Packit b099d7
			(XmMAX_SHORT - color_value) / 100;
Packit b099d7
		ts_color->blue = color_value;
Packit b099d7
	}
Packit b099d7
}
Packit b099d7
Packit b099d7
static void 
Packit b099d7
CalculateColorsForMediumBackground(
Packit b099d7
        XColor *bg_color,
Packit b099d7
        XColor *fg_color,
Packit b099d7
        XColor *sel_color,
Packit b099d7
        XColor *ts_color,
Packit b099d7
        XColor *bs_color )
Packit b099d7
{
Packit b099d7
	int brightness = Brightness(bg_color);
Packit b099d7
	int color_value, f;
Packit b099d7
Packit b099d7
	if (brightness > XmFOREGROUND_THRESHOLD)
Packit b099d7
	{
Packit b099d7
		fg_color->red = 0;
Packit b099d7
		fg_color->green = 0;
Packit b099d7
		fg_color->blue = 0;
Packit b099d7
	}
Packit b099d7
	else
Packit b099d7
	{
Packit b099d7
		fg_color->red = XmMAX_SHORT;
Packit b099d7
		fg_color->green = XmMAX_SHORT;
Packit b099d7
		fg_color->blue = XmMAX_SHORT;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	if (sel_color)
Packit b099d7
	{
Packit b099d7
		f = XmCOLOR_LO_SEL_FACTOR + (brightness
Packit b099d7
			* ( XmCOLOR_HI_SEL_FACTOR - XmCOLOR_LO_SEL_FACTOR )
Packit b099d7
			/ XmMAX_SHORT );
Packit b099d7
Packit b099d7
		color_value = bg_color->red;
Packit b099d7
		color_value -= (color_value * f) / 100;
Packit b099d7
		sel_color->red = color_value;
Packit b099d7
Packit b099d7
		color_value = bg_color->green;
Packit b099d7
		color_value -= (color_value * f) / 100;
Packit b099d7
		sel_color->green = color_value;
Packit b099d7
Packit b099d7
		color_value = bg_color->blue;
Packit b099d7
		color_value -= (color_value * f) / 100;
Packit b099d7
		sel_color->blue = color_value;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	if (bs_color)
Packit b099d7
	{
Packit b099d7
		f = XmCOLOR_LO_BS_FACTOR + (brightness 
Packit b099d7
			* ( XmCOLOR_HI_BS_FACTOR - XmCOLOR_LO_BS_FACTOR )
Packit b099d7
			/ XmMAX_SHORT);
Packit b099d7
Packit b099d7
		color_value = bg_color->red;
Packit b099d7
		color_value -= (color_value * f) / 100;
Packit b099d7
		bs_color->red = color_value;
Packit b099d7
Packit b099d7
		color_value = bg_color->green;
Packit b099d7
		color_value -= (color_value * f) / 100;
Packit b099d7
		bs_color->green = color_value;
Packit b099d7
Packit b099d7
		color_value = bg_color->blue;
Packit b099d7
		color_value -= (color_value * f) / 100;
Packit b099d7
		bs_color->blue = color_value;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	if (ts_color)
Packit b099d7
	{
Packit b099d7
		f = XmCOLOR_LO_TS_FACTOR + (brightness
Packit b099d7
			* ( XmCOLOR_HI_TS_FACTOR - XmCOLOR_LO_TS_FACTOR )
Packit b099d7
			/ XmMAX_SHORT);
Packit b099d7
Packit b099d7
		color_value = bg_color->red;
Packit b099d7
		color_value += f * ( XmMAX_SHORT - color_value ) / 100;
Packit b099d7
		ts_color->red = color_value;
Packit b099d7
Packit b099d7
		color_value = bg_color->green;
Packit b099d7
		color_value += f * ( XmMAX_SHORT - color_value ) / 100;
Packit b099d7
		ts_color->green = color_value;
Packit b099d7
Packit b099d7
		color_value = bg_color->blue;
Packit b099d7
		color_value += f * ( XmMAX_SHORT - color_value ) / 100;
Packit b099d7
		ts_color->blue = color_value;
Packit b099d7
	}
Packit b099d7
}
Packit b099d7
Packit b099d7
static void 
Packit b099d7
CalculateColorsRGB(
Packit b099d7
        XColor *bg_color,
Packit b099d7
        XColor *fg_color,
Packit b099d7
        XColor *sel_color,
Packit b099d7
        XColor *ts_color,
Packit b099d7
        XColor *bs_color )
Packit b099d7
{
Packit b099d7
	int brightness = Brightness(bg_color);
Packit b099d7
Packit b099d7
	/* make sure DefaultThresholds are inited */
Packit b099d7
	if (!XmTHRESHOLDS_INITD)
Packit b099d7
	    	GetDefaultThresholdsForScreen(
Packit b099d7
			DefaultScreenOfDisplay(_XmGetDefaultDisplay()));
Packit b099d7
Packit b099d7
	if (brightness < XmCOLOR_DARK_THRESHOLD)
Packit b099d7
		CalculateColorsForDarkBackground(bg_color, fg_color,
Packit b099d7
			sel_color, ts_color, bs_color);
Packit b099d7
	else if (brightness > XmCOLOR_LITE_THRESHOLD)
Packit b099d7
		CalculateColorsForLightBackground(bg_color, fg_color,
Packit b099d7
			sel_color, ts_color, bs_color);
Packit b099d7
	else
Packit b099d7
		CalculateColorsForMediumBackground(bg_color, fg_color,
Packit b099d7
			sel_color, ts_color, bs_color);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/*********************************************************************
Packit b099d7
 *
Packit b099d7
 *  GetColors
Packit b099d7
 *
Packit b099d7
 *********************************************************************/
Packit b099d7
static XmColorData * 
Packit b099d7
GetColors(
Packit b099d7
        Screen *screen,
Packit b099d7
        Colormap color_map,
Packit b099d7
        Pixel background )
Packit b099d7
{
Packit b099d7
	Display * display = DisplayOfScreen (screen);
Packit b099d7
	XmColorData *old_colors;
Packit b099d7
	XmColorData new_colors;
Packit b099d7
Packit b099d7
Packit b099d7
	new_colors.screen = screen;
Packit b099d7
	new_colors.color_map = color_map;
Packit b099d7
	new_colors.background.pixel = background;
Packit b099d7
Packit b099d7
	if (_XmSearchColorCache(
Packit b099d7
		(XmLOOK_AT_SCREEN | XmLOOK_AT_CMAP | XmLOOK_AT_BACKGROUND),
Packit b099d7
			&new_colors, &old_colors)) {
Packit b099d7
               /*
Packit b099d7
		* initialize the thresholds if the current color scheme
Packit b099d7
		* already matched what is in the cache and the thresholds
Packit b099d7
		* haven't already been initialized.
Packit b099d7
                */
Packit b099d7
                if (!XmTHRESHOLDS_INITD)
Packit b099d7
	            GetDefaultThresholdsForScreen(screen);
Packit b099d7
		return(old_colors);
Packit b099d7
        }
Packit b099d7
Packit b099d7
	XQueryColor (display, color_map, &(new_colors.background));
Packit b099d7
	new_colors.allocated = XmBACKGROUND;
Packit b099d7
Packit b099d7
	/*
Packit b099d7
	 * Just in case somebody looks at these before they're ready,
Packit b099d7
	 * initialize them to a value that is always valid (for most
Packit b099d7
	 * implementations of X).
Packit b099d7
	 */
Packit b099d7
	new_colors.foreground.pixel = new_colors.top_shadow.pixel = 
Packit b099d7
		new_colors.top_shadow.pixel = new_colors.select.pixel = 0;
Packit b099d7
Packit b099d7
	/*  Generate the foreground, top_shadow, and bottom_shadow based  */
Packit b099d7
	/*  on the background                                             */
Packit b099d7
Packit b099d7
	if (DefaultDepthOfScreen(screen) == 1)
Packit b099d7
		SetMonochromeColors(&new_colors);
Packit b099d7
	else
Packit b099d7
	  {
Packit b099d7
	      XmScreenColorProc screen_color_proc ;
Packit b099d7
Packit b099d7
	      GetDefaultThresholdsForScreen(screen);
Packit b099d7
Packit b099d7
	      /* look for the new per-Screen resource */
Packit b099d7
	      screen_color_proc = _XmGetColorCalculationProc(screen);
Packit b099d7
Packit b099d7
	      if (!screen_color_proc) {
Packit b099d7
		  /* no new color proc set, use the old one */
Packit b099d7
		  (*ColorRGBCalcProc)(&(new_colors.background),
Packit b099d7
				      &(new_colors.foreground), 
Packit b099d7
				      &(new_colors.select),
Packit b099d7
				      &(new_colors.top_shadow), 
Packit b099d7
				      &(new_colors.bottom_shadow));
Packit b099d7
	      } else {
Packit b099d7
		  /* call the application */
Packit b099d7
		  (*screen_color_proc)(screen,
Packit b099d7
				       &(new_colors.background),
Packit b099d7
				       &(new_colors.foreground), 
Packit b099d7
				       &(new_colors.select),
Packit b099d7
				       &(new_colors.top_shadow), 
Packit b099d7
				       &(new_colors.bottom_shadow));
Packit b099d7
	      }
Packit b099d7
	  }
Packit b099d7
	return (_XmAddToColorCache(&new_colors));
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
/*********************************************************************
Packit b099d7
         Global API
Packit b099d7
 ********************************************************************/
Packit b099d7
Packit b099d7
Packit b099d7
/* DEPRECATED in favor of the Screen resource XmNcolorcalculationProc
Packit b099d7
   that takes a Screen in argument (while colorProc doesn't) */
Packit b099d7
XmColorProc 
Packit b099d7
XmSetColorCalculation(
Packit b099d7
        XmColorProc proc )
Packit b099d7
{
Packit b099d7
	XmColorProc a = ColorRGBCalcProc;
Packit b099d7
Packit b099d7
	_XmProcessLock();
Packit b099d7
	if (proc != NULL)
Packit b099d7
		ColorRGBCalcProc = proc;
Packit b099d7
	else
Packit b099d7
		ColorRGBCalcProc = CalculateColorsRGB;
Packit b099d7
	
Packit b099d7
	_XmProcessUnlock();
Packit b099d7
	return(a);
Packit b099d7
}
Packit b099d7
Packit b099d7
/* DEPRECATED */
Packit b099d7
XmColorProc 
Packit b099d7
XmGetColorCalculation( void )
Packit b099d7
{
Packit b099d7
	return(ColorRGBCalcProc);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
void 
Packit b099d7
XmGetColors(
Packit b099d7
        Screen *screen,
Packit b099d7
        Colormap color_map,
Packit b099d7
        Pixel background,
Packit b099d7
        Pixel *foreground_ret,
Packit b099d7
        Pixel *top_shadow_ret,
Packit b099d7
        Pixel *bottom_shadow_ret,
Packit b099d7
        Pixel *select_ret )
Packit b099d7
{
Packit b099d7
	XmColorData *cd;
Packit b099d7
Packit b099d7
        _XmDisplayToAppContext(DisplayOfScreen(screen));
Packit b099d7
        _XmAppLock(app);
Packit b099d7
	_XmProcessLock();
Packit b099d7
	cd = GetColors(screen, color_map, background);
Packit b099d7
Packit b099d7
	if (foreground_ret)
Packit b099d7
		*foreground_ret = AccessColorData(cd, XmFOREGROUND);
Packit b099d7
	if (top_shadow_ret)
Packit b099d7
		*top_shadow_ret = AccessColorData(cd, XmTOP_SHADOW);
Packit b099d7
	if (bottom_shadow_ret)
Packit b099d7
		*bottom_shadow_ret = AccessColorData(cd, XmBOTTOM_SHADOW);
Packit b099d7
	if (select_ret)
Packit b099d7
		*select_ret = AccessColorData(cd, XmSELECT);
Packit b099d7
	_XmProcessUnlock();
Packit b099d7
	_XmAppUnlock(app);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/*********************************************************************
Packit b099d7
 *
Packit b099d7
 *  XmeGetDefaultPixel
Packit b099d7
 *	Given the widget and the requested type of default, generate the
Packit b099d7
 *	default and store it in the value structure to be returned.
Packit b099d7
 *
Packit b099d7
 *********************************************************************/
Packit b099d7
/*ARGSUSED*/
Packit b099d7
void 
Packit b099d7
XmeGetDefaultPixel(
Packit b099d7
        Widget widget,
Packit b099d7
        int type,
Packit b099d7
        int offset,
Packit b099d7
        XrmValue *value )
Packit b099d7
{
Packit b099d7
    Screen *screen;
Packit b099d7
    Colormap color_map;
Packit b099d7
    static Pixel new_value;
Packit b099d7
    XmColorData *color_data;
Packit b099d7
    Pixel background = 0 ;
Packit b099d7
    Widget parent;
Packit b099d7
    
Packit b099d7
    _XmWidgetToAppContext(widget);
Packit b099d7
Packit b099d7
    _XmAppLock(app);
Packit b099d7
    value->size = sizeof(new_value);
Packit b099d7
    value->addr = (char *) &new_value;
Packit b099d7
    
Packit b099d7
    if (!XtIsWidget(widget))
Packit b099d7
	{
Packit b099d7
	parent = widget->core.parent;
Packit b099d7
	color_map = parent->core.colormap;
Packit b099d7
	
Packit b099d7
	/*
Packit b099d7
	 *  Skip this for the background case.  The background
Packit b099d7
	 * field hasn't been inited yet but for the background
Packit b099d7
	 * case it isn't needed.
Packit b099d7
	 */
Packit b099d7
	 
Packit b099d7
	if (type != XmBACKGROUND)
Packit b099d7
	    {
Packit b099d7
	    if ((XmIsLabelGadget(widget)) ||
Packit b099d7
		(XmIsArrowButtonGadget(widget)) ||
Packit b099d7
		(XmIsSeparatorGadget(widget)))
Packit b099d7
		XtVaGetValues(widget, XmNbackground, &background, NULL);
Packit b099d7
	    else
Packit b099d7
		{
Packit b099d7
		/*
Packit b099d7
		  This line should not be executed but this case does
Packit b099d7
		  need to be handled.
Packit b099d7
		  */
Packit b099d7
		background = parent->core.background_pixel;
Packit b099d7
		}
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
    else
Packit b099d7
	{
Packit b099d7
	color_map = widget->core.colormap;
Packit b099d7
	if(type != XmBACKGROUND)
Packit b099d7
	    background = widget->core.background_pixel;
Packit b099d7
	}
Packit b099d7
    
Packit b099d7
    
Packit b099d7
    screen = XtScreen(widget);
Packit b099d7
    
Packit b099d7
    if (type == XmBACKGROUND)
Packit b099d7
	{
Packit b099d7
	color_data = GetDefaultColors(screen, color_map);
Packit b099d7
	}
Packit b099d7
    else
Packit b099d7
	{
Packit b099d7
	color_data = GetColors(screen, color_map, background);
Packit b099d7
	}
Packit b099d7
    
Packit b099d7
    new_value = AccessColorData(color_data, type);
Packit b099d7
    _XmAppUnlock(app);
Packit b099d7
}
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  Dynamic defaulting color functions
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
Packit b099d7
void 
Packit b099d7
_XmForegroundColorDefault(
Packit b099d7
        Widget widget,
Packit b099d7
        int offset,
Packit b099d7
        XrmValue *value )
Packit b099d7
{
Packit b099d7
   XmeGetDefaultPixel (widget, XmFOREGROUND, offset, value);
Packit b099d7
}
Packit b099d7
Packit b099d7
void 
Packit b099d7
_XmHighlightColorDefault(
Packit b099d7
        Widget widget,
Packit b099d7
        int offset,
Packit b099d7
        XrmValue *value )
Packit b099d7
{
Packit b099d7
   XmeGetDefaultPixel (widget, XmFOREGROUND, offset, value);
Packit b099d7
}
Packit b099d7
Packit b099d7
void 
Packit b099d7
_XmBackgroundColorDefault(
Packit b099d7
        Widget widget,
Packit b099d7
        int offset,
Packit b099d7
        XrmValue *value )
Packit b099d7
{
Packit b099d7
   XmeGetDefaultPixel (widget, XmBACKGROUND, offset, value);
Packit b099d7
}
Packit b099d7
Packit b099d7
void 
Packit b099d7
_XmTopShadowColorDefault(
Packit b099d7
        Widget widget,
Packit b099d7
        int offset,
Packit b099d7
        XrmValue *value )
Packit b099d7
{
Packit b099d7
   XmeGetDefaultPixel (widget, XmTOP_SHADOW, offset, value);
Packit b099d7
}
Packit b099d7
Packit b099d7
void 
Packit b099d7
_XmBottomShadowColorDefault(
Packit b099d7
        Widget widget,
Packit b099d7
        int offset,
Packit b099d7
        XrmValue *value )
Packit b099d7
{
Packit b099d7
   XmeGetDefaultPixel (widget, XmBOTTOM_SHADOW, offset, value);
Packit b099d7
}
Packit b099d7
Packit b099d7
void 
Packit b099d7
_XmSelectColorDefault(
Packit b099d7
        Widget widget,
Packit b099d7
        int offset,
Packit b099d7
        XrmValue *value )
Packit b099d7
{
Packit b099d7
   XmeGetDefaultPixel (widget, XmSELECT, offset, value);
Packit b099d7
}
Packit b099d7
Packit b099d7
#ifdef FIX_1381
Packit b099d7
static
Packit b099d7
unsigned int
Packit b099d7
FromColorToBlackAndWhite(char *col)
Packit b099d7
{
Packit b099d7
   unsigned long r, g, b, bw;
Packit b099d7
   char k[5];
Packit b099d7
   k[4] = '\0';
Packit b099d7
    
Packit b099d7
   memcpy(k, col, 4);
Packit b099d7
   r = strtoul(k, NULL, 16);
Packit b099d7
   memcpy(k, col + 4, 4);
Packit b099d7
   g = strtoul(k, NULL, 16);
Packit b099d7
   b = strtoul(col + 8, NULL, 16);
Packit b099d7
   bw = (0.3 * r + 0.59 * g + 0.11 * b);
Packit b099d7
   return (bw);
Packit b099d7
}
Packit b099d7
Packit b099d7
Pixmap
Packit b099d7
_XmConvertToBW(Widget w, Pixmap pm)
Packit b099d7
{
Packit b099d7
   XpmImage im;
Packit b099d7
   int i = 0;
Packit b099d7
   unsigned int bw = 0, bw2 = 0;
Packit b099d7
   char *col = NULL, *col2 = NULL;
Packit b099d7
   Pixmap bw_pixmap = XmUNSPECIFIED_PIXMAP;
Packit b099d7
#ifdef FIX_1500
Packit b099d7
   char *data_before = NULL, *data_after = NULL;
Packit b099d7
#endif
Packit b099d7
Packit b099d7
   if (pm == XmUNSPECIFIED_PIXMAP)
Packit b099d7
	   return bw_pixmap;
Packit b099d7
    
Packit b099d7
#ifdef FIX_1500
Packit b099d7
   XpmCreateBufferFromPixmap(XtDisplay(w), &data_before, pm, 0, NULL);
Packit b099d7
#endif
Packit b099d7
   XpmCreateXpmImageFromPixmap(XtDisplay(w), pm, 0, &im, NULL);
Packit b099d7
   if (im.ncolors > 0) {
Packit b099d7
	   if (im.ncolors <= 2) {
Packit b099d7
		   if (im.ncolors == 1) {
Packit b099d7
			   col = strdup(im.colorTable[0].c_color);
Packit b099d7
			   if (col[0] == '#') {
Packit b099d7
				   bw = (FromColorToBlackAndWhite(col + 1) * 0.65);
Packit b099d7
				   sprintf(im.colorTable[0].c_color, "#%04x%04x%04x", bw, bw, bw);
Packit b099d7
			   }
Packit b099d7
			   if (col) 
Packit b099d7
				   free(col);
Packit b099d7
		   } else {
Packit b099d7
			   col = im.colorTable[0].c_color;
Packit b099d7
			   col2 = im.colorTable[1].c_color;
Packit b099d7
			   if ((col[0] == '#') && (col2[0] == '#')) {
Packit b099d7
				   bw = FromColorToBlackAndWhite(col + 1);
Packit b099d7
				   bw2 = FromColorToBlackAndWhite(col2 + 1);
Packit b099d7
				   if (bw >= bw2) {
Packit b099d7
					   bw2 = bw2 + ((bw - bw2) * 0.65);
Packit b099d7
					   sprintf(im.colorTable[1].c_color, "#%04x%04x%04x", bw2, bw2, bw2);
Packit b099d7
				   } else {
Packit b099d7
					   bw = bw + ((bw2 - bw) * 0.65);
Packit b099d7
					   sprintf (im.colorTable[0].c_color, "#%04x%04x%04x", bw, bw, bw);
Packit b099d7
				   }
Packit b099d7
			   }
Packit b099d7
		   }
Packit b099d7
	   } else {
Packit b099d7
		   char e[5];
Packit b099d7
		   for (i = 0; i < im.ncolors; i++) {
Packit b099d7
			   col = im.colorTable[i].c_color;
Packit b099d7
			   if (col[0] == '#') {
Packit b099d7
				   bw = FromColorToBlackAndWhite(col + 1);
Packit b099d7
				   /* could be					
Packit b099d7
					sprintf(im.colorTable[i].c_color, "#%04x%04x%04x", bw, bw, bw);
Packit b099d7
					Four lower lines is sprintf optimized version */
Packit b099d7
				   sprintf(e, "%04x", bw);
Packit b099d7
				   memcpy(col + 1, e, 4);
Packit b099d7
				   memcpy(col + 5, e, 4);
Packit b099d7
				   memcpy(col + 9, e, 4);
Packit b099d7
			   }
Packit b099d7
		   }
Packit b099d7
	   }
Packit b099d7
   }
Packit b099d7
   XpmCreatePixmapFromXpmImage(XtDisplay(w), pm, &im, &bw_pixmap, 0, NULL);
Packit b099d7
#ifdef FIX_1500
Packit b099d7
   if (bw_pixmap)
Packit b099d7
	   XpmCreateBufferFromPixmap(XtDisplay(w), &data_after, bw_pixmap, 0, NULL);
Packit b099d7
Packit b099d7
   if (data_before && data_after && !strcmp(data_before, data_after))
Packit b099d7
	   bw_pixmap = 0;
Packit b099d7
Packit b099d7
   if (data_before)
Packit b099d7
	   XpmFree(data_before);
Packit b099d7
   if (data_after)
Packit b099d7
	   XpmFree(data_after);
Packit b099d7
#endif
Packit b099d7
   XpmFreeXpmImage(&im);
Packit b099d7
    
Packit b099d7
#ifdef FIX_1505
Packit b099d7
   return (bw_pixmap) ? bw_pixmap : pm;
Packit b099d7
#else
Packit b099d7
   return bw_pixmap;
Packit b099d7
#endif
Packit b099d7
}
Packit b099d7
#endif
Packit b099d7