From: Udi F. <udi...@us...> - 2007-03-26 20:49:58
|
Update of /cvsroot/ufraw/ufraw In directory sc8-pr-cvs8.sourceforge.net:/tmp/cvs-serv27109 Modified Files: configure.ac ufraw_chooser.c ufraw_ufraw.c Log Message: Support gzipped and bzipped raw files. EXIF support is still not working for these files. Index: configure.ac =================================================================== RCS file: /cvsroot/ufraw/ufraw/configure.ac,v retrieving revision 1.69 retrieving revision 1.70 diff -C2 -d -r1.69 -r1.70 *** configure.ac 23 Mar 2007 14:10:22 -0000 1.69 --- configure.ac 26 Mar 2007 20:49:49 -0000 1.70 *************** *** 136,139 **** --- 136,143 ---- have_zlib=${ac_cv_lib_z_deflate:-no} + # Check for libbz2 + AC_CHECK_LIB(bz2, BZ2_bzReadOpen) + have_libbz2=${ac_cv_lib_bz2_BZ2_bzReadOpen:-no} + # Check for jpeg headers and library. AC_CHECK_HEADER(jpeglib.h, *************** *** 241,245 **** AC_MSG_NOTICE(PNG support: $have_png) AC_MSG_NOTICE(TIFF support: $have_tiff) ! if test $have_tiff = yes; then ! AC_MSG_NOTICE(TIFF deflate (lossless compression) support: $have_zlib) ! fi --- 245,248 ---- AC_MSG_NOTICE(PNG support: $have_png) AC_MSG_NOTICE(TIFF support: $have_tiff) ! AC_MSG_NOTICE(gzip compressed raw support: $have_zlib) ! AC_MSG_NOTICE(bzip2 compressed raw support: $have_libbz2) Index: ufraw_ufraw.c =================================================================== RCS file: /cvsroot/ufraw/ufraw/ufraw_ufraw.c,v retrieving revision 1.84 retrieving revision 1.85 diff -C2 -d -r1.84 -r1.85 *** ufraw_ufraw.c 15 Mar 2007 23:50:56 -0000 1.84 --- ufraw_ufraw.c 26 Mar 2007 20:49:49 -0000 1.85 *************** *** 22,25 **** --- 22,31 ---- #include <time.h> #include <errno.h> + #ifdef HAVE_LIBZ + #include <zlib.h> + #endif + #ifdef HAVE_LIBBZ2 + #include <bzlib.h> + #endif #include <glib.h> #include <glib/gi18n.h> *************** *** 122,125 **** --- 128,222 ---- } + static int make_temporary(char *basefilename, char **tmpfilename) + { + int fd; + char *basename = g_path_get_basename(basefilename); + char *template = g_strconcat(basename, ".tmp.XXXXXX", NULL); + fd = g_file_open_tmp(template, tmpfilename, NULL); + g_free(template); + g_free(basename); + return fd; + } + + static ssize_t writeall(int fd, const char *buf, ssize_t size) + { + ssize_t written; + ssize_t wr; + for (written = 0; size > 0; size -= wr, written += wr, buf += wr) + if ((wr = write(fd, buf, size)) < 0) + break; + return written; + } + + static char *decompress_gz(char *origfilename) + { + #ifdef HAVE_LIBZ + char *filename; + int tmpfd; + gzFile gzfile; + char buf[8192]; + ssize_t size; + if ((tmpfd = make_temporary(origfilename, &filename)) != -1) { + if ((gzfile = gzopen(origfilename, "rb")) != 0) { + while ((size = gzread(gzfile, buf, sizeof buf)) > 0) { + if (writeall(tmpfd, buf, size) != size) + break; + } + gzclose(gzfile); + if (size == 0) + if (close(tmpfd) == 0) + return filename; + } + close(tmpfd); + unlink(filename); + free(filename); + } + #else + origfilename = origfilename; + ufraw_message(UFRAW_SET_ERROR, + "Cannot open gzip compressed images.\n"); + #endif + return NULL; + } + + static char *decompress_bz2(char *origfilename) + { + #ifdef HAVE_LIBBZ2 + char *filename; + int tmpfd; + FILE *compfile; + BZFILE *bzfile; + int bzerror; + char buf[8192]; + ssize_t size; + + if ((tmpfd = make_temporary(origfilename, &filename)) != -1) { + if ((compfile = fopen(origfilename, "rb")) != 0) { + if ((bzfile = BZ2_bzReadOpen(&bzerror, compfile, + 0, 0, 0, 0)) != 0) { + while ((size = BZ2_bzRead(&bzerror, bzfile, + buf, sizeof buf)) > 0) + if (writeall(tmpfd, buf, size) != size) + break; + BZ2_bzReadClose(&bzerror, bzfile); + fclose(compfile); + if (size == 0) { + close(tmpfd); + return filename; + } + } + } + close(tmpfd); + unlink(filename); + free(filename); + } + #else + origfilename = origfilename; + ufraw_message(UFRAW_SET_ERROR, + "Cannot open bzip2 compressed images.\n"); + #endif + return NULL; + } + ufraw_data *ufraw_open(char *filename) { *************** *** 130,133 **** --- 227,231 ---- conf_data *conf = NULL; char *fname, *hostname; + char *origfilename; fname = g_filename_from_uri(filename, &hostname, NULL); *************** *** 178,183 **** --- 276,296 ---- filename = conf->inputFilename; } + origfilename = filename; + if (!strcasecmp(filename + strlen(filename) - 3, ".gz")) + filename = decompress_gz(filename); + else if (!strcasecmp(filename + strlen(filename) - 4, ".bz2")) + filename = decompress_bz2(filename); + if (filename == 0) { + ufraw_message(UFRAW_SET_ERROR, + "Error creating temporary file for compressed data."); + return NULL; + } raw = g_new(dcraw_data, 1); status = dcraw_open(raw, filename); + if (filename != origfilename) { + unlink(filename); + free(filename); + filename = origfilename; + } if ( status!=DCRAW_SUCCESS) { /* Hold the message without displaying it */ *************** *** 218,221 **** --- 331,338 ---- ufraw_message(UFRAW_SET_LOG, "ufraw_open: w:%d h:%d curvesize:%d\n", uf->predictedWidth, uf->predictedHeight, raw->toneCurveSize); + if (origfilename != filename) { + unlink(filename); + free(filename); + } return uf; } Index: ufraw_chooser.c =================================================================== RCS file: /cvsroot/ufraw/ufraw/ufraw_chooser.c,v retrieving revision 1.14 retrieving revision 1.15 diff -C2 -d -r1.14 -r1.15 *** ufraw_chooser.c 16 Mar 2007 17:38:41 -0000 1.14 --- ufraw_chooser.c 26 Mar 2007 20:49:49 -0000 1.15 *************** *** 67,70 **** --- 67,82 ---- gtk_file_filter_add_pattern(filter, cp=g_ascii_strup(ext,-1)); g_free(cp); + #ifdef HAVE_LIBZ + snprintf(ext, max_name, "*.%s.gz", *l); + gtk_file_filter_add_pattern(filter, ext); + gtk_file_filter_add_pattern(filter, cp=g_ascii_strup(ext,-1)); + g_free(cp); + #endif + #ifdef HAVE_LIBBZ2 + snprintf(ext, max_name, "*.%s.bz2", *l); + gtk_file_filter_add_pattern(filter, ext); + gtk_file_filter_add_pattern(filter, cp=g_ascii_strup(ext,-1)); + g_free(cp); + #endif } g_strfreev(extList); |