Blame urt/rle_row_alc.c

Packit 78deda
/*
Packit 78deda
 * This software is copyrighted as noted below.  It may be freely copied,
Packit 78deda
 * modified, and redistributed, provided that the copyright notice is 
Packit 78deda
 * preserved on all copies.
Packit 78deda
 * 
Packit 78deda
 * There is no warranty or other guarantee of fitness for this software,
Packit 78deda
 * it is provided solely "as is".  Bug reports or fixes may be sent
Packit 78deda
 * to the author, who may or may not act on them as he desires.
Packit 78deda
 *
Packit 78deda
 * You may not include this software in a program or other software product
Packit 78deda
 * without supplying the source, or without informing the end-user that the 
Packit 78deda
 * source is available for no extra charge.
Packit 78deda
 *
Packit 78deda
 * If you modify this software, you should include a notice giving the
Packit 78deda
 * name of the person performing the modification, the date of modification,
Packit 78deda
 * and the reason for such modification.
Packit 78deda
 *
Packit 78deda
 *  Modified at BRL 16-May-88 by Mike Muuss to avoid Alliant STDC desire
Packit 78deda
 *  to have all "void" functions so declared.
Packit 78deda
 */
Packit 78deda
/* 
Packit 78deda
 * rle_row_alc.c - Allocate buffers for rle_getrow/rle_putrow.
Packit 78deda
 * 
Packit 78deda
 * Author:	Spencer W. Thomas
Packit 78deda
 * 		Computer Science Dept.
Packit 78deda
 * 		University of Utah
Packit 78deda
 * Date:	Fri Nov 14 1986
Packit 78deda
 * Copyright (c) 1986, Spencer W. Thomas
Packit 78deda
 */
Packit 78deda
Packit 78deda
#include <stdlib.h>
Packit 78deda
#include <stdio.h>
Packit 78deda
Packit 78deda
#include "rle.h"
Packit 78deda
Packit 78deda
/*****************************************************************
Packit 78deda
 * TAG( rle_row_alloc )
Packit 78deda
 * 
Packit 78deda
 * Allocate buffer space for use by rle_getrow and rle_putrow.
Packit 78deda
 * Inputs:
Packit 78deda
 * 	the_hdr:	Header structure for RLE file to be read or
Packit 78deda
 *			written.
Packit 78deda
 * Outputs:
Packit 78deda
 *	scanp:		Pointer to pointer to created scanline buffer.
Packit 78deda
 *			This pointer is adjusted for the alpha channel,
Packit 78deda
 *			if present.
Packit 78deda
 *	Returns 0 for success, -1 if malloc failed.
Packit 78deda
 * Assumptions:
Packit 78deda
 * 	No input scanline will extend beyond the declared xmax endpoint.
Packit 78deda
 * Algorithm:
Packit 78deda
 *	Count number of channels actually used (check bitmap).
Packit 78deda
 * 	Allocate nchan*rowlength pixels, allocate a buffer
Packit 78deda
 *	to hold ncolors+alpha pointers, and give each channel
Packit 78deda
 *	rowlength pixels.  Rowlength is xmax + 1, to allow for rle_getrow
Packit 78deda
 *	usage.
Packit 78deda
 */
Packit 78deda
int
Packit 78deda
rle_row_alloc( the_hdr, scanp )
Packit 78deda
rle_hdr *the_hdr;
Packit 78deda
rle_pixel ***scanp;
Packit 78deda
{
Packit 78deda
    rle_pixel ** scanbuf, * pixbuf;
Packit 78deda
    int rowlen, nchan = 0, i, ncol;
Packit 78deda
Packit 78deda
    rowlen = the_hdr->xmax + 1;
Packit 78deda
    if ( the_hdr->alpha && RLE_BIT( *the_hdr, RLE_ALPHA ) )
Packit 78deda
	nchan++;
Packit 78deda
    for ( i = 0; i < the_hdr->ncolors; i++ )
Packit 78deda
	if ( RLE_BIT( *the_hdr, i ) )
Packit 78deda
	     nchan++;
Packit 78deda
Packit 78deda
    ncol = the_hdr->ncolors + the_hdr->alpha;
Packit 78deda
Packit 78deda
    if ( (scanbuf = (rle_pixel **)malloc( ncol * sizeof(rle_pixel *) )) == 0 )
Packit 78deda
	return -1;
Packit 78deda
    if ( (pixbuf = (rle_pixel *)malloc( nchan * rowlen *
Packit 78deda
				       sizeof(rle_pixel) )) == 0 )
Packit 78deda
    {
Packit 78deda
	free( scanbuf );
Packit 78deda
	return -1;
Packit 78deda
    }
Packit 78deda
Packit 78deda
    if ( the_hdr->alpha )
Packit 78deda
	scanbuf++;
Packit 78deda
Packit 78deda
    for ( i = -the_hdr->alpha; i < the_hdr->ncolors; i++ )
Packit 78deda
	if ( RLE_BIT( *the_hdr, i ) )
Packit 78deda
	{
Packit 78deda
	    scanbuf[i] = pixbuf;
Packit 78deda
	    pixbuf += rowlen;
Packit 78deda
	}
Packit 78deda
	else
Packit 78deda
	    scanbuf[i] = 0;
Packit 78deda
    *scanp = scanbuf;
Packit 78deda
Packit 78deda
    return 0;
Packit 78deda
}
Packit 78deda
Packit 78deda
Packit 78deda
/*****************************************************************
Packit 78deda
 * TAG( rle_row_free )
Packit 78deda
 * 
Packit 78deda
 * Free storage allocated by rle_row_alloc().
Packit 78deda
 * Inputs:
Packit 78deda
 * 	the_hdr:	Header structure as above.
Packit 78deda
 *	scanp:		Pointer to scanbuf above.
Packit 78deda
 * Outputs:
Packit 78deda
 * 	Frees storage referenced by scanp and nrawp.
Packit 78deda
 * Assumptions:
Packit 78deda
 * 	Storage was allocated by rle_row_alloc, or by use of same
Packit 78deda
 *	algorithm, at least.
Packit 78deda
 * Algorithm:
Packit 78deda
 * 	free scanp[0] and scanp.
Packit 78deda
 */
Packit 78deda
void
Packit 78deda
rle_row_free( the_hdr, scanp )
Packit 78deda
rle_hdr *the_hdr;
Packit 78deda
rle_pixel **scanp;
Packit 78deda
{
Packit 78deda
    int i;
Packit 78deda
Packit 78deda
    if ( the_hdr->alpha )
Packit 78deda
	scanp--;
Packit 78deda
    for ( i = 0; i < the_hdr->ncolors + the_hdr->alpha; i++ )
Packit 78deda
	if ( scanp[i] != 0 )
Packit 78deda
	{
Packit 78deda
	    free( (char *)scanp[i] );
Packit 78deda
	    break;
Packit 78deda
	}
Packit 78deda
    free( (char *)scanp );
Packit 78deda
}