Blame lib/Xm/PixConv.c

Packit b099d7
/* $XConsortium: PixConv.c /main/12 1996/12/16 18:32:08 drk $ */
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
 * (c) Copyright 1996 Digital Equipment Corporation.
Packit b099d7
 * (c) Copyright 1996 Hewlett-Packard Company.
Packit b099d7
 * (c) Copyright 1996 International Business Machines Corp.
Packit b099d7
 * (c) Copyright 1996 Sun Microsystems, Inc.
Packit b099d7
 * (c) Copyright 1996 Novell, Inc. 
Packit b099d7
 * (c) Copyright 1996 FUJITSU LIMITED.
Packit b099d7
 * (c) Copyright 1996 Hitachi.
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 <Xm/AccColorT.h> 
Packit b099d7
#include <Xm/TraitP.h> 
Packit b099d7
#include <Xm/XmP.h>
Packit b099d7
#include "XmI.h"
Packit b099d7
#include "ImageCachI.h"
Packit b099d7
#include "PixConvI.h"
Packit b099d7
#include "ScreenI.h"
Packit b099d7
Packit b099d7
/* Warning and Error messages */
Packit b099d7
Packit b099d7
#define DEPTH(widget)  \
Packit b099d7
    (XtIsWidget(widget))? \
Packit b099d7
       ((widget)->core.depth):((XtParent(widget))->core.depth)
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
/********    Static Function Declarations    ********/
Packit b099d7
Packit b099d7
static Boolean GetColorInfo (
Packit b099d7
			  Widget widget, 
Packit b099d7
			  XmAccessColorData acc_color);
Packit b099d7
static Pixmap GetPixmap (
Packit b099d7
			 Widget widget,
Packit b099d7
			 unsigned char  conv_type,
Packit b099d7
			 String image_name,
Packit b099d7
			 Boolean  scaling);
Packit b099d7
static Boolean CvtStringToPixmap( 
Packit b099d7
                        Display *dpy,
Packit b099d7
                        XrmValue *args,
Packit b099d7
                        Cardinal *numArgs,
Packit b099d7
                        XrmValue *fromVal,
Packit b099d7
                        XrmValue *toVal,
Packit b099d7
                        XtPointer *closure_ret) ;
Packit b099d7
/********    End Static Function Declarations    ********/
Packit b099d7
	
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
/*--------------------------------------------------------------*/
Packit b099d7
/*  Argument lists sent down to all pixmap converter functions  */
Packit b099d7
Packit b099d7
#define CONVERT_BITMAP  0
Packit b099d7
#define CONVERT_DYNAMIC 1
Packit b099d7
#define CONVERT_PIXMAP  2
Packit b099d7
Packit b099d7
Packit b099d7
static XtConvertArgRec bitmapArgs[] =
Packit b099d7
{
Packit b099d7
   { XtBaseOffset, (XtPointer) 0, sizeof (int) }, /* to get the widget */
Packit b099d7
   { XtAddress, (XtPointer)CONVERT_BITMAP, 0},
Packit b099d7
   { XtAddress, (XtPointer)True, 0}  /* scaling */
Packit b099d7
};
Packit b099d7
Packit b099d7
static XtConvertArgRec bitmapNoScalingArgs[] =
Packit b099d7
{
Packit b099d7
   { XtBaseOffset, (XtPointer) 0, sizeof (int) }, 
Packit b099d7
   { XtAddress, (XtPointer)CONVERT_BITMAP, 0},
Packit b099d7
   { XtAddress, (XtPointer)False, 0}
Packit b099d7
};
Packit b099d7
Packit b099d7
static XtConvertArgRec dynamicArgs[] =
Packit b099d7
{
Packit b099d7
   { XtBaseOffset, (XtPointer) 0, sizeof (int) },
Packit b099d7
   { XtAddress, (XtPointer)CONVERT_DYNAMIC, 0},
Packit b099d7
   { XtAddress, (XtPointer)True, 0}
Packit b099d7
};
Packit b099d7
Packit b099d7
static XtConvertArgRec dynamicNoScalingArgs[] =
Packit b099d7
{
Packit b099d7
   { XtBaseOffset, (XtPointer) 0, sizeof (int) },
Packit b099d7
   { XtAddress, (XtPointer)CONVERT_DYNAMIC, 0},
Packit b099d7
   { XtAddress, (XtPointer)False, 0}
Packit b099d7
};
Packit b099d7
Packit b099d7
static XtConvertArgRec pixmapArgs[] =
Packit b099d7
{
Packit b099d7
   { XtBaseOffset, (XtPointer) 0, sizeof (int) },
Packit b099d7
   { XtAddress, (XtPointer)CONVERT_PIXMAP, 0},
Packit b099d7
   { XtAddress, (XtPointer)False, 0}
Packit b099d7
};
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  _XmRegisterPixmapConverters
Packit b099d7
 *	Register the pixmap converters used in Motif 2.0
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
void 
Packit b099d7
_XmRegisterPixmapConverters( void )
Packit b099d7
{
Packit b099d7
    static Boolean inited = False;
Packit b099d7
Packit b099d7
    _XmProcessLock();
Packit b099d7
    if (inited == False) {
Packit b099d7
	inited = True;
Packit b099d7
	
Packit b099d7
	/* for icon masks - need scaling */
Packit b099d7
	XtSetTypeConverter (XmRString, XmRBitmap, 
Packit b099d7
			    CvtStringToPixmap,
Packit b099d7
			    bitmapArgs, XtNumber(bitmapArgs),
Packit b099d7
			    (XtCacheNone | XtCacheRefCount), NULL);
Packit b099d7
	/* for insensitive stipple */
Packit b099d7
	XtSetTypeConverter (XmRString, XmRNoScalingBitmap, 
Packit b099d7
			    CvtStringToPixmap,
Packit b099d7
			    bitmapNoScalingArgs, 
Packit b099d7
			    XtNumber(bitmapNoScalingArgs),
Packit b099d7
			    (XtCacheNone | XtCacheRefCount), NULL);
Packit b099d7
	/* for most pixmap used as icon - need scaling */
Packit b099d7
	XtSetTypeConverter (XmRString, XmRDynamicPixmap,
Packit b099d7
			    CvtStringToPixmap, 
Packit b099d7
			    dynamicArgs, XtNumber(dynamicArgs),
Packit b099d7
			    (XtCacheNone | XtCacheRefCount), NULL);
Packit b099d7
 	/* for pixmap used as tiling */
Packit b099d7
	XtSetTypeConverter (XmRString, XmRNoScalingDynamicPixmap,
Packit b099d7
			    CvtStringToPixmap, 
Packit b099d7
			    dynamicNoScalingArgs, 
Packit b099d7
			    XtNumber(dynamicNoScalingArgs),
Packit b099d7
			    (XtCacheNone | XtCacheRefCount), NULL);
Packit b099d7
Packit b099d7
 	/* for background and shell iconPixmap: no scaling by default */
Packit b099d7
	XtSetTypeConverter (XmRString, XmRPixmap, 
Packit b099d7
			    CvtStringToPixmap,
Packit b099d7
			    pixmapArgs, XtNumber(pixmapArgs),
Packit b099d7
			    (XtCacheNone | XtCacheRefCount), NULL);
Packit b099d7
	
Packit b099d7
	
Packit b099d7
#ifndef _NO_PIXMAP_CONV_BC
Packit b099d7
/* Here we install the 1.2 pixmap converters by default,
Packit b099d7
   so that subwidgets can still use them.
Packit b099d7
   They use the pixmapArgs, meaning they create a matching 
Packit b099d7
   depth pixmap, with background and foreground color, not
Packit b099d7
   highlight, top_shadow, etc.
Packit b099d7
Packit b099d7
   define _NO_PIXMAP_CONV_BC if you don't want them */
Packit b099d7
Packit b099d7
	XtSetTypeConverter (XmRString, XmRXmBackgroundPixmap, 
Packit b099d7
			    CvtStringToPixmap,
Packit b099d7
			    pixmapArgs, XtNumber(pixmapArgs),
Packit b099d7
			    (XtCacheNone | XtCacheRefCount), NULL);
Packit b099d7
	
Packit b099d7
	XtSetTypeConverter (XmRString, XmRPrimForegroundPixmap,
Packit b099d7
			    CvtStringToPixmap, 
Packit b099d7
			    pixmapArgs, XtNumber(pixmapArgs),
Packit b099d7
			    (XtCacheNone | XtCacheRefCount), NULL);
Packit b099d7
	
Packit b099d7
	XtSetTypeConverter (XmRString, XmRPrimHighlightPixmap,
Packit b099d7
			    CvtStringToPixmap, 
Packit b099d7
			    pixmapArgs, XtNumber(pixmapArgs),
Packit b099d7
			    (XtCacheNone | XtCacheRefCount), NULL);
Packit b099d7
	
Packit b099d7
	XtSetTypeConverter (XmRString, XmRPrimTopShadowPixmap,
Packit b099d7
			    CvtStringToPixmap, 
Packit b099d7
			    pixmapArgs, XtNumber(pixmapArgs),
Packit b099d7
			    (XtCacheNone | XtCacheRefCount), NULL);
Packit b099d7
	
Packit b099d7
	XtSetTypeConverter (XmRString, XmRPrimBottomShadowPixmap,
Packit b099d7
			    CvtStringToPixmap, 
Packit b099d7
			    pixmapArgs, XtNumber(pixmapArgs),
Packit b099d7
			    (XtCacheNone | XtCacheRefCount), NULL);
Packit b099d7
	
Packit b099d7
	XtSetTypeConverter (XmRString, XmRManForegroundPixmap,
Packit b099d7
			    CvtStringToPixmap, 
Packit b099d7
			    pixmapArgs, XtNumber(pixmapArgs),
Packit b099d7
			    (XtCacheNone | XtCacheRefCount), NULL);
Packit b099d7
	
Packit b099d7
	XtSetTypeConverter (XmRString, XmRManHighlightPixmap,
Packit b099d7
			    CvtStringToPixmap, 
Packit b099d7
			    pixmapArgs, XtNumber(pixmapArgs),
Packit b099d7
			    (XtCacheNone | XtCacheRefCount), NULL);
Packit b099d7
	
Packit b099d7
	XtSetTypeConverter (XmRString, XmRManTopShadowPixmap,
Packit b099d7
			    CvtStringToPixmap, 
Packit b099d7
			    pixmapArgs, XtNumber(pixmapArgs),
Packit b099d7
			    (XtCacheNone | XtCacheRefCount), NULL);
Packit b099d7
	
Packit b099d7
	XtSetTypeConverter (XmRString, XmRManBottomShadowPixmap,
Packit b099d7
			    CvtStringToPixmap, 
Packit b099d7
			    pixmapArgs, XtNumber(pixmapArgs),
Packit b099d7
			    (XtCacheNone | XtCacheRefCount), NULL);
Packit b099d7
	
Packit b099d7
	XtSetTypeConverter (XmRString, XmRGadgetPixmap,
Packit b099d7
			    CvtStringToPixmap, 
Packit b099d7
			    pixmapArgs, XtNumber(pixmapArgs),
Packit b099d7
			    (XtCacheNone | XtCacheRefCount), NULL);
Packit b099d7
Packit b099d7
	XtSetTypeConverter (XmRString, XmRAnimationPixmap,
Packit b099d7
			    CvtStringToPixmap, 
Packit b099d7
			    pixmapArgs, XtNumber(pixmapArgs),
Packit b099d7
			    (XtCacheNone | XtCacheRefCount), NULL);
Packit b099d7
Packit b099d7
	XtSetTypeConverter (XmRString, XmRAnimationMask, 
Packit b099d7
			    CvtStringToPixmap,
Packit b099d7
			    bitmapArgs, XtNumber(bitmapArgs),
Packit b099d7
			    (XtCacheNone | XtCacheRefCount), NULL);
Packit b099d7
Packit b099d7
Packit b099d7
#endif /* _NO_PIXMAP_CONV_BC */
Packit b099d7
    }
Packit b099d7
Packit b099d7
    _XmProcessUnlock();
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  CvtStringToPixmap
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static Boolean 
Packit b099d7
CvtStringToPixmap(
Packit b099d7
        Display *dpy,
Packit b099d7
        XrmValue *args,
Packit b099d7
        Cardinal *numArgs,
Packit b099d7
        XrmValue *fromVal,
Packit b099d7
        XrmValue *toVal,
Packit b099d7
        XtPointer *closure_ret)	/* unused */
Packit b099d7
{
Packit b099d7
   Pixmap pixmap = XmUNSPECIFIED_PIXMAP;
Packit b099d7
   String image_name = (String) (fromVal->addr);
Packit b099d7
   Widget widget ;
Packit b099d7
   unsigned char conv_type ;
Packit b099d7
   Boolean scaling;
Packit b099d7
Packit b099d7
   /* only called locally, no need to check number of arguments,
Packit b099d7
      just be sure it's 3 */
Packit b099d7
Packit b099d7
   widget = *((Widget *) args[0].addr);
Packit b099d7
Packit b099d7
   if (XmeNamesAreEqual(image_name, "none")) {
Packit b099d7
       pixmap = None ;
Packit b099d7
       _XM_CONVERTER_DONE ( toVal, Pixmap, pixmap, 
Packit b099d7
	     XmDestroyPixmap(XtScreen(widget), pixmap) ;)
Packit b099d7
   }
Packit b099d7
       
Packit b099d7
   if (XmeNamesAreEqual(image_name, XmSunspecified_pixmap)) {
Packit b099d7
       pixmap = XmUNSPECIFIED_PIXMAP ;
Packit b099d7
       _XM_CONVERTER_DONE ( toVal, Pixmap, pixmap, 
Packit b099d7
	     XmDestroyPixmap(XtScreen(widget), pixmap) ;)
Packit b099d7
   }
Packit b099d7
Packit b099d7
   conv_type = (unsigned char) (int) (long) args[1].addr;
Packit b099d7
   scaling = (unsigned char) (int) (long) args[2].addr;
Packit b099d7
Packit b099d7
   pixmap = GetPixmap (widget, conv_type, image_name, scaling) ;
Packit b099d7
       
Packit b099d7
   if (pixmap == XmUNSPECIFIED_PIXMAP) {
Packit b099d7
       XtDisplayStringConversionWarning(dpy, image_name, 
Packit b099d7
					XmRPixmap);
Packit b099d7
       return False;   
Packit b099d7
   }
Packit b099d7
Packit b099d7
Packit b099d7
   _XM_CONVERTER_DONE ( toVal, Pixmap, pixmap, 
Packit b099d7
		       XmDestroyPixmap(XtScreen(widget), pixmap) ;)
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
static Pixmap 
Packit b099d7
GetPixmap (
Packit b099d7
	   Widget widget,
Packit b099d7
	   unsigned char converter_type,
Packit b099d7
	   String image_name,
Packit b099d7
	   Boolean scaling)
Packit b099d7
{
Packit b099d7
   int depth ;
Packit b099d7
   Screen * screen = XtScreen(widget);
Packit b099d7
   Pixmap pixmap ;
Packit b099d7
   XmAccessColorDataRec acc_color_rec;
Packit b099d7
   double scaling_ratio ;
Packit b099d7
Packit b099d7
   if (scaling) scaling_ratio = 0 ; else scaling_ratio = 1;
Packit b099d7
Packit b099d7
   if (converter_type == CONVERT_BITMAP) {
Packit b099d7
       pixmap = XmGetScaledPixmap (widget, image_name, 1, 0, 1, 
Packit b099d7
				   scaling_ratio); 
Packit b099d7
       /* pass a double: 0 means scaling using print shell resolution, etc
Packit b099d7
	  and 1 means no scaling explicitly */
Packit b099d7
       /* use the widget to find the print shell which gives
Packit b099d7
	  the pixmap resolution to be applied */
Packit b099d7
       return pixmap  ;
Packit b099d7
   }
Packit b099d7
Packit b099d7
   /* else it's the CONVERT_DYNAMIC or CONVERT_PIXMAP case */
Packit b099d7
Packit b099d7
   /* ask the class for color info */
Packit b099d7
   if (!GetColorInfo (widget, &acc_color_rec))
Packit b099d7
       /* If we cannot get the colors out of the widget,
Packit b099d7
	  we have to delay the conversion.
Packit b099d7
	  So we return a magic value for the pixmap,
Packit b099d7
	  so that the conversion be done later in Initialize. 
Packit b099d7
	  This probably happens for gadget when the cache is not yet 
Packit b099d7
	  created at the time the pixmap is converted, so the colors
Packit b099d7
	  cannot be accessed. */
Packit b099d7
       return  XmDELAYED_PIXMAP;
Packit b099d7
Packit b099d7
   depth = DEPTH(widget);
Packit b099d7
Packit b099d7
    /* here we want the function to return a bitmap in the xbm case 
Packit b099d7
      or a pixmap (match depth actually) in the xpm case.
Packit b099d7
      since it is a breakage, I can either use a new private API,
Packit b099d7
      or a private convention, useful for others who know it :-)
Packit b099d7
      the convention is -depth (depth is an int). Positive depth 
Packit b099d7
Packit b099d7
      will still fetch pixmap even for xbm. */
Packit b099d7
   depth = -depth ;
Packit b099d7
Packit b099d7
   
Packit b099d7
   /* if PIXMAP forced, force depth to be positive, meaning
Packit b099d7
      always a pixmap even if xbm specified */
Packit b099d7
   /* ...as long as the foreground color is not XmUNSPECIFIED_PIXEL.
Packit b099d7
      Otherwise, the pixmap gets created with a bogus foreground color.
Packit b099d7
      (Metro Link fix) */
Packit b099d7
   /* this is mainly for backgroundPixmap */
Packit b099d7
   /* if the resource name was available in the converter, I could
Packit b099d7
      give it to GetColorInfo and have the class decide.. Xt problem */
Packit b099d7
Packit b099d7
   if ((depth < 0) && (acc_color_rec.foreground != XmUNSPECIFIED_PIXEL) &&
Packit b099d7
       ((converter_type == CONVERT_PIXMAP) ||
Packit b099d7
	(_XmGetBitmapConversionModel(screen) == XmMATCH_DEPTH)))
Packit b099d7
       depth = - depth ;
Packit b099d7
Packit b099d7
   pixmap = _XmGetScaledPixmap (screen, widget, image_name,
Packit b099d7
				&acc_color_rec, depth, FALSE,
Packit b099d7
				scaling_ratio); /* pass scaling down to
Packit b099d7
				             ImageCache */ 
Packit b099d7
Packit b099d7
   return pixmap ; 
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
static Boolean
Packit b099d7
GetColorInfo (
Packit b099d7
	       Widget widget, 
Packit b099d7
	       XmAccessColorData acc_color)
Packit b099d7
{
Packit b099d7
    XmAccessColorsTrait access_colors_trait ;
Packit b099d7
Packit b099d7
    access_colors_trait = (XmAccessColorsTrait) 
Packit b099d7
	XmeTraitGet((XtPointer)XtClass(widget), XmQTaccessColors) ;
Packit b099d7
    
Packit b099d7
    if (access_colors_trait) {
Packit b099d7
	acc_color->valueMask = AccessForeground | AccessBackgroundPixel |
Packit b099d7
	    AccessHighlightColor | AccessTopShadowColor | 
Packit b099d7
		AccessBottomShadowColor | AccessSelectColor;
Packit b099d7
	access_colors_trait->getColors(widget, acc_color) ;
Packit b099d7
Packit b099d7
	/* some widget don't have select color */
Packit b099d7
	if (!(acc_color->valueMask & AccessSelectColor))
Packit b099d7
	    acc_color->select_color = XmUNSPECIFIED_PIXEL ;
Packit b099d7
Packit b099d7
	if (acc_color->valueMask == AccessColorInvalid) 
Packit b099d7
	    return False ;
Packit b099d7
    }
Packit b099d7
    else /* not one of ours, set dumb default */ {
Packit b099d7
	if (XtIsWidget(widget))
Packit b099d7
	    acc_color->background = widget->core.background_pixel;
Packit b099d7
	else
Packit b099d7
	    acc_color->background = WhitePixelOfScreen(XtScreen(widget));
Packit b099d7
	acc_color->foreground = BlackPixelOfScreen(XtScreen(widget));
Packit b099d7
	acc_color->highlight_color = acc_color->top_shadow_color = 
Packit b099d7
	    acc_color->bottom_shadow_color = acc_color->select_color 
Packit b099d7
		= XmUNSPECIFIED_PIXEL ;
Packit b099d7
    }
Packit b099d7
    
Packit b099d7
    return True ;
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  Dynamic defaulting pixmap functions.
Packit b099d7
 *  Usable by most classes since they query the class back for pixel
Packit b099d7
 *  and depth information.
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
/*ARGSUSED*/
Packit b099d7
void 
Packit b099d7
_XmTopShadowPixmapDefault(
Packit b099d7
        Widget widget,
Packit b099d7
        int offset,		/* unused */
Packit b099d7
        XrmValue *value )
Packit b099d7
{
Packit b099d7
   static Pixmap pixmap;
Packit b099d7
   XmAccessColorDataRec acc_color_rec ;
Packit b099d7
   int depth ;
Packit b099d7
Packit b099d7
   pixmap = XmUNSPECIFIED_PIXMAP;
Packit b099d7
Packit b099d7
   value->addr = (char *) &pixmap;
Packit b099d7
   value->size = sizeof (Pixmap);
Packit b099d7
Packit b099d7
   /* no need to check for return value from GetColorInfo here
Packit b099d7
      since these resources are always converted for valid
Packit b099d7
      widget or gadget */
Packit b099d7
   (void) GetColorInfo (widget, &acc_color_rec) ;
Packit b099d7
Packit b099d7
   depth = DEPTH(widget);
Packit b099d7
Packit b099d7
   /* no scaling in this case: last arg 1 */
Packit b099d7
   if (depth == 1)
Packit b099d7
       pixmap = XmGetScaledPixmap (widget, XmS50_foreground,
Packit b099d7
				   1, 0, 1, 1);
Packit b099d7
   else 
Packit b099d7
       if (acc_color_rec.top_shadow_color == acc_color_rec.background) {
Packit b099d7
	   /* forces a real pixmap here, otherwise the widget will 
Packit b099d7
	      still use the top_shadow_color == background as a 
Packit b099d7
	      stipple, so don't negative depth  */
Packit b099d7
Packit b099d7
	   pixmap = XmGetScaledPixmap (widget, 
Packit b099d7
				       XmS50_foreground,
Packit b099d7
				       acc_color_rec.top_shadow_color, 
Packit b099d7
				       acc_color_rec.foreground, 
Packit b099d7
				       depth, 1);
Packit b099d7
       }
Packit b099d7
}
Packit b099d7
Packit b099d7
/*ARGSUSED*/
Packit b099d7
void 
Packit b099d7
_XmHighlightPixmapDefault(
Packit b099d7
        Widget widget,
Packit b099d7
        int offset,		/* unused */
Packit b099d7
        XrmValue *value )
Packit b099d7
{
Packit b099d7
   static Pixmap pixmap;
Packit b099d7
   XmAccessColorDataRec acc_color_rec ;
Packit b099d7
   int depth ;
Packit b099d7
Packit b099d7
   pixmap = XmUNSPECIFIED_PIXMAP;
Packit b099d7
Packit b099d7
   value->addr = (char *) &pixmap;
Packit b099d7
   value->size = sizeof (Pixmap);
Packit b099d7
Packit b099d7
   /* no need to check for return value from GetColorInfo here
Packit b099d7
      since these resources are always converted for valid
Packit b099d7
      widget or gadget */
Packit b099d7
   (void) GetColorInfo (widget, &acc_color_rec) ;
Packit b099d7
Packit b099d7
   depth = DEPTH(widget);
Packit b099d7
Packit b099d7
   if (acc_color_rec.highlight_color == acc_color_rec.background) {
Packit b099d7
       /* forces a real pixmap here, otherwise the widget will still use
Packit b099d7
	  the highlight_color == background as a stipple */
Packit b099d7
       pixmap = XmGetScaledPixmap  (widget, XmS50_foreground,
Packit b099d7
				    acc_color_rec.highlight_color, 
Packit b099d7
				    acc_color_rec.foreground, 
Packit b099d7
				    depth, 1);
Packit b099d7
   }
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
   
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  _XmGetPixmapBasedGC
Packit b099d7
 *     Get the graphics context used for drawing with a pixmap.
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
GC
Packit b099d7
_XmGetPixmapBasedGC(
Packit b099d7
        Widget w,
Packit b099d7
        Pixel foreground,
Packit b099d7
        Pixel background,
Packit b099d7
        Pixmap pixmap)
Packit b099d7
{
Packit b099d7
   XGCValues values;
Packit b099d7
   XtGCMask  valueMask;
Packit b099d7
Packit b099d7
   valueMask = GCForeground | GCBackground;
Packit b099d7
   values.foreground = foreground;
Packit b099d7
   values.background = background;
Packit b099d7
Packit b099d7
   if ((pixmap != None) && (pixmap != XmUNSPECIFIED_PIXMAP)) {
Packit b099d7
       int depth ;
Packit b099d7
Packit b099d7
       XmeGetPixmapData(XtScreen(w), pixmap,
Packit b099d7
			NULL,    
Packit b099d7
			&depth,
Packit b099d7
			NULL, NULL, NULL, NULL, NULL, NULL); 
Packit b099d7
        
Packit b099d7
       if (depth == 1) {
Packit b099d7
	   valueMask |= GCFillStyle | GCStipple ;
Packit b099d7
	   values.fill_style = FillOpaqueStippled;
Packit b099d7
	   values.stipple = pixmap;
Packit b099d7
	   /* topShadowPixmap has a foreground=background=1 */
Packit b099d7
	   if (foreground == background) values.foreground = background?0:1;
Packit b099d7
       } else {
Packit b099d7
	   valueMask |= GCFillStyle | GCTile ;
Packit b099d7
	   values.fill_style = FillTiled;
Packit b099d7
	   values.tile = pixmap;
Packit b099d7
       }	   
Packit b099d7
	       
Packit b099d7
   }
Packit b099d7
Packit b099d7
   return (XtGetGC (w, valueMask, &values));
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7