This is rletogif.c in view mode; [Download] [Up]
/*
* This software is copyrighted as noted below. It may be freely copied,
* modified, and redistributed, provided that the copyright notice is
* preserved on all copies.
*
* There is no warranty or other guarantee of fitness for this software,
* it is provided solely "as is". Bug reports or fixes may be sent
* to the author, who may or may not act on them as he desires.
*
* You may not include this software in a program or other software product
* without supplying the source, or without informing the end-user that the
* source is available for no extra charge.
*
* If you modify this software, you should include a notice giving the
* name of the person performing the modification, the date of modification,
* and the reason for such modification.
*/
/* rletogif.c */
/*************************************************************************
* rletogif - Main program for RLE to GIF graphics format conversion.
* Works only with 8-bit RLE files. Use to8 to convert
* from 24-bit files.
* Will detectect if mcut has been used to reduce the number of
* colors and act accordingly.
*
* Written by Bailey Brown, Jr. May 24, 1990.
*************************************************************************
*/
#include <stdio.h>
#include "rle.h"
#include "rletogif.h"
#ifdef USE_STDLIB_H
#include <stdlib.h>
#else
#ifndef USE_STRING_H
#include "strings.h"
#else
#include "string.h"
#endif
#ifndef VOID_STAR
char *malloc();
#else
extern void *malloc();
#endif
extern void free();
#endif /* USE_STDLIB_H */
CONST_DECL char *MY_NAME = "rletogif";
static rle_hdr in_hdr;
static rle_pixel **scan;
static gif_pixel **scanbuf; /* needed to read all scanlines before
converting to gif (rle is upside down) */
int get_scanlines();
int get_color_bits();
void GIFEncode();
void
main(argc, argv)
int argc;
char *argv[];
{
char *outfname = NULL,
*infname = NULL;
int oflag = 0;
int i, color_bits;
MY_NAME = cmd_name( argv );
if ( scanargs( argc, argv, "% o%-outfile.gif!s infile.rle%s",
&oflag, &outfname, &infname ) == 0 )
exit( 1 );
in_hdr.rle_file = rle_open_f( MY_NAME, infname, "r" );
rle_get_setup_ok( &in_hdr, argv[0], argv[1]);
in_hdr.xmax -= in_hdr.xmin;
in_hdr.xmin = 0;
in_hdr.ymax -= in_hdr.ymin;
in_hdr.ymin = 0;
if (in_hdr.ncolors > 1) error("must use to8 to make file 8-bit");
get_scanlines();
color_bits = get_color_bits(in_hdr.comments);
GIFEncode( outfname, in_hdr.xmax - in_hdr.xmin + 1,
in_hdr.ymax - in_hdr.ymin + 1, 0, 0,
color_bits, &in_hdr.cmap[0], &in_hdr.cmap[256],
&in_hdr.cmap[512], getpixel );
rle_row_free(&in_hdr, scan);
for (i = 0; i <= in_hdr.ymax; i++ ) free(scanbuf[i]);
free(scanbuf);
}
/*
* get_scanlines() reads in all RLE raster data at once. This is
* necessary because of RLE stores images bottom to top and GIF stores
* them top to bottom.
*/
int get_scanlines()
{
int i;
rle_pixel *save_scan_0;
if (sizeof(rle_pixel) != sizeof(gif_pixel))
error("rle pixel size not 8 bits");
if (rle_row_alloc(&in_hdr, &scan) < 0) error("can't allocate scan");
save_scan_0 = scan[0];
scanbuf = (gif_pixel**)malloc(sizeof(gif_pixel*)*(in_hdr.ymax+1));
if (scanbuf == NULL) error("can't allocate scanbuf");
for (i = 0; i <= in_hdr.ymax; i++) {
scan[0] = (rle_pixel*)malloc(sizeof(rle_pixel)*(in_hdr.xmax+1));
if (scan[0] == NULL) error("can't allocate current scanline");
rle_getrow(&in_hdr, scan);
scanbuf[in_hdr.ymax - i] = (gif_pixel*)scan[0];
}
scan[0] = save_scan_0;
return (1);
}
/********************************************************************
* get_color_bits() searches the array of comment strings for the substring
* "color_map_length=" which is added by mcut if it has worked on the
* file. If it is found, it sets color_bits to the ceiling of log 2
* color_map_length. Otherwise it returns the default value 8.
********************************************************************/
int get_color_bits(comments)
char **comments;
{
int i, color_bits, num_colors;
color_bits = 8;
if (comments == NULL) return (color_bits);
for (i = 0; comments[i]; i++) {
if (!strncmp(comments[i],"color_map_length=",17)) {
num_colors = atoi(&(comments[i][17]));
for (color_bits = 1; num_colors >> color_bits; color_bits++);
if (num_colors == (1<<(color_bits-1))) color_bits--;
break;
}
}
if ((color_bits < 0) || (color_bits > 8))
error("invalid number of color bits");
return (color_bits);
}
int getpixel( x, y )
int x, y;
{
return (int)scanbuf[y][x];
}
void error(s)
char *s;
{
fprintf(stderr,"%s\n", s);
exit(2);
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.