You are here: Home / archived / radsite / radiance / pub / translators / ra_rle.c

ra_rle.c

/* Copyright (c) 1992 Regents of the University of California */ #ifndef lint static char SCCSid[] = "@(#)ra_skel.c 2.4 12/17/92 LBL"; #endif /* Philip R. Thompson, 4/93 * Computer Resource Lab. * School of Architecture and Planning, MIT * Quick an dirty jof of converting Radiance images to the * Utah Raster Toolkit format (rle). * Note: No support for comments although both file formats support * them. */ #define RLELIB #include #include "color.h" #include "resolu.h" #ifdef RLELIB #include "rle.h" #endif #include "standard.h" static double gam = 2.2; /* gam correction */ static int bradj = 0; /* brightness adjustment */ static char *progname = NULL; static int xmax, ymax; static void quiterr(err) /* print message and exit */ char *err; { if (err != NULL) fprintf(stderr, "%s: %s\n", progname, err); exit(1); } /* convert 24-bit scanlines to Radiance pic */ static int Rle2Ra(argc, argv) int argc; char **argv; { register int x, y, xmax, ymax; rle_hdr in_globals; rle_pixel **rows; COLR *scanout; bzero((char*)&in_globals, sizeof(rle_hdr)); in_globals.rle_file = stdin; if (rle_get_setup(&in_globals) < 0) quiterr("Rle2Ra: can't read rle setup information"); xmax = in_globals.xmax - in_globals.xmin + 1; ymax = in_globals.ymax - in_globals.ymin + 1; if (rle_row_alloc(&in_globals, &rows)) quiterr("Rle2Ra: rle_row_alloc() failed."); /* put our header */ printargs(argc, argv, stdout); fputformat(COLRFMT, stdout); putchar('\n'); fprtresolu(xmax, ymax, stdout); /* allocate scanline */ if ((scanout = (COLR *)malloc(xmax*sizeof(COLR))) == NULL) quiterr("out of memory in Rle2Ra"); /* convert image */ for (y = ymax-1; y >= 0; y--) { rle_getrow(&in_globals, rows); for (x = 0; x < xmax; x++) { scanout[x][RED] = rows[RLE_RED][x]; scanout[x][GRN] = rows[RLE_GREEN][x]; scanout[x][BLU] = rows[RLE_BLUE][x]; } if (feof(stdin) || ferror(stdin)) quiterr("error reading rle image"); /* undo gam */ gambs_colrs(scanout, xmax); if (bradj) /* adjust exposure */ shiftcolrs(scanout, xmax, bradj); if (fwritecolrs(scanout, xmax, stdout) < 0) quiterr("error writing Radiance picture"); } /* free scanline */ free((char *)scanout); rle_row_free(&in_globals, rows); return 1; } static int Ra2Rle() /* convert Radiance data to 24-bit Utah rle */ { register int x, y; register COLR *scanin; rle_pixel **rows; rle_hdr out_globals; /* allocate scanline */ if ((scanin = (COLR *)malloc(xmax*sizeof(COLR))) == NULL) quiterr("out of memory in Ra2Rle"); /* Intialize and setup rle header */ bzero(&out_globals, sizeof(rle_hdr)); out_globals.xmax = xmax - 1; out_globals.ymax = ymax - 1; out_globals.rle_file = stdout; out_globals.ncmap = 0; out_globals.ncolors = 3; for (x = 0; x < out_globals.ncolors; x++) RLE_SET_BIT(out_globals, x); out_globals.comments = NULL; if (rle_row_alloc(&out_globals, &rows)) { quiterr("Ra2Rle: rle_row_alloc failed"); return 0; } rle_put_setup(&out_globals); /* write out the header */ /* convert image */ for (y = ymax-1; y >= 0; y--) { if (freadcolrs(scanin, xmax, stdin) < 0) quiterr("error reading Radiance picture"); if (bradj) /* adjust exposure */ shiftcolrs(scanin, xmax, bradj); colrs_gambs(scanin, xmax); /* gam correction */ for (x = 0; x < xmax; x++) { rows[RLE_RED][x] = scanin[x][RED]; rows[RLE_GREEN][x] = scanin[x][GRN]; rows[RLE_BLUE][x] = scanin[x][BLU]; } rle_putrow(rows, xmax, &out_globals); if (ferror(stdout)) quiterr("error writing skel file"); } rle_puteof(&out_globals); rle_row_free(&out_globals, rows); if (out_globals.priv.put.brun) free((char*)out_globals.priv.put.brun); if (out_globals.bg_color) free((char*)out_globals.bg_color); if (out_globals.cmap) free((char*)out_globals.cmap); free((char *)scanin); return 1; } main(argc, argv) int argc; char *argv[]; { int i, reverse = 0; progname = argv[0]; for (i = 1; i < argc; i++) if (argv[i][0] == '-') switch (argv[i][1]) { case 'g': /* gam correction */ gam = atof(argv[++i]); break; case 'e': /* exposure adjustment */ if (argv[i+1][0] != '+' && argv[i+1][0] != '-') goto userr; bradj = atoi(argv[++i]); break; case 'r': /* reverse conversion */ reverse = 1; break; default: goto userr; } else break; if (i < argc-2) goto userr; if (i <= argc-1 && freopen(argv[i], "r", stdin) == NULL) { fprintf(stderr, "%s: can't open input \"%s\"\n", progname, argv[i]); exit(1); } if (i == argc-2 && freopen(argv[i+1], "w", stdout) == NULL) { fprintf(stderr, "can't open output \"%s\"\n", progname, argv[i+1]); exit(1); } setcolrgam(gam); /* set up gam correction */ if (reverse) { /* convert file */ Rle2Ra(i, argv); } else { /* get our header */ if (checkheader(stdin, COLRFMT, NULL) < 0 || fgetresolu(&xmax, &ymax, stdin) < 0) quiterr("bad picture format"); /* convert file */ Ra2Rle(); } exit(0); userr: fprintf(stderr, "Usage: %s [-r][-g gam][-e +/-stops] [input [output]]\n", progname); exit(1); } /*** end ra_rle.c ***/ From [email protected] Thu Apr 29 14:52:59 1993 Return-Path: From: [email protected] Date: Thu, 29 Apr 93 17:52:50 -0400 To: [email protected] Subject: Radiance to Utah Raster Toolkit Cc: [email protected] Status: R Hi Greg, Here is code that reads/writes rle files for interfacing with the Utah Raster Toolkit. We find it useful for animations. Unfortunately, images come out upsidedown, so they have to be passed through rleflip. Its a quick hack and comments don't get translated amoung the files. Maybe later. Hope you find it useful (if you have the toolkit). Philip ------------- /* Copyright (c) 1992 Regents of the University of California */ #ifndef lint static char SCCSid[] = "@(#)ra_skel.c 2.4 12/17/92 LBL"; #endif /* Philip R. Thompson, 4/93 * Computer Resource Lab. * School of Architecture and Planning, MIT * Quick an dirty jof of converting Radiance images to the * Utah Raster Toolkit format (rle). * Note: No support for comments although both file formats support * them. */ #define RLELIB #include #include "color.h" #include "resolu.h" #ifdef RLELIB #include "rle.h" #endif #include "standard.h" static double gam = 2.2; /* gam correction */ static int bradj = 0; /* brightness adjustment */ static char *progname = NULL; static int xmax, ymax; static void quiterr(err) /* print message and exit */ char *err; { if (err != NULL) fprintf(stderr, "%s: %s\n", progname, err); exit(1); } /* convert 24-bit scanlines to Radiance pic */ static int Rle2Ra(argc, argv) int argc; char **argv; { register int x, y, xmax, ymax; rle_hdr in_globals; rle_pixel **rows; COLR *scanout; bzero((char*)&in_globals, sizeof(rle_hdr)); in_globals.rle_file = stdin; if (rle_get_setup(&in_globals) < 0) quiterr("Rle2Ra: can't read rle setup information"); xmax = in_globals.xmax - in_globals.xmin + 1; ymax = in_globals.ymax - in_globals.ymin + 1; if (rle_row_alloc(&in_globals, &rows)) quiterr("Rle2Ra: rle_row_alloc() failed."); /* put our header */ printargs(argc, argv, stdout); fputformat(COLRFMT, stdout); putchar('\n'); fprtresolu(xmax, ymax, stdout); /* allocate scanline */ if ((scanout = (COLR *)malloc(xmax*sizeof(COLR))) == NULL) quiterr("out of memory in Rle2Ra"); /* convert image */ for (y = ymax-1; y >= 0; y--) { rle_getrow(&in_globals, rows); for (x = 0; x < xmax; x++) { scanout[x][RED] = rows[RLE_RED][x]; scanout[x][GRN] = rows[RLE_GREEN][x]; scanout[x][BLU] = rows[RLE_BLUE][x]; } if (feof(stdin) || ferror(stdin)) quiterr("error reading rle image"); /* undo gam */ gambs_colrs(scanout, xmax); if (bradj) /* adjust exposure */ shiftcolrs(scanout, xmax, bradj); if (fwritecolrs(scanout, xmax, stdout) < 0) quiterr("error writing Radiance picture"); } /* free scanline */ free((char *)scanout); rle_row_free(&in_globals, rows); return 1; } static int Ra2Rle() /* convert Radiance data to 24-bit Utah rle */ { register int x, y; register COLR *scanin; rle_pixel **rows; rle_hdr out_globals; /* allocate scanline */ if ((scanin = (COLR *)malloc(xmax*sizeof(COLR))) == NULL) quiterr("out of memory in Ra2Rle"); /* Intialize and setup rle header */ bzero(&out_globals, sizeof(rle_hdr)); out_globals.xmax = xmax - 1; out_globals.ymax = ymax - 1; out_globals.rle_file = stdout; out_globals.ncmap = 0; out_globals.ncolors = 3; for (x = 0; x < out_globals.ncolors; x++) RLE_SET_BIT(out_globals, x); out_globals.comments = NULL; if (rle_row_alloc(&out_globals, &rows)) { quiterr("Ra2Rle: rle_row_alloc failed"); return 0; } rle_put_setup(&out_globals); /* write out the header */ /* convert image */ for (y = ymax-1; y >= 0; y--) { if (freadcolrs(scanin, xmax, stdin) < 0) quiterr("error reading Radiance picture"); if (bradj) /* adjust exposure */ shiftcolrs(scanin, xmax, bradj); colrs_gambs(scanin, xmax); /* gam correction */ for (x = 0; x < xmax; x++) { rows[RLE_RED][x] = scanin[x][RED]; rows[RLE_GREEN][x] = scanin[x][GRN]; rows[RLE_BLUE][x] = scanin[x][BLU]; } rle_putrow(rows, xmax, &out_globals); if (ferror(stdout)) quiterr("error writing skel file"); } rle_puteof(&out_globals); rle_row_free(&out_globals, rows); if (out_globals.priv.put.brun) free((char*)out_globals.priv.put.brun); if (out_globals.bg_color) free((char*)out_globals.bg_color); if (out_globals.cmap) free((char*)out_globals.cmap); free((char *)scanin); return 1; } main(argc, argv) int argc; char *argv[]; { int i, reverse = 0; progname = argv[0]; for (i = 1; i < argc; i++) if (argv[i][0] == '-') switch (argv[i][1]) { case 'g': /* gam correction */ gam = atof(argv[++i]); break; case 'e': /* exposure adjustment */ if (argv[i+1][0] != '+' && argv[i+1][0] != '-') goto userr; bradj = atoi(argv[++i]); break; case 'r': /* reverse conversion */ reverse = 1; break; default: goto userr; } else break; if (i < argc-2) goto userr; if (i <= argc-1 && freopen(argv[i], "r", stdin) == NULL) { fprintf(stderr, "%s: can't open input \"%s\"\n", progname, argv[i]); exit(1); } if (i == argc-2 && freopen(argv[i+1], "w", stdout) == NULL) { fprintf(stderr, "can't open output \"%s\"\n", progname, argv[i+1]); exit(1); } setcolrgam(gam); /* set up gam correction */ if (reverse) { /* convert file */ Rle2Ra(i, argv); } else { /* get our header */ if (checkheader(stdin, COLRFMT, NULL) < 0 || fgetresolu(&xmax, &ymax, stdin) < 0) quiterr("bad picture format"); /* convert file */ Ra2Rle(); } exit(0); userr: fprintf(stderr, "Usage: %s [-r][-g gam][-e +/-stops] [input [output]]\n", progname); exit(1); } /*** end ra_rle.c ***/ From greg Thu Apr 29 16:38:15 1993 Return-Path: Date: Thu, 29 Apr 93 16:38:12 PDT From: greg (Gregory J. Ward) To: [email protected] Subject: Re: Radiance to Utah Raster Toolkit Status: R Hi Philip, I don't use the RLE toolkit myself, but I'm sure there are Radiance users out there who do. I assume they convert to RLE via some intermediate format like Targa or PPM. Not as convenient, I admit. I actually downloaded the RLE toolkit at one point because I wanted to try and support some of the commonly used formats, but including this library in the Radiance distribution would have required a lot of extra work on the part of the administrator during compilation. The RLE library just doesn't compile that easily. I also looked at writing the format manually, but the format itself is quite complicated, like TIFF in many respects. (ra_tiff uses Sam Leffler's very robust library -- I couldn't have written this myself!) I assume from glancing at it that ra_rle.c requires linking with the RLE library, doesn't it? If so, then I suggest that I put it in the translators directory on our anonymous ftp account, where people with the library may pick it up. Thanks very much! -Greg From [email protected] Thu Apr 29 17:07:48 1993 Return-Path: To: [email protected] (Gregory J. Ward) Subject: Re: Radiance to Utah Raster Toolkit Date: Thu, 29 Apr 93 20:07:27 EDT From: Philip Thompson Status: R Greg, You may want to grab the latest URT (version3.0 + patches), since it really has compiled without any problems around here. Its supported on: Sun 3 (SunOS 4) with cc (config/sun3) and gcc Sun 4 (SunOS 4) (config/sun4) DEC 3100 (Ultrix 3.1) (config/dec) IBM RT (AIX ??) (config/ibm-rt) SGI Iris 4D (IRIX 3.2) (config/iris4d) Apollo (SR 10.2) (config/apollo) Stardent GS1000 (config/stellar) HP 9000/3xx,8xx (HP-UX 7.03) (config/hpux300 config/hpux800) Macintosh (A/UX) [note - getmac program does not work on A/UX] Macintosh (MacOS) with MPW [at least library and getmac program] Cray 2 (UNICOS) (config/cray) and available from freebie.engin.umich.edu. Anyway go ahead and put ra_rle.c in translators. If you have any ideas on ways to avoid a flipped image, I'd appreciate suggestions. I don't suppose there's an easy way to read scanlines in reverse order? Or calls to get/put comments from radiance files? It's a shame to loose that information. bye, Philip From greg Thu Apr 29 19:22:48 1993 Return-Path: Date: Thu, 29 Apr 93 19:22:44 PDT From: greg (Gregory J. Ward) To: [email protected] Subject: Re: Radiance to Utah Raster Toolkit Status: R Hi Philip, I didn't mean to say that RLE didn't compile, only that it was difficult and required the user to answer a lot of questions. Has this changed? I couldn't figure out how to integrate their installation into mine without making mine take twice as long. (I'm not saying that my installation is better, only different. It would be better if both used imake or something.) As for the flipped images, you can either load the whole thing into memory, or call an image flipper before or after. If you don't want to do either, you can look at pflip.c for how to read a Radiance image from bottom to top. Basically, you make one pass on the file to figure out where each scanline starts, then use fseek to get them in reverse order. Writing the image out, you can write out a flattened image by calling fwrite in place of fwritecolrs (see ra_rgbe for example), again using fseek to go to the appropriate locations in reverse. This has the unfortunate problem of doubling or even tripling the picture size, however. Provided temporary disk space is not a problem, you can always call ra_rgbe -r to fix this problem afterwards, which is a very fast program. -Greg
by admin – last modified Nov 09, 2019 09:22 AM