# HG changeset patch # User alex@thinkpad # Date 1387136243 -7200 # Node ID 6f59cc3410105f3bea7b8aebd36846ad8de24b92 # Parent 234b908f81ae31c4c61089fada41d61f9b836a30 Experimental (read: hackish) support for 32-bit floating point DNGs diff -r 234b908f81ae -r 6f59cc341010 dcraw.cc --- a/dcraw.cc Tue Dec 10 21:54:48 2013 +0200 +++ b/dcraw.cc Sun Dec 15 21:37:23 2013 +0200 @@ -516,6 +516,17 @@ swab ((const char *)pixel, (char *)pixel, count*2); /*mingw support UF*/ } +void CLASS read_floats (ushort *pixel, unsigned count) +{ + float* buf = (float*) malloc(count * 4); + merror(buf, "read_floats()"); + if (fread (buf, 4, count, ifp) < count) derror(); + unsigned i; + for (i = 0; i < count; i++) + pixel[i] = CLIP(buf[i] * bright); + free(buf); +} + void CLASS canon_600_fixed_wb (int temp) { static const short mul[4][5] = { @@ -1184,12 +1195,14 @@ pixel = (ushort *) calloc (raw_width * tiff_samples, sizeof *pixel); merror (pixel, "packed_dng_load_raw()"); for (row=0; row < raw_height; row++) { - if (tiff_bps == 16) + if (tiff_bps == 32) { + read_floats (pixel, raw_width * tiff_samples); + } else if (tiff_bps == 16) { read_shorts (pixel, raw_width * tiff_samples); - else { - getbits(-1); - for (col=0; col < raw_width * tiff_samples; col++) - pixel[col] = getbits(tiff_bps); + } else { + getbits(-1); + for (col=0; col < raw_width * tiff_samples; col++) + pixel[col] = getbits(tiff_bps); } for (rp=pixel, col=0; col < raw_width; col++) adobe_copy_pixel (row, col, &rp); diff -r 234b908f81ae -r 6f59cc341010 dcraw.h --- a/dcraw.h Tue Dec 10 21:54:48 2013 +0200 +++ b/dcraw.h Sun Dec 15 21:37:23 2013 +0200 @@ -128,6 +128,7 @@ float int_to_float(int i); double getreal(int type); void read_shorts(ushort *pixel, unsigned count); + void read_floats(ushort *pixel, unsigned count); void canon_600_fixed_wb(int temp); int canon_600_color(int ratio[2], int mar); void canon_600_auto_wb(); diff -r 234b908f81ae -r 6f59cc341010 dcraw_api.cc --- a/dcraw_api.cc Tue Dec 10 21:54:48 2013 +0200 +++ b/dcraw_api.cc Sun Dec 15 21:37:23 2013 +0200 @@ -61,7 +61,7 @@ void fuji_rotate_INDI(gushort(**image_p)[4], int *height_p, int *width_p, int *fuji_width_p, const int colors, const double step, void *dcraw); - int dcraw_open(dcraw_data *h, char *filename) + int dcraw_open(dcraw_data *h, char *filename, double raw_exposure) { DCRaw *d = new DCRaw; int c, i; @@ -70,6 +70,7 @@ putenv(const_cast("TZ=UTC")); #endif g_free(d->messageBuffer); + d->bright = pow(2, raw_exposure); d->messageBuffer = NULL; d->lastStatus = DCRAW_SUCCESS; d->verbose = 1; diff -r 234b908f81ae -r 6f59cc341010 dcraw_api.h --- a/dcraw_api.h Tue Dec 10 21:54:48 2013 +0200 +++ b/dcraw_api.h Sun Dec 15 21:37:23 2013 +0200 @@ -55,7 +55,7 @@ dcraw_none_interpolation }; enum { unknown_thumb_type, jpeg_thumb_type, ppm_thumb_type }; - int dcraw_open(dcraw_data *h, char *filename); + int dcraw_open(dcraw_data *h, char *filename, double raw_exposure); int dcraw_load_raw(dcraw_data *h); int dcraw_load_thumb(dcraw_data *h, dcraw_image_data *thumb); int dcraw_finalize_shrink(dcraw_image_data *f, dcraw_data *h, diff -r 234b908f81ae -r 6f59cc341010 ufraw-batch.c --- a/ufraw-batch.c Tue Dec 10 21:54:48 2013 +0200 +++ b/ufraw-batch.c Sun Dec 15 21:37:23 2013 +0200 @@ -65,7 +65,9 @@ int fileIndex = 1; for (; optInd < argc; optInd++, fileIndex++) { argFile = uf_win32_locale_to_utf8(argv[optInd]); - uf = ufraw_open(argFile); + double raw_exposure = MAX(0, cmd.exposure - 3); + cmd.exposure -= raw_exposure; + uf = ufraw_open(argFile, raw_exposure); uf_win32_locale_free(argFile); if (uf == NULL) { exitCode = 1; diff -r 234b908f81ae -r 6f59cc341010 ufraw-gimp.c --- a/ufraw-gimp.c Tue Dec 10 21:54:48 2013 +0200 +++ b/ufraw-gimp.c Sun Dec 15 21:37:23 2013 +0200 @@ -152,7 +152,7 @@ g_free(gtkrcfile); gimp_ui_init("ufraw-gimp", TRUE); - uf = ufraw_open(filename); + uf = ufraw_open(filename, 0); /* if UFRaw fails on jpg/jpeg or tif/tiff then open with GIMP */ if (uf == NULL) { if (!strcasecmp(filename + strlen(filename) - 4, ".jpg") || diff -r 234b908f81ae -r 6f59cc341010 ufraw.c --- a/ufraw.c Tue Dec 10 21:54:48 2013 +0200 +++ b/ufraw.c Sun Dec 15 21:37:23 2013 +0200 @@ -113,7 +113,9 @@ int exitCode = 0; for (; optInd < argc; optInd++) { argFile = uf_win32_locale_to_utf8(argv[optInd]); - uf = ufraw_open(argFile); + double raw_exposure = MAX(0, cmd.exposure - 3); + cmd.exposure -= raw_exposure; + uf = ufraw_open(argFile, raw_exposure); uf_win32_locale_free(argFile); if (uf == NULL) { exitCode = 1; diff -r 234b908f81ae -r 6f59cc341010 ufraw.h --- a/ufraw.h Tue Dec 10 21:54:48 2013 +0200 +++ b/ufraw.h Sun Dec 15 21:37:23 2013 +0200 @@ -377,7 +377,7 @@ #endif /* prototypes for functions in ufraw_ufraw.c */ - ufraw_data *ufraw_open(char *filename); + ufraw_data *ufraw_open(char *filename, double raw_exposure); int ufraw_config(ufraw_data *uf, conf_data *rc, conf_data *conf, conf_data *cmd); int ufraw_load_raw(ufraw_data *uf); int ufraw_load_darkframe(ufraw_data *uf); diff -r 234b908f81ae -r 6f59cc341010 ufraw_chooser.c --- a/ufraw_chooser.c Tue Dec 10 21:54:48 2013 +0200 +++ b/ufraw_chooser.c Sun Dec 15 21:37:23 2013 +0200 @@ -149,7 +149,7 @@ for (list = saveList = gtk_file_chooser_get_filenames(fileChooser); list != NULL; list = g_slist_next(list)) { filename = list->data; - uf = ufraw_open(filename); + uf = ufraw_open(filename, 0); if (uf == NULL) { ufraw_message(UFRAW_REPORT, NULL); continue; diff -r 234b908f81ae -r 6f59cc341010 ufraw_ufraw.c --- a/ufraw_ufraw.c Tue Dec 10 21:54:48 2013 +0200 +++ b/ufraw_ufraw.c Sun Dec 15 21:37:23 2013 +0200 @@ -151,7 +151,7 @@ #endif } -ufraw_data *ufraw_open(char *filename) +ufraw_data *ufraw_open(char *filename, double raw_exposure) { int status; ufraw_data *uf; @@ -220,7 +220,7 @@ return NULL; } raw = g_new(dcraw_data, 1); - status = dcraw_open(raw, filename); + status = dcraw_open(raw, filename, raw_exposure); if (filename != origfilename) { g_file_get_contents(filename, &unzippedBuf, &unzippedBufLen, NULL); g_unlink(filename); @@ -286,7 +286,7 @@ ufraw_close_darkframe(uf->conf); } ufraw_data *dark = uf->conf->darkframe = - ufraw_open(uf->conf->darkframeFile); + ufraw_open(uf->conf->darkframeFile, 0); if (dark == NULL) { ufraw_message(UFRAW_ERROR, _("darkframe error: %s is not a raw file\n"), uf->conf->darkframeFile);