Blame lib/Mrm/Mrmicon.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
Packit b099d7
#ifdef REV_INFO
Packit b099d7
#ifndef lint
Packit b099d7
static char rcsid[] = "$XConsortium: Mrmicon.c /main/14 1996/11/13 14:01:43 drk $"
Packit b099d7
#endif
Packit b099d7
#endif
Packit b099d7
Packit b099d7
/* (c) Copyright 1989, 1990, DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. */
Packit b099d7
Packit b099d7
Packit b099d7
/*
Packit b099d7
 *++
Packit b099d7
 *  FACILITY:
Packit b099d7
 *
Packit b099d7
 *      UIL Resource Manager (URM)
Packit b099d7
 *
Packit b099d7
 *  ABSTRACT:
Packit b099d7
 *
Packit b099d7
 *	This module contains routines which operate on URM icon images -
Packit b099d7
 *	RGMIconImage structs.
Packit b099d7
 *
Packit b099d7
 *--
Packit b099d7
 */
Packit b099d7
Packit b099d7
Packit b099d7
/*
Packit b099d7
 *
Packit b099d7
 *  INCLUDE FILES
Packit b099d7
 *
Packit b099d7
 */
Packit b099d7
Packit b099d7
#include <stdio.h>
Packit b099d7
#include <Mrm/MrmAppl.h>
Packit b099d7
#include <Mrm/Mrm.h>
Packit b099d7
#include "MrmMsgI.h"
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*
Packit b099d7
 *++
Packit b099d7
 *
Packit b099d7
 *  PROCEDURE DESCRIPTION:
Packit b099d7
 *
Packit b099d7
 *	This routine creates and returns an X pixmap from a URM icon
Packit b099d7
 *	for some widget. It uses the foreground and background obtainable
Packit b099d7
 *	from the widget as required.
Packit b099d7
 *
Packit b099d7
 *  FORMAL PARAMETERS:
Packit b099d7
 *
Packit b099d7
 *	icon		URM icon image to be converted to X pixmap
Packit b099d7
 *	screen		screen to use for pixmap
Packit b099d7
 *	display		display to use for pixmap
Packit b099d7
 *	fgpix		foreground color for pixmap
Packit b099d7
 *	bgpix		background color for pixmap
Packit b099d7
 *	pixmap		to return resulting X pixmap
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT INPUTS:
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT OUTPUTS:
Packit b099d7
 *
Packit b099d7
 *  FUNCTION VALUE:
Packit b099d7
 *
Packit b099d7
 *	URM status
Packit b099d7
 *
Packit b099d7
 *  SIDE EFFECTS:
Packit b099d7
 *
Packit b099d7
 *--
Packit b099d7
 */
Packit b099d7
Packit b099d7
Cardinal 
Packit b099d7
UrmCreatePixmap (RGMIconImagePtr	icon,
Packit b099d7
		 Screen			*screen,
Packit b099d7
		 Display		*display,
Packit b099d7
		 Pixel			fgpix,
Packit b099d7
		 Pixel			bgpix,
Packit b099d7
		 Pixel			*pixmap,
Packit b099d7
		 Widget			parent)
Packit b099d7
{
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   *  Local variables
Packit b099d7
   */
Packit b099d7
  Cardinal		result;		/* function results */
Packit b099d7
  RGMColorTablePtr	ctable;		/* color table in icon */
Packit b099d7
  unsigned		maxbits;	/* # bits required for X image */
Packit b099d7
  int			srcpix;		/* # bits per pixel in icon (actual) */
Packit b099d7
  int			dds ;
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Convert the color table colors to pixels.
Packit b099d7
   */
Packit b099d7
  ctable = icon->color_table.ctptr;
Packit b099d7
  result = 
Packit b099d7
    Urm__RealizeColorTable (screen, display, fgpix, bgpix, ctable, parent);
Packit b099d7
  if ( result != MrmSUCCESS ) return result;
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Use the depth of screen to infer the number of bits required to
Packit b099d7
   * hold the pixels in X format. The ZPixmap format only supports 1, 8, 16,
Packit b099d7
   * and 32 bit pixels, so we always map to one of these sizes.
Packit b099d7
   */
Packit b099d7
  if (parent) dds = parent->core.depth;
Packit b099d7
  else dds = DefaultDepthOfScreen(screen) ;
Packit b099d7
Packit b099d7
  if (dds == 1) 
Packit b099d7
    maxbits = 1;
Packit b099d7
  else if (dds <= 8) 
Packit b099d7
    maxbits = 8;
Packit b099d7
  else if (dds <= 16) 
Packit b099d7
    maxbits = 16;
Packit b099d7
  else
Packit b099d7
    maxbits = 32;
Packit b099d7
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * See if the icon can be mapped as a bitmap. This will be true if the
Packit b099d7
   * color table has only FG/BG entries, or uses only those entries.
Packit b099d7
   */
Packit b099d7
  if ( ctable->count <= 2 ) maxbits = 1;
Packit b099d7
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Compute the number of bits available in the icon pixmap
Packit b099d7
   */
Packit b099d7
  switch ( icon->pixel_size )
Packit b099d7
    {
Packit b099d7
    case URMPixelSize1Bit:
Packit b099d7
      srcpix = 1;
Packit b099d7
      break;
Packit b099d7
    case URMPixelSize2Bit:
Packit b099d7
      srcpix = 2;
Packit b099d7
      break;
Packit b099d7
    case URMPixelSize4Bit:
Packit b099d7
      srcpix = 4;
Packit b099d7
      break;
Packit b099d7
    case URMPixelSize8Bit:
Packit b099d7
      srcpix = 8;
Packit b099d7
      break;
Packit b099d7
    default:
Packit b099d7
      return MrmNOT_VALID;
Packit b099d7
    }
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Map the icon image pixmap from color table indices to Pixel values.
Packit b099d7
   * There are three cases:
Packit b099d7
   *	maxbits == 1; a bitmap is possible, so map to a bitmap.
Packit b099d7
   *	maxbits <= # bits/pixel in pixmap. Map in place. In fact,
Packit b099d7
   *		only works if maxbits == srcpix == 8.
Packit b099d7
   *	maxbits > # bits/pixel. Map to allocated pixmap.
Packit b099d7
   *
Packit b099d7
   * Each of the three routines which performs these mappings completes
Packit b099d7
   * the entire process of doing the mapping and creating the X pixmap.
Packit b099d7
   */
Packit b099d7
  if ( maxbits == 1 )
Packit b099d7
    return Urm__MapIconBitmap
Packit b099d7
      (icon, srcpix, ctable, screen, display, pixmap);
Packit b099d7
  if ((maxbits == 8) && (srcpix == 8))
Packit b099d7
    return Urm__MapIconReplace
Packit b099d7
      (icon, srcpix, ctable, screen, display, pixmap, parent);
Packit b099d7
  if ( maxbits > srcpix )
Packit b099d7
    return Urm__MapIconAllocate
Packit b099d7
      (icon, srcpix, maxbits, ctable, screen, display, pixmap, parent);
Packit b099d7
Packit b099d7
  return MrmNOT_VALID;
Packit b099d7
}
Packit b099d7
Packit b099d7

Packit b099d7
/*
Packit b099d7
 *++
Packit b099d7
 *
Packit b099d7
 *  PROCEDURE DESCRIPTION:
Packit b099d7
 *
Packit b099d7
 *	This routine creates and returns an X pixmap of depth 1 from a URM icon
Packit b099d7
 *	for some widget.
Packit b099d7
 *
Packit b099d7
 *  FORMAL PARAMETERS:
Packit b099d7
 *
Packit b099d7
 *	icon		URM icon image to be converted to X pixmap
Packit b099d7
 *	screen		screen to use for pixmap
Packit b099d7
 *	display		display to use for pixmap
Packit b099d7
 *	pixmap		to return resulting X pixmap
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT INPUTS:
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT OUTPUTS:
Packit b099d7
 *
Packit b099d7
 *  FUNCTION VALUE:
Packit b099d7
 *
Packit b099d7
 *	URM status
Packit b099d7
 *
Packit b099d7
 *  SIDE EFFECTS:
Packit b099d7
 *
Packit b099d7
 *--
Packit b099d7
 */
Packit b099d7
Packit b099d7
Cardinal 
Packit b099d7
UrmCreateBitmap (RGMIconImagePtr	icon,
Packit b099d7
		 Screen			*screen,
Packit b099d7
		 Display		*display,
Packit b099d7
		 Pixel			*pixmap)
Packit b099d7
{
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   *  Local variables
Packit b099d7
   */
Packit b099d7
  int			srcpix;		/* # bits per pixel in icon (actual) */
Packit b099d7
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Compute the number of bits available in the icon pixmap
Packit b099d7
   */
Packit b099d7
  switch ( icon->pixel_size )
Packit b099d7
    {
Packit b099d7
    case URMPixelSize1Bit:
Packit b099d7
      srcpix = URMPixelSize1Bit;
Packit b099d7
      break;
Packit b099d7
    default:
Packit b099d7
      return MrmNOT_VALID;
Packit b099d7
    }
Packit b099d7
Packit b099d7
  return Urm__MapIconBitmapDepth1 (icon, srcpix, screen, display, pixmap);
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7

Packit b099d7
/*
Packit b099d7
 *++
Packit b099d7
 *
Packit b099d7
 *  PROCEDURE DESCRIPTION:
Packit b099d7
 *
Packit b099d7
 *	This routine creates and returns an X pixmap from the X bitmap file
Packit b099d7
 *	name specified.  It uses the foreground and background as needed.
Packit b099d7
 *	
Packit b099d7
 *
Packit b099d7
 *  FORMAL PARAMETERS:
Packit b099d7
 *
Packit b099d7
 *	filename	file containing the bitmap to be converted to X pixmap
Packit b099d7
 *	screen		screen to use for pixmap
Packit b099d7
 *	display		display to use for pixmap - not used
Packit b099d7
 *	fgint		foreground color for pixmap
Packit b099d7
 *	bgint		background color for pixmap
Packit b099d7
 *	pixmap		to return resulting X pixmap
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT INPUTS:
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT OUTPUTS:
Packit b099d7
 *
Packit b099d7
 *  FUNCTION VALUE:
Packit b099d7
 *
Packit b099d7
 *	URM status
Packit b099d7
 *
Packit b099d7
 *  SIDE EFFECTS:
Packit b099d7
 *
Packit b099d7
 *--
Packit b099d7
 */
Packit b099d7
Packit b099d7
Cardinal 
Packit b099d7
Urm__CW_ReadBitmapFile (String			filename,
Packit b099d7
			Screen			*screen,
Packit b099d7
			Pixel			fgint,
Packit b099d7
			Pixel			bgint,
Packit b099d7
			Pixmap			*pixmap,
Packit b099d7
			Widget			parent)
Packit b099d7
{
Packit b099d7
  int		depth;
Packit b099d7
  char		err_msg[300];
Packit b099d7
Packit b099d7
  /*
Packit b099d7
  **  Create a pixmap from a X bitmap file specification
Packit b099d7
  */
Packit b099d7
  depth = parent ? parent->core.depth : DefaultDepthOfScreen(screen);
Packit b099d7
  
Packit b099d7
  *pixmap = XmGetPixmapByDepth(screen, filename, fgint, bgint, depth);
Packit b099d7
Packit b099d7
  if (*pixmap == XmUNSPECIFIED_PIXMAP)
Packit b099d7
    {
Packit b099d7
      pixmap = 0;
Packit b099d7
      sprintf (err_msg, _MrmMMsg_0033, filename);
Packit b099d7
      return Urm__UT_Error ("UrmReadBitmapFile", err_msg, 
Packit b099d7
			    NULL, NULL, MrmFAILURE);
Packit b099d7
    }
Packit b099d7
Packit b099d7
  return MrmSUCCESS;
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*
Packit b099d7
 *++
Packit b099d7
 *
Packit b099d7
 *  PROCEDURE DESCRIPTION:
Packit b099d7
 *
Packit b099d7
 *	This routine maps the pixmap in the icon into a bitmap. The
Packit b099d7
 *	bitmap is written over pixmap data. The X pixmap is then
Packit b099d7
 *	constructed as an XYBitmap.
Packit b099d7
 *
Packit b099d7
 *  FORMAL PARAMETERS:
Packit b099d7
 *
Packit b099d7
 *	icon		the IconImage being converted
Packit b099d7
 *	srcpix		number of bits/pixel in icon
Packit b099d7
 *	ctable		the color table for (in) icon
Packit b099d7
 *	screen		screen for the X pixmap
Packit b099d7
 *	display		display for the X pixmap
Packit b099d7
 *	pixmap		to return the result
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT INPUTS:
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT OUTPUTS:
Packit b099d7
 *
Packit b099d7
 *  FUNCTION VALUE:
Packit b099d7
 *
Packit b099d7
 *  SIDE EFFECTS:
Packit b099d7
 *
Packit b099d7
 *--
Packit b099d7
 */
Packit b099d7
Packit b099d7
Cardinal 
Packit b099d7
Urm__MapIconBitmap(RGMIconImagePtr		icon,
Packit b099d7
		   int				srcpix,
Packit b099d7
		   RGMColorTablePtr		ctable,
Packit b099d7
		   Screen			*screen,
Packit b099d7
		   Display			*display,
Packit b099d7
		   Pixmap			*pixmap)
Packit b099d7
{
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   *  Local variables
Packit b099d7
   */
Packit b099d7
  Pixel			fgpix;		/* foreground pixel value */
Packit b099d7
  int			iconwid;	/* icon width */
Packit b099d7
  int			srclinebyt;	/* # bytes per icon line */
Packit b099d7
  int			dstlinebyt;	/* # bytes per bitmap line */
Packit b099d7
  char			*srcbytptr;	/* image byte pointer */
Packit b099d7
  char			*dstbytptr;	/* bitmap pointer */
Packit b099d7
  int			lin;		/* icon line number */
Packit b099d7
  int			byt;		/* line byte number */
Packit b099d7
  int			pix;		/* line pixel number */
Packit b099d7
  unsigned char		srcbyt;		/* icon image byte */
Packit b099d7
  unsigned char		dstbyt;		/* mapped image byte */
Packit b099d7
  int			tndx;		/* color table index */
Packit b099d7
  XImage		*imagep;	/* X image */
Packit b099d7
  GC			gc;
Packit b099d7
  XGCValues		gcValues;
Packit b099d7
  int			endian;		/* to determine which endian. */
Packit b099d7
 
Packit b099d7
  /*
Packit b099d7
   * Overwrite the icon data with a bitmap. Use 0 for background, 1 for
Packit b099d7
   * foreground.
Packit b099d7
   */
Packit b099d7
  fgpix = ctable->item[URMColorTableFG].color_pixel;
Packit b099d7
  iconwid = icon->width;
Packit b099d7
  srclinebyt = (iconwid*srcpix+7) / 8;
Packit b099d7
  dstlinebyt = (iconwid+7) / 8;
Packit b099d7
  srcbytptr = icon->pixel_data.pdptr;
Packit b099d7
  for ( lin=0 ; lin<icon->height ; lin++ )
Packit b099d7
    {
Packit b099d7
      pix = 0;
Packit b099d7
      dstbytptr = icon->pixel_data.pdptr + lin*dstlinebyt;
Packit b099d7
      dstbyt = 0;
Packit b099d7
      for ( byt=0 ; byt
Packit b099d7
        {
Packit b099d7
	  srcbyt = *srcbytptr;
Packit b099d7
	  switch ( icon->pixel_size )
Packit b099d7
            {
Packit b099d7
            case URMPixelSize1Bit:
Packit b099d7
	      *dstbytptr = srcbyt;
Packit b099d7
	      srcbytptr += 1;
Packit b099d7
	      dstbytptr += 1;
Packit b099d7
	      pix += 8;
Packit b099d7
	      /*
Packit b099d7
	       *  NOTE: The original algorithm used here cleared any
Packit b099d7
	       *        unused bits of the last byte.  I don't think
Packit b099d7
	       *        the protocol requires that...
Packit b099d7
	       if ( pix > iconwid )
Packit b099d7
	       */
Packit b099d7
	      continue;
Packit b099d7
            case URMPixelSize2Bit:
Packit b099d7
	      tndx = srcbyt & 0x3;
Packit b099d7
	      if ( pix < iconwid )
Packit b099d7
		if ( ctable->item[tndx].color_pixel == fgpix)
Packit b099d7
		  dstbyt |= 1<<(pix%8);
Packit b099d7
	      pix += 1;
Packit b099d7
	      srcbyt >>= 2;
Packit b099d7
	      tndx = srcbyt & 0x3;
Packit b099d7
	      if ( pix < iconwid )
Packit b099d7
		if ( ctable->item[tndx].color_pixel == fgpix)
Packit b099d7
		  dstbyt |= 1<<(pix%8);
Packit b099d7
	      pix += 1;
Packit b099d7
	      srcbyt >>= 2;
Packit b099d7
	      tndx = srcbyt & 0x3;
Packit b099d7
	      if ( pix < iconwid )
Packit b099d7
		if ( ctable->item[tndx].color_pixel == fgpix)
Packit b099d7
		  dstbyt |= 1<<(pix%8);
Packit b099d7
	      pix += 1;
Packit b099d7
	      srcbyt >>= 2;
Packit b099d7
	      tndx = srcbyt & 0x3;
Packit b099d7
	      if ( pix < iconwid )
Packit b099d7
		if ( ctable->item[tndx].color_pixel == fgpix)
Packit b099d7
		  dstbyt |= 1<<(pix%8);
Packit b099d7
	      pix += 1;
Packit b099d7
	      break;
Packit b099d7
            case URMPixelSize4Bit:
Packit b099d7
	      tndx = srcbyt & 0xF;
Packit b099d7
	      if ( pix < iconwid )
Packit b099d7
		if ( ctable->item[tndx].color_pixel == fgpix)
Packit b099d7
		  dstbyt |= 1<<(pix%8);
Packit b099d7
	      pix += 1;
Packit b099d7
	      srcbyt >>= 4;
Packit b099d7
	      tndx = srcbyt & 0xF;
Packit b099d7
	      if ( pix < iconwid )
Packit b099d7
		if ( ctable->item[tndx].color_pixel == fgpix)
Packit b099d7
		  dstbyt |= 1<<(pix%8);
Packit b099d7
	      pix += 1;
Packit b099d7
	      break;
Packit b099d7
            case URMPixelSize8Bit:
Packit b099d7
	      if ( pix < iconwid )
Packit b099d7
		if ( ctable->item[srcbyt].color_pixel == fgpix)
Packit b099d7
		  dstbyt |= 1<<(pix%8);
Packit b099d7
	      pix += 1;
Packit b099d7
	      break;
Packit b099d7
            }
Packit b099d7
	  /*
Packit b099d7
	   *  NOTE:  The "1Bit" case CONTINUEs directly and will never
Packit b099d7
	   *         reach this point in the loop...
Packit b099d7
	   */
Packit b099d7
	  srcbytptr += 1;
Packit b099d7
	  if ( pix%8 == 0 )
Packit b099d7
            {
Packit b099d7
	      *dstbytptr = dstbyt;
Packit b099d7
	      dstbytptr += 1;
Packit b099d7
	      dstbyt = 0;
Packit b099d7
            }
Packit b099d7
        }
Packit b099d7
      if ( pix%8 != 0 )
Packit b099d7
        *dstbytptr = dstbyt;
Packit b099d7
    }
Packit b099d7
Packit b099d7
Packit b099d7
  imagep = XCreateImage(display,
Packit b099d7
			DefaultVisualOfScreen(screen),
Packit b099d7
			1,
Packit b099d7
			XYBitmap,
Packit b099d7
			0,
Packit b099d7
			icon->pixel_data.pdptr,
Packit b099d7
			(unsigned int)icon->width,
Packit b099d7
			(unsigned int)icon->height,
Packit b099d7
			8,
Packit b099d7
			dstlinebyt);
Packit b099d7
Packit b099d7
  if ( imagep == NULL )
Packit b099d7
    return Urm__UT_Error ("Urm__MapIconBitmap", _MrmMMsg_0034,
Packit b099d7
			  NULL, NULL, MrmFAILURE);
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Well, Uil creates a uid icon in its byteorder, on his side
Packit b099d7
   * XCreateImage creates an image in the byte_order of the server, so
Packit b099d7
   * its not correct, we have to adjust the byte_order fields of this
Packit b099d7
   * image to match those of the icon.
Packit b099d7
   */
Packit b099d7
Packit b099d7
  endian = 1;
Packit b099d7
  imagep->bitmap_unit = 8 ;
Packit b099d7
  if (*(char *) &endian) {
Packit b099d7
    imagep->byte_order = LSBFirst ;
Packit b099d7
    imagep->bitmap_bit_order = LSBFirst ;
Packit b099d7
  }
Packit b099d7
  else {
Packit b099d7
    imagep->byte_order = MSBFirst;
Packit b099d7
    imagep->bitmap_bit_order = LSBFirst ;
Packit b099d7
  }
Packit b099d7
Packit b099d7
  *pixmap = XCreatePixmap (display,
Packit b099d7
			   RootWindowOfScreen(screen),
Packit b099d7
			   icon->width,
Packit b099d7
			   icon->height,
Packit b099d7
			   (unsigned)DefaultDepthOfScreen(screen));
Packit b099d7
  if ( *pixmap == (Pixmap)0)
Packit b099d7
    {
Packit b099d7
      XFree((char*)imagep);
Packit b099d7
      return Urm__UT_Error ("Urm__MapIconBitmap", _MrmMMsg_0035,
Packit b099d7
			    NULL, NULL, MrmFAILURE);
Packit b099d7
    }
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Build a gc to use when drawing into the pixmap
Packit b099d7
   */
Packit b099d7
  gcValues.foreground = ctable->item[URMColorTableFG].color_pixel;
Packit b099d7
  gcValues.background = ctable->item[URMColorTableBG].color_pixel;
Packit b099d7
  gcValues.fill_style = FillTiled;
Packit b099d7
  gcValues.tile       = *pixmap;
Packit b099d7
Packit b099d7
  gc = XCreateGC (display, 
Packit b099d7
		  RootWindowOfScreen (screen),
Packit b099d7
		  GCForeground | GCBackground | GCFillStyle | GCTile,
Packit b099d7
		  &gcValues);
Packit b099d7
  if ( gc == NULL )
Packit b099d7
    return Urm__UT_Error ("Urm__MapIconBitmap", _MrmMMsg_0036,
Packit b099d7
			  NULL, NULL, MrmFAILURE);
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Put bits into the pixmap
Packit b099d7
   */
Packit b099d7
  XPutImage (display, 
Packit b099d7
	     *pixmap, 
Packit b099d7
	     gc, 
Packit b099d7
	     imagep, 
Packit b099d7
	     0, 0,				/* source x, y */
Packit b099d7
	     0, 0, icon->width, icon->height);	/* dest, loc & size */
Packit b099d7
 
Packit b099d7
  XFreeGC (display, gc);
Packit b099d7
  XFree ((char*)imagep);
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Successfully created
Packit b099d7
   */
Packit b099d7
  return MrmSUCCESS;
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7

Packit b099d7
/*
Packit b099d7
 *++
Packit b099d7
 *
Packit b099d7
 *  PROCEDURE DESCRIPTION:
Packit b099d7
 *
Packit b099d7
 *	This routine maps the pixmap in the icon into a bitmap. The
Packit b099d7
 *	bitmap is written over pixmap data. The X pixmap is then
Packit b099d7
 *	constructed as an XYBitmap.
Packit b099d7
 *
Packit b099d7
 *  FORMAL PARAMETERS:
Packit b099d7
 *
Packit b099d7
 *	icon		the IconImage being converted
Packit b099d7
 *	srcpix		number of bits/pixel in icon
Packit b099d7
 *	screen		screen for the X pixmap
Packit b099d7
 *	display		display for the X pixmap
Packit b099d7
 *	pixmap		to return the result
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT INPUTS:
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT OUTPUTS:
Packit b099d7
 *
Packit b099d7
 *  FUNCTION VALUE:
Packit b099d7
 *
Packit b099d7
 *  SIDE EFFECTS:
Packit b099d7
 *
Packit b099d7
 *--
Packit b099d7
 */
Packit b099d7
Packit b099d7
Cardinal 
Packit b099d7
Urm__MapIconBitmapDepth1 (RGMIconImagePtr	icon,
Packit b099d7
			  int			srcpix,
Packit b099d7
			  Screen		*screen,
Packit b099d7
			  Display		*display,
Packit b099d7
			  Pixmap		*pixmap)
Packit b099d7
{
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   *  Local variables
Packit b099d7
   */
Packit b099d7
  int			iconwid;	/* icon width */
Packit b099d7
  int			srclinebyt;	/* # bytes per icon line */
Packit b099d7
  int			dstlinebyt;	/* # bytes per bitmap line */
Packit b099d7
  char			*srcbytptr;	/* image byte pointer */
Packit b099d7
  char			*dstbytptr;	/* bitmap pointer */
Packit b099d7
  int			lin;		/* icon line number */
Packit b099d7
  int			byt;		/* line byte number */
Packit b099d7
  int			pix;		/* line pixel number */
Packit b099d7
  unsigned char		srcbyt;		/* icon image byte */
Packit b099d7
  unsigned char		dstbyt;		/* mapped image byte */
Packit b099d7
  XImage		*imagep;	/* X image */
Packit b099d7
  GC			gc;
Packit b099d7
  XGCValues		gcValues;
Packit b099d7
  int			endian;		/* to determine which endian. */
Packit b099d7
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Overwrite the icon data with a bitmap. Use 0 for background, 1 for
Packit b099d7
   * foreground.
Packit b099d7
   */
Packit b099d7
  iconwid = icon->width;
Packit b099d7
  srclinebyt = (iconwid*srcpix+7) / 8;
Packit b099d7
  dstlinebyt = (iconwid+7) / 8;
Packit b099d7
  srcbytptr = icon->pixel_data.pdptr;
Packit b099d7
  for ( lin=0 ; lin<icon->height ; lin++ )
Packit b099d7
    {
Packit b099d7
      pix = 0;
Packit b099d7
      dstbytptr = icon->pixel_data.pdptr + lin*dstlinebyt;
Packit b099d7
      dstbyt = 0;
Packit b099d7
      for ( byt=0 ; byt
Packit b099d7
        {
Packit b099d7
	  srcbyt = *srcbytptr;
Packit b099d7
	  switch ( icon->pixel_size )
Packit b099d7
            {
Packit b099d7
            case URMPixelSize1Bit:
Packit b099d7
	      *dstbytptr = srcbyt;
Packit b099d7
	      srcbytptr += 1;
Packit b099d7
	      dstbytptr += 1;
Packit b099d7
	      pix += 8;
Packit b099d7
	      /*
Packit b099d7
	       *  NOTE: The original algorithm used here cleared any
Packit b099d7
	       *        unused bits of the last byte.  I don't think
Packit b099d7
	       *        the protocol requires that...
Packit b099d7
	       if ( pix > iconwid )
Packit b099d7
	       */
Packit b099d7
	      continue;
Packit b099d7
	    default:
Packit b099d7
	      return MrmNOT_VALID;
Packit b099d7
            }
Packit b099d7
        }
Packit b099d7
      if ( pix%8 != 0 )
Packit b099d7
        *dstbytptr = dstbyt;
Packit b099d7
    }
Packit b099d7
Packit b099d7
Packit b099d7
  imagep = XCreateImage(display,
Packit b099d7
			DefaultVisualOfScreen(screen),
Packit b099d7
			1,
Packit b099d7
			XYBitmap,
Packit b099d7
			0,
Packit b099d7
			icon->pixel_data.pdptr,
Packit b099d7
			(unsigned int)icon->width,
Packit b099d7
			(unsigned int)icon->height,
Packit b099d7
			8,
Packit b099d7
			dstlinebyt);
Packit b099d7
Packit b099d7
  if ( imagep == NULL )
Packit b099d7
    return Urm__UT_Error ("Urm__MapIconBitmapDepth1", _MrmMMsg_0034,
Packit b099d7
			  NULL, NULL, MrmFAILURE);
Packit b099d7
Packit b099d7
  /* Well, Uil creates a uid icon in its byteorder, on his side
Packit b099d7
     XCreateImage creates an image in the byte_order of the server, so
Packit b099d7
     its not correct, we have to adjust the byte_order fields of this
Packit b099d7
     image to match those of the icon. */
Packit b099d7
Packit b099d7
  endian = 1;
Packit b099d7
  imagep->bitmap_unit = 8 ;
Packit b099d7
  if (*(char *) &endian) {
Packit b099d7
    imagep->byte_order = LSBFirst ;
Packit b099d7
    imagep->bitmap_bit_order = LSBFirst ;
Packit b099d7
  }
Packit b099d7
  else {
Packit b099d7
    imagep->byte_order = MSBFirst;
Packit b099d7
    imagep->bitmap_bit_order = LSBFirst ;
Packit b099d7
  }
Packit b099d7
Packit b099d7
  *pixmap = XCreatePixmap (display,
Packit b099d7
			   RootWindowOfScreen(screen),
Packit b099d7
			   icon->width,
Packit b099d7
			   icon->height,
Packit b099d7
			   1);
Packit b099d7
  if ( *pixmap == (Pixmap)0)
Packit b099d7
    {
Packit b099d7
      XFree((char*)imagep);
Packit b099d7
      return Urm__UT_Error ("Urm__MapIconBitmapDepth1", _MrmMMsg_0035,
Packit b099d7
			    NULL, NULL, MrmFAILURE);
Packit b099d7
    }
Packit b099d7
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Build a gc to use when drawing into the pixmap
Packit b099d7
   */
Packit b099d7
  gcValues.foreground = 1;
Packit b099d7
  gcValues.background = 0;
Packit b099d7
  gcValues.fill_style = FillTiled;
Packit b099d7
  gcValues.tile       = *pixmap;
Packit b099d7
Packit b099d7
  gc = XCreateGC (display, 
Packit b099d7
		  *pixmap,
Packit b099d7
		  GCForeground | GCBackground | GCFillStyle | GCTile,
Packit b099d7
		  &gcValues);
Packit b099d7
Packit b099d7
  if ( gc == NULL )
Packit b099d7
    return Urm__UT_Error ("Urm__MapIconBitmapDepth1", _MrmMMsg_0036,
Packit b099d7
			  NULL, NULL, MrmFAILURE);
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Put bits into the pixmap
Packit b099d7
   */
Packit b099d7
  XPutImage (display, 
Packit b099d7
	     *pixmap, 
Packit b099d7
	     gc, 
Packit b099d7
	     imagep, 
Packit b099d7
	     0, 0,				/* source x, y */
Packit b099d7
	     0, 0, icon->width, icon->height);	/* dest, loc & size */
Packit b099d7
 
Packit b099d7
Packit b099d7
  XFreeGC (display, gc);
Packit b099d7
  XFree ((char *)imagep);
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Successfully created
Packit b099d7
   */
Packit b099d7
  return MrmSUCCESS;
Packit b099d7
}
Packit b099d7
Packit b099d7

Packit b099d7
/*
Packit b099d7
 *++
Packit b099d7
 *
Packit b099d7
 *  PROCEDURE DESCRIPTION:
Packit b099d7
 *
Packit b099d7
 *	This routine maps the pixmap in the icon into a ZPixmap. The
Packit b099d7
 *	ZPixmap is written over the icon image pixmap data. The X pixmap
Packit b099d7
 *	is then constructed as a ZPixmap from the overwritten data.
Packit b099d7
 *
Packit b099d7
 *	This routine is called only when srcpix == 8.
Packit b099d7
 *
Packit b099d7
 *  FORMAL PARAMETERS:
Packit b099d7
 *
Packit b099d7
 *	icon		the IconImage being converted
Packit b099d7
 *	srcpix		number of bits/pixel in icon
Packit b099d7
 *	ctable		the color table for (in) icon
Packit b099d7
 *	screen		screen for the X pixmap
Packit b099d7
 *	display		display for the X pixmap
Packit b099d7
 *	pixmap		to return the result
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT INPUTS:
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT OUTPUTS:
Packit b099d7
 *
Packit b099d7
 *  FUNCTION VALUE:
Packit b099d7
 *
Packit b099d7
 *  SIDE EFFECTS:
Packit b099d7
 *
Packit b099d7
 *--
Packit b099d7
 */
Packit b099d7
Packit b099d7
Cardinal 
Packit b099d7
Urm__MapIconReplace (RGMIconImagePtr		icon,
Packit b099d7
		     int			srcpix,
Packit b099d7
		     RGMColorTablePtr		ctable,
Packit b099d7
		     Screen			*screen,
Packit b099d7
		     Display			*display,
Packit b099d7
		     Pixmap			*pixmap,
Packit b099d7
		     Widget			parent)
Packit b099d7
{
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   *  Local variables
Packit b099d7
   */
Packit b099d7
  int			iconwid;	/* icon width */
Packit b099d7
  int			linebyt;	/* # bytes per icon line */
Packit b099d7
  char			*bytptr;	/* image byte pointer */
Packit b099d7
  int			lin;		/* icon line number */
Packit b099d7
  int			byt;		/* line byte number */
Packit b099d7
  int			pix;		/* line pixel number */
Packit b099d7
  unsigned char		srcbyt;		/* icon image byte */
Packit b099d7
  XImage		*imagep;	/* X image */
Packit b099d7
  GC			gc;
Packit b099d7
  XGCValues		gcValues;
Packit b099d7
  int			depth;		/* depth of screen  */
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Overwrite the pixmap with actual Pixel values. The source and destination
Packit b099d7
   * bit widths are the same (==8), and the same pointer can be used for
Packit b099d7
   * both source and destination.
Packit b099d7
   */
Packit b099d7
  iconwid = icon->width;
Packit b099d7
  linebyt = (iconwid*srcpix+7) / 8;
Packit b099d7
  bytptr = icon->pixel_data.pdptr;
Packit b099d7
  for ( lin=0 ; lin<icon->height ; lin++ )
Packit b099d7
    {
Packit b099d7
      pix = 0;
Packit b099d7
      for ( byt=0 ; byt
Packit b099d7
        {
Packit b099d7
	  srcbyt = *bytptr;
Packit b099d7
	  if ( pix < iconwid )
Packit b099d7
	    *bytptr = ctable->item[srcbyt].color_pixel;
Packit b099d7
	  pix += 1;
Packit b099d7
	  bytptr += 1;
Packit b099d7
        }
Packit b099d7
    }
Packit b099d7
Packit b099d7
  depth = parent ? parent->core.depth : DefaultDepthOfScreen(screen);
Packit b099d7
Packit b099d7
  imagep = XCreateImage(display,
Packit b099d7
			DefaultVisualOfScreen(screen),
Packit b099d7
			depth,
Packit b099d7
			ZPixmap,
Packit b099d7
			0,
Packit b099d7
			icon->pixel_data.pdptr,
Packit b099d7
			(unsigned int)icon->width,
Packit b099d7
			(unsigned int)icon->height,
Packit b099d7
			srcpix,
Packit b099d7
			linebyt);
Packit b099d7
Packit b099d7
  if ( imagep == NULL )
Packit b099d7
    return Urm__UT_Error ("Urm__MapIconReplace", _MrmMMsg_0034,
Packit b099d7
			  NULL, NULL, MrmFAILURE);
Packit b099d7
Packit b099d7
  *pixmap = XCreatePixmap (display,
Packit b099d7
			   RootWindowOfScreen(screen),
Packit b099d7
			   icon->width,
Packit b099d7
			   icon->height,
Packit b099d7
			   (unsigned)depth);
Packit b099d7
  if ( *pixmap == (Pixmap)0)
Packit b099d7
    {
Packit b099d7
      XFree((char*)imagep);
Packit b099d7
      return Urm__UT_Error ("Urm__MapIconReplace", _MrmMMsg_0035,
Packit b099d7
			    NULL, NULL, MrmFAILURE);
Packit b099d7
    }
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Build a gc to use when drawing into the pixmap
Packit b099d7
   */
Packit b099d7
  gcValues.foreground = ctable->item[URMColorTableFG].color_pixel;
Packit b099d7
  gcValues.background = ctable->item[URMColorTableBG].color_pixel;
Packit b099d7
  gcValues.fill_style = FillTiled;
Packit b099d7
  gcValues.tile       = *pixmap;
Packit b099d7
Packit b099d7
  gc = XCreateGC (display, 
Packit b099d7
		  RootWindowOfScreen (screen),
Packit b099d7
		  GCForeground | GCBackground | GCFillStyle | GCTile,
Packit b099d7
		  &gcValues);
Packit b099d7
  if ( gc == NULL )
Packit b099d7
    return Urm__UT_Error ("Urm__MapIconReplace", _MrmMMsg_0036,
Packit b099d7
			  NULL, NULL, MrmFAILURE);
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Put bits into the pixmap
Packit b099d7
   */
Packit b099d7
  XPutImage (display, 
Packit b099d7
	     *pixmap, 
Packit b099d7
	     gc, 
Packit b099d7
	     imagep, 
Packit b099d7
	     0, 0,				/* source x, y */
Packit b099d7
	     0, 0, icon->width, icon->height);	/* dest, loc & size */
Packit b099d7
Packit b099d7
  XFreeGC (display, gc);
Packit b099d7
  XFree((char*)imagep);
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Successfully created
Packit b099d7
   */
Packit b099d7
  return MrmSUCCESS;
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*
Packit b099d7
 *++
Packit b099d7
 *
Packit b099d7
 *  PROCEDURE DESCRIPTION:
Packit b099d7
 *
Packit b099d7
 *	This routine maps the pixmap in the icon into a ZPixmap. The
Packit b099d7
 *	ZPixmap is allocated 1 byte per pixel, as the icon image pixmap
Packit b099d7
 *	has too few bits per pixel to be replace in situ. The X pixmap
Packit b099d7
 *	is created from the allocated ZPixmap.
Packit b099d7
 *
Packit b099d7
 *  FORMAL PARAMETERS:
Packit b099d7
 *
Packit b099d7
 *	icon		the IconImage being converted
Packit b099d7
 *	srcpix		number of bits/pixel in icon
Packit b099d7
 *	dstpix		number of bits/pixel in resulting image
Packit b099d7
 *	ctable		the color table for (in) icon
Packit b099d7
 *	screen		screen for the X pixmap
Packit b099d7
 *	display		display for the X pixmap
Packit b099d7
 *	pixmap		to return the result
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT INPUTS:
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT OUTPUTS:
Packit b099d7
 *
Packit b099d7
 *  FUNCTION VALUE:
Packit b099d7
 *
Packit b099d7
 *  SIDE EFFECTS:
Packit b099d7
 *
Packit b099d7
 *--
Packit b099d7
 */
Packit b099d7
Packit b099d7
Cardinal 
Packit b099d7
Urm__MapIconAllocate (RGMIconImagePtr		icon,
Packit b099d7
		      int			srcpix,
Packit b099d7
		      int			dstpix,
Packit b099d7
		      RGMColorTablePtr		ctable,
Packit b099d7
		      Screen			*screen,
Packit b099d7
		      Display			*display,
Packit b099d7
		      Pixmap			*pixmap,
Packit b099d7
		      Widget			parent)
Packit b099d7
{
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   *  Local variables
Packit b099d7
   */
Packit b099d7
  int			iconwid;	/* icon width */
Packit b099d7
  int			iconhgt;	/* icon height */
Packit b099d7
  char			*alloc_pixmap;	/* allocated pixmap */
Packit b099d7
  int			dstbytsize;	/* # 8-bit bytes per bitmap byte */
Packit b099d7
  int			srclinebyt;	/* # bytes per icon line */
Packit b099d7
  char			*srcbytptr;	/* image byte pointer */
Packit b099d7
  int			lin;		/* icon line number */
Packit b099d7
  int			byt;		/* line byte number */
Packit b099d7
  int			bit;		/* bit loop index */
Packit b099d7
  int			pix;		/* line pixel number */
Packit b099d7
  unsigned char		srcbyt;		/* icon image byte */
Packit b099d7
  int			bitmask;        /* mask all but significant bits */
Packit b099d7
  int			num_bits;       /* real (not coded) pixel size */
Packit b099d7
  int			tndx;		/* color table index */
Packit b099d7
  XImage		*imagep;	/* X image */
Packit b099d7
  GC			gc;
Packit b099d7
  XGCValues		gcValues;
Packit b099d7
  int			depth;		/* depth of screen */
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Allocate a new pixmap image. 
Packit b099d7
   */
Packit b099d7
  iconwid = icon->width;
Packit b099d7
  iconhgt = icon->height;
Packit b099d7
  if (dstpix <= 8) dstpix = 8;
Packit b099d7
  else if (dstpix <= 16) dstpix = 16;
Packit b099d7
  else dstpix = 32;
Packit b099d7
  dstbytsize = dstpix / 8;
Packit b099d7
  alloc_pixmap = (char *) XtMalloc (iconwid * iconhgt * dstbytsize);
Packit b099d7
  if (alloc_pixmap == NULL)
Packit b099d7
    return Urm__UT_Error ("Urm__MapIconAllocate", _MrmMMsg_0037,
Packit b099d7
			  NULL, NULL, MrmFAILURE);
Packit b099d7
  srclinebyt = (iconwid * srcpix + 7) / 8;
Packit b099d7
  srcbytptr = icon->pixel_data.pdptr;
Packit b099d7
Packit b099d7
  depth = parent ? parent->core.depth : DefaultDepthOfScreen(screen);
Packit b099d7
Packit b099d7
  imagep = XCreateImage(display,
Packit b099d7
			DefaultVisualOfScreen(screen),
Packit b099d7
			depth,
Packit b099d7
			ZPixmap,
Packit b099d7
			0,
Packit b099d7
			alloc_pixmap,
Packit b099d7
			iconwid,
Packit b099d7
			iconhgt,
Packit b099d7
			dstpix,
Packit b099d7
			0);	/* Let Xlib calculate it. */
Packit b099d7
Packit b099d7
  if ( imagep == NULL )
Packit b099d7
    {
Packit b099d7
      XtFree (alloc_pixmap);
Packit b099d7
      return Urm__UT_Error ("Urm__MapIconAllocate", _MrmMMsg_0034,
Packit b099d7
			    NULL, NULL, MrmFAILURE);
Packit b099d7
    }
Packit b099d7
Packit b099d7
  if(icon->pixel_size == URMPixelSize1Bit)
Packit b099d7
    { num_bits = 1; bitmask=0x1; }
Packit b099d7
  else if(icon->pixel_size == URMPixelSize2Bit)
Packit b099d7
    { num_bits = 2; bitmask=0x3; }
Packit b099d7
  else if(icon->pixel_size == URMPixelSize4Bit)
Packit b099d7
    { num_bits = 4; bitmask=0xF; }
Packit b099d7
  else if(icon->pixel_size == URMPixelSize8Bit)
Packit b099d7
    { num_bits = 8; bitmask=0xFF; }
Packit b099d7
  for ( pix=0,lin=0 ; lin<icon->height ; pix=0,lin++ )
Packit b099d7
    {
Packit b099d7
      for ( byt=0 ; byt
Packit b099d7
	{
Packit b099d7
	  srcbyt = *srcbytptr;
Packit b099d7
	  for ( bit=0 ; bit<8 ; bit+=num_bits )
Packit b099d7
	    {
Packit b099d7
	      tndx = srcbyt & bitmask;
Packit b099d7
	      if ( pix < iconwid )
Packit b099d7
		XPutPixel(imagep, pix, lin, ctable->item[tndx].color_pixel);
Packit b099d7
	      pix++;
Packit b099d7
	      srcbyt >>= num_bits;
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
  *pixmap = XCreatePixmap (display,
Packit b099d7
			   RootWindowOfScreen(screen),
Packit b099d7
			   iconwid,
Packit b099d7
			   iconhgt,
Packit b099d7
			   (unsigned)depth);
Packit b099d7
  if ( *pixmap == (Pixmap)0)
Packit b099d7
    {
Packit b099d7
      XtFree (alloc_pixmap);
Packit b099d7
      XFree((char*)imagep);
Packit b099d7
      return Urm__UT_Error ("Urm__MapIconAllocate", _MrmMMsg_0035,
Packit b099d7
			    NULL, NULL, MrmFAILURE);
Packit b099d7
    }
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Build a gc to use when drawing into the pixmap
Packit b099d7
   */
Packit b099d7
  gcValues.foreground = ctable->item[URMColorTableFG].color_pixel;
Packit b099d7
  gcValues.background = ctable->item[URMColorTableBG].color_pixel;
Packit b099d7
  gcValues.fill_style = FillTiled;
Packit b099d7
  gcValues.tile       = *pixmap;
Packit b099d7
Packit b099d7
  gc = XCreateGC (display, 
Packit b099d7
		  RootWindowOfScreen (screen),
Packit b099d7
		  GCForeground | GCBackground | GCFillStyle | GCTile,
Packit b099d7
		  &gcValues);
Packit b099d7
  if ( gc == NULL )
Packit b099d7
    {
Packit b099d7
      XtFree (alloc_pixmap);
Packit b099d7
      return Urm__UT_Error ("Urm__MapIconAllocate", _MrmMMsg_0036,
Packit b099d7
			    NULL, NULL, MrmFAILURE);
Packit b099d7
    }
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Put bits into the pixmap
Packit b099d7
   */
Packit b099d7
  XPutImage (display, 
Packit b099d7
	     *pixmap, 
Packit b099d7
	     gc, 
Packit b099d7
	     imagep, 
Packit b099d7
	     0, 0,				/* source x, y */
Packit b099d7
	     0, 0, iconwid, iconhgt);		/* dest, loc & size */
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * don't deallocate with XDestroyImage, which would destroy alloc_pixmap
Packit b099d7
   */
Packit b099d7
  XFree((char*)imagep);
Packit b099d7
  XFreeGC (display, gc);
Packit b099d7
  XtFree (alloc_pixmap);
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Successfully created
Packit b099d7
   */
Packit b099d7
  return MrmSUCCESS;
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*
Packit b099d7
 *++
Packit b099d7
 *
Packit b099d7
 *  PROCEDURE DESCRIPTION:
Packit b099d7
 *
Packit b099d7
 *	This routine sets the Pixel values corresponding to each of the
Packit b099d7
 *	entries in the color table. Foreground and background are set by
Packit b099d7
 *	querying the widget for those values, or falling back on
Packit b099d7
 *	Black/WhitePixelOfScreen. All other colors are set by honoring
Packit b099d7
 *	FG/BG setting for monochrome devices, or by getting the xolor
Packit b099d7
 *	Pixel values from X.
Packit b099d7
 *
Packit b099d7
 *  FORMAL PARAMETERS:
Packit b099d7
 *
Packit b099d7
 *	screen		screen to use for color table
Packit b099d7
 *	display		display to use for color table
Packit b099d7
 *	fgpix		foreground color for color table
Packit b099d7
 *	bgpix		background color for color table
Packit b099d7
 *	ctable		the color table
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT INPUTS:
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT OUTPUTS:
Packit b099d7
 *
Packit b099d7
 *  FUNCTION VALUE:
Packit b099d7
 *
Packit b099d7
 *  SIDE EFFECTS:
Packit b099d7
 *
Packit b099d7
 *--
Packit b099d7
 */
Packit b099d7
Packit b099d7
Cardinal 
Packit b099d7
Urm__RealizeColorTable (Screen			*screen,
Packit b099d7
			Display			*display,
Packit b099d7
			Pixel			fgpix,
Packit b099d7
			Pixel			bgpix,
Packit b099d7
			RGMColorTablePtr	ctable,
Packit b099d7
			Widget			parent)
Packit b099d7
{
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   *  Local variables
Packit b099d7
   */
Packit b099d7
  Cardinal		result;		/* function results */
Packit b099d7
  Cardinal		ndx;		/* loop index */
Packit b099d7
  RGMColorTableEntryPtr	citem;		/* color table entry */
Packit b099d7
  Colormap		cmap;		/* default color map */
Packit b099d7
  int			depth;		/* # planes in screen */
Packit b099d7
  char			err_msg[300];
Packit b099d7
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Load the foreground and background pixel values.
Packit b099d7
   */
Packit b099d7
  ctable->item[URMColorTableFG].color_pixel = fgpix;
Packit b099d7
  ctable->item[URMColorTableBG].color_pixel = bgpix;
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Get the Pixel for each defined color. Honor the FG/BG specification
Packit b099d7
   * if present on monochrome displays. Otherwise, get the Pixel value for
Packit b099d7
   * the color. Use the FG/BG specification as a fallback for unfound
Packit b099d7
   * colors in non-monochrome. If no reasonable color Pixel can be found,
Packit b099d7
   * return an error.
Packit b099d7
   */
Packit b099d7
  cmap = parent ? parent->core.colormap : DefaultColormapOfScreen(screen);
Packit b099d7
  depth = parent ? parent->core.depth : DefaultDepthOfScreen(screen);
Packit b099d7
Packit b099d7
  for ( ndx=URMColorTableUserMin ; ndx<ctable->count ; ndx++ )
Packit b099d7
    {
Packit b099d7
      citem = &ctable->item[ndx];
Packit b099d7
      if ( depth == 1 )
Packit b099d7
        switch ( citem->color_item.cptr->mono_state )
Packit b099d7
	  {
Packit b099d7
	  case URMColorMonochromeUnspecified:
Packit b099d7
	    switch (citem->color_item.cptr->desc_type)
Packit b099d7
	      {
Packit b099d7
	      case URMColorDescTypeName:
Packit b099d7
		result = Urm__UT_GetNamedColorPixel
Packit b099d7
		  (display, cmap, citem->color_item.cptr, &citem->color_pixel,
Packit b099d7
		   ctable->item[URMColorTableBG].color_pixel);
Packit b099d7
		if ( result != MrmSUCCESS) {
Packit b099d7
		  /* we use PARTIAL_SUCCESS only to indicate
Packit b099d7
		     the color allocation failed and we've 
Packit b099d7
		     substituted the fallback color. We still
Packit b099d7
		     want a warning, though */
Packit b099d7
		  if (result == MrmPARTIAL_SUCCESS) {
Packit b099d7
		    result = MrmSUCCESS;
Packit b099d7
		    sprintf (err_msg, _MrmMMsg_0038,
Packit b099d7
			     citem->color_item.cptr->desc.name);
Packit b099d7
		    return Urm__UT_Error ("Urm__RealizeColorTable",
Packit b099d7
					  err_msg, NULL, NULL, result);
Packit b099d7
		  } else {
Packit b099d7
		    sprintf (err_msg, _MrmMMsg_0038,
Packit b099d7
			     citem->color_item.cptr->desc.name);
Packit b099d7
		    return Urm__UT_Error ("Urm__RealizeColorTable",
Packit b099d7
					  err_msg, NULL, NULL, result);
Packit b099d7
		  }
Packit b099d7
		}
Packit b099d7
		break;
Packit b099d7
	      case URMColorDescTypeRGB:
Packit b099d7
		result = Urm__UT_GetColorPixel
Packit b099d7
		  (display, cmap, citem->color_item.cptr, &citem->color_pixel,
Packit b099d7
		   ctable->item[URMColorTableBG].color_pixel);
Packit b099d7
		if ( result != MrmSUCCESS ) {
Packit b099d7
		  /* we use PARTIAL_SUCCESS only to indicate
Packit b099d7
		     the color allocation failed and we've 
Packit b099d7
		     substituted the fallback color. We still
Packit b099d7
		     want a warning, though */
Packit b099d7
		  if (result == MrmPARTIAL_SUCCESS) {
Packit b099d7
		    result = MrmSUCCESS;
Packit b099d7
		    sprintf (err_msg, _MrmMMsg_0038,
Packit b099d7
			     citem->color_item.cptr->desc.name);
Packit b099d7
		    return Urm__UT_Error ("Urm__RealizeColorTable",
Packit b099d7
					  err_msg, NULL, NULL, result);
Packit b099d7
		  } else {
Packit b099d7
		    sprintf (err_msg, _MrmMMsg_0039,
Packit b099d7
			     citem->color_item.cptr->desc.rgb.red,
Packit b099d7
			     citem->color_item.cptr->desc.rgb.green,
Packit b099d7
			     citem->color_item.cptr->desc.rgb.blue) ;
Packit b099d7
		    return Urm__UT_Error ("Urm__RealizeColorTable",
Packit b099d7
					  err_msg, NULL, NULL, result);
Packit b099d7
		  }
Packit b099d7
		}
Packit b099d7
		break;
Packit b099d7
	      default:
Packit Service 1f15c3
		sprintf(err_msg, _MrmMMsg_0040);
Packit b099d7
		return Urm__UT_Error ("Urm__RelizeColorTable",
Packit b099d7
				      err_msg, NULL, NULL, MrmFAILURE) ;
Packit b099d7
	      }
Packit b099d7
	    break;
Packit b099d7
	  case URMColorMonochromeForeground:
Packit b099d7
	    citem->color_pixel =
Packit b099d7
	      ctable->item[URMColorTableFG].color_pixel;
Packit b099d7
	    break;
Packit b099d7
	  case URMColorMonochromeBackground:
Packit b099d7
	    citem->color_pixel =
Packit b099d7
	      ctable->item[URMColorTableBG].color_pixel;
Packit b099d7
	    break;
Packit b099d7
	  default:
Packit b099d7
	    sprintf (err_msg, _MrmMMsg_0041,
Packit b099d7
		     citem->color_item.cptr->mono_state);
Packit b099d7
	    return Urm__UT_Error ("Urm__RealizeColorTable",
Packit b099d7
				  err_msg, NULL, NULL, result);
Packit b099d7
	  }
Packit b099d7
      else
Packit b099d7
        {
Packit b099d7
	  switch (citem->color_item.cptr->desc_type)
Packit b099d7
	    {
Packit b099d7
	    case URMColorDescTypeName:
Packit b099d7
	      result = Urm__UT_GetNamedColorPixel
Packit b099d7
		(display, cmap, citem->color_item.cptr, &citem->color_pixel,
Packit b099d7
		 ((citem->color_item.cptr->mono_state == 
Packit b099d7
		   URMColorMonochromeForeground) ? 
Packit b099d7
		  ctable->item[URMColorTableFG].color_pixel :
Packit b099d7
		  ctable->item[URMColorTableBG].color_pixel));
Packit b099d7
	      if (result != MrmSUCCESS) {
Packit b099d7
		/* we use PARTIAL_SUCCESS only to indicate
Packit b099d7
		   the color allocation failed and we've 
Packit b099d7
		   substituted the fallback color. We still
Packit b099d7
		   want a warning, though */
Packit b099d7
		if (result == MrmPARTIAL_SUCCESS) {
Packit b099d7
		  result = MrmSUCCESS;
Packit b099d7
		  sprintf (err_msg, _MrmMMsg_0038,
Packit b099d7
			   citem->color_item.cptr->desc.name);
Packit b099d7
		  return Urm__UT_Error ("Urm__RealizeColorTable",
Packit b099d7
					err_msg, NULL, NULL, result);
Packit b099d7
		} else {
Packit b099d7
		  sprintf (err_msg, _MrmMMsg_0038,
Packit b099d7
			   citem->color_item.cptr->desc.name);
Packit b099d7
		  Urm__UT_Error ("Urm__RealizeColorTable",
Packit b099d7
				 err_msg, NULL, NULL, result);
Packit b099d7
		}
Packit b099d7
	      }
Packit b099d7
	      break;
Packit b099d7
	    case URMColorDescTypeRGB:
Packit b099d7
	      result = Urm__UT_GetColorPixel
Packit b099d7
		(display, cmap, citem->color_item.cptr, &citem->color_pixel,
Packit b099d7
		 ctable->item[URMColorTableBG].color_pixel);
Packit b099d7
	      if (result != MrmSUCCESS) {
Packit b099d7
		/* we use PARTIAL_SUCCESS only to indicate
Packit b099d7
		   the color allocation failed and we've 
Packit b099d7
		   substituted the fallback color. We still
Packit b099d7
		   want a warning, though */
Packit b099d7
		if (result == MrmPARTIAL_SUCCESS) {
Packit b099d7
		  result = MrmSUCCESS;
Packit b099d7
		  sprintf (err_msg, _MrmMMsg_0038,
Packit b099d7
			   citem->color_item.cptr->desc.name);
Packit b099d7
		  return Urm__UT_Error ("Urm__RealizeColorTable",
Packit b099d7
					err_msg, NULL, NULL, result);
Packit b099d7
		} else {
Packit b099d7
		  sprintf (err_msg, _MrmMMsg_0039,
Packit b099d7
			   citem->color_item.cptr->desc.rgb.red,
Packit b099d7
			   citem->color_item.cptr->desc.rgb.green,
Packit b099d7
			   citem->color_item.cptr->desc.rgb.blue) ;
Packit b099d7
		  Urm__UT_Error ("Urm__RealizeColorTable",
Packit b099d7
				 err_msg, NULL, NULL, result);
Packit b099d7
		}
Packit b099d7
	      }
Packit b099d7
	      break;
Packit b099d7
	    default:
Packit b099d7
	      result = MrmFAILURE;
Packit Service 1f15c3
	      sprintf (err_msg, _MrmMMsg_0040);
Packit b099d7
	      Urm__UT_Error ("Urm__RelizeColorTable",
Packit b099d7
			     err_msg, NULL, NULL, MrmFAILURE) ;
Packit b099d7
	    }
Packit b099d7
	  if ( result != MrmSUCCESS )
Packit b099d7
            {
Packit b099d7
	      switch ( citem->color_item.cptr->mono_state )
Packit b099d7
                {
Packit b099d7
                case URMColorMonochromeForeground:
Packit b099d7
		  citem->color_pixel =
Packit b099d7
		    ctable->item[URMColorTableFG].color_pixel;
Packit b099d7
		  break;
Packit b099d7
                case URMColorMonochromeBackground:
Packit b099d7
		  citem->color_pixel =
Packit b099d7
		    ctable->item[URMColorTableBG].color_pixel;
Packit b099d7
		  break;
Packit b099d7
                default:
Packit b099d7
		  return result;
Packit b099d7
                }
Packit b099d7
            }
Packit b099d7
        }
Packit b099d7
    }
Packit b099d7
Packit b099d7
  return MrmSUCCESS;
Packit b099d7
}
Packit b099d7

Packit b099d7
/*
Packit b099d7
 *++
Packit b099d7
 *
Packit b099d7
 *  PROCEDURE DESCRIPTION:
Packit b099d7
 *
Packit b099d7
 *	This routine makes a copy of a URM icon into a memory block
Packit b099d7
 *	which has been pre-allocated. The block must be big enough
Packit b099d7
 *	to hold both the header and the bit vector.
Packit b099d7
 *
Packit b099d7
 *  FORMAL PARAMETERS:
Packit b099d7
 *
Packit b099d7
 *	dst_icon	the memory block to receive the copy
Packit b099d7
 *	src_icon	the URM icon descriptor to be copied.
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT INPUTS:
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT OUTPUTS:
Packit b099d7
 *
Packit b099d7
 *  FUNCTION VALUE:
Packit b099d7
 *
Packit b099d7
 *  SIDE EFFECTS:
Packit b099d7
 *
Packit b099d7
 *--
Packit b099d7
 */
Packit b099d7
Packit b099d7
Packit b099d7
RGMIconImagePtr 
Packit b099d7
UrmCopyAllocatedIconImage (RGMIconImagePtr	dst_icon,
Packit b099d7
			   RGMIconImagePtr	src_icon)
Packit b099d7
{
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Copy the header and bit vector into the new memory block.
Packit b099d7
   */
Packit b099d7
  dst_icon->validation = URMIconImageValid;
Packit b099d7
  dst_icon->pixel_size = src_icon->pixel_size;
Packit b099d7
  dst_icon->width = src_icon->width;
Packit b099d7
  dst_icon->height = src_icon->height;
Packit b099d7
  dst_icon->hot_x = src_icon->hot_x;
Packit b099d7
  dst_icon->hot_y = src_icon->hot_y;
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Copy the color table as an immediate. It is allocated immediately
Packit b099d7
   * after the image header.
Packit b099d7
   */
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Copy the pixel data
Packit b099d7
   */
Packit b099d7
Packit b099d7
  return dst_icon;
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*
Packit b099d7
 *++
Packit b099d7
 *
Packit b099d7
 *  PROCEDURE DESCRIPTION:
Packit b099d7
 *
Packit b099d7
 *	This routine attempts to look up the name of a color, and return
Packit b099d7
 *	the pixel value required as a widget arglist value. It will use
Packit b099d7
 *	the default color map if necessary, and returns the closest color
Packit b099d7
 *	supported by the hardware (as defined by X), not the exact database
Packit b099d7
 *	definition. If the screen is depth 1 (monochrome), the routine will
Packit b099d7
 *	honor the monochrome rendition specified in the color descriptor.
Packit b099d7
 *
Packit b099d7
 *  FORMAL PARAMETERS:
Packit b099d7
 *
Packit b099d7
 *	display		specifies the X server connection
Packit b099d7
 *	cmap		color map ID. If NULL, the default color map is used
Packit b099d7
 *	colorptr	color descriptor
Packit b099d7
 *	pixel_return	to return the pixel value for the color
Packit b099d7
 *      fallback        fallback color to use in case of alloc failure
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT INPUTS:
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT OUTPUTS:
Packit b099d7
 *
Packit b099d7
 *  FUNCTION VALUE:
Packit b099d7
 *
Packit b099d7
 *	MrmSUCCESS	   color found and translated
Packit b099d7
 *	MrmNOT_FOUND	   conversion failure
Packit b099d7
 *      MrmPARTIAL_SUCCESS internal only, for allocation failure
Packit b099d7
 *
Packit b099d7
 *  SIDE EFFECTS:
Packit b099d7
 *
Packit b099d7
 *--
Packit b099d7
 */
Packit b099d7
Packit b099d7
Cardinal 
Packit b099d7
Urm__UT_GetNamedColorPixel (Display		*display,
Packit b099d7
			    Colormap		cmap,
Packit b099d7
			    RGMColorDescPtr	colorptr,
Packit b099d7
			    Pixel		*pixel_return,
Packit b099d7
			    Pixel		fallback)
Packit b099d7
{
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   *  Local variables
Packit b099d7
   */
Packit b099d7
  XColor		screen_def;	/* realizable values */
Packit b099d7
  XColor		exact_def;	/* exact values */
Packit b099d7
  int			status;		/* function return */
Packit b099d7
Packit b099d7
Packit b099d7
  if ( cmap == (Colormap)0)
Packit b099d7
    cmap = DefaultColormap (display, DefaultScreen(display));
Packit b099d7
Packit b099d7
  /* CR 9891: Support new pixel constants. */
Packit b099d7
  if (XmeNamesAreEqual(colorptr->desc.name, "default_select_color"))
Packit b099d7
    {
Packit b099d7
      *pixel_return = XmDEFAULT_SELECT_COLOR;
Packit b099d7
      return MrmSUCCESS;
Packit b099d7
    }
Packit b099d7
  else if (XmeNamesAreEqual(colorptr->desc.name, "reversed_ground_colors"))
Packit b099d7
    {
Packit b099d7
      *pixel_return = XmREVERSED_GROUND_COLORS;
Packit b099d7
      return MrmSUCCESS;
Packit b099d7
    }
Packit b099d7
  else if (XmeNamesAreEqual(colorptr->desc.name, "highlight_color"))
Packit b099d7
    {
Packit b099d7
      *pixel_return = XmHIGHLIGHT_COLOR;
Packit b099d7
      return MrmSUCCESS;
Packit b099d7
    }
Packit b099d7
Packit b099d7
  status = XAllocNamedColor
Packit b099d7
    (display, cmap, colorptr->desc.name, &screen_def, &exact_def);
Packit b099d7
Packit b099d7
  if ( status == 0) {
Packit b099d7
    if (fallback) { 
Packit b099d7
      *pixel_return = fallback; 
Packit b099d7
      return MrmPARTIAL_SUCCESS;
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
      return MrmFAILURE;
Packit b099d7
  }
Packit b099d7
  *pixel_return = screen_def.pixel;
Packit b099d7
  return MrmSUCCESS;
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*
Packit b099d7
 *++
Packit b099d7
 *
Packit b099d7
 *  PROCEDURE DESCRIPTION:
Packit b099d7
 *
Packit b099d7
 *	This routine attempts to look up the RGB values of a color, and return
Packit b099d7
 *	the pixel value required as a widget arglist value. It will use
Packit b099d7
 *	the default color map if necessary, and returns the closest color
Packit b099d7
 *	supported by the hardware (as defined by X), not the exact database
Packit b099d7
 *	definition. If the screen is depth 1 (monochrome), the routine will
Packit b099d7
 *	honor the monochrome rendition specified in the color descriptor.
Packit b099d7
 *
Packit b099d7
 *  FORMAL PARAMETERS:
Packit b099d7
 *
Packit b099d7
 *	display		specifies the X server connection
Packit b099d7
 *	cmap		color map ID. If NULL, the default color map is used
Packit b099d7
 *	colorptr	color descriptor
Packit b099d7
 *	pixel_return	to return the pixel value for the color
Packit b099d7
 *      fallback        fallback color to use in case of alloc failure
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT INPUTS:
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT OUTPUTS:
Packit b099d7
 *
Packit b099d7
 *  FUNCTION VALUE:
Packit b099d7
 *
Packit b099d7
 *	MrmSUCCESS	color found and translated
Packit b099d7
 *	MrmNOT_FOUND	conversion failure
Packit b099d7
 *      MrmPARTIAL_SUCCESS internal only, for allocation failure
Packit b099d7
 *
Packit b099d7
 *  SIDE EFFECTS:
Packit b099d7
 *
Packit b099d7
 *--
Packit b099d7
 */
Packit b099d7
Packit b099d7
Cardinal 
Packit b099d7
Urm__UT_GetColorPixel (Display			*display,
Packit b099d7
		       Colormap			cmap,
Packit b099d7
		       RGMColorDescPtr		colorptr,
Packit b099d7
		       Pixel			*pixel_return,
Packit b099d7
		       Pixel			fallback)
Packit b099d7
{
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   *  Local variables
Packit b099d7
   */
Packit b099d7
  XColor		screen_in_out;	/* realizable values */
Packit b099d7
  int			status;		/* function return */
Packit b099d7
Packit b099d7
Packit b099d7
  if ( cmap == (Colormap)0)
Packit b099d7
    cmap = DefaultColormap (display, DefaultScreen(display));
Packit b099d7
  screen_in_out.red = colorptr->desc.rgb.red;
Packit b099d7
  screen_in_out.green = colorptr->desc.rgb.green;
Packit b099d7
  screen_in_out.blue = colorptr->desc.rgb.blue;
Packit b099d7
  status = XAllocColor (display, cmap, &screen_in_out);
Packit b099d7
Packit b099d7
  if ( status == 0) {
Packit b099d7
    if (fallback) {
Packit b099d7
      *pixel_return = fallback; 
Packit b099d7
      return MrmPARTIAL_SUCCESS;
Packit b099d7
    } else
Packit b099d7
      return MrmFAILURE;
Packit b099d7
  }
Packit b099d7
  *pixel_return = screen_in_out.pixel;
Packit b099d7
  return MrmSUCCESS;
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*
Packit b099d7
 *++
Packit b099d7
 *
Packit b099d7
 *  PROCEDURE DESCRIPTION:
Packit b099d7
 *
Packit b099d7
 *	This routine computes the number of bytes used by a URM icon
Packit b099d7
 *
Packit b099d7
 *  FORMAL PARAMETERS:
Packit b099d7
 *
Packit b099d7
 *	icon		URM icon image
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT INPUTS:
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT OUTPUTS:
Packit b099d7
 *
Packit b099d7
 *  FUNCTION VALUE:
Packit b099d7
 *
Packit b099d7
 *	# bytes in the image
Packit b099d7
 *
Packit b099d7
 *  SIDE EFFECTS:
Packit b099d7
 *
Packit b099d7
 *--
Packit b099d7
 */
Packit b099d7
Packit b099d7
Cardinal 
Packit b099d7
UrmIconImageSize (RGMIconImagePtr	icon)
Packit b099d7
{
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   *  Local variables
Packit b099d7
   */
Packit b099d7
  int			bytes_per_line;	/* # bytes for padded width */
Packit b099d7
  int			raster_len;	/* bytes in image */
Packit b099d7
  Cardinal		size;		/* # bytes in descriptor */
Packit b099d7
Packit b099d7
Packit b099d7
  bytes_per_line = (icon->width+7) / 8;
Packit b099d7
  raster_len = bytes_per_line * icon->height;
Packit b099d7
  size = sizeof(RGMIconImage) + (raster_len-1)*sizeof(char);
Packit b099d7
  return size;
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7

Packit b099d7
/*
Packit b099d7
 *++
Packit b099d7
 *
Packit b099d7
 *  PROCEDURE DESCRIPTION:
Packit b099d7
 *
Packit b099d7
 *	This routine computes the number of bytes necessary to store
Packit b099d7
 *	the given color table in a single memory block.
Packit b099d7
 *
Packit b099d7
 *  FORMAL PARAMETERS:
Packit b099d7
 *
Packit b099d7
 *	ctable		An allocated color table
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT INPUTS:
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT OUTPUTS:
Packit b099d7
 *
Packit b099d7
 *  FUNCTION VALUE:
Packit b099d7
 *
Packit b099d7
 *	table size in bytes
Packit b099d7
 *
Packit b099d7
 *  SIDE EFFECTS:
Packit b099d7
 *
Packit b099d7
 *--
Packit b099d7
 */
Packit b099d7
Packit b099d7
/*ARGSUSED*/
Packit b099d7
Cardinal 
Packit b099d7
UrmColorTableSize (RGMColorTablePtr	ctable)	/* unused */
Packit b099d7
{
Packit b099d7
Packit b099d7
  return sizeof(RGMColorTable);
Packit b099d7
Packit b099d7
}