Blame lib/Xm/XmRenderT.c

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
#ifdef HAVE_CONFIG_H
Packit b099d7
#include <config.h>
Packit b099d7
#endif
Packit b099d7
Packit b099d7
#define FIX_1152
Packit b099d7
Packit b099d7
#ifdef REV_INFO
Packit b099d7
#ifndef lint
Packit b099d7
static char rcsid[] = "$TOG: XmRenderT.c /main/14 1998/10/26 20:14:42 samborn $"
Packit b099d7
#endif
Packit b099d7
#endif
Packit b099d7
Packit b099d7
#ifndef X_NOT_STDC_ENV
Packit b099d7
#include <stdlib.h>
Packit b099d7
#endif
Packit b099d7
#include <string.h>
Packit b099d7
#include <ctype.h>
Packit b099d7
#include <math.h>
Packit b099d7
Packit b099d7
#ifdef __cplusplus
Packit b099d7
extern "C" { /* some 'locale.h' do not have prototypes (sun) */
Packit b099d7
#endif
Packit b099d7
#include <X11/Xlocale.h>
Packit b099d7
#ifdef __cplusplus
Packit b099d7
} /* Close scope of 'extern "C"' declaration */
Packit b099d7
#endif /* __cplusplus */
Packit b099d7
Packit b099d7
#include <Xm/XmosP.h>		/* For ALLOCATE/DEALLOCATE_LOCAL */
Packit b099d7
#include <X11/IntrinsicP.h>
Packit b099d7
#include <X11/ShellP.h>
Packit b099d7
#include <X11/Xresource.h>
Packit b099d7
#include <Xm/Display.h>		/* For XmGetXmDisplay */
Packit b099d7
#include <Xm/DisplayP.h>	/* For direct access to callback fields */
Packit b099d7
#include "MessagesI.h"
Packit b099d7
#include "XmI.h"
Packit b099d7
#include "XmRenderTI.h"
Packit b099d7
#include "XmStringI.h"
Packit b099d7
#include "XmTabListI.h"
Packit b099d7
#ifdef USE_XFT
Packit b099d7
#include <X11/Xft/Xft.h>
Packit b099d7
#endif
Packit b099d7
Packit b099d7
/* Warning Messages */
Packit b099d7
#define NO_NULL_TAG_MSG			_XmMMsgXmRenderT_0000
Packit b099d7
#define NULL_DISPLAY_MSG      		_XmMMsgXmRenderT_0001
Packit b099d7
#define INVALID_TYPE_MSG      		_XmMMsgXmRenderT_0002
Packit b099d7
#define CONVERSION_FAILED_MSG 		_XmMMsgXmRenderT_0003
Packit b099d7
#define NULL_FONT_TYPE_MSG    		_XmMMsgXmRenderT_0004
Packit b099d7
#define NULL_LOAD_IMMEDIATE_MSG		_XmMMsgXmRenderT_0005
Packit b099d7
Packit b099d7
/* local macros */
Packit b099d7
#define GetHandle(type)		(type *)XtMalloc(sizeof(type))
Packit b099d7
#define FreeHandle(handle)	XtFree((char *)handle)
Packit b099d7
#define SetPtr(handle, ptr)	*(handle) = ptr
Packit b099d7
#define GetPtr(handle)		*(handle)
Packit b099d7
#define NameIsString(fontname) \
Packit b099d7
  (((fontname) != NULL) && ((fontname) != (String)XmAS_IS))
Packit b099d7
#define ListIsList(tablist) \
Packit b099d7
  (((tablist) != NULL) && \
Packit b099d7
   ((unsigned int)(unsigned long)(tablist) != XmAS_IS))
Packit b099d7
Packit b099d7
#define  FIX_1414
Packit b099d7
#define  FIX_1449
Packit b099d7
#define  FIX_1444
Packit b099d7
#define FIX_1451
Packit b099d7
#define FIX_1536
Packit b099d7
/**********************************************************************
Packit b099d7
 *	      IMPORTANT NOTE: IMPLEMENTATION OF SHARING
Packit b099d7
 *
Packit b099d7
 *	Instances of XmRenderTable and XmRendition are shared via a
Packit b099d7
 *	reference counting mechanism. This comment provides a general
Packit b099d7
 *	overview of how this is done.
Packit b099d7
 *
Packit b099d7
 *	First, both rendertable and renditions are indirectly
Packit b099d7
 *	referenced via a handle mechanism.  See the GetHandle,
Packit b099d7
 *	FreeHandle, SetPtr and GetPtr macros above.  This allows
Packit b099d7
 *	either the handle to change without the underlying data
Packit b099d7
 * 	structure changing, or the underlying data structure to change
Packit b099d7
 *	without the handle changing. I will indicate below where this
Packit b099d7
 *	happens.
Packit b099d7
 *
Packit b099d7
 *	Second, the real data structure for rendertable and rendition
Packit b099d7
 *	contain a reference count.  This count is incremented on copy
Packit b099d7
 *	and decremented on free.  If a decrement produces a zero
Packit b099d7
 *	refcount, the actual memory is freed.  If an increment
Packit b099d7
 *	produces a zero refcount, then the refcount has overflowed.  The
Packit b099d7
 *	refcount is decremented, and new memory is allocated for a new
Packit b099d7
 *	copy. 
Packit b099d7
 *
Packit b099d7
 *	Finally, I have defined a terminology for the different types
Packit b099d7
 *	of "copying" that can done based on allocating a new handle or
Packit b099d7
 *	not and allocating a new data structure or not.  This probably
Packit b099d7
 *	conflicts with some other existing terminology, probably in
Packit b099d7
 *	object oriented programming.  Sorry about that.
Packit b099d7
 *
Packit b099d7
 *	Function:	Clone	Copy	Renew	Duplicate
Packit b099d7
 *			(Mutate)	(Update)
Packit b099d7
 *
Packit b099d7
 *	handle		new	new	old	old
Packit b099d7
 *	structure	new	inc	new	inc
Packit b099d7
 *			(changed)	(changed)
Packit b099d7
 *
Packit b099d7
 *	(changed) indicates that the data in the new structure has
Packit b099d7
 *	been changed from the data in the old structure.
Packit b099d7
 *
Packit b099d7
 *	I will use these terms as a short hand in describing the
Packit b099d7
 *	functions below.
Packit b099d7
 **********************************************************************/
Packit b099d7
Packit b099d7
Packit b099d7
/********    Static Function Declarations    ********/
Packit b099d7
Packit b099d7
static void CopyInto(XmRendition toRend, 
Packit b099d7
		     XmRendition fromRend); 
Packit b099d7
static void MergeInto(XmRendition toRend, 
Packit b099d7
		     XmRendition fromRend); 
Packit b099d7
static XmRendition CloneRendition(XmRendition rend); 
Packit b099d7
static XmRendition CopyRendition(XmRendition rend); 
Packit b099d7
static XmRendition RenewRendition(XmRendition rend); 
Packit b099d7
static XmRendition DuplicateRendition(XmRendition rend); 
Packit b099d7
static Boolean FreeRendition(XmRendition rend); 
Packit b099d7
static void RenditionWarning(char *tag, char *type,
Packit b099d7
			     char *message, Display *dpy);
Packit b099d7
static void CleanupResources(XmRendition rend, Boolean copy);
Packit b099d7
static void ValidateTag(XmRendition rend,
Packit b099d7
			XmStringTag dflt);
Packit b099d7
static void ValidateAndLoadFont(XmRendition rend, Display *display);
Packit b099d7
static void SetRend(XmRendition to,
Packit b099d7
		    XmRendition from); 
Packit b099d7
static Boolean RendComplete(XmRendition rend);      
Packit b099d7
static void CopyFromArg(XtArgVal src,
Packit b099d7
			char *dst,
Packit b099d7
			unsigned int size);
Packit b099d7
static void CopyToArg(char *src,
Packit b099d7
		      XtArgVal *dst,
Packit b099d7
		      unsigned int size); 
Packit b099d7
static Cardinal GetNamesAndClasses(Widget w,
Packit b099d7
				   XrmNameList names,
Packit b099d7
				   XrmClassList classes); 
Packit b099d7
static XrmResourceList CompileResourceTable(XtResourceList resources,
Packit b099d7
					    Cardinal num_resources); 
Packit b099d7
static Boolean GetResources(XmRendition rend,
Packit b099d7
			    Display *dsp,
Packit b099d7
			    Widget wid,
Packit b099d7
			    String resname,
Packit b099d7
			    String resclass,
Packit b099d7
			    XmStringTag tag,
Packit b099d7
			    ArgList arglist,
Packit b099d7
			    Cardinal argcount);
Packit b099d7
static void SetDefault(XmRendition rend); 
Packit b099d7
#ifdef USE_XFT
Packit b099d7
#ifdef FIX_1536
Packit b099d7
static XftColor GetCachedXftColor(Display *display, Pixel color);
Packit b099d7
#endif
Packit b099d7
#endif
Packit b099d7
Packit b099d7
/********    End Static Function Declarations    ********/
Packit b099d7

Packit b099d7
/* Resource List. */
Packit b099d7
Packit b099d7
/************************************************************************/
Packit b099d7
/* N.B.:  The SetDefault procedure has a hardcoded list of all the	*/
Packit b099d7
/*	common resources.  Be sure to update it when adding resources.	*/
Packit b099d7
/************************************************************************/
Packit b099d7
Packit b099d7
#define DEFAULT_loadModel		XmAS_IS
Packit b099d7
#define DEFAULT_tag			XmS
Packit b099d7
#define DEFAULT_fontName		(String)XmAS_IS
Packit b099d7
#define DEFAULT_fontType		(XmFontType)XmAS_IS
Packit b099d7
#define DEFAULT_font			(XtPointer)XmAS_IS
Packit b099d7
#define DEFAULT_tabs			(XmTabList)XmAS_IS
Packit b099d7
#define DEFAULT_background		XmUNSPECIFIED_PIXEL
Packit b099d7
#define DEFAULT_foreground		XmUNSPECIFIED_PIXEL
Packit b099d7
#define DEFAULT_underlineType		XmAS_IS
Packit b099d7
#define DEFAULT_strikethruType		XmAS_IS
Packit b099d7
#define DEFAULT_backgroundState		XmAS_IS
Packit b099d7
#define DEFAULT_foregroundState		XmAS_IS
Packit b099d7
#ifdef USE_XFT
Packit b099d7
#define DEFAULT_xftFont			(XtPointer)XmAS_IS
Packit b099d7
#define DEFAULT_fontStyle		(String)NULL
Packit b099d7
#define DEFAULT_fontFoundry		(String)NULL
Packit b099d7
#define DEFAULT_fontEncoding		(String)NULL
Packit b099d7
#define DEFAULT_fontSize		0
Packit b099d7
#endif
Packit b099d7
Packit b099d7
static XtResource _XmRenditionResources[] = {
Packit b099d7
  { 
Packit b099d7
    XmNtag, XmCTag, XmRString,
Packit b099d7
    sizeof(XmStringTag), XtOffsetOf(_XmRenditionRec, tag),
Packit b099d7
    XmRImmediate, (XtPointer) DEFAULT_tag
Packit b099d7
  },
Packit b099d7
  { 
Packit b099d7
    XmNfontName, XmCFontName, XmRString,
Packit b099d7
    sizeof(String), XtOffsetOf(_XmRenditionRec, fontName),
Packit b099d7
    XmRImmediate, (XtPointer) DEFAULT_fontName
Packit b099d7
  },
Packit b099d7
  { 
Packit b099d7
    XmNfontType, XmCFontType, XmRFontType,
Packit b099d7
    sizeof(XmFontType), XtOffsetOf(_XmRenditionRec, fontType),
Packit b099d7
    XmRImmediate, (XtPointer) DEFAULT_fontType
Packit b099d7
  },
Packit b099d7
  { 
Packit b099d7
    XmNfont, XmCFont, XmRFontStruct,
Packit b099d7
    sizeof(XtPointer), XtOffsetOf(_XmRenditionRec, font),
Packit b099d7
    XmRImmediate, (XtPointer) DEFAULT_font
Packit b099d7
  },
Packit b099d7
  { 
Packit b099d7
    XmNloadModel, XmCLoadModel, XmRLoadModel,
Packit b099d7
    sizeof(unsigned char), XtOffsetOf(_XmRenditionRec, loadModel),
Packit b099d7
    XmRImmediate, (XtPointer) DEFAULT_loadModel
Packit b099d7
  },
Packit b099d7
  { 
Packit b099d7
    XmNtabList, XmCTabList, XmRTabList,
Packit b099d7
    sizeof(XmTabList), XtOffsetOf(_XmRenditionRec, tabs),
Packit b099d7
    XmRImmediate, (XtPointer) DEFAULT_tabs
Packit b099d7
  },
Packit b099d7
#if USE_XFT
Packit b099d7
  {
Packit b099d7
    XmNxftFont, XmCXftFont, XmRPointer,
Packit b099d7
    sizeof (XtPointer), XtOffsetOf (_XmRenditionRec, xftFont),
Packit b099d7
    XmRImmediate, (XtPointer) DEFAULT_xftFont
Packit b099d7
  },
Packit b099d7
  {
Packit b099d7
    XmNrenditionBackground, XmCRenditionBackground, XmRRenditionPixel,
Packit b099d7
    sizeof (Pixel), XtOffsetOf (_XmRenditionRec, xftBackground.pixel),
Packit b099d7
    XmRImmediate, (XtPointer) DEFAULT_background
Packit b099d7
  },
Packit b099d7
  {
Packit b099d7
    XmNrenditionForeground, XmCRenditionForeground, XmRRenditionPixel,
Packit b099d7
    sizeof (Pixel), XtOffsetOf (_XmRenditionRec, xftForeground.pixel),
Packit b099d7
    XmRImmediate, (XtPointer) DEFAULT_foreground
Packit b099d7
  },
Packit b099d7
  {
Packit b099d7
    XmNfontStyle, XmCFontStyle, XmRString,
Packit b099d7
    sizeof(String), XtOffsetOf (_XmRenditionRec, fontStyle),
Packit b099d7
    XmRImmediate, (XtPointer) DEFAULT_fontStyle
Packit b099d7
  },
Packit b099d7
  {
Packit b099d7
    XmNfontFoundry, XmCFontFoundry, XmRString,
Packit b099d7
    sizeof(String), XtOffsetOf (_XmRenditionRec, fontFoundry),
Packit b099d7
    XmRImmediate, (XtPointer) DEFAULT_fontFoundry
Packit b099d7
  },
Packit b099d7
  {
Packit b099d7
    XmNfontEncoding, XmCFontEncoding, XmRString,
Packit b099d7
    sizeof(String), XtOffsetOf (_XmRenditionRec, fontEncoding),
Packit b099d7
    XmRImmediate, (XtPointer) DEFAULT_fontEncoding
Packit b099d7
  },
Packit b099d7
  {
Packit b099d7
    XmNfontSize, XmCFontSize, XmRInt,
Packit b099d7
    sizeof(int), XtOffsetOf (_XmRenditionRec, fontSize),
Packit b099d7
    XmRImmediate, (XtPointer) DEFAULT_fontSize
Packit b099d7
  },
Packit b099d7
#else
Packit b099d7
  {
Packit b099d7
    XmNrenditionBackground, XmCRenditionBackground, XmRRenditionPixel,
Packit b099d7
    sizeof (Pixel), XtOffsetOf (_XmRenditionRec, background),
Packit b099d7
    XmRImmediate, (XtPointer) DEFAULT_background
Packit b099d7
  },
Packit b099d7
  {
Packit b099d7
    XmNrenditionForeground, XmCRenditionForeground, XmRRenditionPixel,
Packit b099d7
    sizeof (Pixel), XtOffsetOf (_XmRenditionRec, foreground),
Packit b099d7
    XmRImmediate, (XtPointer) DEFAULT_foreground
Packit b099d7
  },
Packit b099d7
#endif
Packit b099d7
  { 
Packit b099d7
    XmNunderlineType, XmCUnderlineType, XmRLineType,
Packit b099d7
    sizeof(unsigned char), XtOffsetOf(_XmRenditionRec, underlineType),
Packit b099d7
    XmRImmediate, (XtPointer) DEFAULT_underlineType
Packit b099d7
  },
Packit b099d7
  { 
Packit b099d7
    XmNstrikethruType, XmCStrikethruType, XmRLineType,
Packit b099d7
    sizeof(unsigned char), XtOffsetOf(_XmRenditionRec, strikethruType),
Packit b099d7
    XmRImmediate, (XtPointer) DEFAULT_strikethruType
Packit b099d7
  },
Packit b099d7
  { 
Packit b099d7
    XmNforegroundState, XmCGroundState, XmRGroundState,
Packit b099d7
    sizeof(unsigned char), XtOffsetOf(_XmRenditionRec, foregroundState),
Packit b099d7
    XmRImmediate, (XtPointer) DEFAULT_foregroundState
Packit b099d7
  },
Packit b099d7
  { 
Packit b099d7
    XmNbackgroundState, XmCGroundState, XmRGroundState,
Packit b099d7
    sizeof(unsigned char), XtOffsetOf(_XmRenditionRec, backgroundState),
Packit b099d7
    XmRImmediate, (XtPointer) DEFAULT_backgroundState
Packit b099d7
  },
Packit b099d7
};
Packit b099d7
  
Packit b099d7
static XmConst Cardinal _XmNumRenditionResources = 
Packit b099d7
	XtNumber(_XmRenditionResources);
Packit b099d7
Packit b099d7
/* Searches up widget hierarchy, quarkifying ancestor names and */
Packit b099d7
/* classes. */
Packit b099d7
static Cardinal
Packit b099d7
GetNamesAndClasses(Widget w, XrmNameList names, XrmClassList classes)
Packit b099d7
{
Packit b099d7
  Cardinal length, j;
Packit b099d7
  XrmQuark t;
Packit b099d7
  WidgetClass wc;
Packit b099d7
Packit b099d7
  /* Return null-terminated quark arrays, with length the number of
Packit b099d7
     quarks (not including NULL) */
Packit b099d7
Packit b099d7
  for (length = 0; w != NULL; w = (Widget)w->core.parent)
Packit b099d7
    {
Packit b099d7
      names[length] = w->core.xrm_name;
Packit b099d7
      wc = XtClass(w);
Packit b099d7
      /* KLUDGE KLUDGE KLUDGE KLUDGE */
Packit b099d7
      if (w->core.parent == NULL && XtIsApplicationShell(w)) {
Packit b099d7
	classes[length] =
Packit b099d7
	  ((ApplicationShellWidget) w)->application.xrm_class;
Packit b099d7
      } else classes[length] = wc->core_class.xrm_class;
Packit b099d7
      length++;
Packit b099d7
    }
Packit b099d7
  /* They're in backwards order, flop them around */
Packit b099d7
  for (j = 0; j < length/2; j++)
Packit b099d7
    {
Packit b099d7
      t = names[j];
Packit b099d7
      names[j] = names[length-j-1];
Packit b099d7
      names[length-j-1] = t;
Packit b099d7
      t = classes[j];
Packit b099d7
      classes[j] = classes[length-j-1];
Packit b099d7
      classes[length-j-1] = t;
Packit b099d7
    }
Packit b099d7
  names[length] = NULLQUARK;
Packit b099d7
  classes[length] = NULLQUARK;
Packit b099d7
  return length;
Packit b099d7
}						  /* GetNamesAndClasses */
Packit b099d7
Packit b099d7
/* Converts resource list to quarkified list. */
Packit b099d7
static XrmResourceList
Packit b099d7
CompileResourceTable(XtResourceList resources,
Packit b099d7
		     Cardinal num_resources)
Packit b099d7
{
Packit b099d7
  Cardinal		count;
Packit b099d7
  XrmResourceList	table, tPtr;
Packit b099d7
  XtResourceList	rPtr;
Packit b099d7
  
Packit b099d7
  tPtr = table = (XrmResourceList)XtMalloc(num_resources * sizeof(XrmResource));
Packit b099d7
  rPtr = resources;
Packit b099d7
  
Packit b099d7
  for (count = 0; count < num_resources; count++, tPtr++, rPtr++)
Packit b099d7
    {
Packit b099d7
      tPtr->xrm_name 		= XrmPermStringToQuark(rPtr->resource_name);
Packit b099d7
      tPtr->xrm_class 		= XrmPermStringToQuark(rPtr->resource_class);
Packit b099d7
      tPtr->xrm_type 		= XrmPermStringToQuark(rPtr->resource_type);
Packit b099d7
      tPtr->xrm_size		= rPtr->resource_size;
Packit b099d7
      tPtr->xrm_offset		= rPtr->resource_offset;
Packit b099d7
      tPtr->xrm_default_type 	= XrmPermStringToQuark(rPtr->default_type);
Packit b099d7
      tPtr->xrm_default_addr	= rPtr->default_addr;
Packit b099d7
    }
Packit b099d7
  return(table);
Packit b099d7
}
Packit b099d7
Packit b099d7
/* Does resource database lookup for arglist, filling in defaults from */
Packit b099d7
/* resource list as necessary. */
Packit b099d7
static Boolean
Packit b099d7
GetResources(XmRendition rend,
Packit b099d7
	     Display *dsp,
Packit b099d7
	     Widget wid,
Packit b099d7
	     String resname,
Packit b099d7
	     String resclass,
Packit b099d7
	     XmStringTag tag,
Packit b099d7
	     ArgList arglist,
Packit b099d7
	     Cardinal argcount)
Packit b099d7
{
Packit b099d7
  XrmName		names[100];
Packit b099d7
  XrmClass		classes[100];
Packit b099d7
  Cardinal		length = 0;
Packit b099d7
  static XrmQuarkList	quarks = NULL;
Packit b099d7
  static Cardinal	num_quarks = 0;
Packit b099d7
  static Boolean	*found = NULL;
Packit b099d7
  int			i, j;
Packit b099d7
  static XrmResourceList	table = NULL;
Packit b099d7
  static XrmQuark	QString;
Packit b099d7
  static XrmQuark	Qfont;
Packit b099d7
  Arg			*arg;
Packit b099d7
  XrmName		argName;
Packit b099d7
  XrmResource		*res;
Packit b099d7
  XrmDatabase		db = NULL;
Packit b099d7
  XrmHashTable   	stackSearchList[100];
Packit b099d7
  XrmHashTable    	*searchList = stackSearchList;
Packit b099d7
  unsigned int    	searchListSize = 100;
Packit b099d7
  Boolean		got_one = False;
Packit b099d7
  XrmValue		value;
Packit b099d7
  XrmQuark		rawType;
Packit b099d7
  XrmValue		convValue;
Packit b099d7
  Boolean		have_value, copied;
Packit b099d7
#ifdef XTHREADS
Packit b099d7
  XtAppContext		app=NULL;
Packit b099d7
Packit b099d7
  if (wid)
Packit b099d7
	app = XtWidgetToApplicationContext(wid);
Packit b099d7
  else if (dsp)
Packit b099d7
	app = XtDisplayToApplicationContext(dsp);
Packit b099d7
  if (app) {
Packit b099d7
      _XmAppLock(app);
Packit b099d7
  }
Packit b099d7
  _XmProcessLock();
Packit b099d7
#endif
Packit b099d7
  /* Initialize quark cache */
Packit b099d7
  if (quarks == NULL)
Packit b099d7
    {
Packit b099d7
      quarks = (XrmQuark *)XtMalloc(_XmNumRenditionResources *
Packit b099d7
				    sizeof(XrmQuark));
Packit b099d7
      num_quarks = _XmNumRenditionResources;
Packit b099d7
    }
Packit b099d7
Packit b099d7
  /* Initialize found */
Packit b099d7
  if (found == NULL)
Packit b099d7
    found = (Boolean *)XtMalloc(_XmNumRenditionResources * sizeof(Boolean));
Packit b099d7
  bzero(found, _XmNumRenditionResources * sizeof(Boolean));
Packit b099d7
Packit b099d7
  /* Compile names and classes. */
Packit b099d7
  if (wid != NULL)
Packit b099d7
    length = GetNamesAndClasses(wid, names, classes);
Packit b099d7
  
Packit b099d7
  names[length] = XrmStringToQuark(resname);
Packit b099d7
  classes[length] = XrmStringToQuark(resclass);
Packit b099d7
  length++;
Packit b099d7
  
Packit b099d7
  if (tag != NULL)
Packit b099d7
    {
Packit b099d7
      names[length] = XrmStringToQuark(tag);
Packit b099d7
      classes[length] = XrmPermStringToQuark(XmCRendition);
Packit b099d7
      length++;
Packit b099d7
    }      
Packit b099d7
Packit b099d7
  names[length] = NULLQUARK;
Packit b099d7
  classes[length] = NULLQUARK;
Packit b099d7
Packit b099d7
  /* Cache arglist */
Packit b099d7
  if (num_quarks < argcount)
Packit b099d7
    {
Packit b099d7
      quarks = (XrmQuark *)XtRealloc((char *)quarks,
Packit b099d7
				     argcount * sizeof(XrmQuark));
Packit b099d7
      num_quarks = argcount;
Packit b099d7
    }
Packit b099d7
  for (i = 0; i < argcount; i++)
Packit b099d7
    quarks[i] = XrmStringToQuark(arglist[i].name);
Packit b099d7
Packit b099d7
  /* Compile resource description into XrmResourceList if not already done. */
Packit b099d7
  if (table == NULL)
Packit b099d7
    {
Packit b099d7
      table = CompileResourceTable(_XmRenditionResources,
Packit b099d7
				   _XmNumRenditionResources);
Packit b099d7
      QString = XrmPermStringToQuark(XtCString);
Packit b099d7
      Qfont = XrmPermStringToQuark(XmNfont);
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  /* Set resources from arglist. */
Packit b099d7
  for (arg = arglist, i = 0; i < argcount; arg++, i++)
Packit b099d7
    {
Packit b099d7
      argName = quarks[i];
Packit b099d7
      
Packit b099d7
      for (j = 0, res = table; j < _XmNumRenditionResources; j++, res++)
Packit b099d7
	{
Packit b099d7
	  if (res->xrm_name == argName)
Packit b099d7
	    {
Packit b099d7
	      CopyFromArg((arg->value),
Packit b099d7
			  ((char *)GetPtr(rend) + res->xrm_offset),
Packit b099d7
			  res->xrm_size);
Packit b099d7
	      found[j] = TRUE;
Packit b099d7
	      break;
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  /* DB query */
Packit b099d7
  /* Get database */
Packit b099d7
  if ((wid != NULL) || (dsp != NULL))
Packit b099d7
    {
Packit b099d7
      if (wid != NULL)
Packit b099d7
	db = XtScreenDatabase(XtScreenOfObject(wid));
Packit b099d7
      else db = XtScreenDatabase(DefaultScreenOfDisplay(dsp));
Packit b099d7
Packit b099d7
      /* Get searchlist */
Packit b099d7
      while (!XrmQGetSearchList(db, names, classes,
Packit b099d7
				searchList, searchListSize))
Packit b099d7
	{
Packit b099d7
	  if (searchList == stackSearchList)
Packit b099d7
	    searchList = NULL;
Packit b099d7
	  searchList = (XrmHashTable *)XtRealloc((char*)searchList,
Packit b099d7
						 sizeof(XrmHashTable) *
Packit b099d7
						 (searchListSize *= 2));
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  /* Loop over table */
Packit b099d7
  for (j = 0, res = table; j < _XmNumRenditionResources; j++, res++)
Packit b099d7
    {
Packit b099d7
      if (!found[j])
Packit b099d7
	{
Packit b099d7
	  copied = False;
Packit b099d7
	  have_value = False;
Packit b099d7
	  
Packit b099d7
	  if ((db != NULL) &&
Packit b099d7
	      (XrmQGetSearchResource(searchList, res->xrm_name,
Packit b099d7
				     res->xrm_class, &rawType, &value)))
Packit b099d7
	    {
Packit b099d7
	      /* convert if necessary */
Packit b099d7
	      if (rawType != res->xrm_type)
Packit b099d7
		{
Packit b099d7
		  if (wid != NULL)
Packit b099d7
		    {
Packit b099d7
		      convValue.size = res->xrm_size;
Packit b099d7
		      convValue.addr = (char *)GetPtr(rend) + res->xrm_offset;
Packit b099d7
		      /*
Packit b099d7
		       * Check for special font case.
Packit b099d7
		       * Depending upon the fontType resource, try to convert
Packit b099d7
		       * to a FontSet, else to a FontStruct.
Packit b099d7
		       */
Packit b099d7
		      if ((res->xrm_name == Qfont) &&
Packit b099d7
			  (_XmRendFontType(rend) == XmFONT_IS_FONTSET))
Packit b099d7
			  copied = have_value =
Packit b099d7
			     XtConvertAndStore(wid, 
Packit b099d7
					       XrmQuarkToString(rawType),
Packit b099d7
					       &value,
Packit b099d7
					       "FontSet",
Packit b099d7
					       &convValue);
Packit b099d7
		      else
Packit b099d7
			  copied = have_value =
Packit b099d7
			     XtConvertAndStore(wid, 
Packit b099d7
					       XrmQuarkToString(rawType),
Packit b099d7
					       &value,
Packit b099d7
					       XrmQuarkToString(res->xrm_type),
Packit b099d7
					       &convValue);
Packit b099d7
		    }
Packit b099d7
		  else have_value = False;
Packit b099d7
		} 
Packit b099d7
	      else have_value = True;
Packit b099d7
		  
Packit b099d7
	      /* Check for special font case */
Packit b099d7
	      if (have_value)
Packit b099d7
		{
Packit b099d7
		  if (res->xrm_name == Qfont)
Packit b099d7
		    {
Packit b099d7
		      _XmRendFontName(rend) = value.addr;
Packit b099d7
		      copied = True;
Packit b099d7
		    }
Packit b099d7
		}
Packit b099d7
	    }
Packit b099d7
	      
Packit b099d7
	  if (!got_one && have_value) got_one = True;
Packit b099d7
Packit b099d7
	  /* Set defaults */
Packit b099d7
	  if (!have_value)
Packit b099d7
	    {
Packit b099d7
	      CopyFromArg((XtArgVal)(res->xrm_default_addr),
Packit b099d7
			  ((char *)GetPtr(rend) + res->xrm_offset),
Packit b099d7
			  res->xrm_size);
Packit b099d7
	      copied = True;
Packit b099d7
	    }
Packit b099d7
Packit b099d7
	  /* Copy if needed */
Packit b099d7
	  if (!copied)
Packit b099d7
	    {
Packit b099d7
	      if (res->xrm_type == QString)
Packit b099d7
		*((String *)((char *)GetPtr(rend) + res->xrm_offset)) =
Packit b099d7
		  value.addr;
Packit b099d7
	      else if (value.addr != NULL)
Packit b099d7
		memcpy(((char *)GetPtr(rend) + res->xrm_offset),
Packit b099d7
		       value.addr, res->xrm_size);
Packit b099d7
	      else 
Packit b099d7
		bzero(((char *)GetPtr(rend) + res->xrm_offset), res->xrm_size);
Packit b099d7
	    }
Packit b099d7
	      
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
  if (searchList != stackSearchList) XtFree((char *)searchList);
Packit b099d7
Packit b099d7
#ifdef XTHREADS
Packit b099d7
  _XmProcessUnlock();
Packit b099d7
  if (app) {
Packit b099d7
      _XmAppUnlock(app);
Packit b099d7
  }
Packit b099d7
#endif
Packit b099d7
  return(got_one);
Packit b099d7
}
Packit b099d7

Packit b099d7
/* Sets all resources to defaults from resource list. */
Packit b099d7
static void
Packit b099d7
SetDefault(XmRendition rend)
Packit b099d7
{
Packit b099d7
  /* A more robust implementation of this routine would to to loop
Packit b099d7
   * over _XmRenditionResources and use CopyFromArg to reset values
Packit b099d7
   * in rend, but to improve performance we use direct assignments. 
Packit b099d7
   */
Packit b099d7
Packit b099d7
  if (rend == NULL) return;
Packit b099d7
Packit b099d7
#ifdef	USE_XFT
Packit b099d7
  memset (&(_XmRendXftFG(rend)), 0, sizeof (XftColor));
Packit b099d7
  memset (&(_XmRendXftBG(rend)), 0, sizeof (XftColor));
Packit b099d7
#endif
Packit b099d7
Packit b099d7
  /* Leave _XmRendFontOnly unchanged.	 */
Packit b099d7
  /* Leave _XmRendRefcount unchanged.	 */
Packit b099d7
  _XmRendLoadModel(rend)      = DEFAULT_loadModel;
Packit b099d7
  _XmRendTag(rend)	      = DEFAULT_tag;
Packit b099d7
  _XmRendFontName(rend)	      = DEFAULT_fontName;
Packit b099d7
  _XmRendFontType(rend)	      = DEFAULT_fontType;
Packit b099d7
  _XmRendFont(rend)	      = DEFAULT_font;
Packit b099d7
  /* Leave _XmRendDisplay unchanged.	 */
Packit b099d7
  /* Leave _XmRendGC unchanged.		 */
Packit b099d7
  /* Leave _XmRendTags unchanged.	 */
Packit b099d7
  /* Leave _XmRendCount unchanged.	 */
Packit b099d7
  /* Leave _XmRendHadEnds unchanged.	 */
Packit b099d7
  _XmRendTabs(rend)	      = DEFAULT_tabs;
Packit b099d7
  _XmRendBG(rend)	      = DEFAULT_background;
Packit b099d7
  _XmRendFG(rend)	      = DEFAULT_foreground;
Packit b099d7
  _XmRendUnderlineType(rend)  = DEFAULT_underlineType;
Packit b099d7
  _XmRendStrikethruType(rend) = DEFAULT_strikethruType;
Packit b099d7
  _XmRendBGState(rend)	      = DEFAULT_backgroundState;
Packit b099d7
  _XmRendFGState(rend)	      = DEFAULT_foregroundState;
Packit b099d7
Packit b099d7
#ifdef	USE_XFT
Packit b099d7
  _XmRendXftFG (rend).color.alpha = 0xFFFF; /*TODO: it is really needed? (yura)*/
Packit b099d7
  _XmRendXftBG (rend).color.alpha = 0xFFFF; /*TODO: it is really needed? (yura)*/
Packit b099d7
  _XmRendXftFont(rend) = DEFAULT_xftFont;
Packit b099d7
  _XmRendPattern(rend) = NULL;
Packit b099d7
  _XmRendFontStyle(rend) = DEFAULT_fontStyle;
Packit b099d7
  _XmRendFontFoundry(rend) = DEFAULT_fontFoundry;
Packit b099d7
  _XmRendFontEncoding(rend) = DEFAULT_fontEncoding;
Packit b099d7
  _XmRendFontSize(rend) = DEFAULT_fontSize;
Packit b099d7
  _XmRendPixelSize(rend) = 0;
Packit b099d7
  _XmRendFontSlant(rend) = 0;
Packit b099d7
  _XmRendFontSpacing(rend) = 0;
Packit b099d7
  _XmRendFontWeight(rend) = 0;
Packit b099d7
#endif
Packit b099d7
}
Packit b099d7

Packit b099d7
/* Extern function to pick out display from rendertable. */
Packit b099d7
Display *
Packit b099d7
_XmRenderTableDisplay(XmRenderTable table)
Packit b099d7
{
Packit b099d7
  return(_XmRTDisplay(table));
Packit b099d7
}
Packit b099d7
Packit b099d7
/* Find a rendition in table with matching tag.  Call callback if not */
Packit b099d7
/* found and callback available.  Fail if need_font is true and */
Packit b099d7
/* rendition found does not provide font. */
Packit b099d7
XmRendition
Packit b099d7
_XmRenderTableFindRendition(XmRenderTable table, 
Packit b099d7
			    XmStringTag tag,
Packit b099d7
#if NeedWidePrototypes
Packit b099d7
			    int cached_tag,
Packit b099d7
			    int need_font,
Packit b099d7
			    int call,
Packit b099d7
#else
Packit b099d7
			    Boolean cached_tag,
Packit b099d7
			    Boolean need_font,
Packit b099d7
			    Boolean call,
Packit b099d7
#endif /* NeedWidePrototypes */
Packit b099d7
			    short *index)
Packit b099d7
{
Packit b099d7
  int				i, j;
Packit b099d7
  XmRendition			rend;
Packit b099d7
  Boolean			hit = FALSE;
Packit b099d7
  XmDisplayCallbackStruct	cb;
Packit b099d7
  XmDisplay			dsp;
Packit b099d7
  XmRenderTable			copy;
Packit b099d7
  
Packit b099d7
  if ((table == NULL) || (tag == NULL)) return(NULL);
Packit b099d7
  
Packit b099d7
Packit b099d7
  for (;;) /* May have to try twice */
Packit b099d7
    {  
Packit b099d7
      for (i = 0; i < _XmRTCount(table); i++)
Packit b099d7
	{
Packit b099d7
	  rend = _XmRTRenditions(table)[i];
Packit b099d7
      
Packit b099d7
	  if ((cached_tag) ?
Packit b099d7
	      (_XmRendTag(rend) == tag) :
Packit b099d7
	      (strcmp(_XmRendTag(rend), tag) == 0))
Packit b099d7
	    {
Packit b099d7
	      hit = TRUE;
Packit b099d7
	  
Packit b099d7
	      if ((_XmRendFont(rend) == NULL) && (_XmRendXftFont (rend) == NULL) &&
Packit b099d7
		  NameIsString(_XmRendFontName(rend)))
Packit b099d7
		{
Packit b099d7
		  if (_XmRendLoadModel(rend) == XmLOAD_DEFERRED)
Packit b099d7
		    _XmRendLoadModel(rend) = XmLOAD_IMMEDIATE;
Packit b099d7
Packit b099d7
		  ValidateAndLoadFont(rend, _XmRendDisplay(rend));
Packit b099d7
	      
Packit b099d7
		  if (need_font && (_XmRendFont(rend) == NULL &&
Packit b099d7
                      _XmRendXftFont(rend) == NULL))
Packit b099d7
		    break;
Packit b099d7
		}
Packit b099d7
	  
Packit b099d7
	      if (index != NULL) *index = i;
Packit b099d7
	      return(rend);
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
Packit b099d7
      /* Are we done? */
Packit b099d7
      if (hit || !call) break;
Packit b099d7
      
Packit b099d7
      call = FALSE;
Packit b099d7
Packit b099d7
      /* Call callback */
Packit b099d7
      if (_XmRTDisplay(table) != NULL)
Packit b099d7
	{
Packit b099d7
	  dsp = (XmDisplay) XmGetXmDisplay(_XmRTDisplay(table));
Packit b099d7
	  
Packit b099d7
	  /* CR 7964: XtHasCallbacks is surprisingly expensive, */
Packit b099d7
	  /*	so we use a conservative approximation here. */
Packit b099d7
	  if (dsp && dsp->display.noRenditionCallback)
Packit b099d7
	    {
Packit b099d7
	      copy = XmRenderTableCopy(table, NULL, 0);
Packit b099d7
	  
Packit b099d7
	      cb.reason = XmCR_NO_RENDITION;
Packit b099d7
	      cb.event = NULL;
Packit b099d7
	      cb.render_table = copy;
Packit b099d7
	      cb.tag = tag;
Packit b099d7
      
Packit b099d7
	      XtCallCallbackList((Widget)dsp, 
Packit b099d7
				 dsp->display.noRenditionCallback, 
Packit b099d7
				 &cb;;
Packit b099d7
Packit b099d7
	      if (cb.render_table != copy)
Packit b099d7
		{
Packit b099d7
		  /* Callback mutated table.  Update table with */
Packit b099d7
		  /* substitution and search again. */
Packit b099d7
Packit b099d7
		  for (j = 0; j < _XmRTCount(table); j++)
Packit b099d7
		    if (FreeRendition(_XmRTRenditions(table)[j]))
Packit b099d7
		      FreeHandle(_XmRTRenditions(table)[j]);
Packit b099d7
  
Packit b099d7
		  if (_XmRTRefcountDec(table) == 0)
Packit b099d7
		    XtFree((char *)GetPtr(table));
Packit b099d7
Packit b099d7
		  SetPtr(table, GetPtr(cb.render_table));
Packit b099d7
		  FreeHandle(cb.render_table);
Packit b099d7
		}
Packit b099d7
	      else break;
Packit b099d7
	    }
Packit b099d7
	  else break;
Packit b099d7
	}
Packit b099d7
      else break;
Packit b099d7
    } 
Packit b099d7
  
Packit b099d7
  /* Didn't find it. */
Packit b099d7
  if (index != NULL) *index = -1;
Packit b099d7
  return(NULL);
Packit b099d7
}
Packit b099d7
Packit b099d7
/* If to has resource unset and from has it set, set in to. */
Packit b099d7
static void
Packit b099d7
SetRend(XmRendition to,
Packit b099d7
	XmRendition from)
Packit b099d7
{
Packit b099d7
  if (NameIsString(_XmRendFontName(from)) &&
Packit b099d7
      !NameIsString(_XmRendFontName(to)))
Packit b099d7
    _XmRendFontName(to) = _XmRendFontName(from);
Packit b099d7
  if ((_XmRendFontType(from) != XmAS_IS) &&
Packit b099d7
      (_XmRendFontType(to) == XmAS_IS))
Packit b099d7
    _XmRendFontType(to) = _XmRendFontType(from);
Packit b099d7
  if ((_XmRendLoadModel(from) != XmAS_IS) &&
Packit b099d7
      (_XmRendLoadModel(to) == XmAS_IS))
Packit b099d7
    _XmRendLoadModel(to) = _XmRendLoadModel(from);
Packit b099d7
  if ((_XmRendFont(from) != NULL) &&
Packit b099d7
      ((unsigned int)(unsigned long)_XmRendFont(to) == XmAS_IS))
Packit b099d7
    _XmRendFont(to) = _XmRendFont(from);
Packit b099d7
  if (ListIsList(_XmRendTabs(from)) &&
Packit b099d7
      !ListIsList(_XmRendTabs(to)))
Packit b099d7
    _XmRendTabs(to) = _XmRendTabs(from);
Packit b099d7
#if USE_XFT
Packit b099d7
  if ((_XmRendFG(from) != XmUNSPECIFIED_PIXEL) &&
Packit b099d7
      (_XmRendFG(to) == XmUNSPECIFIED_PIXEL))
Packit b099d7
    {
Packit b099d7
#ifdef FIX_1536
Packit b099d7
      _XmRendFG(to) = _XmRendFG(from);
Packit b099d7
      _XmRendXftFG(to) = GetCachedXftColor(_XmRendDisplay(to), _XmRendFG(to));
Packit b099d7
#else
Packit b099d7
      XColor xcolor;
Packit b099d7
      _XmRendFG(to) = _XmRendFG(from);
Packit b099d7
      xcolor.pixel = _XmRendFG(to);
Packit b099d7
      XQueryColor(_XmRendDisplay(to), DefaultColormapOfScreen(
Packit b099d7
                  DefaultScreenOfDisplay(_XmRendDisplay(to))), &xcolor);
Packit b099d7
      /* doesn't needed  (_XmRendXftFG (to)).pixel = xcolor.pixel; */
Packit b099d7
      (_XmRendXftFG(to)).color.red = xcolor.red;
Packit b099d7
      (_XmRendXftFG(to)).color.green = xcolor.green;
Packit b099d7
      (_XmRendXftFG(to)).color.blue = xcolor.blue;
Packit b099d7
      (_XmRendXftFG(to)).color.alpha = 0xFFFF;
Packit b099d7
#endif
Packit b099d7
    }
Packit b099d7
  if ((_XmRendBG(from) != XmUNSPECIFIED_PIXEL) &&
Packit b099d7
      (_XmRendBG(to) == XmUNSPECIFIED_PIXEL))
Packit b099d7
    {
Packit b099d7
#ifdef FIX_1536
Packit b099d7
      _XmRendBG(to) = _XmRendBG (from);
Packit b099d7
      _XmRendXftBG(to) = GetCachedXftColor(_XmRendDisplay(to), _XmRendBG(to));
Packit b099d7
#else
Packit b099d7
      XColor xcolor;
Packit b099d7
      _XmRendBG(to) = _XmRendBG (from);
Packit b099d7
      xcolor.pixel = _XmRendBG (to);
Packit b099d7
      XQueryColor(_XmRendDisplay(to), DefaultColormapOfScreen(
Packit b099d7
                  DefaultScreenOfDisplay(_XmRendDisplay(to))), &xcolor);
Packit b099d7
      /* doesn't needed  (_XmRendXftBG (to)).pixel = xcolor.pixel; */
Packit b099d7
      (_XmRendXftBG(to)).color.red = xcolor.red;
Packit b099d7
      (_XmRendXftBG(to)).color.green = xcolor.green;
Packit b099d7
      (_XmRendXftBG(to)).color.blue = xcolor.blue;
Packit b099d7
      (_XmRendXftBG(to)).color.alpha = 0xFFFF;
Packit b099d7
#endif
Packit b099d7
    }
Packit b099d7
  if ((_XmRendXftFont (from) != NULL) &&
Packit b099d7
      ((unsigned int) (unsigned long) _XmRendXftFont (to) == XmAS_IS))
Packit b099d7
    _XmRendXftFont (to) = _XmRendXftFont (from);
Packit b099d7
  if ((_XmRendFontStyle (from) != NULL) && _XmRendFontStyle (to) == NULL)
Packit b099d7
    _XmRendFontStyle (to) = _XmRendFontStyle (from);
Packit b099d7
  if ((_XmRendFontFoundry (from) != NULL) && _XmRendFontFoundry (to) == NULL)
Packit b099d7
    _XmRendFontFoundry (to) = _XmRendFontFoundry (from);
Packit b099d7
  if ((_XmRendFontEncoding (from) != NULL) && _XmRendFontEncoding (to) == NULL)
Packit b099d7
    _XmRendFontEncoding (to) = _XmRendFontEncoding (from);
Packit b099d7
  if (_XmRendFontSize (to) == 0)
Packit b099d7
    _XmRendFontSize (to) = _XmRendFontSize (from);
Packit b099d7
#else
Packit b099d7
  if ((_XmRendFG(from) != XmUNSPECIFIED_PIXEL) &&
Packit b099d7
      (_XmRendFG(to) == XmUNSPECIFIED_PIXEL))
Packit b099d7
    _XmRendFG(to) = _XmRendFG (from);
Packit b099d7
  if ((_XmRendBG(from) != XmUNSPECIFIED_PIXEL) &&
Packit b099d7
      (_XmRendBG(to) == XmUNSPECIFIED_PIXEL))
Packit b099d7
    _XmRendBG(to) = _XmRendBG (from);
Packit b099d7
#endif
Packit b099d7
  if ((_XmRendUnderlineType(from) != XmAS_IS) &&
Packit b099d7
      (_XmRendUnderlineType(to) == XmAS_IS))
Packit b099d7
    _XmRendUnderlineType(to) = _XmRendUnderlineType(from);
Packit b099d7
  if ((_XmRendStrikethruType(from) != XmAS_IS) &&
Packit b099d7
      (_XmRendStrikethruType(to) == XmAS_IS))
Packit b099d7
    _XmRendStrikethruType(to) = _XmRendStrikethruType(from);
Packit b099d7
}
Packit b099d7
Packit b099d7
/* Check that all resources are not default values. */
Packit b099d7
static Boolean
Packit b099d7
RendComplete(XmRendition rend)      
Packit b099d7
{
Packit b099d7
  return(((unsigned int)(unsigned long)_XmRendFontName(rend) != XmAS_IS) &&
Packit b099d7
	 (_XmRendFontType(rend) != XmAS_IS) &&
Packit b099d7
	 (_XmRendLoadModel(rend) != XmAS_IS) &&
Packit b099d7
	 (
Packit b099d7
	  ((unsigned int) (unsigned long) _XmRendFont (rend) != XmAS_IS)
Packit b099d7
#ifdef USE_XFT
Packit b099d7
            || ((unsigned int) (unsigned long) _XmRendXftFont (rend) != XmAS_IS)
Packit b099d7
#endif
Packit b099d7
         ) &&
Packit b099d7
	 ((unsigned int)(unsigned long)_XmRendTabs(rend) != XmAS_IS) &&
Packit b099d7
	 (_XmRendFG(rend) != XmUNSPECIFIED_PIXEL) &&
Packit b099d7
	 (_XmRendBG(rend) != XmUNSPECIFIED_PIXEL) &&
Packit b099d7
	 (_XmRendUnderlineType(rend) != XmAS_IS) &&
Packit b099d7
	 (_XmRendStrikethruType(rend) != XmAS_IS));
Packit b099d7
}
Packit b099d7
Packit b099d7
/* Search rt for all renditions matching tags, successively merging */
Packit b099d7
/* resource values in scr rendition. */
Packit b099d7
/*ARGSUSED*/
Packit b099d7
XmRendition
Packit b099d7
_XmRenditionMerge(Display *d,	/* unused */
Packit b099d7
		  XmRendition *scr,
Packit b099d7
		  XmRendition base_rend,
Packit b099d7
		  XmRenderTable rt,
Packit b099d7
		  XmStringTag base_tag,
Packit b099d7
		  XmStringTag *tags,
Packit b099d7
#if NeedWidePrototypes
Packit b099d7
		  unsigned int tag_count,
Packit b099d7
		  unsigned int copy
Packit b099d7
#else			
Packit b099d7
		  unsigned short tag_count,
Packit b099d7
		  Boolean copy
Packit b099d7
#endif /* NeedWidePrototypes */
Packit b099d7
		  )
Packit b099d7
{
Packit b099d7
  XmRendition 	rend, tmp;
Packit b099d7
  int 		i;
Packit b099d7
  
Packit b099d7
  if (scr == NULL)
Packit b099d7
    {
Packit b099d7
      rend = XmRenditionCreate(NULL, XmS, NULL, 0); /* Create new */
Packit b099d7
    }
Packit b099d7
  else
Packit b099d7
    {
Packit b099d7
      rend = *scr;
Packit b099d7
      if (copy)
Packit b099d7
	{
Packit b099d7
	  if (NameIsString(_XmRendFontName(rend)))
Packit b099d7
	    XtFree(_XmRendFontName(rend));
Packit b099d7
	  if (ListIsList(_XmRendTabs(rend)))
Packit b099d7
	    XmTabListFree(_XmRendTabs(rend));
Packit b099d7
	}
Packit b099d7
      SetDefault(rend);			  /* Reset state */
Packit b099d7
    }
Packit b099d7
Packit b099d7
  for (i = (tag_count - 1); i >= 0; i--)
Packit b099d7
    {
Packit b099d7
      tmp = _XmRenderTableFindRendition(rt, tags[i], TRUE, FALSE, TRUE, NULL);
Packit b099d7
      if (tmp == NULL) continue;
Packit b099d7
      
Packit b099d7
      SetRend(rend, tmp);
Packit b099d7
      if (RendComplete(rend)) break;
Packit b099d7
    }
Packit b099d7
Packit b099d7
  if (!RendComplete(rend))
Packit b099d7
    {
Packit b099d7
      short index;
Packit b099d7
      
Packit b099d7
      _XmRenderTableFindFallback(rt, base_tag, TRUE, &index, &tmp);
Packit b099d7
      if (tmp != NULL) SetRend(rend, tmp);
Packit b099d7
    }
Packit b099d7
Packit b099d7
  if (base_rend != NULL) 
Packit b099d7
    {
Packit b099d7
      SetRend(rend, base_rend);
Packit b099d7
  
Packit b099d7
      if (_XmRendFGState(base_rend) == XmFORCE_COLOR)
Packit b099d7
#if USE_XFT
Packit b099d7
	_XmRendXftFG(rend) = _XmRendXftFG(base_rend);
Packit b099d7
#else
Packit b099d7
	_XmRendFG(rend) = _XmRendFG(base_rend);
Packit b099d7
#endif
Packit b099d7
  
Packit b099d7
      if (_XmRendBGState(base_rend) == XmFORCE_COLOR)
Packit b099d7
	_XmRendBG(rend) = _XmRendBG(base_rend);
Packit b099d7
    }
Packit b099d7
  	
Packit b099d7
  CleanupResources(rend, copy);
Packit b099d7
  
Packit b099d7
  return(rend);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/****************
Packit b099d7
 * If the cached_tag flag is true, _XmRenderTableFindFallback assumes that the
Packit b099d7
 *   tag pointer is a pointer out of the (local) tag cache.
Packit b099d7
 *   Since XmRenditionCreate also uses tag pointers out of this cache,
Packit b099d7
 *   a string compare is avoided by simply comparing pointer values.
Packit b099d7
 ****************/
Packit b099d7
extern Boolean 
Packit b099d7
_XmRenderTableFindFallback(
Packit b099d7
        XmRenderTable rendertable,
Packit b099d7
        XmStringTag tag,
Packit b099d7
#if NeedWidePrototypes
Packit b099d7
        int cached_tag,
Packit b099d7
#else
Packit b099d7
        Boolean cached_tag,
Packit b099d7
#endif /* NeedWidePrototypes */
Packit b099d7
        short *indx,
Packit b099d7
	XmRendition *rend_ptr )
Packit b099d7
{   
Packit b099d7
  XmStringTag     search_cset = NULL;
Packit b099d7
  
Packit b099d7
  *indx = -1 ;
Packit b099d7
Packit b099d7
  if ((rendertable != NULL) && (_XmRTCount(rendertable) == 0))
Packit b099d7
    {
Packit b099d7
      *rend_ptr = NULL;
Packit b099d7
      return(FALSE);
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  if (rendertable != NULL)
Packit b099d7
    {   
Packit b099d7
      if (tag != NULL)
Packit b099d7
	{
Packit b099d7
	  if (cached_tag)			  /* No XmSTRING_DEFAULT_CHARSET */
Packit b099d7
	    {   
Packit b099d7
	      *rend_ptr = (XmRendition)
Packit b099d7
		_XmRenderTableFindRendition(rendertable, tag, TRUE, TRUE, FALSE,
Packit b099d7
					    indx);
Packit b099d7
	      if (*rend_ptr != NULL) return(TRUE);
Packit b099d7
	    }
Packit b099d7
	  else
Packit b099d7
	    {   
Packit b099d7
	      XmStringTag       curtag; 
Packit b099d7
Packit b099d7
	      if ((strcmp(tag, XmSTRING_DEFAULT_CHARSET) == 0))
Packit b099d7
		curtag = _XmStringGetCurrentCharset();
Packit b099d7
	      else curtag = tag;
Packit b099d7
Packit b099d7
	      *rend_ptr = (XmRendition)
Packit b099d7
		_XmRenderTableFindRendition(rendertable, curtag, FALSE, TRUE, FALSE,
Packit b099d7
					    indx);
Packit b099d7
	  
Packit b099d7
	      if (*rend_ptr != NULL) return(TRUE);
Packit b099d7
	    } 
Packit b099d7
      
Packit b099d7
	  /* Didn't find a match.  See if tag is one of the defaults
Packit b099d7
	     and search for the other. */
Packit b099d7
	  if (_XmStringIsCurrentCharset(tag))
Packit b099d7
	    {
Packit b099d7
	      search_cset = XmFONTLIST_DEFAULT_TAG;
Packit b099d7
Packit b099d7
	      *rend_ptr = (XmRendition)
Packit b099d7
		_XmRenderTableFindRendition(rendertable, search_cset, TRUE, 
Packit b099d7
					    TRUE, FALSE, indx);
Packit b099d7
	  
Packit b099d7
	      if (*rend_ptr != NULL) return(TRUE);
Packit b099d7
	    }
Packit b099d7
	  else if ((tag == XmFONTLIST_DEFAULT_TAG) ||
Packit b099d7
		   (strcmp(tag, XmFONTLIST_DEFAULT_TAG) == 0))
Packit b099d7
	    {
Packit b099d7
	      search_cset = _XmStringGetCurrentCharset();
Packit b099d7
	
Packit b099d7
	      *rend_ptr = (XmRendition)
Packit b099d7
		_XmRenderTableFindRendition(rendertable, search_cset, FALSE, 
Packit b099d7
					    TRUE, FALSE, indx);
Packit b099d7
	  
Packit b099d7
	      if (*rend_ptr != NULL) return(TRUE);
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
        
Packit b099d7
      /* Otherwise pick up first font(set) if tag a default value. */
Packit b099d7
      if ((tag == NULL) ||
Packit b099d7
	  (tag == XmFONTLIST_DEFAULT_TAG) ||
Packit b099d7
	  (strcmp(tag, XmFONTLIST_DEFAULT_TAG) == 0) ||
Packit b099d7
	  _XmStringIsCurrentCharset(tag))
Packit b099d7
	return(_XmRenderTableFindFirstFont(rendertable, indx, rend_ptr));
Packit b099d7
    }
Packit b099d7
  *rend_ptr = NULL; 
Packit b099d7
  *indx = -1;
Packit b099d7
  return(FALSE);
Packit b099d7
}
Packit b099d7
Packit b099d7
extern Boolean
Packit b099d7
_XmRenderTableFindFirstFont(XmRenderTable rendertable,
Packit b099d7
			    short *indx,
Packit b099d7
			    XmRendition *rend_ptr)
Packit b099d7
{
Packit b099d7
  int i, f_idx = -1, fs_idx = -1;
Packit b099d7
#ifdef USE_XFT
Packit b099d7
  int xft_idx = -1;
Packit b099d7
#endif
Packit b099d7
Packit b099d7
  for (i = _XmRTCount(rendertable) - 1; i >= 0; i--)
Packit b099d7
    {
Packit b099d7
      *rend_ptr = _XmRTRenditions(rendertable)[i];
Packit b099d7
Packit b099d7
      if (_XmRendFont(*rend_ptr) != NULL)
Packit b099d7
      {
Packit b099d7
	if (_XmRendFontType(*rend_ptr) == XmFONT_IS_FONT) f_idx = i;
Packit b099d7
	else if (_XmRendFontType(*rend_ptr) == XmFONT_IS_FONTSET) fs_idx = i;
Packit b099d7
#ifdef USE_XFT
Packit b099d7
      } else if (_XmRendXftFont(*rend_ptr) != NULL) {
Packit b099d7
        if (_XmRendFontType(*rend_ptr) == XmFONT_IS_XFT) xft_idx = i;
Packit b099d7
#endif
Packit b099d7
      }
Packit b099d7
  }
Packit b099d7
#ifdef USE_XFT
Packit b099d7
  if (xft_idx >= 0)
Packit b099d7
    {
Packit b099d7
      *rend_ptr = _XmRTRenditions (rendertable)[xft_idx];
Packit b099d7
      *indx = xft_idx;
Packit b099d7
    }
Packit b099d7
  else
Packit b099d7
#endif
Packit b099d7
  if (fs_idx >= 0)
Packit b099d7
    {
Packit b099d7
      *rend_ptr = _XmRTRenditions(rendertable)[fs_idx];
Packit b099d7
      *indx = fs_idx;
Packit b099d7
    }
Packit b099d7
  else if (f_idx >= 0)
Packit b099d7
    {
Packit b099d7
      *rend_ptr = _XmRTRenditions(rendertable)[f_idx];
Packit b099d7
      *indx = f_idx;
Packit b099d7
    }
Packit b099d7
  else
Packit b099d7
    {
Packit b099d7
      *rend_ptr = NULL;
Packit b099d7
      *indx = -1;
Packit b099d7
      return(FALSE);
Packit b099d7
    }
Packit b099d7
Packit b099d7
  return(TRUE); 
Packit b099d7
}
Packit b099d7
Packit b099d7
/* Put value of every resource in fromRend into toRend, copying where */
Packit b099d7
/* necessary. */
Packit b099d7
static void
Packit b099d7
CopyInto(XmRendition toRend,
Packit b099d7
	 XmRendition fromRend)
Packit b099d7
{
Packit b099d7
  _XmRendTag(toRend) = _XmStringCacheTag(_XmRendTag(fromRend),
Packit b099d7
					 XmSTRING_TAG_STRLEN);
Packit b099d7
  /* CR 7890 - the fontName might be XmAS_IS here - if so, we
Packit b099d7
   ** obviously don't want to do an XtNewString (implicit strcpy)
Packit b099d7
   */
Packit b099d7
  if (!NameIsString(_XmRendFontName(fromRend)))
Packit b099d7
    _XmRendFontName(toRend) = NULL;
Packit b099d7
  else
Packit b099d7
    _XmRendFontName(toRend) = XtNewString(_XmRendFontName(fromRend));
Packit b099d7
  _XmRendFontType(toRend) = _XmRendFontType(fromRend);
Packit b099d7
  _XmRendLoadModel(toRend) = _XmRendLoadModel(fromRend);
Packit b099d7
  _XmRendFont(toRend) = _XmRendFont(fromRend);
Packit b099d7
  _XmRendDisplay(toRend) = _XmRendDisplay(fromRend);
Packit b099d7
  
Packit b099d7
  if (!ListIsList(_XmRendTabs(fromRend)))
Packit b099d7
    _XmRendTabs(toRend) = NULL;
Packit b099d7
  else
Packit b099d7
    _XmRendTabs(toRend) = XmTabListCopy(_XmRendTabs(fromRend), 0, 0);
Packit b099d7
#if USE_XFT
Packit b099d7
  _XmRendXftFont (toRend) = _XmRendXftFont (fromRend);
Packit b099d7
  _XmRendXftBG (toRend) = _XmRendXftBG (fromRend);
Packit b099d7
  _XmRendXftFG (toRend) = _XmRendXftFG (fromRend);
Packit b099d7
  _XmRendFontStyle (toRend) = _XmRendFontStyle (fromRend);
Packit b099d7
  _XmRendFontFoundry (toRend) = _XmRendFontFoundry (fromRend);
Packit b099d7
  _XmRendFontEncoding (toRend) = _XmRendFontEncoding (fromRend);
Packit b099d7
  _XmRendFontSize (toRend) = _XmRendFontSize (fromRend);
Packit b099d7
#else
Packit b099d7
  _XmRendBG (toRend) = _XmRendBG (fromRend);
Packit b099d7
  _XmRendFG (toRend) = _XmRendFG (fromRend);
Packit b099d7
#endif
Packit b099d7
  _XmRendUnderlineType(toRend) = _XmRendUnderlineType(fromRend);
Packit b099d7
  _XmRendStrikethruType(toRend) = _XmRendStrikethruType(fromRend);
Packit b099d7
}
Packit b099d7
Packit b099d7
/* As above, except only change resources in toRend that are default. */
Packit b099d7
static void
Packit b099d7
MergeInto(XmRendition toRend,
Packit b099d7
	 XmRendition fromRend)
Packit b099d7
{
Packit b099d7
  _XmRendTag(toRend) = _XmStringCacheTag(_XmRendTag(fromRend),
Packit b099d7
					 XmSTRING_TAG_STRLEN);
Packit b099d7
  if ((_XmRendFontName(toRend) == NULL) &&
Packit b099d7
      NameIsString(_XmRendFontName(fromRend)))
Packit b099d7
    _XmRendFontName(toRend) = XtNewString(_XmRendFontName(fromRend));
Packit b099d7
  if (_XmRendFontType(toRend) == XmAS_IS)
Packit b099d7
    _XmRendFontType(toRend) = _XmRendFontType(fromRend);
Packit b099d7
  if (_XmRendLoadModel(toRend) == XmAS_IS)
Packit b099d7
    _XmRendLoadModel(toRend) = _XmRendLoadModel(fromRend);
Packit b099d7
  if (_XmRendFont(toRend) == NULL)
Packit b099d7
    _XmRendFont(toRend) = _XmRendFont(fromRend);
Packit b099d7
  
Packit b099d7
  if (!ListIsList(_XmRendTabs(toRend)) && 
Packit b099d7
      ListIsList(_XmRendTabs(fromRend)))
Packit b099d7
    _XmRendTabs(toRend) = XmTabListCopy(_XmRendTabs(fromRend), 0, 0);
Packit b099d7
#if USE_XFT
Packit b099d7
  if (_XmRendXftFont(toRend) == NULL)
Packit b099d7
    _XmRendXftFont(toRend) = _XmRendXftFont(fromRend);
Packit b099d7
  if (_XmRendBG(toRend) == XmUNSPECIFIED_PIXEL)
Packit b099d7
    _XmRendXftBG(toRend) = _XmRendXftBG(fromRend);
Packit b099d7
  if (_XmRendFG(toRend) == XmUNSPECIFIED_PIXEL)
Packit b099d7
    _XmRendXftFG(toRend) = _XmRendXftFG(fromRend);
Packit b099d7
  if (_XmRendFontStyle(toRend) == NULL)
Packit b099d7
    _XmRendFontStyle(toRend) = _XmRendFontStyle(fromRend);
Packit b099d7
  if (_XmRendFontFoundry(toRend) == NULL)
Packit b099d7
    _XmRendFontFoundry(toRend) = _XmRendFontFoundry(fromRend);
Packit b099d7
  if (_XmRendFontEncoding(toRend) == NULL)
Packit b099d7
    _XmRendFontEncoding(toRend) = _XmRendFontEncoding(fromRend);
Packit b099d7
  if (_XmRendFontSize(toRend) == 0)
Packit b099d7
    _XmRendFontSize(toRend) = _XmRendFontSize(fromRend);
Packit b099d7
#else
Packit b099d7
  if (_XmRendBG(toRend) == XmUNSPECIFIED_PIXEL)
Packit b099d7
    _XmRendBG(toRend) = _XmRendBG (fromRend);
Packit b099d7
  if (_XmRendFG(toRend) == XmUNSPECIFIED_PIXEL)
Packit b099d7
    _XmRendFG(toRend) = _XmRendFG (fromRend);
Packit b099d7
#endif
Packit b099d7
  if (_XmRendUnderlineType(toRend) == XmAS_IS)
Packit b099d7
    _XmRendUnderlineType(toRend) = _XmRendUnderlineType(fromRend);
Packit b099d7
  if (_XmRendUnderlineType(toRend) == XmAS_IS)
Packit b099d7
    _XmRendStrikethruType(toRend) = _XmRendStrikethruType(fromRend);
Packit b099d7
}
Packit b099d7
Packit b099d7
/* Make a Clone--new handle and new data structure--of a rendition. */
Packit b099d7
static XmRendition
Packit b099d7
CloneRendition(XmRendition rend)
Packit b099d7
{
Packit b099d7
  _XmRendition 	copy;
Packit b099d7
  XmRendition	copy_handle;
Packit b099d7
  
Packit b099d7
  if (rend == NULL) return(NULL);
Packit b099d7
  
Packit b099d7
  copy = (_XmRendition)XtMalloc(sizeof(_XmRenditionRec));
Packit b099d7
  bzero((char*)copy, sizeof(_XmRenditionRec));
Packit b099d7
  copy_handle = GetHandle(_XmRendition);
Packit b099d7
  SetPtr(copy_handle, copy);
Packit b099d7
  
Packit b099d7
  _XmRendFontOnly(copy_handle) = FALSE;
Packit b099d7
  _XmRendRefcount(copy_handle) = 1;
Packit b099d7
  
Packit b099d7
  CopyInto(copy_handle, rend);
Packit b099d7
  return(copy_handle);
Packit b099d7
}
Packit b099d7
Packit b099d7
/* Set the old handle to point to a new data structure. */
Packit b099d7
static XmRendition
Packit b099d7
RenewRendition(XmRendition rend)
Packit b099d7
{
Packit b099d7
  _XmRendition copy;
Packit b099d7
  
Packit b099d7
  if (rend == NULL) return(NULL);
Packit b099d7
  
Packit b099d7
  copy = (_XmRendition)XtMalloc(sizeof(_XmRenditionRec));
Packit b099d7
  memcpy((char *)copy, (char *)GetPtr(rend), sizeof(_XmRenditionRec));
Packit b099d7
  SetPtr(rend, copy);
Packit b099d7
  
Packit b099d7
  _XmRendFontOnly(rend) = FALSE;
Packit b099d7
  _XmRendRefcount(rend) = 1;
Packit b099d7
  
Packit b099d7
  return(rend);
Packit b099d7
}
Packit b099d7
Packit b099d7
/* Allocate a new handle which points to the old data structure with */
Packit b099d7
/* an incremented refcount. */
Packit b099d7
static XmRendition
Packit b099d7
CopyRendition(XmRendition rend)
Packit b099d7
{
Packit b099d7
  XmRendition	copy;
Packit b099d7
  
Packit b099d7
  if (rend == NULL) return(NULL);
Packit b099d7
Packit b099d7
  if (_XmRendRefcountInc(rend) == 0)
Packit b099d7
    {
Packit b099d7
      _XmRendRefcountDec(rend);
Packit b099d7
      return(CloneRendition(rend));
Packit b099d7
    }
Packit b099d7
  else 
Packit b099d7
    {
Packit b099d7
      copy = GetHandle(_XmRendition);
Packit b099d7
      SetPtr(copy, GetPtr(rend));
Packit b099d7
      return(copy);
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
/* Increment the refcount.  Clone if overflow. */
Packit b099d7
static XmRendition
Packit b099d7
DuplicateRendition(XmRendition rend)
Packit b099d7
{
Packit b099d7
  if (rend == NULL) return(NULL);
Packit b099d7
Packit b099d7
  if (_XmRendRefcountInc(rend) == 0)
Packit b099d7
    {
Packit b099d7
      _XmRendRefcountDec(rend);
Packit b099d7
      return(CloneRendition(rend));
Packit b099d7
    }
Packit b099d7
  else 
Packit b099d7
    {
Packit b099d7
      return(rend);
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
/* Make a copy of a rendition, *including* the "scratch" info (tags,
Packit b099d7
 * GC, hadEnds).
Packit b099d7
 * Shared indicates whether or not this is a shared copy.
Packit b099d7
 */
Packit b099d7
XmRendition
Packit b099d7
_XmRenditionCopy(XmRendition rend,
Packit b099d7
		 Boolean shared)
Packit b099d7
{
Packit b099d7
  XmRendition toRend;
Packit b099d7
  int i;
Packit b099d7
Packit b099d7
  if (rend == NULL) return(NULL);
Packit b099d7
Packit b099d7
  if (shared) toRend = CopyRendition(rend);
Packit b099d7
  else toRend = CloneRendition(rend);
Packit b099d7
Packit b099d7
  /* If we had to clone, copy the 'scratch' info. */
Packit b099d7
  if (*toRend != *rend)
Packit b099d7
    {
Packit b099d7
      _XmRendGC(toRend) = _XmRendGC(rend);
Packit b099d7
      _XmRendTagCount(toRend) = _XmRendTagCount(rend);
Packit b099d7
      _XmRendHadEnds(toRend) = _XmRendHadEnds(rend);
Packit b099d7
      _XmRendTags(toRend) =
Packit b099d7
	(XmStringTag *)XtMalloc(sizeof(XmStringTag) * _XmRendTagCount(rend));
Packit b099d7
      for (i = 0; i < _XmRendTagCount(rend); i++)
Packit b099d7
	_XmRendTags(toRend)[i] = _XmRendTags(rend)[i];
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  return(toRend);
Packit b099d7
}
Packit b099d7
Packit b099d7
/* Creates new rendertable, adding any new renditions. */
Packit b099d7
/* Mutate rendertable.  Copy renditions. */
Packit b099d7
XmRenderTable
Packit b099d7
XmRenderTableAddRenditions(XmRenderTable oldtable, 
Packit b099d7
			   XmRendition *renditions,
Packit b099d7
			   Cardinal rendition_count,
Packit b099d7
			   XmMergeMode merge_mode)
Packit b099d7
{
Packit b099d7
  int			i, next;
Packit b099d7
  int			count = rendition_count;
Packit b099d7
  XmRendition		rend, match;
Packit b099d7
  _XmRenderTable	table;
Packit b099d7
  XmRenderTable		newtable, tmptable = NULL;
Packit b099d7
  Boolean		*matches;
Packit b099d7
  short			idx;
Packit b099d7
  XtAppContext		app=NULL;
Packit b099d7
Packit b099d7
  if ((renditions == NULL) || (rendition_count == 0))
Packit b099d7
    return(oldtable);
Packit b099d7
Packit b099d7
#ifdef XTHREADS
Packit b099d7
  if (_XmRendDisplay(renditions[0]))
Packit b099d7
	app = XtDisplayToApplicationContext(_XmRendDisplay(renditions[0]));
Packit b099d7
  if (app) {
Packit b099d7
     _XmAppLock(app);
Packit b099d7
  }
Packit b099d7
  else {
Packit b099d7
     _XmProcessLock();
Packit b099d7
  }
Packit b099d7
#endif
Packit b099d7
  if (oldtable == NULL)
Packit b099d7
    {
Packit b099d7
      /* Malloc new table */
Packit b099d7
      table = 
Packit b099d7
	(_XmRenderTable)XtMalloc(sizeof(_XmRenderTableRec) +
Packit b099d7
				(sizeof(XmRendition) *
Packit b099d7
				 (rendition_count -
Packit b099d7
				  RENDITIONS_IN_STRUCT)));
Packit b099d7
      oldtable = GetHandle(_XmRenderTable);
Packit b099d7
      SetPtr(oldtable, table);
Packit b099d7
Packit b099d7
      _XmRTCount(oldtable) = rendition_count;
Packit b099d7
      _XmRTDisplay(oldtable) = NULL;
Packit b099d7
      _XmRTRefcount(oldtable) = 1;
Packit b099d7
      
Packit b099d7
      /* Copy renditions */
Packit b099d7
      for (i = 0; i < rendition_count; i++)
Packit b099d7
	{
Packit b099d7
	  _XmRTRenditions(oldtable)[i] = CopyRendition(renditions[i]);
Packit b099d7
	  if (_XmRTDisplay(oldtable) == NULL)
Packit b099d7
	    _XmRTDisplay(oldtable) = _XmRendDisplay(renditions[i]);
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
  else
Packit b099d7
    {
Packit b099d7
      matches =
Packit b099d7
	(Boolean *)ALLOCATE_LOCAL(rendition_count * sizeof(Boolean));
Packit b099d7
      bzero(matches, rendition_count * sizeof(Boolean));
Packit b099d7
      
Packit b099d7
      /* May have to copy table if shared. */
Packit b099d7
      if (_XmRTRefcount(oldtable) > 1)
Packit b099d7
	{
Packit b099d7
	  /* Allocate new table */
Packit b099d7
	  table = (_XmRenderTable)
Packit b099d7
	    XtMalloc(sizeof(_XmRenderTableRec) +
Packit b099d7
		     (sizeof(XmRendition) *
Packit b099d7
		      (_XmRTCount(oldtable) - RENDITIONS_IN_STRUCT)));
Packit b099d7
Packit b099d7
	  newtable = GetHandle(_XmRenderTable);
Packit b099d7
	  SetPtr(newtable, table);
Packit b099d7
Packit b099d7
	  _XmRTDisplay(newtable) = _XmRTDisplay(oldtable);
Packit b099d7
	  _XmRTRefcount(newtable) = 1;
Packit b099d7
Packit b099d7
	  /* Move old Renditions. */
Packit b099d7
	  for (i = 0; i < _XmRTCount(oldtable); i++)
Packit b099d7
	    _XmRTRenditions(newtable)[i] = _XmRTRenditions(oldtable)[i];
Packit b099d7
Packit b099d7
	  _XmRTCount(newtable) = _XmRTCount(oldtable);
Packit b099d7
	  _XmRTRefcountDec(oldtable);
Packit b099d7
Packit b099d7
	  /* Free at end so we don't get same memory from malloc. */
Packit b099d7
	  tmptable = oldtable;
Packit b099d7
	  oldtable = newtable;
Packit b099d7
	}
Packit b099d7
      
Packit b099d7
      /* Merge matching renditions */
Packit b099d7
      for (i = 0; i < rendition_count; i++)
Packit b099d7
	{
Packit b099d7
	  rend = renditions[i];
Packit b099d7
	  
Packit b099d7
	  match =
Packit b099d7
	    _XmRenderTableFindRendition(oldtable, _XmRendTag(rend),
Packit b099d7
					TRUE, FALSE, FALSE, &idx);
Packit b099d7
	  if ((match != NULL) && (merge_mode != XmDUPLICATE))
Packit b099d7
	    {
Packit b099d7
	      /* Merge renditions. */
Packit b099d7
	      switch (merge_mode)
Packit b099d7
		{
Packit b099d7
		case XmMERGE_REPLACE:
Packit b099d7
		  if (FreeRendition(match)) FreeHandle(match);
Packit b099d7
		  _XmRTRenditions(oldtable)[idx] = 
Packit b099d7
		    CopyRendition(rend);
Packit b099d7
		  break;
Packit b099d7
		  
Packit b099d7
		case XmSKIP:
Packit b099d7
		  break;
Packit b099d7
		  
Packit b099d7
		case XmMERGE_OLD:
Packit b099d7
		  if (_XmRendRefcount(match) > 1) 
Packit b099d7
		    {
Packit b099d7
		      match = CloneRendition(match);
Packit b099d7
		      _XmRTRenditions(oldtable)[idx] = match;
Packit b099d7
		    }		      
Packit b099d7
		  MergeInto(match, rend);
Packit b099d7
		  break;
Packit b099d7
		  
Packit b099d7
		case XmMERGE_NEW:
Packit b099d7
		  rend = CloneRendition(rend);
Packit b099d7
		  MergeInto(rend, match);
Packit b099d7
		  _XmRTRenditions(oldtable)[idx] = rend;
Packit b099d7
		  if (FreeRendition(match)) FreeHandle(match);
Packit b099d7
		  break;
Packit b099d7
		  
Packit b099d7
		default:
Packit b099d7
		  printf("NYI");
Packit b099d7
		  break;
Packit b099d7
		}
Packit b099d7
Packit b099d7
	      matches[i] = TRUE;
Packit b099d7
	      --count;
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
      
Packit b099d7
      if (count > 0)				  /* Allocate new table */
Packit b099d7
	{
Packit b099d7
	  table = (_XmRenderTable)
Packit b099d7
	    XtMalloc(sizeof(_XmRenderTableRec) +
Packit b099d7
		     (sizeof(XmRendition) *
Packit b099d7
		      (_XmRTCount(oldtable) + count - RENDITIONS_IN_STRUCT)));
Packit b099d7
	  newtable = GetHandle(_XmRenderTable);
Packit b099d7
	  SetPtr(newtable, table);
Packit b099d7
Packit b099d7
	  _XmRTDisplay(newtable) = _XmRTDisplay(oldtable);
Packit b099d7
	  _XmRTRefcount(newtable) = 1;
Packit b099d7
      
Packit b099d7
	  /* Move old Renditions. */
Packit b099d7
	  for (i = 0; i < _XmRTCount(oldtable); i++)
Packit b099d7
	    _XmRTRenditions(newtable)[i] = _XmRTRenditions(oldtable)[i];
Packit b099d7
Packit b099d7
	  /* Copy new renditions. */
Packit b099d7
	  next = _XmRTCount(oldtable);
Packit b099d7
      
Packit b099d7
	  for (i = 0; i < rendition_count; i++)
Packit b099d7
	    {
Packit b099d7
	      if (!matches[i])
Packit b099d7
		{
Packit b099d7
		  _XmRTRenditions(newtable)[next] =
Packit b099d7
		    CopyRendition(renditions[i]);
Packit b099d7
		  if (_XmRTDisplay(newtable) == NULL)
Packit b099d7
		    _XmRTDisplay(newtable) = _XmRTDisplay(oldtable);
Packit b099d7
		  ++next;
Packit b099d7
		}
Packit b099d7
	    }
Packit b099d7
	    
Packit b099d7
	  _XmRTCount(newtable) = _XmRTCount(oldtable) + count;
Packit b099d7
	  
Packit b099d7
	  /* Deallocate oldtable */
Packit b099d7
	  XtFree((char *)GetPtr(oldtable));
Packit b099d7
	  FreeHandle(oldtable);
Packit b099d7
	}
Packit b099d7
      /* Otherwise just return newhandle to oldtable */
Packit b099d7
      else					  
Packit b099d7
	{
Packit b099d7
	  table = GetPtr(oldtable);
Packit b099d7
	  newtable = GetHandle(_XmRenderTable);
Packit b099d7
	  SetPtr(newtable, table);
Packit b099d7
	  FreeHandle(oldtable);
Packit b099d7
	}
Packit b099d7
      
Packit b099d7
      DEALLOCATE_LOCAL((char *)matches);
Packit b099d7
Packit b099d7
      oldtable = newtable;
Packit b099d7
    }
Packit b099d7
Packit b099d7
  if (tmptable != NULL) FreeHandle(tmptable);
Packit b099d7
#ifdef XTHREADS
Packit b099d7
  if (app) {
Packit b099d7
      _XmAppUnlock(app);
Packit b099d7
  }
Packit b099d7
  else {
Packit b099d7
      _XmProcessUnlock();
Packit b099d7
  }
Packit b099d7
#endif
Packit b099d7
  return(oldtable);
Packit b099d7
}
Packit b099d7
Packit b099d7
/* Remove matching renditions. */
Packit b099d7
/* Mutates oldtable, decrements removed renditions. */
Packit b099d7
XmRenderTable
Packit b099d7
XmRenderTableRemoveRenditions(XmRenderTable oldtable,
Packit b099d7
			      XmStringTag *tags,
Packit b099d7
			      int tag_count)
Packit b099d7
{
Packit b099d7
  XmRenderTable ret_val;
Packit b099d7
#ifdef XTHREADS
Packit b099d7
  XtAppContext  app=NULL;
Packit b099d7
Packit b099d7
  if (_XmRTDisplay(oldtable))
Packit b099d7
	app = XtDisplayToApplicationContext(_XmRTDisplay(oldtable));
Packit b099d7
  if (app) {
Packit b099d7
    _XmAppLock(app);
Packit b099d7
  }
Packit b099d7
  else {
Packit b099d7
    _XmProcessLock();
Packit b099d7
  }
Packit b099d7
#endif
Packit b099d7
  ret_val = _XmRenderTableRemoveRenditions(oldtable, tags,tag_count,
Packit b099d7
				FALSE, XmFONT_IS_FONT, NULL);
Packit b099d7
#ifdef XTHREADS
Packit b099d7
  if (app) {
Packit b099d7
     _XmAppUnlock(app);
Packit b099d7
  }
Packit b099d7
  else {
Packit b099d7
     _XmProcessUnlock();
Packit b099d7
  }
Packit b099d7
#endif
Packit b099d7
  return ret_val;
Packit b099d7
}
Packit b099d7
Packit b099d7
/* Remove matching renditions. */
Packit b099d7
/* Mutates oldtable, decrements removed renditions. */
Packit b099d7
/* If chk_font TRUE, checks that font and type also match. */
Packit b099d7
XmRenderTable
Packit b099d7
_XmRenderTableRemoveRenditions(XmRenderTable oldtable,
Packit b099d7
			       XmStringTag *tags,
Packit b099d7
			       int tag_count,
Packit b099d7
#if NeedWidePrototypes
Packit b099d7
			       int chk_font,
Packit b099d7
#else
Packit b099d7
			       Boolean chk_font,
Packit b099d7
#endif /* NeedWidePrototypes */
Packit b099d7
			       XmFontType type,
Packit b099d7
			       XtPointer font)
Packit b099d7
{
Packit b099d7
  int			i, j;
Packit b099d7
  int			count;
Packit b099d7
  _XmRenderTable	table;
Packit b099d7
  XmRenderTable		newtable = NULL;
Packit b099d7
Packit b099d7
  if ((oldtable == NULL) || (tags == NULL) || (tag_count == 0))
Packit b099d7
    return(oldtable);
Packit b099d7
  
Packit b099d7
  count = 0;
Packit b099d7
  
Packit b099d7
  if (_XmRTRefcount(oldtable) > 1)
Packit b099d7
    {
Packit b099d7
      /* Allocate new table */
Packit b099d7
      table = (_XmRenderTable)
Packit b099d7
	XtMalloc(sizeof(_XmRenderTableRec) +
Packit b099d7
		 (sizeof(XmRendition) *
Packit b099d7
		  (_XmRTCount(oldtable) - RENDITIONS_IN_STRUCT)));
Packit b099d7
Packit b099d7
      newtable = GetHandle(_XmRenderTable);
Packit b099d7
      SetPtr(newtable, table);
Packit b099d7
Packit b099d7
      _XmRTDisplay(newtable) = _XmRTDisplay(oldtable);
Packit b099d7
      _XmRTRefcount(newtable) = 1;
Packit b099d7
Packit b099d7
      /* Move old Renditions. */
Packit b099d7
      for (i = 0; i < _XmRTCount(oldtable); i++)
Packit b099d7
	_XmRTRenditions(newtable)[i] = _XmRTRenditions(oldtable)[i];
Packit b099d7
      _XmRTCount(newtable) = _XmRTCount(oldtable);
Packit b099d7
      
Packit b099d7
      if (_XmRTRefcountDec(oldtable) == 0)
Packit b099d7
	XtFree((char *)GetPtr(oldtable));
Packit b099d7
      FreeHandle(oldtable);
Packit b099d7
      
Packit b099d7
      oldtable = newtable;
Packit b099d7
    }
Packit b099d7
  /* Iterate over renditions */
Packit b099d7
  for (i = 0; i < _XmRTCount(oldtable); i++)
Packit b099d7
    {
Packit b099d7
      /* Match against tags */
Packit b099d7
      for (j = 0; j < tag_count; j++)
Packit b099d7
	{
Packit b099d7
	  if ((strcmp(_XmRendTag(_XmRTRenditions(oldtable)[i]),
Packit b099d7
		      tags[j]) == 0) &&
Packit b099d7
	      (!chk_font ||
Packit b099d7
	       ((font == _XmRendFont(_XmRTRenditions(oldtable)[i])) &&
Packit b099d7
		(type == _XmRendFontType(_XmRTRenditions(oldtable)[i])))))
Packit b099d7
	    {
Packit b099d7
	      if (FreeRendition(_XmRTRenditions(oldtable)[i]))
Packit b099d7
		FreeHandle(_XmRTRenditions(oldtable)[i]);
Packit b099d7
	      _XmRTRenditions(oldtable)[i] = NULL;
Packit b099d7
	      break;
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
      if (_XmRTRenditions(oldtable)[i] != NULL) 
Packit b099d7
	{
Packit b099d7
	  if (count != i)
Packit b099d7
	    _XmRTRenditions(oldtable)[count] = _XmRTRenditions(oldtable)[i];
Packit b099d7
Packit b099d7
	  count++;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
  if (count == 0)
Packit b099d7
    /* No renditions left. Return NULL. */
Packit b099d7
    {
Packit b099d7
      XmRenderTableFree(oldtable);
Packit b099d7
      return(NULL);
Packit b099d7
    }
Packit b099d7
  else if (count < _XmRTCount(oldtable))
Packit b099d7
    {
Packit b099d7
      /* Realloc table */
Packit b099d7
      table = (_XmRenderTable)XtRealloc((char *)*oldtable,
Packit b099d7
					sizeof(_XmRenderTableRec) +
Packit b099d7
					(sizeof(XmRendition) *
Packit b099d7
					 (count - RENDITIONS_IN_STRUCT)));
Packit b099d7
      if (newtable == NULL) 
Packit b099d7
	{
Packit b099d7
	  newtable = GetHandle(_XmRenderTable);
Packit b099d7
	  FreeHandle(oldtable);
Packit b099d7
	}      
Packit b099d7
      SetPtr(newtable, table);
Packit b099d7
Packit b099d7
      _XmRTCount(newtable) = count;
Packit b099d7
  
Packit b099d7
      return(newtable);
Packit b099d7
    }
Packit b099d7
  return(oldtable);
Packit b099d7
}
Packit b099d7
Packit b099d7
static void
Packit b099d7
CopyFromArg(XtArgVal src, char *dst, unsigned int size)
Packit b099d7
{
Packit b099d7
  if (size > sizeof(XtArgVal))
Packit b099d7
    memcpy((char *)dst, (char *)src, (size_t)size);
Packit b099d7
  else {
Packit b099d7
    union {
Packit b099d7
      long	longval;
Packit b099d7
#ifdef FIX_1152
Packit b099d7
      int	intval;
Packit b099d7
#endif
Packit b099d7
      short	shortval;
Packit b099d7
      char	charval;
Packit b099d7
      char*	charptr;
Packit b099d7
      XtPointer	ptr;
Packit b099d7
    } u;
Packit b099d7
    char *p = (char*)&u;
Packit b099d7
    if      (size == sizeof(long))	    u.longval = (long)src;
Packit b099d7
#ifdef FIX_1152
Packit b099d7
    else if (size == sizeof(int))	    u.intval = (int) src;
Packit b099d7
#endif
Packit b099d7
    else if (size == sizeof(short))	    u.shortval = (short)src;
Packit b099d7
    else if (size == sizeof(char))	    u.charval = (char)src;
Packit b099d7
    else if (size == sizeof(XtPointer))	    u.ptr = (XtPointer)src;
Packit b099d7
    else if (size == sizeof(char*))	    u.charptr = (char*)src;
Packit b099d7
    else				    p = (char*)&src;
Packit b099d7
Packit b099d7
    memcpy((char *)dst, p, (size_t)size);
Packit b099d7
  }
Packit b099d7
} /* CopyFromArg */
Packit b099d7
Packit b099d7
static void
Packit b099d7
CopyToArg(char *src, XtArgVal *dst, unsigned int size)
Packit b099d7
{
Packit b099d7
  if ((void *)(*dst) == NULL) {
Packit b099d7
    /* old GetValues semantics (storing directly into arglists) are bad,
Packit b099d7
     * but preserve for compatibility as long as arglist contains NULL.
Packit b099d7
     */
Packit b099d7
    if	    (size == sizeof(long))	   *dst = (XtArgVal)*(long*)src;
Packit b099d7
#ifdef FIX_1152
Packit b099d7
    else if (size == sizeof(int))	   *dst = (XtArgVal)*(int*)src;
Packit b099d7
#endif
Packit b099d7
    else if (size == sizeof(short))    *dst = (XtArgVal)*(short*)src;
Packit b099d7
    else if (size == sizeof(char))	   *dst = (XtArgVal)*(char*)src;
Packit b099d7
    else if (size == sizeof(XtPointer)) *dst = (XtArgVal)*(XtPointer*)src;
Packit b099d7
    else if (size == sizeof(char*))    *dst = (XtArgVal)*(char**)src;
Packit b099d7
    else if (size == sizeof(XtArgVal)) *dst = *(XtArgVal*)src;
Packit b099d7
    else memcpy((char*)dst, (char*)src, (size_t)size);
Packit b099d7
  }
Packit b099d7
  else {
Packit b099d7
    /* proper GetValues semantics: argval is pointer to destination */
Packit b099d7
    if	(size == sizeof(long))	   *((long*)*dst) = *(long*)src;
Packit b099d7
#ifdef FIX_1152
Packit b099d7
    else if (size == sizeof(int))	*((int*)*dst) = *(int*)src;
Packit b099d7
#endif
Packit b099d7
    else if (size == sizeof(short))    *((short*)*dst) = *(short*)src;
Packit b099d7
    else if (size == sizeof(char))	   *((char*)*dst) = *(char*)src;
Packit b099d7
    else if (size == sizeof(XtPointer)) *((XtPointer*)*dst) = *(XtPointer*)src;
Packit b099d7
    else if (size == sizeof(char*))    *((char**)*dst) = *(char**)src;
Packit b099d7
    else if (size == sizeof(XtArgVal)) *((XtArgVal*)*dst)= *(XtArgVal*)src;
Packit b099d7
    else memcpy((char *)*dst, (char *)src, (size_t)size);
Packit b099d7
  }
Packit b099d7
} /* CopyToArg */
Packit b099d7
Packit b099d7
/* Copies renditions matching tags to a new table. */
Packit b099d7
/* If all renditions copied then duplicate rendertable, duplicate */
Packit b099d7
/* renditions.  Otherwise, mutate rendertable, duplicate renditions. */
Packit b099d7
XmRenderTable
Packit b099d7
XmRenderTableCopy(XmRenderTable table,
Packit b099d7
		  XmStringTag *tags,
Packit b099d7
		  int tag_count)
Packit b099d7
{
Packit b099d7
  XmRenderTable		rt = NULL;
Packit b099d7
  _XmRenderTable	t = NULL;
Packit b099d7
  int			i, j, count;
Packit b099d7
  int			size;
Packit b099d7
  XmRendition		rend = NULL;
Packit b099d7
  XtAppContext		app = NULL;
Packit b099d7
Packit b099d7
  if (table == NULL) return((XmRenderTable)NULL);
Packit b099d7
Packit b099d7
#ifdef XTHREADS
Packit b099d7
  if (_XmRTDisplay(table))
Packit b099d7
     app = XtDisplayToApplicationContext(_XmRTDisplay(table));
Packit b099d7
  if (app) {
Packit b099d7
     _XmAppLock(app);
Packit b099d7
  }
Packit b099d7
  else {
Packit b099d7
     _XmProcessLock();
Packit b099d7
  }
Packit b099d7
#endif
Packit b099d7
  count = 0;
Packit b099d7
Packit b099d7
  if ((_XmRTRefcountInc(table) == 0) || (tags != NULL))
Packit b099d7
    {
Packit b099d7
      /* Malloc new table */
Packit b099d7
      _XmRTRefcountDec(table);
Packit b099d7
      
Packit b099d7
      if (tag_count > 0)
Packit b099d7
	size = (sizeof(_XmRendition) * (tag_count - RENDITIONS_IN_STRUCT));
Packit b099d7
      else 
Packit b099d7
	size = (sizeof(_XmRendition) *
Packit b099d7
		(_XmRTCount(table) - RENDITIONS_IN_STRUCT));
Packit b099d7
  
Packit b099d7
      size = (size < 0) ? 0 : size;
Packit b099d7
Packit b099d7
      t = (_XmRenderTable)XtMalloc(sizeof(_XmRenderTableRec) + size);
Packit b099d7
      rt = GetHandle(_XmRenderTable);
Packit b099d7
      SetPtr(rt, t);
Packit b099d7
      _XmRTRefcount(rt) = 1;
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  if (tags == NULL)
Packit b099d7
    {
Packit b099d7
      /* Increment renditions. */
Packit b099d7
      for (i = 0; i < _XmRTCount(table); i++)
Packit b099d7
	{
Packit b099d7
	  rend = DuplicateRendition(_XmRTRenditions(table)[i]);
Packit b099d7
	  /* Check for overflow. */
Packit b099d7
	  if (rend != _XmRTRenditions(table)[i]) break;
Packit b099d7
	}
Packit b099d7
      
Packit b099d7
      if (i < _XmRTCount(table))		  /* Overflow! */
Packit b099d7
	{
Packit b099d7
	  /* Malloc new table. */
Packit b099d7
	  t = (_XmRenderTable)XtMalloc(sizeof(_XmRenderTableRec) +
Packit b099d7
				       (sizeof(_XmRendition) *
Packit b099d7
					(_XmRTCount(table) - RENDITIONS_IN_STRUCT)));
Packit b099d7
	  rt = GetHandle(_XmRenderTable);
Packit b099d7
	  SetPtr(rt, t);
Packit b099d7
	  _XmRTRefcount(rt) = 1;
Packit b099d7
	    
Packit b099d7
	  _XmRTCount(rt) = _XmRTCount(table);
Packit b099d7
Packit b099d7
	  /* Move renditions done already. */
Packit b099d7
	  for (j = 0; j < i; j++)
Packit b099d7
	    _XmRTRenditions(rt)[j] = _XmRTRenditions(table)[j];
Packit b099d7
	  _XmRTRenditions(rt)[i] = rend;
Packit b099d7
	  /* Copy rest */
Packit b099d7
	  for (j = i + 1; j < _XmRTCount(rt); j++)
Packit b099d7
	    _XmRTRenditions(rt)[j] = DuplicateRendition(_XmRTRenditions(table)[j]);
Packit b099d7
	}
Packit b099d7
      else
Packit b099d7
	{
Packit b099d7
	  rt = GetHandle(_XmRenderTable);
Packit b099d7
	  SetPtr(rt, GetPtr(table));
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
  else
Packit b099d7
    {
Packit b099d7
      /* Copy matching renditions. */
Packit b099d7
      for (i = 0; i < tag_count; i++)
Packit b099d7
	{
Packit b099d7
	  XmRendition match;
Packit b099d7
	  
Packit b099d7
	  match = XmRenderTableGetRendition(table, tags[i]);
Packit b099d7
Packit b099d7
	  if (match != NULL)
Packit b099d7
	    {
Packit b099d7
	      _XmRTRenditions(rt)[i] = match;
Packit b099d7
	      ++count;
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
Packit b099d7
      /* Realloc table */
Packit b099d7
      t = (_XmRenderTable)XtRealloc((char *)t, 
Packit b099d7
				     sizeof(_XmRenderTableRec) +
Packit b099d7
				     (sizeof(XmRendition) *
Packit b099d7
				      (count - RENDITIONS_IN_STRUCT)));
Packit b099d7
      SetPtr(rt, t);
Packit b099d7
      _XmRTCount(rt) = count;
Packit b099d7
    }
Packit b099d7
Packit b099d7
  _XmRTDisplay(rt) = _XmRTDisplay(table);
Packit b099d7
Packit b099d7
#ifdef XTHREADS
Packit b099d7
  if (app) {
Packit b099d7
	_XmAppUnlock(app);
Packit b099d7
  }
Packit b099d7
  else {
Packit b099d7
	_XmProcessUnlock();
Packit b099d7
  }
Packit b099d7
#endif
Packit b099d7
  return(rt);
Packit b099d7
}
Packit b099d7
Packit b099d7
/* Decrement rendertable, free if refcount is zero.  XmRenditionFree */
Packit b099d7
/* renditions. */
Packit b099d7
void
Packit b099d7
XmRenderTableFree(XmRenderTable table)
Packit b099d7
{
Packit b099d7
  int 		i;
Packit b099d7
Packit b099d7
  _XmProcessLock();
Packit b099d7
  for (i = 0; i < _XmRTCount(table); i++)
Packit b099d7
    if (FreeRendition(_XmRTRenditions(table)[i]))
Packit b099d7
      FreeHandle(_XmRTRenditions(table)[i]);
Packit b099d7
  
Packit b099d7
  if (_XmRTRefcountDec(table) == 0)
Packit b099d7
    XtFree((char *)GetPtr(table));
Packit b099d7
Packit b099d7
  FreeHandle(table);
Packit b099d7
  _XmProcessUnlock();
Packit b099d7
}
Packit b099d7
Packit b099d7
/* Get list of tags of all renditions in table. */
Packit b099d7
int
Packit b099d7
XmRenderTableGetTags(XmRenderTable table, 
Packit b099d7
		     XmStringTag **tag_list)
Packit b099d7
{
Packit b099d7
  int i, ret_val;
Packit b099d7
  XtAppContext          app = NULL;
Packit b099d7
Packit b099d7
  if (table == NULL)
Packit b099d7
    {
Packit b099d7
      *tag_list = NULL;
Packit b099d7
      return(0);
Packit b099d7
    }
Packit b099d7
Packit b099d7
  app = XtDisplayToApplicationContext(_XmRTDisplay(table));
Packit b099d7
  _XmAppLock(app);
Packit b099d7
  *tag_list = 
Packit b099d7
    (XmStringTag *)XtMalloc(sizeof(XmStringTag) * _XmRTCount(table));
Packit b099d7
Packit b099d7
  for (i = 0; i < _XmRTCount(table); i++)
Packit b099d7
      (*tag_list)[i] = 
Packit b099d7
	XtNewString(_XmRendTag(_XmRTRenditions(table)[i]));
Packit b099d7
      
Packit b099d7
  ret_val = _XmRTCount(table);
Packit b099d7
  _XmAppUnlock(app);
Packit b099d7
  return ret_val;
Packit b099d7
}
Packit b099d7
Packit b099d7
/* Returns copy of matching rendition. */
Packit b099d7
XmRendition
Packit b099d7
XmRenderTableGetRendition(XmRenderTable table,
Packit b099d7
			  XmStringTag tag)
Packit b099d7
{
Packit b099d7
  XmRendition ret_val;
Packit b099d7
  _XmDisplayToAppContext(_XmRTDisplay(table));
Packit b099d7
Packit b099d7
  _XmAppLock(app);
Packit b099d7
  ret_val = CopyRendition(_XmRenderTableFindRendition(table, tag,
Packit b099d7
			FALSE, FALSE, FALSE, NULL));
Packit b099d7
  _XmAppUnlock(app);
Packit b099d7
  return ret_val;
Packit b099d7
}
Packit b099d7
Packit b099d7
/* Returns array of copies of matching renditions. */
Packit b099d7
XmRendition *
Packit b099d7
XmRenderTableGetRenditions(XmRenderTable table,
Packit b099d7
			   char **tags,
Packit b099d7
			   Cardinal tag_count)
Packit b099d7
{
Packit b099d7
  XmRendition	rend, *rends;
Packit b099d7
  int		i, count;
Packit b099d7
  XtAppContext  app = NULL;
Packit b099d7
Packit b099d7
  if ((table == NULL) || (tags == NULL) || (tag_count == 0))
Packit b099d7
      return(NULL);
Packit b099d7
 
Packit b099d7
#ifdef XTHREADS
Packit b099d7
  if (_XmRTDisplay(table))
Packit b099d7
  {
Packit b099d7
     app = XtDisplayToApplicationContext(_XmRTDisplay(table));
Packit b099d7
     _XmAppLock(app);
Packit b099d7
  }
Packit b099d7
#endif
Packit b099d7
  rends = (XmRendition *)XtMalloc(tag_count * sizeof(XmRendition));
Packit b099d7
  
Packit b099d7
  count = 0;
Packit b099d7
  for (i = 0; i < tag_count; i++)
Packit b099d7
    {
Packit b099d7
      rend = _XmRenderTableFindRendition(table, tags[i],
Packit b099d7
					 FALSE, FALSE, FALSE, NULL);
Packit b099d7
      if (rend != NULL)
Packit b099d7
	{
Packit b099d7
	  rends[count] = CopyRendition(rend);
Packit b099d7
	  count++;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  if (count < tag_count)
Packit b099d7
    rends = (XmRendition *)XtRealloc((char *)rends, count * sizeof(XmRendition));
Packit b099d7
  
Packit b099d7
#ifdef XTHREADS
Packit b099d7
  if (app) {
Packit b099d7
     _XmAppUnlock(app);
Packit b099d7
  }
Packit b099d7
#endif
Packit b099d7
  return(rends);
Packit b099d7
}
Packit b099d7
Packit b099d7
/* Wrapper for calling XtWarning functions. */
Packit b099d7
static void
Packit b099d7
RenditionWarning(char *tag,
Packit b099d7
		 char *type,
Packit b099d7
		 char *message,
Packit b099d7
     		 Display *dpy)
Packit b099d7
{
Packit b099d7
  char *params[1];
Packit b099d7
  Cardinal num_params = 1 ;
Packit b099d7
  Display *d;
Packit b099d7
Packit b099d7
  /* the MotifWarningHandler installed in VendorS.c knows about
Packit b099d7
     this convention */
Packit b099d7
  params[0] = XME_WARNING;
Packit b099d7
Packit b099d7
  if (dpy)
Packit b099d7
     d = dpy;
Packit b099d7
  else
Packit b099d7
     d = _XmGetDefaultDisplay();
Packit b099d7
  if (d)
Packit b099d7
    XtAppWarningMsg (XtDisplayToApplicationContext(d),
Packit b099d7
		     tag, type, "XmRendition", 
Packit b099d7
		     message, params, &num_params);
Packit b099d7
  else XtWarning(message);
Packit b099d7
}
Packit b099d7
Packit b099d7
/* Replace XmAS_IS and copy as necessary. */
Packit b099d7
static void
Packit b099d7
CleanupResources(XmRendition rend,
Packit b099d7
		 Boolean copy)
Packit b099d7
{
Packit b099d7
  if ((unsigned int)(unsigned long)_XmRendFont(rend) == XmAS_IS) 
Packit b099d7
    _XmRendFont(rend) = NULL;
Packit b099d7
  else if (_XmRendFontType(rend) == XmAS_IS)
Packit b099d7
    _XmRendFontType(rend) = XmFONT_IS_FONT;
Packit b099d7
Packit b099d7
#ifdef USE_XFT
Packit b099d7
  if ((unsigned int)(unsigned long)_XmRendXftFont (rend) == XmAS_IS)
Packit b099d7
    _XmRendXftFont (rend) = NULL;
Packit b099d7
#endif
Packit b099d7
Packit b099d7
  if (((unsigned int)(unsigned long)_XmRendFontName(rend) == XmAS_IS) ||
Packit b099d7
      (strcmp(_XmRendFontName(rend), XmSXmAS_IS) == 0))
Packit b099d7
    _XmRendFontName(rend) = NULL;
Packit b099d7
  else if (copy)
Packit b099d7
    _XmRendFontName(rend) = XtNewString(_XmRendFontName(rend));
Packit b099d7
  
Packit b099d7
  if ((unsigned int)(unsigned long)_XmRendTabs(rend) == XmAS_IS)
Packit b099d7
    _XmRendTabs(rend) = NULL;
Packit b099d7
  else if (copy)
Packit b099d7
    _XmRendTabs(rend) = XmTabListCopy(_XmRendTabs(rend), 0, 0);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/* Emit warning and set default if tag is NULL. */
Packit b099d7
static void
Packit b099d7
ValidateTag(XmRendition rend,
Packit b099d7
	    XmStringTag dflt)
Packit b099d7
{
Packit b099d7
  if (_XmRendTag(rend) == NULL)
Packit b099d7
    {
Packit b099d7
      RenditionWarning(_XmRendTag(rend), "NO_NULL_TAG",
Packit b099d7
	NO_NULL_TAG_MSG, _XmRendDisplay(rend));
Packit b099d7
      _XmRendTag(rend) = _XmStringCacheTag(dflt, XmSTRING_TAG_STRLEN);
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
#ifdef FIX_1414
Packit b099d7
#ifdef USE_XFT
Packit b099d7
static int
Packit b099d7
GetSameRenditions(XmRendition *rend_cache, XmRendition rend, int count_rend)
Packit b099d7
{
Packit b099d7
	int i;
Packit b099d7
	for (i=0; i
Packit b099d7
Packit b099d7
		if ( rend_cache && (rend_cache[i])
Packit b099d7
				&& (((_XmRendFontName(rend) 	&& _XmRendFontName(rend_cache[i]) ) && !strcmp(_XmRendFontName(rend_cache[i]), _XmRendFontName(rend))
Packit b099d7
					|| 	(!_XmRendFontName(rend) && !_XmRendFontName(rend_cache[i])))
Packit b099d7
				&& (((_XmRendFontFoundry(rend) && _XmRendFontFoundry(rend_cache[i])) && !strcmp(_XmRendFontFoundry(rend_cache[i]), _XmRendFontFoundry(rend)))
Packit b099d7
					|| 	(!_XmRendFontFoundry(rend) && !_XmRendFontFoundry(rend_cache[i])))
Packit b099d7
				&& (((_XmRendFontEncoding(rend) && _XmRendFontEncoding(rend_cache[i])) && !strcmp(_XmRendFontEncoding(rend_cache[i]), _XmRendFontEncoding(rend)))
Packit b099d7
					|| 	(!_XmRendFontEncoding(rend) && !_XmRendFontEncoding(rend_cache[i])))
Packit b099d7
				&& (((_XmRendFontStyle(rend) && _XmRendFontStyle(rend_cache[i])) && !strcmp(_XmRendFontStyle(rend_cache[i]), _XmRendFontStyle(rend)))
Packit b099d7
					|| 	(!_XmRendFontStyle(rend) && !_XmRendFontStyle(rend_cache[i])) )
Packit b099d7
				&& _XmRendFontSize(rend) == _XmRendFontSize(rend_cache[i])
Packit b099d7
				&& _XmRendPixelSize(rend) == _XmRendPixelSize(rend_cache[i])
Packit b099d7
				&& _XmRendFontSlant(rend) == _XmRendFontSlant(rend_cache[i])
Packit b099d7
				&& _XmRendFontWeight(rend) == _XmRendFontWeight(rend_cache[i])
Packit b099d7
				&& _XmRendFontSpacing(rend) == _XmRendFontSpacing(rend_cache[i]))
Packit b099d7
	   	   )
Packit b099d7
		{
Packit b099d7
			return i;
Packit b099d7
		}
Packit b099d7
Packit b099d7
	}
Packit b099d7
	return -1;
Packit b099d7
Packit b099d7
}
Packit b099d7
#endif
Packit b099d7
#endif
Packit b099d7
Packit b099d7
/* Make sure all the font related resources make sense together and */
Packit b099d7
/* then load the font specified by fontName if necessary. */
Packit b099d7
static void
Packit b099d7
ValidateAndLoadFont(XmRendition rend, Display *display)
Packit b099d7
{
Packit b099d7
  XrmString 		locale;
Packit b099d7
  XtPointer 		font;
Packit b099d7
  XrmValue         	args[2];
Packit b099d7
  Cardinal         	num_args = 0;
Packit b099d7
  XrmValue         	fromVal;
Packit b099d7
  XrmValue         	toVal;
Packit b099d7
  Boolean		result = False;
Packit b099d7
Packit b099d7
  _XmRendDisplay(rend) = display;
Packit b099d7
  
Packit b099d7
  if (_XmRendLoadModel(rend) != XmLOAD_DEFERRED)
Packit b099d7
    {
Packit b099d7
      XmDisplay			dsp = NULL;
Packit b099d7
      XmDisplayCallbackStruct	cb;
Packit b099d7
Packit b099d7
      if ((_XmRendFont(rend) == NULL) &&
Packit b099d7
#ifdef USE_XFT
Packit b099d7
          (_XmRendXftFont (rend) == NULL) &&
Packit b099d7
#endif
Packit b099d7
	  (_XmRendFontName(rend) != NULL))
Packit b099d7
	{
Packit b099d7
	  if (_XmRendFontType(rend) != XmAS_IS)
Packit b099d7
	    {
Packit b099d7
	      if (display == NULL)
Packit b099d7
		{
Packit b099d7
		  RenditionWarning(_XmRendTag(rend), "NULL_DISPLAY",
Packit b099d7
				   NULL_DISPLAY_MSG, NULL);
Packit b099d7
		  return;
Packit b099d7
		}
Packit b099d7
	      
Packit b099d7
	      args[0].addr = (XPointer) &display;
Packit b099d7
	      args[0].size = sizeof(Display*);
Packit b099d7
	      num_args++;
Packit b099d7
Packit b099d7
	      fromVal.addr = _XmRendFontName(rend);
Packit b099d7
	      fromVal.size = strlen(_XmRendFontName(rend));
Packit b099d7
Packit b099d7
	      toVal.addr = (XPointer) &fon;;
Packit b099d7
	      toVal.size = sizeof (XtPointer);
Packit b099d7
Packit b099d7
	      switch (_XmRendFontType(rend))
Packit b099d7
		{
Packit b099d7
		case XmFONT_IS_FONT:
Packit b099d7
		  result = 
Packit b099d7
		    XtCallConverter(display, XtCvtStringToFontStruct,
Packit b099d7
				    args, num_args, &fromVal, &toVal, NULL);
Packit b099d7
		  break;
Packit b099d7
		case XmFONT_IS_FONTSET:
Packit b099d7
		  locale = 
Packit b099d7
		    XrmQuarkToString(XrmStringToQuark(setlocale(LC_ALL, NULL)));
Packit b099d7
		  args[1].addr = (XPointer) &locale;
Packit b099d7
		  args[1].size = sizeof(XrmString);
Packit b099d7
		  num_args++;
Packit b099d7
Packit b099d7
		  result = XtCallConverter (display, XtCvtStringToFontSet, args,
Packit b099d7
					    num_args, &fromVal, &toVal, NULL);
Packit b099d7
		  break;
Packit b099d7
#ifdef USE_XFT
Packit b099d7
		case XmFONT_IS_XFT:
Packit b099d7
		  {
Packit b099d7
		    FcResult res;
Packit b099d7
		    FcPattern *p;
Packit b099d7
		    
Packit b099d7
#ifdef FIX_1414
Packit b099d7
						  static XmRendition *rend_cache;
Packit b099d7
						  static int count_rend=0, num_rend;
Packit b099d7
						  num_rend = GetSameRenditions(rend_cache, rend, count_rend);
Packit b099d7
Packit b099d7
						  if (num_rend>=0)
Packit b099d7
							  _XmRendXftFont(rend) = _XmRendXftFont(rend_cache[num_rend]);
Packit b099d7
						  else
Packit b099d7
						  {
Packit b099d7
#endif
Packit b099d7
		    _XmRendPattern(rend) = FcPatternCreate();
Packit b099d7
		    if (_XmRendFontName(rend))
Packit b099d7
		      FcPatternAddString(_XmRendPattern(rend), FC_FAMILY,
Packit b099d7
		                         (XftChar8 *)_XmRendFontName(rend));
Packit b099d7
		    if (_XmRendFontFoundry(rend))
Packit b099d7
		      FcPatternAddString(_XmRendPattern(rend), FC_FOUNDRY,
Packit b099d7
		                         (XftChar8 *)_XmRendFontFoundry(rend));
Packit b099d7
		    if (_XmRendFontEncoding(rend))
Packit b099d7
		      FcPatternAddString(_XmRendPattern(rend), XFT_ENCODING,
Packit b099d7
		                         (XftChar8 *)_XmRendFontEncoding(rend));
Packit b099d7
		    if (_XmRendFontStyle(rend))
Packit b099d7
		      FcPatternAddString(_XmRendPattern(rend), FC_STYLE,
Packit b099d7
		                         (XftChar8 *)_XmRendFontStyle(rend));
Packit b099d7
		    if (_XmRendFontSize(rend))
Packit b099d7
		      FcPatternAddInteger(_XmRendPattern(rend), FC_SIZE,
Packit b099d7
		                         _XmRendFontSize(rend));
Packit b099d7
		    if (_XmRendPixelSize(rend))
Packit b099d7
		      FcPatternAddInteger(_XmRendPattern(rend), FC_PIXEL_SIZE,
Packit b099d7
		                         _XmRendPixelSize(rend));
Packit b099d7
		    if (_XmRendFontSlant(rend))
Packit b099d7
		      FcPatternAddInteger(_XmRendPattern(rend), FC_SLANT,
Packit b099d7
		                         _XmRendFontSlant(rend));
Packit b099d7
		    if (_XmRendFontWeight(rend))
Packit b099d7
		      FcPatternAddInteger(_XmRendPattern(rend), FC_WEIGHT,
Packit b099d7
		                         _XmRendFontWeight(rend));
Packit b099d7
		    if (_XmRendFontSpacing(rend))
Packit b099d7
		      FcPatternAddInteger(_XmRendPattern(rend), FC_SPACING,
Packit b099d7
		                         _XmRendFontSpacing(rend));
Packit b099d7
                    p = XftFontMatch(display, 0, _XmRendPattern(rend), &res;;
Packit b099d7
#ifdef FIX_1414
Packit b099d7
                    _XmRendXftFont(rend) = XftFontOpenPattern(display, p);
Packit b099d7
					    		  rend_cache = (XmRendition *) XtRealloc((char *)rend_cache, 
Packit b099d7
					    		    (Cardinal)(sizeof(XmRendition) * (count_rend + 1)));
Packit b099d7
							  rend_cache[count_rend] =_XmRenditionCopy(rend, TRUE);
Packit b099d7
							  count_rend++;
Packit b099d7
						  }
Packit b099d7
Packit b099d7
#else
Packit b099d7
						  _XmRendXftFont(rend) = XftFontOpenPattern(display, p);
Packit b099d7
#endif
Packit b099d7
		  }
Packit b099d7
		  result = _XmRendXftFont(rend) != NULL;
Packit b099d7
		  break;
Packit b099d7
#endif
Packit b099d7
		default:
Packit b099d7
		  RenditionWarning(_XmRendTag(rend), "INVALID_TYPE",
Packit b099d7
				   INVALID_TYPE_MSG,
Packit b099d7
				   _XmRendDisplay(rend));
Packit b099d7
		  break;
Packit b099d7
		}
Packit b099d7
Packit b099d7
	      /* NoFontCallback. */
Packit b099d7
	      if (!result)
Packit b099d7
		{
Packit b099d7
		  if (display != NULL) 
Packit b099d7
		    {
Packit b099d7
		      dsp = (XmDisplay) XmGetXmDisplay(display);
Packit b099d7
		      cb.reason = XmCR_NO_FONT;
Packit b099d7
		      cb.event = NULL;
Packit b099d7
		      cb.rendition = rend;
Packit b099d7
		      cb.font_name = _XmRendFontName(rend);
Packit b099d7
      
Packit b099d7
		      /* We must know for sure whether there are any */
Packit b099d7
		      /* callbacks, so we have to use XtHasCallbacks. */
Packit b099d7
		      if (XtHasCallbacks((Widget)dsp, XmNnoFontCallback) ==
Packit b099d7
			  XtCallbackHasSome)
Packit b099d7
			{
Packit b099d7
			  XtCallCallbackList((Widget)dsp,
Packit b099d7
					     dsp->display.noFontCallback, 
Packit b099d7
					     &cb;;
Packit b099d7
			  return;
Packit b099d7
			}
Packit b099d7
		    }
Packit b099d7
	  
Packit b099d7
		  RenditionWarning(_XmRendTag(rend), "CONVERSION_FAILED",
Packit b099d7
				   CONVERSION_FAILED_MSG,
Packit b099d7
				   _XmRendDisplay(rend));
Packit b099d7
		}
Packit b099d7
	      else
Packit b099d7
		{
Packit b099d7
#ifdef USE_XFT
Packit b099d7
		  if (_XmRendFontType(rend) != XmFONT_IS_XFT)
Packit b099d7
#endif
Packit b099d7
		    _XmRendFont(rend) = font;
Packit b099d7
		}
Packit b099d7
	    }
Packit b099d7
	  else
Packit b099d7
	    {
Packit b099d7
	      RenditionWarning(_XmRendTag(rend), "NULL_FONT_TYPE",
Packit b099d7
			       NULL_FONT_TYPE_MSG,
Packit b099d7
				_XmRendDisplay(rend));
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
      else if ((_XmRendLoadModel(rend) == XmLOAD_IMMEDIATE) &&
Packit b099d7
	       (_XmRendFont(rend) == NULL) &&
Packit b099d7
#ifdef USE_XFT
Packit b099d7
	       (_XmRendXftFont (rend) == NULL) &&
Packit b099d7
#endif
Packit b099d7
	       (_XmRendFontName(rend) == NULL))
Packit b099d7
	{
Packit b099d7
	  RenditionWarning(_XmRendTag(rend), "NULL_LOAD_IMMEDIATE",
Packit b099d7
			   NULL_LOAD_IMMEDIATE_MSG,
Packit b099d7
			   _XmRendDisplay(rend));
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
/* Create new rendition. */
Packit b099d7
XmRendition
Packit b099d7
XmRenditionCreate(Widget widget,
Packit b099d7
		  XmStringTag tag,
Packit b099d7
		  ArgList arglist,
Packit b099d7
		  Cardinal argcount)
Packit b099d7
{
Packit b099d7
  XmRendition  ret_val;
Packit b099d7
  XtAppContext app=NULL;
Packit b099d7
Packit b099d7
  /* If cannot applock, assume its an internal call (from
Packit b099d7
   *	fontlist code, etc.) and already process locked.
Packit b099d7
   */
Packit b099d7
  if (widget)
Packit b099d7
	app = XtWidgetToApplicationContext(widget);
Packit b099d7
  if (app) {
Packit b099d7
	_XmAppLock(app);
Packit b099d7
  }
Packit b099d7
  else {
Packit b099d7
	_XmProcessLock();
Packit b099d7
  }
Packit b099d7
  ret_val = _XmRenditionCreate(NULL, widget, XmS, XmCRenderTable,
Packit b099d7
			    tag, arglist, argcount, NULL);
Packit b099d7
  if (app) {
Packit b099d7
	_XmAppUnlock(app);
Packit b099d7
  }
Packit b099d7
  else {
Packit b099d7
	_XmProcessUnlock();
Packit b099d7
  }
Packit b099d7
Packit b099d7
  return ret_val;
Packit b099d7
}
Packit b099d7
Packit b099d7
/* Internal function.  Called from XmRenditionCreate, resource */
Packit b099d7
/* converter, and Mrm create function. */
Packit b099d7
XmRendition
Packit b099d7
_XmRenditionCreate(Display *display,
Packit b099d7
		   Widget widget,
Packit b099d7
		   String resname,
Packit b099d7
		   String resclass,
Packit b099d7
		   XmStringTag tag,
Packit b099d7
		   ArgList arglist,
Packit b099d7
		   Cardinal argcount,
Packit b099d7
		   Boolean *in_db)
Packit b099d7
{
Packit b099d7
  XmRendition	rend;
Packit b099d7
  _XmRendition	rend_int;
Packit b099d7
  Boolean 	result;
Packit b099d7
  
Packit b099d7
  if ((display == NULL) && (widget != NULL))
Packit b099d7
    display = XtDisplayOfObject(widget);
Packit b099d7
Packit b099d7
 if ((tag != NULL) &&
Packit b099d7
     (tag != XmFONTLIST_DEFAULT_TAG) &&
Packit b099d7
     (strcmp(tag, XmSTRING_DEFAULT_CHARSET) == 0))
Packit b099d7
   tag = _XmStringGetCurrentCharset();
Packit b099d7
Packit b099d7
  /* Allocate rendition. */
Packit b099d7
  rend_int = (_XmRendition)XtMalloc(sizeof(_XmRenditionRec));
Packit b099d7
  bzero((char*)rend_int, sizeof(_XmRenditionRec));
Packit b099d7
  rend = GetHandle(_XmRendition);
Packit b099d7
  SetPtr(rend, rend_int);
Packit b099d7
  
Packit b099d7
  _XmRendRefcount(rend) = 1;
Packit b099d7
  
Packit b099d7
  /* For now, FontOnly renditions aren't implemented. */
Packit b099d7
  _XmRendFontOnly(rend) = FALSE;
Packit b099d7
Packit b099d7
  /* X resource DB query */
Packit b099d7
  result =
Packit b099d7
    GetResources(rend, display, widget, resname, resclass, tag,
Packit b099d7
		 arglist, argcount);
Packit b099d7
  
Packit b099d7
  if (in_db != NULL) *in_db = result;
Packit b099d7
  
Packit b099d7
  if (tag == NULL)
Packit b099d7
    {
Packit b099d7
      if (result == FALSE)
Packit b099d7
	{
Packit b099d7
	  XtFree((char *)rend_int);
Packit b099d7
	  FreeHandle(rend);
Packit b099d7
	  return(NULL);
Packit b099d7
	}
Packit b099d7
      else tag = _MOTIF_DEFAULT_LOCALE;
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  _XmRendTag(rend) = _XmStringCacheTag(tag, XmSTRING_TAG_STRLEN);
Packit b099d7
  
Packit b099d7
  /* Cleanup and validate resources. */
Packit b099d7
Packit b099d7
  CleanupResources(rend, TRUE);
Packit b099d7
Packit b099d7
  ValidateTag(rend, XmS);
Packit b099d7
  
Packit b099d7
  ValidateAndLoadFont(rend, display);
Packit b099d7
Packit b099d7
  return(rend);
Packit b099d7
}
Packit b099d7
Packit b099d7
/* Mrm create function for rendertables. */
Packit b099d7
/*ARGSUSED*/
Packit b099d7
Widget
Packit b099d7
_XmCreateRenderTable(Widget parent,
Packit b099d7
		     String name, /* unused */
Packit b099d7
		     ArgList arglist, /* unused */
Packit b099d7
		     Cardinal argcount)	/* unused */
Packit b099d7
{
Packit b099d7
  XmRenderTable 	newtable;
Packit b099d7
  _XmRenderTable	table;
Packit b099d7
  
Packit b099d7
  /* Malloc new table */
Packit b099d7
  table = (_XmRenderTable)XtMalloc(sizeof(_XmRenderTableRec));
Packit b099d7
  newtable = GetHandle(_XmRenderTable);
Packit b099d7
  SetPtr(newtable, table);
Packit b099d7
  _XmRTCount(newtable) = 0;
Packit b099d7
  _XmRTRefcount(newtable) = 1;
Packit b099d7
  _XmRTDisplay(newtable) = XtDisplay(parent);
Packit b099d7
  
Packit b099d7
  return((Widget)newtable);
Packit b099d7
}
Packit b099d7
Packit b099d7
/* Mrm create function for renditions. */
Packit b099d7
Widget
Packit b099d7
_XmCreateRendition(Widget parent,
Packit b099d7
		   String name,
Packit b099d7
		   ArgList arglist,
Packit b099d7
		   Cardinal argcount)
Packit b099d7
{
Packit b099d7
  XmRenderTable		rt = (XmRenderTable)parent;
Packit b099d7
  _XmRenderTable	table;
Packit b099d7
  XmRendition		rend;
Packit b099d7
  
Packit b099d7
  table = GetPtr(rt);
Packit b099d7
  
Packit b099d7
  rend = _XmRenditionCreate(_XmRTDisplay(rt), NULL, XmS, XmCRenderTable,
Packit b099d7
			    name, arglist, argcount, NULL);
Packit b099d7
  
Packit b099d7
  /* Ignore repeats */
Packit b099d7
  if (_XmRenderTableFindRendition(rt, _XmRendTag(rend),
Packit b099d7
				  TRUE, FALSE, FALSE, NULL) 
Packit b099d7
      != NULL)
Packit b099d7
    {
Packit b099d7
      if (FreeRendition(rend)) FreeHandle(rend);
Packit b099d7
      return((Widget)NULL);
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  table = (_XmRenderTable)
Packit b099d7
    XtRealloc((char *)table,
Packit b099d7
	      sizeof(_XmRenderTableRec) +
Packit b099d7
	      (sizeof(XmRendition) *
Packit b099d7
	       ((_XmRTCount(rt) + 1) - RENDITIONS_IN_STRUCT)));
Packit b099d7
  SetPtr(rt, table);
Packit b099d7
Packit b099d7
  /* Copy new rendition. */
Packit b099d7
  _XmRTRenditions(rt)[_XmRTCount(rt)] = CopyRendition(rend);
Packit b099d7
  _XmRTCount(rt)++;
Packit b099d7
Packit b099d7
  return((Widget)rend);
Packit b099d7
}
Packit b099d7
Packit b099d7
/* Free data structure and any copied values. */
Packit b099d7
/* TRUE return -> freed.  FALSE -> just decremented. */
Packit b099d7
static Boolean
Packit b099d7
FreeRendition(XmRendition rendition)
Packit b099d7
{
Packit b099d7
  if (rendition == NULL) return(FALSE);
Packit b099d7
  
Packit b099d7
  if (_XmRendRefcountDec(rendition) == 0)
Packit b099d7
    {
Packit b099d7
      /* CR 7890 - the fontName might be XmAS_IS here */
Packit b099d7
      if (NameIsString(_XmRendFontName(rendition)))
Packit b099d7
	XtFree(_XmRendFontName(rendition));
Packit b099d7
      if (ListIsList(_XmRendTabs(rendition)))
Packit b099d7
	XmTabListFree(_XmRendTabs(rendition));
Packit b099d7
      if (_XmRendTagCount(rendition) != 0)
Packit b099d7
	XtFree((char *)_XmRendTags(rendition));
Packit b099d7
#ifdef USE_XFT
Packit b099d7
      if (_XmRendXftFont(rendition))
Packit b099d7
        {
Packit b099d7
          XftFontClose(_XmRendDisplay(rendition),
Packit b099d7
              _XmRendXftFont(rendition));
Packit b099d7
          _XmRendXftFont(rendition) = NULL;
Packit b099d7
        }
Packit b099d7
      if (_XmRendPattern(rendition))
Packit b099d7
        {
Packit b099d7
          FcPatternDestroy(_XmRendPattern(rendition));
Packit b099d7
          _XmRendPattern(rendition) = NULL;
Packit b099d7
        }
Packit b099d7
#endif
Packit b099d7
  
Packit b099d7
      XtFree((char *)GetPtr(rendition));
Packit b099d7
      return(TRUE);
Packit b099d7
    }
Packit b099d7
  return(FALSE);
Packit b099d7
}
Packit b099d7
Packit b099d7
void
Packit b099d7
XmRenditionFree(XmRendition rendition)
Packit b099d7
{
Packit b099d7
  XtAppContext app;
Packit b099d7
Packit b099d7
  if (rendition == NULL) return;
Packit b099d7
Packit b099d7
  _XmProcessLock();
Packit b099d7
  FreeRendition(rendition);
Packit b099d7
  FreeHandle(rendition);
Packit b099d7
  _XmProcessUnlock();
Packit b099d7
}
Packit b099d7
Packit b099d7
/* Get resource values from rendition. */
Packit b099d7
void
Packit b099d7
XmRenditionRetrieve(XmRendition rendition,
Packit b099d7
		    ArgList arglist,
Packit b099d7
		    Cardinal argcount)
Packit b099d7
{
Packit b099d7
  int			i, j;
Packit b099d7
  Arg			*arg;
Packit b099d7
  XtResource		*res;
Packit b099d7
  char			*as_is = (char *)XmAS_IS;
Packit b099d7
  
Packit b099d7
  if (rendition == NULL) return;
Packit b099d7
Packit b099d7
  _XmProcessLock();
Packit b099d7
  /* Get resources */
Packit b099d7
  for (i = 0; i < argcount; i++)
Packit b099d7
    {
Packit b099d7
      arg = &(arglist[i]);
Packit b099d7
      
Packit b099d7
      for (j = 0; j < _XmNumRenditionResources; j++)
Packit b099d7
	{
Packit b099d7
	  res = &(_XmRenditionResources[j]);
Packit b099d7
Packit b099d7
	  if (strcmp(res->resource_name, arg->name) == 0)
Packit b099d7
	    {
Packit b099d7
	      /* CR 7890: Font hook - if there's a fontName but the 
Packit b099d7
	      ** font hasn't been fetched yet, now's a good time to 
Packit b099d7
	      ** get it - if the caller wants to use the font to, say, 
Packit b099d7
	      ** compute font metrics for layout (as CSText does), it won't
Packit b099d7
	      ** like to get NULL back
Packit b099d7
	      */
Packit b099d7
	      if (strcmp(res->resource_name, XmNfont) == 0)
Packit b099d7
		{
Packit b099d7
		  if ((_XmRendFont(rendition) == NULL) &&
Packit b099d7
#ifdef USE_XFT
Packit b099d7
		      (_XmRendXftFont (rendition) == NULL) &&
Packit b099d7
#endif
Packit b099d7
		      (_XmRendFontName(rendition) != NULL))
Packit b099d7
		    {
Packit b099d7
		      if (_XmRendLoadModel(rendition) == XmLOAD_DEFERRED)
Packit b099d7
			_XmRendLoadModel(rendition) = XmLOAD_IMMEDIATE;
Packit b099d7
		      ValidateAndLoadFont(rendition, _XmRendDisplay(rendition));
Packit b099d7
		    }
Packit b099d7
		  if (_XmRendFont (rendition) == NULL
Packit b099d7
#ifdef USE_XFT
Packit b099d7
		      && _XmRendXftFont (rendition) == NULL
Packit b099d7
#endif
Packit b099d7
		     )
Packit b099d7
		    CopyToArg((char*)&as_is, &(arg->value), sizeof(char*));
Packit b099d7
		  else CopyToArg(((char *)GetPtr(rendition) + 
Packit b099d7
				  res->resource_offset),
Packit b099d7
				 &(arg->value),
Packit b099d7
				 res->resource_size);
Packit b099d7
		}
Packit b099d7
	      else if (((strcmp(res->resource_name, XmNfontName) == 0) &&
Packit b099d7
		       (_XmRendFontName(rendition) == NULL)) ||
Packit b099d7
		       ((strcmp(res->resource_name, XmNtabList) == 0) &&
Packit b099d7
		       (_XmRendTabs(rendition) == NULL)))
Packit b099d7
		CopyToArg((char*)&as_is, &(arg->value), sizeof(char*));
Packit b099d7
	      else CopyToArg(((char *)GetPtr(rendition) + res->resource_offset),
Packit b099d7
			     &(arg->value),
Packit b099d7
			     res->resource_size);
Packit b099d7
	      break;
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
    _XmProcessUnlock();
Packit b099d7
}
Packit b099d7
Packit b099d7
/* Set resources in rendition. */
Packit b099d7
/* Renew rendition if necessary, then update resources. */
Packit b099d7
void
Packit b099d7
XmRenditionUpdate(XmRendition rendition,
Packit b099d7
		  ArgList arglist,
Packit b099d7
		  Cardinal argcount)
Packit b099d7
{
Packit b099d7
  XmStringTag	oldtag;
Packit b099d7
  char		*oldname;
Packit b099d7
  XtPointer	oldfont;
Packit b099d7
  XmTabList	oldtabs;
Packit b099d7
  int		i, j;
Packit b099d7
  XtResource	*res;
Packit b099d7
  Arg		*arg;
Packit b099d7
  Display	*display = _XmGetDefaultDisplay();
Packit b099d7
  Boolean	can_free;
Packit b099d7
  XtAppContext	app = NULL;
Packit b099d7
  
Packit b099d7
  if (rendition == NULL) return;
Packit b099d7
  
Packit b099d7
#ifdef XTHREADS
Packit b099d7
  if (_XmRendDisplay(rendition))
Packit b099d7
  {
Packit b099d7
     app = XtDisplayToApplicationContext(_XmRendDisplay(rendition));
Packit b099d7
     _XmAppLock(app);
Packit b099d7
  }
Packit b099d7
  if (_XmRendDisplay(rendition) && (_XmRendDisplay(rendition) !=
Packit b099d7
			display) )
Packit b099d7
 	display = _XmRendDisplay(rendition);
Packit b099d7
#endif
Packit b099d7
  /* Save old values to check for dependencies and free memory. */
Packit b099d7
  oldtag = _XmRendTag(rendition);
Packit b099d7
  oldname = _XmRendFontName(rendition);
Packit b099d7
  oldfont = _XmRendFont(rendition);
Packit b099d7
  oldtabs = _XmRendTabs(rendition);
Packit b099d7
  can_free = TRUE;
Packit b099d7
  
Packit b099d7
  /* New memory if needed. */
Packit b099d7
  if (_XmRendRefcount(rendition) > 1)
Packit b099d7
    {
Packit b099d7
      _XmRendRefcountDec(rendition);
Packit b099d7
      RenewRendition(rendition);
Packit b099d7
      can_free = FALSE;
Packit b099d7
    }
Packit b099d7
      
Packit b099d7
  for (i = 0; i < argcount; i++)
Packit b099d7
    {
Packit b099d7
      arg = &(arglist[i]);
Packit b099d7
      
Packit b099d7
      for (j = 0; j < _XmNumRenditionResources; j++)
Packit b099d7
	{
Packit b099d7
	  res = &(_XmRenditionResources[j]);
Packit b099d7
Packit b099d7
	  if (strcmp(res->resource_name, arg->name) == 0)
Packit b099d7
	    {
Packit b099d7
	      CopyFromArg((arg->value),
Packit b099d7
			  ((char *)GetPtr(rendition) + res->resource_offset),
Packit b099d7
			  res->resource_size);
Packit b099d7
	      break;
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  CopyInto(rendition, rendition);
Packit b099d7
Packit b099d7
  /** Validate resources **/
Packit b099d7
Packit b099d7
  /* CR 7890 - handle cases of fontName == NULL and fontName == XmAS_IS */
Packit b099d7
Packit b099d7
  /* If fontName changed but not font, NULL font so it's updated. 
Packit b099d7
   ** (first make sure we won't crash on the strcmp) */
Packit b099d7
Packit b099d7
  if (NameIsString(oldname) && NameIsString(_XmRendFontName(rendition)))    {
Packit b099d7
    if (strcmp(oldname, _XmRendFontName(rendition)) != 0)
Packit b099d7
      {
Packit b099d7
	if (oldfont == _XmRendFont(rendition))
Packit b099d7
	  _XmRendFont(rendition) = NULL;
Packit b099d7
      }
Packit b099d7
    if (can_free) XtFree(oldname);
Packit b099d7
  }
Packit b099d7
  /* Also handle the case where we started with a NULL fontName and
Packit b099d7
   ** had a real fontName specified */
Packit b099d7
  else if ((oldname == NULL) && NameIsString(_XmRendFontName(rendition)))
Packit b099d7
    {
Packit b099d7
      if (oldfont == _XmRendFontName(rendition))
Packit b099d7
	_XmRendFont(rendition) = NULL;
Packit b099d7
    }
Packit b099d7
Packit b099d7
  if (_XmRendFont(rendition) == (XtPointer)XmAS_IS)
Packit b099d7
    _XmRendFont(rendition) = NULL;
Packit b099d7
Packit b099d7
  if ((oldtabs != _XmRendTabs(rendition)) && can_free) XmTabListFree(oldtabs);
Packit b099d7
  
Packit b099d7
  ValidateTag(rendition, oldtag);
Packit b099d7
  
Packit b099d7
  ValidateAndLoadFont(rendition, display);
Packit b099d7
#ifdef XTHREADS
Packit b099d7
  if (app) {
Packit b099d7
     _XmAppUnlock(app);
Packit b099d7
  }
Packit b099d7
#endif
Packit b099d7
}
Packit b099d7
Packit b099d7
/*****************************************************************************/
Packit b099d7
/* XmRenderTableCvtToProp takes a rendertable and converts it to             */
Packit b099d7
/* an ascii string in the following format:				     */
Packit b099d7
/* tag : char*								     */
Packit b099d7
/* font : either fontid (integer) or [ fontid, fontid ... fontid ] or -1     */
Packit b099d7
/* tablist : [ tab1, ... tabn ] or -1					     */
Packit b099d7
/* background : pixel or -1						     */
Packit b099d7
/* foreground : pixel or -1						     */
Packit b099d7
/* underlineType : integer (from enum in Xm.h ) or -1			     */
Packit b099d7
/* strikethruType : integer (from enum in Xm.h ) or -1			     */
Packit b099d7
/* 									     */
Packit b099d7
/* example:								     */
Packit b099d7
/* "tag, font, tablist, background, foreground, underlineType, 		     */
Packit b099d7
/*  strikethruType\n							     */
Packit b099d7
/* bold, 10000031, -1, -1, -1, -1, -1\n					     */
Packit b099d7
/* underline, 10000029, -1, -1, -1, -1, -1\n				     */
Packit b099d7
/* default, 10000029, [ 1.234 1 0 0, 2.43 2 0 2], 1, 2, 0, 0\n		     */
Packit b099d7
/* japanese, [10000029, 10000030], -1, -1, -1, -1, -1"			     */
Packit b099d7
/* 									     */
Packit b099d7
/* The first line gives a complete list of the attributes by name.	     */
Packit b099d7
/* on the destination side,  attributes which are not understood	     */
Packit b099d7
/* or are outdated can be ignored.  The conversion of each rendition	     */
Packit b099d7
/* passes a single "line" which contains the fields in order.		     */
Packit b099d7
/*****************************************************************************/
Packit b099d7
Packit b099d7
/* Note that this MUST be in the same order as the output conversion
Packit b099d7
   below!! */
Packit b099d7
static XmConst char *CVTproperties[] = {
Packit b099d7
  XmNtag,
Packit b099d7
  XmNfont,
Packit b099d7
  XmNtabList,
Packit b099d7
  XmNbackground,
Packit b099d7
  XmNforeground,
Packit b099d7
  XmNunderlineType,
Packit b099d7
  XmNstrikethruType,
Packit b099d7
  NULL,
Packit b099d7
  };
Packit b099d7
Packit b099d7
/* Must be big enough to take all the above strings concatenated with
Packit b099d7
   commas separating them */
Packit b099d7
static char CVTtransfervector[256];
Packit b099d7
static int CVTtvinited = 0;
Packit b099d7
Packit b099d7
/* Use this macro to encapsulate the code that extends the output
Packit b099d7
   buffer as needed */
Packit b099d7
#define CVTaddString(dest, src, srcsize)\
Packit b099d7
{\
Packit b099d7
   if ((chars_used + srcsize) > allocated_size) {\
Packit b099d7
     allocated_size *= 2;\
Packit b099d7
     buffer = XtRealloc(buffer, allocated_size);\
Packit b099d7
   }\
Packit b099d7
   strcat(buffer, src);\
Packit b099d7
   chars_used += srcsize;\
Packit b099d7
}
Packit b099d7
Packit b099d7
/*ARGSUSED*/
Packit b099d7
unsigned int
Packit b099d7
XmRenderTableCvtToProp(Widget widget, /* unused */
Packit b099d7
		       XmRenderTable table,
Packit b099d7
		       char **prop_return)
Packit b099d7
{
Packit b099d7
  int i;
Packit b099d7
  int allocated_size = 256;
Packit b099d7
  int chars_used = 0, size;
Packit b099d7
  char *buffer;
Packit b099d7
  char *str;
Packit b099d7
  XmRendition rendition;
Packit b099d7
  _XmWidgetToAppContext(widget);
Packit b099d7
Packit b099d7
  _XmAppLock(app);
Packit b099d7
  buffer = XtMalloc(allocated_size);
Packit b099d7
Packit b099d7
  _XmProcessLock();
Packit b099d7
  if (CVTtvinited == 0) {
Packit b099d7
    CVTtvinited = 1;
Packit b099d7
    strcpy(CVTtransfervector, "");
Packit b099d7
    for(i = 0; CVTproperties[i] != NULL; i++) {
Packit b099d7
      strcat(CVTtransfervector, CVTproperties[i]);
Packit b099d7
      strcat(CVTtransfervector, ",");
Packit b099d7
    }
Packit b099d7
    strcat(CVTtransfervector, "\n");
Packit b099d7
  }
Packit b099d7
  
Packit b099d7
  /* Copy the transfer vector into the output buffer. */
Packit b099d7
  strcpy(buffer, CVTtransfervector);
Packit b099d7
  chars_used = strlen(buffer);
Packit b099d7
  _XmProcessUnlock();
Packit b099d7
Packit b099d7
  /* Now iterate over the list of renditions */
Packit b099d7
  for(i = 0; i < _XmRTCount(table); i++) {
Packit b099d7
    char temp[2048];
Packit b099d7
Packit b099d7
    rendition = _XmRTRenditions(table)[i];
Packit b099d7
    sprintf(temp, "\"%s\", ", _XmRendTag(rendition));
Packit b099d7
    size = strlen(temp);
Packit b099d7
    CVTaddString(buffer, temp, size);
Packit b099d7
Packit b099d7
    if (_XmRendFontType(rendition) == XmAS_IS)
Packit b099d7
      str = "-1, ";
Packit b099d7
    else {
Packit b099d7
      sprintf(temp, "%d \"%s\" %d,", _XmRendFontType(rendition),
Packit b099d7
	      _XmRendFontName(rendition), _XmRendLoadModel(rendition));
Packit b099d7
      str = temp;
Packit b099d7
    }
Packit b099d7
    size = strlen(str);
Packit b099d7
    CVTaddString(buffer, str, size);
Packit b099d7
Packit b099d7
    if ((unsigned int)(unsigned long)_XmRendTabs(rendition) == XmAS_IS ||
Packit b099d7
	_XmRendTabs(rendition) == NULL)
Packit b099d7
      str = "-1, ";
Packit b099d7
    else {
Packit b099d7
      _XmTab tab;
Packit b099d7
      _XmTabList tlist;
Packit b099d7
      int number;
Packit b099d7
      strcpy(temp, "[ ");
Packit b099d7
      tlist = (_XmTabList) _XmRendTabs(rendition);
Packit b099d7
      number = tlist -> count;
Packit b099d7
      tab = (_XmTab) tlist -> start;
Packit b099d7
      while(number > 0) {
Packit b099d7
	sprintf(temp, "%s %f %d %d %d, ", temp, tab -> value, 
Packit b099d7
		tab -> units, tab -> alignment, tab -> offsetModel);
Packit b099d7
	tab = (_XmTab) tab -> next;
Packit b099d7
	number--;
Packit b099d7
      }
Packit b099d7
      strcat(temp, " ], ");
Packit b099d7
      str = temp;
Packit b099d7
    }
Packit b099d7
    size = strlen(str);
Packit b099d7
    CVTaddString(buffer, str, size);
Packit b099d7
Packit b099d7
    if (_XmRendBG(rendition) == XmAS_IS)
Packit b099d7
      str = "-1, ";
Packit b099d7
    else {
Packit b099d7
      sprintf(temp, "%ld, ", _XmRendBG(rendition));
Packit b099d7
      str = temp;
Packit b099d7
    }
Packit b099d7
    size = strlen(str);
Packit b099d7
    CVTaddString(buffer, str, size);
Packit b099d7
Packit b099d7
    if (_XmRendFG(rendition) == XmAS_IS)
Packit b099d7
      str = "-1, ";
Packit b099d7
    else {
Packit b099d7
      sprintf(temp, "%ld, ", _XmRendFG(rendition));
Packit b099d7
      str = temp;
Packit b099d7
    }
Packit b099d7
    size = strlen(str);
Packit b099d7
    CVTaddString(buffer, str, size);
Packit b099d7
Packit b099d7
    if (_XmRendUnderlineType(rendition) == XmAS_IS)
Packit b099d7
      str = "-1, ";
Packit b099d7
    else {
Packit b099d7
      sprintf(temp, "%d, ", _XmRendUnderlineType(rendition));
Packit b099d7
      str = temp;
Packit b099d7
    }
Packit b099d7
    size = strlen(str);
Packit b099d7
    CVTaddString(buffer, str, size);
Packit b099d7
Packit b099d7
    if (_XmRendStrikethruType(rendition) == XmAS_IS)
Packit b099d7
      str = "-1, ";
Packit b099d7
    else {
Packit b099d7
      sprintf(temp, "%d, ", _XmRendStrikethruType(rendition));
Packit b099d7
      str = temp;
Packit b099d7
    }
Packit b099d7
    size = strlen(str);
Packit b099d7
    CVTaddString(buffer, str, size);
Packit b099d7
    CVTaddString(buffer, "\n", size);
Packit b099d7
  }
Packit b099d7
Packit b099d7
  /* Return the converted rendertable string */
Packit b099d7
  *prop_return = buffer;
Packit b099d7
Packit b099d7
  _XmAppUnlock(app);
Packit b099d7
  /* chars_used is always the size - the NULL terminator */
Packit b099d7
  return(chars_used + 1);
Packit b099d7
}
Packit b099d7
Packit b099d7
typedef enum {   T_NL, T_INT, T_FLOAT, T_SEP, 
Packit b099d7
		 T_OPEN, T_CLOSE, T_STR, T_EOF } TokenType;
Packit b099d7
Packit b099d7
typedef struct _TokenRec {
Packit b099d7
  TokenType	type;
Packit b099d7
  int		integer;
Packit b099d7
  float		real;
Packit b099d7
  char		*string;
Packit b099d7
} TokenRec, *Token;
Packit b099d7
Packit b099d7
Packit b099d7
#ifndef XTHREADS
Packit b099d7
static TokenRec reusetoken;
Packit b099d7
#endif
Packit b099d7
Packit b099d7
static Token
Packit b099d7
ReadToken(char *string, int *position)
Packit b099d7
{
Packit b099d7
#ifdef XTHREADS
Packit b099d7
  TokenRec reusetoken;
Packit b099d7
  Token new_token = &reusetoken;
Packit b099d7
#else
Packit b099d7
  Token new_token = &reusetoken;
Packit b099d7
#endif
Packit b099d7
  int pos = *position;
Packit b099d7
  int count;
Packit b099d7
Packit b099d7
  /* Skip whitespace but not newlines */
Packit b099d7
  while (isspace(string[pos]) && ! (string[pos] == '\n'))
Packit b099d7
    pos++;
Packit b099d7
Packit b099d7
  /* Select token type */
Packit b099d7
  switch(string[pos]) {
Packit b099d7
  case '\0':
Packit b099d7
    new_token -> type = T_EOF;
Packit b099d7
    break;
Packit b099d7
  case '\n': 
Packit b099d7
    new_token -> type = T_NL;
Packit b099d7
    pos++;
Packit b099d7
    break;
Packit b099d7
  case ',':
Packit b099d7
    new_token -> type = T_SEP;
Packit b099d7
    pos++;
Packit b099d7
    break;
Packit b099d7
  case '[':
Packit b099d7
    new_token -> type = T_OPEN;
Packit b099d7
    pos++;
Packit b099d7
    break;
Packit b099d7
  case ']':
Packit b099d7
    new_token -> type = T_CLOSE;
Packit b099d7
    pos++;
Packit b099d7
    break;
Packit b099d7
  case '"': /* String result */
Packit b099d7
    count = 1;
Packit b099d7
    while (string[pos + count] != '"' &&
Packit b099d7
	   string[pos + count] != '\0')
Packit b099d7
      count++; /* Scan for end of string */
Packit b099d7
    new_token -> type = T_STR;
Packit b099d7
    new_token -> string = NULL;
Packit b099d7
    count -= 1;
Packit b099d7
    if (count > 0) {
Packit b099d7
      new_token -> string = (char*) XtMalloc(count + 1);
Packit b099d7
      strncpy(new_token -> string, &string[pos + 1], count);
Packit b099d7
      pos += count + 2; /* Move past end quote */
Packit b099d7
      new_token -> string[count] = 0; /* Null terminate */
Packit b099d7
    }
Packit b099d7
    break;
Packit b099d7
  default:
Packit b099d7
    if (isalpha(string[pos])) /* String result */
Packit b099d7
      {
Packit b099d7
	char temp[80];
Packit b099d7
	int count;
Packit b099d7
	for(count = 0; 
Packit b099d7
	    isalpha(string[pos + count]) && count < 79;
Packit b099d7
	    count++) temp[count] = string[pos + count];
Packit b099d7
	temp[count] = 0;
Packit b099d7
	pos += count;
Packit b099d7
	new_token -> type = T_STR;
Packit b099d7
	new_token -> string = XtNewString(temp);
Packit b099d7
      }
Packit b099d7
    else
Packit b099d7
      {
Packit b099d7
	/* start converting a float number.  If it is exactly integer
Packit b099d7
	   then we return an int,  otherwise return a float */
Packit b099d7
	double result;
Packit b099d7
	int intresult;
Packit b099d7
	char *newpos;
Packit b099d7
	result=strtod(&(string[pos]), &newpos);
Packit b099d7
	intresult= (int) result;
Packit b099d7
	pos = newpos - string;
Packit b099d7
	if (((double) intresult) == result) /* Integer result */
Packit b099d7
	  {
Packit b099d7
	    new_token -> type = T_INT;
Packit b099d7
	    new_token -> integer = intresult;
Packit b099d7
	  }
Packit b099d7
	else
Packit b099d7
	  {
Packit b099d7
	    new_token -> type = T_FLOAT;
Packit b099d7
	    new_token -> real = (float) result;
Packit b099d7
	  }
Packit b099d7
      }
Packit b099d7
  }
Packit b099d7
Packit b099d7
  *position = pos;
Packit b099d7
  return(new_token);
Packit b099d7
}
Packit b099d7
Packit b099d7
#ifdef	USE_XFT
Packit b099d7
static struct _XmXftDrawCacheStruct {
Packit b099d7
	Display	*display;
Packit b099d7
	Window	window;
Packit b099d7
	XftDraw	*draw;
Packit b099d7
} *_XmXftDrawCache = NULL;
Packit b099d7
static int _XmXftDrawCacheSize = 0;
Packit b099d7
Packit b099d7
static XErrorHandler           oldErrorHandler;
Packit b099d7
static int xft_error;
Packit b099d7
Packit b099d7
static int 
Packit b099d7
_XmXftErrorHandler(
Packit b099d7
        Display *display,
Packit b099d7
        XErrorEvent *error )
Packit b099d7
{
Packit b099d7
   (void) fprintf(stderr,
Packit b099d7
   "Ignoring Xlib error: error code %d request code %d\n",
Packit b099d7
   error->error_code,
Packit b099d7
   error->request_code) ;
Packit b099d7
   xft_error = BadWindow;
Packit b099d7
Packit b099d7
    /* No exit! - but keep lint happy */
Packit b099d7
Packit b099d7
    return 0 ;
Packit b099d7
}
Packit b099d7
Packit b099d7
XftDraw *
Packit b099d7
_XmXftDrawCreate(Display *display, Window window)
Packit b099d7
{
Packit b099d7
	XftDraw			*draw;
Packit b099d7
	XWindowAttributes	wa;
Packit b099d7
	int			i;
Packit b099d7
	Status status;
Packit b099d7
Packit b099d7
	for (i=0; i<_XmXftDrawCacheSize; i++) {
Packit b099d7
		if (_XmXftDrawCache[i].display == display &&
Packit b099d7
		    _XmXftDrawCache[i].window == window) {
Packit b099d7
			return _XmXftDrawCache[i].draw;
Packit b099d7
		}
Packit b099d7
	}
Packit b099d7
Packit b099d7
#ifdef FIX_1444
Packit b099d7
	if (!(draw = XftDrawCreate(display, window,
Packit b099d7
	    DefaultVisual(display, DefaultScreen(display)),
Packit b099d7
	    DefaultColormap(display, DefaultScreen(display))))) 
Packit b099d7
            	draw = XftDrawCreateBitmap(display, window);
Packit b099d7
#else
Packit b099d7
	oldErrorHandler = XSetErrorHandler (_XmXftErrorHandler);	
Packit b099d7
	xft_error = 0;
Packit b099d7
	XGetWindowAttributes(display, window, &wa;;
Packit b099d7
	XSetErrorHandler(oldErrorHandler);
Packit b099d7
	if (xft_error != BadWindow) {
Packit b099d7
	    draw = XftDrawCreate(display, window,
Packit b099d7
	        DefaultVisual(display, DefaultScreen(display)),
Packit b099d7
	        DefaultColormap(display, DefaultScreen(display)));
Packit b099d7
	} else {
Packit b099d7
            draw = XftDrawCreateBitmap(display, window);
Packit b099d7
        }
Packit b099d7
#endif
Packit b099d7
	/* Store it in the cache. Look for an empty slot first */
Packit b099d7
	for (i=0; i<_XmXftDrawCacheSize; i++)
Packit b099d7
		if (_XmXftDrawCache[i].display == NULL) {
Packit b099d7
			_XmXftDrawCache[i].display = display;
Packit b099d7
			_XmXftDrawCache[i].draw = draw;
Packit b099d7
			_XmXftDrawCache[i].window = window;
Packit b099d7
			return draw;
Packit b099d7
		}
Packit b099d7
	i = _XmXftDrawCacheSize;	/* Next free index */
Packit b099d7
	_XmXftDrawCacheSize = _XmXftDrawCacheSize * 2 + 8;
Packit b099d7
	_XmXftDrawCache = (struct _XmXftDrawCacheStruct *)
Packit b099d7
		XtRealloc((char *)_XmXftDrawCache,
Packit b099d7
		sizeof(struct _XmXftDrawCacheStruct) * _XmXftDrawCacheSize);
Packit b099d7
#ifdef FIX_1449
Packit b099d7
	memset(_XmXftDrawCache + i, 0, (_XmXftDrawCacheSize - i) * sizeof(*_XmXftDrawCache));
Packit b099d7
#endif
Packit b099d7
Packit b099d7
	_XmXftDrawCache[i].display = display;
Packit b099d7
	_XmXftDrawCache[i].draw = draw;
Packit b099d7
	_XmXftDrawCache[i].window = window;
Packit b099d7
	
Packit b099d7
	return draw;
Packit b099d7
}
Packit b099d7
Packit b099d7
void
Packit b099d7
_XmXftDrawDestroy(Display *display, Window window, XftDraw *draw)
Packit b099d7
{
Packit b099d7
    int i;
Packit b099d7
Packit b099d7
    for (i=0; i<_XmXftDrawCacheSize; i++)
Packit b099d7
	if (_XmXftDrawCache[i].display == display &&
Packit b099d7
	    _XmXftDrawCache[i].window == window) {
Packit b099d7
	        _XmXftDrawCache[i].display = NULL;
Packit b099d7
	        _XmXftDrawCache[i].draw = NULL;
Packit b099d7
	        _XmXftDrawCache[i].window = None;
Packit b099d7
	        XftDrawDestroy(draw);
Packit b099d7
	        return;
Packit b099d7
        }
Packit b099d7
    XmeWarning(NULL, "_XmXftDrawDestroy() this should not happen\n");
Packit b099d7
}
Packit b099d7
Packit b099d7
void
Packit b099d7
_XmXftDrawString2(Display *display, Window window, GC gc, XftFont *font, int bpc,
Packit b099d7
#if NeedWidePrototypes
Packit b099d7
                int x, int y,
Packit b099d7
#else
Packit b099d7
                Position x, Position y,
Packit b099d7
#endif
Packit b099d7
                char *s, int len)
Packit b099d7
{
Packit b099d7
    XftDraw	*draw = _XmXftDrawCreate(display, window);
Packit b099d7
    XGCValues gc_val;
Packit b099d7
    XColor xcol;
Packit b099d7
    XftColor xftcol;
Packit b099d7
    
Packit b099d7
    XGetGCValues(display, gc, GCForeground, &gc_val);
Packit b099d7
Packit b099d7
    xcol.pixel = gc_val.foreground;
Packit b099d7
    XQueryColor(display, DefaultColormap(display,
Packit b099d7
        DefaultScreen(display)), &xcol);
Packit b099d7
    xftcol.color.red = xcol.red;
Packit b099d7
    xftcol.color.blue = xcol.blue;
Packit b099d7
    xftcol.color.green = xcol.green;
Packit b099d7
    xftcol.color.alpha = 0xFFFF;
Packit b099d7
Packit b099d7
    switch (bpc)
Packit b099d7
    {
Packit b099d7
	case 1:
Packit b099d7
		XftDrawStringUtf8(draw, &xftcol, font,
Packit b099d7
			x, y, (XftChar8 *)s, len);
Packit b099d7
		break;
Packit b099d7
	case 2:
Packit b099d7
		XftDrawString16(draw, &xftcol, font,
Packit b099d7
			x, y, (XftChar16 *)s, len);
Packit b099d7
		break;
Packit b099d7
	case 4:
Packit b099d7
		XftDrawString32(draw, &xftcol, font,
Packit b099d7
			x, y, (XftChar32 *)s, len);
Packit b099d7
		break;
Packit b099d7
	default:
Packit b099d7
		XmeWarning(NULL, "_XmXftDrawString(unsupported bpc)\n");
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
void
Packit b099d7
_XmXftDrawString(Display *display, Window window, XmRendition rend, int bpc,
Packit b099d7
#if NeedWidePrototypes
Packit b099d7
                int x, int y,
Packit b099d7
#else
Packit b099d7
                Position x, Position y,
Packit b099d7
#endif
Packit b099d7
                char *s, int len,
Packit b099d7
#if NeedWidePrototypes
Packit b099d7
		int image
Packit b099d7
#else
Packit b099d7
		Boolean image
Packit b099d7
#endif
Packit b099d7
		)
Packit b099d7
{
Packit b099d7
    XftDraw	*draw = _XmXftDrawCreate(display, window);
Packit b099d7
    XftColor    fg_color = _XmRendXftFG(rend);
Packit b099d7
Packit b099d7
    if (image)
Packit b099d7
    {
Packit b099d7
        XftColor bg_color = _XmRendXftBG(rend);
Packit b099d7
	XGlyphInfo ext;
Packit b099d7
	ext.xOff = 0;
Packit b099d7
	
Packit b099d7
	switch (bpc)
Packit b099d7
	{
Packit b099d7
	    case 1:
Packit b099d7
	        XftTextExtentsUtf8(display, _XmRendXftFont(rend),
Packit b099d7
		                (FcChar8*)s, len, &ext;;
Packit b099d7
		break;
Packit b099d7
	    case 2:
Packit b099d7
	        XftTextExtents16(display, _XmRendXftFont(rend),
Packit b099d7
		                 (FcChar16*)s, len, &ext;;
Packit b099d7
		break;
Packit b099d7
	    case 4:
Packit b099d7
	        XftTextExtents32(display, _XmRendXftFont(rend),
Packit b099d7
		                 (FcChar32*)s, len, &ext;;
Packit b099d7
		break;
Packit b099d7
	}
Packit b099d7
	
Packit b099d7
	if (_XmRendBG(rend) == XmUNSPECIFIED_PIXEL)
Packit b099d7
	{
Packit b099d7
	    XGCValues gc_val;
Packit b099d7
	    XColor xcol;
Packit b099d7
Packit b099d7
	    XGetGCValues(display, _XmRendGC(rend), GCBackground, &gc_val);
Packit b099d7
	    xcol.pixel = gc_val.background;
Packit b099d7
            XQueryColor(display, DefaultColormapOfScreen(
Packit b099d7
                  DefaultScreenOfDisplay(display)), &xcol);
Packit b099d7
	    bg_color.pixel = xcol.pixel;
Packit b099d7
	    bg_color.color.red = xcol.red;
Packit b099d7
	    bg_color.color.green = xcol.green;
Packit b099d7
	    bg_color.color.blue = xcol.blue;
Packit b099d7
	    bg_color.color.alpha = 0xFFFF;
Packit b099d7
	}
Packit b099d7
#ifdef FIX_1451
Packit b099d7
        XftDrawRect(draw, &bg_color, x, y - _XmRendXftFont(rend)->ascent,
Packit b099d7
	            ext.xOff,
Packit b099d7
		    _XmRendXftFont(rend)->ascent +
Packit b099d7
		    _XmRendXftFont(rend)->descent);
Packit b099d7
#else
Packit b099d7
        XftDrawRect(draw, &bg_color, x - 10, y - _XmRendXftFont(rend)->ascent - 10,
Packit b099d7
	            ext.xOff +20,
Packit b099d7
		    _XmRendXftFont(rend)->ascent +
Packit b099d7
		    _XmRendXftFont(rend)->descent + 20);
Packit b099d7
#endif
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (_XmRendFG(rend) == XmUNSPECIFIED_PIXEL)
Packit b099d7
    {
Packit b099d7
        XGCValues gc_val;
Packit b099d7
	XColor xcol;
Packit b099d7
	XGetGCValues(display, _XmRendGC(rend), GCForeground, &gc_val);
Packit b099d7
	xcol.pixel = gc_val.foreground;
Packit b099d7
        XQueryColor(display, DefaultColormapOfScreen(
Packit b099d7
              DefaultScreenOfDisplay(display)), &xcol);
Packit b099d7
	fg_color.pixel = xcol.pixel;
Packit b099d7
	fg_color.color.red = xcol.red;
Packit b099d7
	fg_color.color.green = xcol.green;
Packit b099d7
	fg_color.color.blue = xcol.blue;
Packit b099d7
	fg_color.color.alpha = 0xFFFF;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    switch (bpc)
Packit b099d7
    {
Packit b099d7
	case 1:
Packit b099d7
		XftDrawStringUtf8(draw, &fg_color, _XmRendXftFont(rend),
Packit b099d7
			x, y, (XftChar8 *)s, len);
Packit b099d7
		break;
Packit b099d7
	case 2:
Packit b099d7
		XftDrawString16(draw, &fg_color, _XmRendXftFont(rend),
Packit b099d7
			x, y, (XftChar16 *)s, len);
Packit b099d7
		break;
Packit b099d7
	case 4:
Packit b099d7
		XftDrawString32(draw, &fg_color, _XmRendXftFont(rend),
Packit b099d7
			x, y, (XftChar32 *)s, len);
Packit b099d7
		break;
Packit b099d7
	default:
Packit b099d7
		XmeWarning(NULL, "_XmXftDrawString(unsupported bpc)\n");
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
void
Packit b099d7
_XmXftSetClipRectangles(Display *display, Window window, Position x, Position y, XRectangle *rects, int n)
Packit b099d7
{
Packit b099d7
	XftDraw	*d = _XmXftDrawCreate(display, window);
Packit b099d7
Packit b099d7
	XftDrawSetClipRectangles(d, x, y, rects, n);
Packit b099d7
}
Packit b099d7
Packit b099d7
#ifdef FIX_1536
Packit b099d7
static XftColor
Packit b099d7
GetCachedXftColor(Display *display, Pixel color)
Packit b099d7
{
Packit b099d7
  static XftColor *color_cache = NULL;
Packit b099d7
  static int colors_count = 0;
Packit b099d7
Packit b099d7
  XftColor xftcol = {0, {0,0,0,0xFFFF}};
Packit b099d7
  XColor xcol;
Packit b099d7
  Boolean color_exist = FALSE;
Packit b099d7
  int i;
Packit b099d7
Packit b099d7
  if (color_cache != NULL)
Packit b099d7
  {
Packit b099d7
    for (i = 0; i < colors_count; ++i)
Packit b099d7
    {
Packit b099d7
      if (color_cache[i].pixel == color)
Packit b099d7
      {
Packit b099d7
        xftcol = color_cache[i];
Packit b099d7
        color_exist = TRUE;
Packit b099d7
        break;
Packit b099d7
      }
Packit b099d7
    }
Packit b099d7
  }
Packit b099d7
Packit b099d7
  if (!color_exist)
Packit b099d7
  {
Packit b099d7
    xcol.pixel = color;
Packit b099d7
    XQueryColor(display, DefaultColormap(display,
Packit b099d7
      DefaultScreen(display)), &xcol);
Packit b099d7
    xftcol.pixel = color;
Packit b099d7
    xftcol.color.red = xcol.red;
Packit b099d7
    xftcol.color.blue = xcol.blue;
Packit b099d7
    xftcol.color.green = xcol.green;
Packit b099d7
    xftcol.color.alpha = 0xFFFF;
Packit b099d7
Packit b099d7
    color_cache = (XftColor *) XtRealloc((char *) color_cache,
Packit b099d7
      (Cardinal) (sizeof(XftColor) * (colors_count + 1)));
Packit b099d7
    if (color_cache != NULL)
Packit b099d7
      color_cache[colors_count++] = xftcol;
Packit b099d7
  }
Packit b099d7
Packit b099d7
  return xftcol;
Packit b099d7
}
Packit b099d7
#endif
Packit b099d7
Packit b099d7
XftColor
Packit b099d7
_XmXftGetXftColor(Display *display, Pixel color)
Packit b099d7
{
Packit b099d7
#ifdef FIX_1536
Packit b099d7
    return GetCachedXftColor(display, color);
Packit b099d7
#else
Packit b099d7
    XColor xcol;
Packit b099d7
    XftColor xftcol;
Packit b099d7
    
Packit b099d7
    xcol.pixel = color;
Packit b099d7
    XQueryColor(display, DefaultColormap(display,
Packit b099d7
        DefaultScreen(display)), &xcol);
Packit b099d7
    xftcol.pixel = color;
Packit b099d7
    xftcol.color.red = xcol.red;
Packit b099d7
    xftcol.color.blue = xcol.blue;
Packit b099d7
    xftcol.color.green = xcol.green;
Packit b099d7
    xftcol.color.alpha = 0xFFFF;
Packit b099d7
    return xftcol;
Packit b099d7
#endif
Packit b099d7
}
Packit b099d7
Packit b099d7
#ifdef FIX_1415
Packit b099d7
void _XmXftFontAverageWidth(Widget w, XtPointer f, int *width)
Packit b099d7
{
Packit b099d7
	XftFont *fp = (XftFont *)f;
Packit b099d7
	static char	*s = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
Packit b099d7
	int l = 62; /* strlen(s) */
Packit b099d7
	XGlyphInfo	ext;
Packit b099d7
Packit b099d7
	XftTextExtents8(XtDisplay(w), fp, (unsigned char *)s, l, &ext;;
Packit b099d7
    if (width) 
Packit b099d7
    	*width = ext.width / l;
Packit b099d7
}
Packit b099d7
#endif
Packit b099d7
Packit b099d7
#endif
Packit b099d7
Packit b099d7
/*ARGSUSED*/
Packit b099d7
XmRenderTable
Packit b099d7
XmRenderTableCvtFromProp(Widget w, 
Packit b099d7
			 char *prop,
Packit b099d7
			 unsigned int len) /* unused */
Packit b099d7
{
Packit b099d7
  XmRenderTable new_rt;
Packit b099d7
  XmRendition rendition;
Packit b099d7
  XmRendition *rarray;
Packit b099d7
  int rarray_count, rarray_max;
Packit b099d7
  /* These must both be big enough for the number of passed parameters */
Packit b099d7
  char *items[20];
Packit b099d7
  char *name;
Packit b099d7
  Arg args[20];
Packit b099d7
  /* This must be big enough to hold all the strings returned by
Packit b099d7
     readtoken */
Packit b099d7
  char *freelater[5];
Packit b099d7
  int scanpointer, j, count, freecount, i;
Packit b099d7
  Token token;
Packit b099d7
  _XmWidgetToAppContext(w);
Packit b099d7
Packit b099d7
  _XmAppLock(app);
Packit b099d7
  new_rt = NULL;
Packit b099d7
  scanpointer = 0;
Packit b099d7
  rarray_max = 10;
Packit b099d7
  rarray_count = 0;
Packit b099d7
  rarray = (XmRendition *) XtMalloc(sizeof(XmRendition) * rarray_max);
Packit b099d7
  name = "";
Packit b099d7
Packit b099d7
  for(j = 0; j < 20; j++) items[j] = NULL;
Packit b099d7
  /* Read the list of items */
Packit b099d7
  for(j = 0; j < 20; ) {
Packit b099d7
    token = ReadToken(prop, &scanpointer);
Packit b099d7
    if (token -> type == T_NL) break;
Packit b099d7
    if (token -> type == T_STR) {
Packit b099d7
      items[j] = token -> string;
Packit b099d7
      j++;
Packit b099d7
    }
Packit b099d7
  }
Packit b099d7
  
Packit b099d7
  j = -1;
Packit b099d7
  count = 0;
Packit b099d7
  freecount = 0;
Packit b099d7
  while(True) {
Packit b099d7
    token = ReadToken(prop, &scanpointer);
Packit b099d7
    /* We skip the separators */
Packit b099d7
    while(token -> type == T_SEP &&
Packit b099d7
	  token -> type != T_EOF)
Packit b099d7
      token = ReadToken(prop, &scanpointer);
Packit b099d7
    if (token -> type == T_EOF) goto finish;
Packit b099d7
Packit b099d7
    j++; /* Go to next item in items array */
Packit b099d7
	  
Packit b099d7
    if (items[j] == NULL) {
Packit b099d7
      /* End of line processing.  Scan for NewLine */
Packit b099d7
      while(token -> type != T_NL &&
Packit b099d7
	    token -> type != T_EOF)
Packit b099d7
	token = ReadToken(prop, &scanpointer);
Packit b099d7
      /* Store rendition */
Packit b099d7
      rendition = XmRenditionCreate(w, name, args, count);
Packit b099d7
      name = "";
Packit b099d7
      count = 0;
Packit b099d7
      /* Reset index into namelist */
Packit b099d7
      j = -1;
Packit b099d7
      /* Free temp strings returned by ReadToken */
Packit b099d7
      for(i = 0; i < freecount; i++) XtFree(freelater[i]);
Packit b099d7
      freecount = 0;
Packit b099d7
      /* Record rendition in array */
Packit b099d7
      if (rarray_count >= rarray_max) {
Packit b099d7
	/* Extend array if necessary */
Packit b099d7
	rarray_max += 10;
Packit b099d7
	rarray = (XmRendition *) XtRealloc((char*) rarray, 
Packit b099d7
					   sizeof(XmRendition) * rarray_max);
Packit b099d7
      }
Packit b099d7
      if (token -> type == T_EOF) goto finish;
Packit b099d7
      rarray[rarray_count] = rendition;
Packit b099d7
      rarray_count++;
Packit b099d7
    } else if (strcmp(items[j], XmNtag) == 0) {
Packit b099d7
      /* Next item should be a string with the name of the new
Packit b099d7
	 rendition to create */
Packit b099d7
      if (token -> type == T_STR) {
Packit b099d7
	name = token -> string;
Packit b099d7
	freelater[freecount] = token -> string; freecount++;
Packit b099d7
      } else {
Packit b099d7
	goto error;
Packit b099d7
      }
Packit b099d7
    } else if (strcmp(items[j], XmNfont) == 0) {
Packit b099d7
      /* If the next item is a number then we have a font
Packit b099d7
	 id,  otherwise we are reading in a fontset */
Packit b099d7
      if (token -> type != T_INT) goto error;
Packit b099d7
      if (token -> integer != -1) { /* AS IS */ 
Packit b099d7
	XtSetArg(args[count], XmNfontType, token -> integer); count++;
Packit b099d7
	token = ReadToken(prop, &scanpointer);
Packit b099d7
	if (token -> type != T_STR) goto error;
Packit b099d7
	XtSetArg(args[count], XmNfontName, token -> string); count++;
Packit b099d7
	freelater[freecount] = token -> string; freecount++;
Packit b099d7
	token = ReadToken(prop, &scanpointer);
Packit b099d7
	if (token -> type != T_INT) goto error;
Packit b099d7
	XtSetArg(args[count], XmNloadModel, token -> integer); count++;
Packit b099d7
      }
Packit b099d7
    } else if (strcmp(items[j], XmNtabList) == 0) {
Packit b099d7
      /* This starts with an OPEN then a number of
Packit b099d7
	 FLOAT INT INT INT then CLOSE and SEP */
Packit b099d7
      if (token -> type == T_INT) { /* Should be AS IS */
Packit b099d7
	if (token -> integer != -1) goto error;
Packit b099d7
      } else if (token -> type == T_OPEN) {
Packit b099d7
	float value;
Packit b099d7
	int units, align;
Packit b099d7
	XmOffsetModel model;
Packit b099d7
	XmTabList tablist;
Packit b099d7
	XmTab tabs[1];
Packit b099d7
Packit b099d7
	tablist = NULL;
Packit b099d7
	token = ReadToken(prop, &scanpointer);
Packit b099d7
	while(token -> type != T_CLOSE) {
Packit b099d7
	  if (token -> type != T_FLOAT &&
Packit b099d7
	      token -> type != T_INT) goto error;
Packit b099d7
	  if (token -> type == T_FLOAT)
Packit b099d7
	    value = token -> real;
Packit b099d7
	  else
Packit b099d7
	    value = (float) token -> integer;
Packit b099d7
	  token = ReadToken(prop, &scanpointer);
Packit b099d7
	  if (token -> type != T_INT) goto error;
Packit b099d7
	  units = token -> integer;
Packit b099d7
	  token = ReadToken(prop, &scanpointer);
Packit b099d7
	  if (token -> type != T_INT) goto error;
Packit b099d7
	  align = token -> integer;
Packit b099d7
	  token = ReadToken(prop, &scanpointer);
Packit b099d7
	  if (token -> type != T_INT) goto error;
Packit b099d7
	  model = (XmOffsetModel) token -> integer;
Packit b099d7
	  tabs[0] = XmTabCreate(value, units, model, align, NULL);
Packit b099d7
	  tablist = XmTabListInsertTabs(tablist, tabs, 1, 1000);
Packit b099d7
	  XtFree((char*) tabs[0]);
Packit b099d7
	  /* Go to next separator to skip unknown future values */
Packit b099d7
	  while(token -> type != T_SEP) 
Packit b099d7
	    token = ReadToken(prop, &scanpointer);
Packit b099d7
	  if (token -> type == T_SEP)
Packit b099d7
	    token = ReadToken(prop, &scanpointer);
Packit b099d7
	}
Packit b099d7
	XtSetArg(args[count], XmNtabList, tablist); count++;
Packit b099d7
      } else 
Packit b099d7
	goto error;
Packit b099d7
    } else if (strcmp(items[j], XmNbackground) == 0) {
Packit b099d7
      if (token -> type != T_INT) goto error;
Packit b099d7
      if (token -> type != -1) {
Packit b099d7
	XtSetArg(args[count], XmNrenditionBackground, token -> integer); count++;
Packit b099d7
      }
Packit b099d7
    } else if (strcmp(items[j], XmNforeground) == 0) {
Packit b099d7
      if (token -> type != T_INT) goto error;
Packit b099d7
      if (token -> type != -1) {
Packit b099d7
	XtSetArg(args[count], XmNrenditionForeground, token -> integer); count++;
Packit b099d7
      }
Packit b099d7
    } else if (strcmp(items[j], XmNunderlineType) == 0) {
Packit b099d7
      if (token -> type != T_INT) goto error;
Packit b099d7
      if (token -> type != -1) {
Packit b099d7
	XtSetArg(args[count], XmNunderlineType, token -> integer); count++;
Packit b099d7
      }
Packit b099d7
    } else if (strcmp(items[j], XmNstrikethruType) == 0) {
Packit b099d7
      if (token -> type != T_INT) goto error;
Packit b099d7
      if (token -> type != -1) {
Packit b099d7
	XtSetArg(args[count], XmNstrikethruType, token -> integer); count++;
Packit b099d7
      }
Packit b099d7
    }
Packit b099d7
  }
Packit b099d7
Packit b099d7
 finish:
Packit b099d7
  new_rt = XmRenderTableAddRenditions(new_rt, rarray, rarray_count, XmMERGE_REPLACE);
Packit b099d7
  for (i = 0; i < rarray_count; i++) XmRenditionFree(rarray[i]);
Packit b099d7
  _XmAppUnlock(app);
Packit b099d7
  return(new_rt);
Packit b099d7
Packit b099d7
 error:
Packit b099d7
  /* Free temp strings returned by ReadToken */
Packit b099d7
  for(i = 0; i < freecount; i++) XtFree((char*) freelater[i]);
Packit b099d7
  freecount = 0;
Packit b099d7
  goto finish;
Packit b099d7
}
Packit b099d7
Packit b099d7
void
Packit b099d7
XmRenderTableGetDefaultFontExtents(XmRenderTable rendertable,
Packit b099d7
                                    int *height,
Packit b099d7
				    int *ascent,
Packit b099d7
				    int *descent)
Packit b099d7
{
Packit b099d7
    XmStringTag	    tag = XmFONTLIST_DEFAULT_TAG;
Packit b099d7
    XmRendition     rend;
Packit b099d7
    Boolean         success;
Packit b099d7
    short           indx;
Packit b099d7
    int             h,a,d;
Packit b099d7
  
Packit b099d7
#ifdef XTHREADS
Packit b099d7
  XtAppContext	       app=NULL;
Packit b099d7
Packit b099d7
  if ( _XmRTDisplay(rendertable) )
Packit b099d7
    app = XtDisplayToApplicationContext(_XmRTDisplay(rendertable));
Packit b099d7
Packit b099d7
  if (app)
Packit b099d7
    _XmAppLock(app);
Packit b099d7
  else
Packit b099d7
    _XmProcessLock();
Packit b099d7
#endif
Packit b099d7
Packit b099d7
    a = d = h = 0;
Packit b099d7
    /* Get default rendition */
Packit b099d7
    success = _XmRenderTableFindFallback(rendertable, tag, FALSE, &indx, &rend);
Packit b099d7
Packit b099d7
    /* For backward compatibility we must try to return something for */
Packit b099d7
    /* any non-null charset, not just XmFONTLIST_DEFAULT_TAG. */
Packit b099d7
    if (rendertable && tag && !success)
Packit b099d7
      success = _XmRenderTableFindFirstFont(rendertable, &indx, &rend);
Packit b099d7
Packit b099d7
    if (success) {
Packit b099d7
        /* Find font height */
Packit b099d7
        switch (_XmRendFontType(rend)) {
Packit b099d7
            case XmFONT_IS_FONT:
Packit b099d7
                if (_XmRendFont(rend)) {
Packit b099d7
                    a = ((XFontStruct*)_XmRendFont(rend))->ascent;
Packit b099d7
                    d = ((XFontStruct*)_XmRendFont(rend))->descent;
Packit b099d7
                    h = a + d;
Packit b099d7
                }
Packit b099d7
                break;
Packit b099d7
            case XmFONT_IS_FONTSET:
Packit b099d7
                if (_XmRendFont(rend)) {
Packit b099d7
                    XFontStruct **font_struct_list;
Packit b099d7
                    char **font_name_list;
Packit b099d7
Packit b099d7
                    if (XFontsOfFontSet((XFontSet)_XmRendFont(rend),
Packit b099d7
                                &font_struct_list, &font_name_list)) {
Packit b099d7
                        a = font_struct_list[0]->ascent;
Packit b099d7
                        d = font_struct_list[0]->descent;
Packit b099d7
                        h = a + d;
Packit b099d7
                    }
Packit b099d7
                }
Packit b099d7
                break;
Packit b099d7
#ifdef USE_XFT
Packit b099d7
                case XmFONT_IS_XFT:
Packit b099d7
                    if (_XmRendXftFont(rend)) {
Packit b099d7
                        a = _XmRendXftFont(rend)->ascent;
Packit b099d7
                        d = _XmRendXftFont(rend)->descent;
Packit b099d7
                        h = a + d;
Packit b099d7
                    }
Packit b099d7
                    break;
Packit b099d7
#endif
Packit b099d7
        }
Packit b099d7
    }
Packit b099d7
Packit b099d7
#ifdef XTHREADS
Packit b099d7
  if (app)
Packit b099d7
    _XmAppUnlock(app);
Packit b099d7
  else
Packit b099d7
    _XmProcessUnlock();
Packit b099d7
#endif
Packit b099d7
Packit b099d7
  if (ascent) *ascent = a;
Packit b099d7
  if (descent) *descent = d;
Packit b099d7
  if (height) *height = h;
Packit b099d7
}