|
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 |
}
|