|
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 |
|