#include "XpmI.h"
LFUNC(CreateOldColorTable,
int
, (XpmColor *ct,
int
ncolors,
XpmColor ***oldct));
LFUNC(FreeOldColorTable,
void
, (XpmColor **colorTable,
int
ncolors));
static
int
CreateOldColorTable(ct, ncolors, oldct)
XpmColor *ct;
int
ncolors;
XpmColor ***oldct;
{
XpmColor **colorTable, **color;
int
a;
colorTable = (XpmColor **) XpmMalloc(ncolors *
sizeof
(XpmColor *));
if
(!colorTable) {
*oldct = NULL;
return
(XpmNoMemory);
}
for
(a = 0, color = colorTable; a < ncolors; a++, color++, ct++)
*color = ct;
*oldct = colorTable;
return
(XpmSuccess);
}
static
void
FreeOldColorTable(colorTable, ncolors)
XpmColor **colorTable;
int
ncolors;
{
int
a, b;
XpmColor **color;
char
**sptr;
if
(colorTable) {
for
(a = 0, color = colorTable; a < ncolors; a++, color++) {
for
(b = 0, sptr = (
char
**) *color; b <= NKEYS; b++, sptr++)
if
(*sptr)
XpmFree(*sptr);
}
XpmFree(*colorTable);
XpmFree(colorTable);
}
}
void
xpmFreeColorTable(colorTable, ncolors)
XpmColor *colorTable;
int
ncolors;
{
int
a, b;
XpmColor *color;
char
**sptr;
if
(colorTable) {
for
(a = 0, color = colorTable; a < ncolors; a++, color++) {
for
(b = 0, sptr = (
char
**) color; b <= NKEYS; b++, sptr++)
if
(*sptr)
XpmFree(*sptr);
}
XpmFree(colorTable);
}
}
void
XpmFreeExtensions(extensions, nextensions)
XpmExtension *extensions;
int
nextensions;
{
unsigned
int
i, j, nlines;
XpmExtension *ext;
char
**sptr;
if
(extensions) {
for
(i = 0, ext = extensions; i < nextensions; i++, ext++) {
if
(ext->name)
XpmFree(ext->name);
nlines = ext->nlines;
for
(j = 0, sptr = ext->lines; j < nlines; j++, sptr++)
if
(*sptr)
XpmFree(*sptr);
if
(ext->lines)
XpmFree(ext->lines);
}
XpmFree(extensions);
}
}
int
XpmAttributesSize()
{
return
sizeof
(XpmAttributes);
}
void
xpmInitAttributes(attributes)
XpmAttributes *attributes;
{
if
(attributes) {
attributes->pixels = NULL;
attributes->npixels = 0;
attributes->colorTable = NULL;
attributes->ncolors = 0;
attributes->hints_cmt = NULL;
attributes->colors_cmt = NULL;
attributes->pixels_cmt = NULL;
attributes->extensions = NULL;
attributes->nextensions = 0;
attributes->alloc_pixels = NULL;
attributes->nalloc_pixels = 0;
}
}
void
xpmSetAttributes(attributes, image, info)
XpmAttributes *attributes;
XpmImage *image;
XpmInfo *info;
{
if
(attributes->valuemask & XpmReturnColorTable) {
attributes->colorTable = image->colorTable;
attributes->ncolors = image->ncolors;
image->ncolors = 0;
image->colorTable = NULL;
}
else
if
(attributes->valuemask & XpmReturnInfos) {
int
ErrorStatus;
ErrorStatus = CreateOldColorTable(image->colorTable, image->ncolors,
(XpmColor ***)
&attributes->colorTable);
if
(ErrorStatus != XpmSuccess) {
attributes->valuemask &= ~XpmReturnInfos;
if
(!(attributes->valuemask & XpmReturnPixels)) {
XpmFree(attributes->pixels);
attributes->pixels = NULL;
attributes->npixels = 0;
}
attributes->ncolors = 0;
}
else
{
attributes->ncolors = image->ncolors;
attributes->hints_cmt = info->hints_cmt;
attributes->colors_cmt = info->colors_cmt;
attributes->pixels_cmt = info->pixels_cmt;
image->ncolors = 0;
image->colorTable = NULL;
info->hints_cmt = NULL;
info->colors_cmt = NULL;
info->pixels_cmt = NULL;
}
}
if
(attributes->valuemask & XpmReturnExtensions) {
attributes->extensions = info->extensions;
attributes->nextensions = info->nextensions;
info->extensions = NULL;
info->nextensions = 0;
}
if
(info->valuemask & XpmHotspot) {
attributes->valuemask |= XpmHotspot;
attributes->x_hotspot = info->x_hotspot;
attributes->y_hotspot = info->y_hotspot;
}
attributes->valuemask |= XpmCharsPerPixel;
attributes->cpp = image->cpp;
attributes->valuemask |= XpmSize;
attributes->width = image->width;
attributes->height = image->height;
}
void
XpmFreeAttributes(attributes)
XpmAttributes *attributes;
{
if
(attributes->valuemask & XpmReturnPixels && attributes->npixels) {
XpmFree(attributes->pixels);
attributes->pixels = NULL;
attributes->npixels = 0;
}
if
(attributes->valuemask & XpmReturnColorTable) {
xpmFreeColorTable(attributes->colorTable, attributes->ncolors);
attributes->colorTable = NULL;
attributes->ncolors = 0;
}
else
if
(attributes->valuemask & XpmInfos) {
if
(attributes->colorTable) {
FreeOldColorTable((XpmColor **) attributes->colorTable,
attributes->ncolors);
attributes->colorTable = NULL;
attributes->ncolors = 0;
}
if
(attributes->hints_cmt) {
XpmFree(attributes->hints_cmt);
attributes->hints_cmt = NULL;
}
if
(attributes->colors_cmt) {
XpmFree(attributes->colors_cmt);
attributes->colors_cmt = NULL;
}
if
(attributes->pixels_cmt) {
XpmFree(attributes->pixels_cmt);
attributes->pixels_cmt = NULL;
}
if
(attributes->pixels) {
XpmFree(attributes->pixels);
attributes->pixels = NULL;
attributes->npixels = 0;
}
}
if
(attributes->valuemask & XpmReturnExtensions
&& attributes->nextensions) {
XpmFreeExtensions(attributes->extensions, attributes->nextensions);
attributes->extensions = NULL;
attributes->nextensions = 0;
}
if
(attributes->valuemask & XpmReturnAllocPixels
&& attributes->nalloc_pixels) {
XpmFree(attributes->alloc_pixels);
attributes->alloc_pixels = NULL;
attributes->nalloc_pixels = 0;
}
attributes->valuemask = 0;
}