/*
 * Copyright (C) 1989-95 GROUPE BULL 
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to
 * deal in the Software without restriction, including without limitation the
 * rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions: 
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software. 
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
 * GROUPE BULL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
 *
 * Except as contained in this notice, the name of GROUPE BULL shall not be used
 * in advertising or otherwise to promote the sale, use or other dealings in
 * this Software without prior written authorization from GROUPE BULL. 
 */

/*****************************************************************************\
*  CrIFrData.c:                                                               *
*                                                                             *
*  XPM library                                                                *
*  Parse an Xpm array and create the image and possibly its mask              *
*                                                                             *
*  Developed by Arnaud Le Hors                                                *
\*****************************************************************************/

#include "xpmP.h"

LFUNC(OpenArray, void, (char **data, xpmData * mdata));

int
XpmCreateImageFromData(display, data, image_return,
		       shapeimage_return, attributes)
Display *display;
char **data;
XImage **image_return;
XImage **shapeimage_return;
XpmAttributes *attributes;
{
 XpmImage image;
 XpmInfo info;
 int ErrorStatus;

 /* create an XpmImage from the file */
 if (attributes)
 {
  xpmInitAttributes(attributes);
  xpmSetInfoMask(&info, attributes);
  ErrorStatus = XpmCreateXpmImageFromData(data, &image, &info);
 } else
  ErrorStatus = XpmCreateXpmImageFromData(data, &image, NULL);

 if (ErrorStatus != XpmSuccess)
  return (ErrorStatus);

 /* create the related ximages */
 ErrorStatus = XpmCreateImageFromXpmImage(display, &image,
					  image_return, shapeimage_return,
					  attributes);
 if (attributes)
 {
  if (ErrorStatus >= 0)		/* no fatal error */
   xpmSetAttributes(attributes, &image, &info);
  XpmFreeXpmInfo(&info);
 }
 XpmFreeXpmImage(&image);

 return (ErrorStatus);
}

int
XpmCreateXpmImageFromData(data, image, info)
char **data;
XpmImage *image;
XpmInfo *info;
{
 xpmData mdata;
 int ErrorStatus;

 /* init returned values */
 xpmInitXpmImage(image);
 xpmInitXpmInfo(info);

 /* open data */
 OpenArray(data, &mdata);

 /* create the XpmImage from the XpmData */
 ErrorStatus = xpmParseData(&mdata, image, info);

 return (ErrorStatus);
}

/*
 * open the given array to be read or written as an xpmData which is returned 
 */
static void
OpenArray(data, mdata)
char **data;
xpmData *mdata;
{
 mdata->type = XPMARRAY;
 mdata->stream.data = data;
 mdata->cptr = *data;
 mdata->line = 0;
 mdata->CommentLength = 0;
 mdata->Bcmt = mdata->Ecmt = NULL;
 mdata->Bos = mdata->Eos = '\0';
 mdata->format = 0;		/* this can only be Xpm 2 or 3 */
}
