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