From: Udi F. <udi...@us...> - 2006-06-28 23:08:15
|
Update of /cvsroot/ufraw/ufraw In directory sc8-pr-cvs8.sourceforge.net:/tmp/cvs-serv11728 Modified Files: ufraw-batch.c ufraw.c ufraw.h ufraw_conf.c ufraw_ufraw.c Log Message: Add the --darkframe option for subtracting a raw darkframe image. Based on a patch by Kevin Vacit Index: ufraw.h =================================================================== RCS file: /cvsroot/ufraw/ufraw/ufraw.h,v retrieving revision 1.28 retrieving revision 1.29 diff -C2 -d -r1.28 -r1.29 *** ufraw.h 24 Jun 2006 16:20:27 -0000 1.28 --- ufraw.h 28 Jun 2006 23:08:11 -0000 1.29 *************** *** 139,142 **** --- 139,144 ---- int intent; int interpolation; + char darkframeFile[max_path]; + struct ufraw_struct *darkframe; /* SAVE options */ *************** *** 170,174 **** } image_data; ! typedef struct { char filename[max_path]; int predictateHeight, predictateWidth, rgbMax, colors, raw_color, useMatrix; --- 172,176 ---- } image_data; ! typedef struct ufraw_struct { char filename[max_path]; int predictateHeight, predictateWidth, rgbMax, colors, raw_color, useMatrix; *************** *** 201,204 **** --- 203,207 ---- int ufraw_config(ufraw_data *uf, conf_data *rc, conf_data *conf,conf_data *cmd); int ufraw_load_raw(ufraw_data *uf); + ufraw_data *ufraw_load_darkframe(char *darkframeFilename); int ufraw_convert_image(ufraw_data *uf); void ufraw_close(ufraw_data *uf); Index: ufraw_conf.c =================================================================== RCS file: /cvsroot/ufraw/ufraw/ufraw_conf.c,v retrieving revision 1.26 retrieving revision 1.27 diff -C2 -d -r1.26 -r1.27 *** ufraw_conf.c 24 Jun 2006 16:20:27 -0000 1.26 --- ufraw_conf.c 28 Jun 2006 23:08:11 -0000 1.27 *************** *** 59,63 **** 0, /* intent */ ahd_interpolation, /* interpolation */ ! /* Save options */ "", "", "", /* inputFilename, outputFilename, outputPath */ --- 59,63 ---- 0, /* intent */ ahd_interpolation, /* interpolation */ ! "", NULL, /* darkframeFile, darkframe */ /* Save options */ "", "", "", /* inputFilename, outputFilename, outputPath */ *************** *** 446,449 **** --- 446,451 ---- if (!strcmp("Make", element)) g_strlcpy(c->make, temp, max_name); if (!strcmp("Model", element)) g_strlcpy(c->model, temp, max_name); + if (!strcmp("DarkframeFile", element)) + g_strlcpy(c->darkframeFile, temp, max_path); if (!strcmp("ProfilePath", element)) { char *utf8 = g_filename_from_utf8(temp, -1, NULL, NULL, NULL); *************** *** 824,827 **** --- 826,832 ---- buf = uf_markup_buf(buf, "<Model>%s</Model>\n", c->model); if (IDFilename!=NULL) { + if (strcmp(c->darkframeFile, conf_default.darkframeFile)!=0) + buf = uf_markup_buf(buf, + "<DarkframeFile>%s</DarkframeFile>\n", c->darkframeFile); buf = uf_markup_buf(buf, "<Timestamp>%s</Timestamp>\n", c->timestamp); buf = uf_markup_buf(buf, "<ISOSpeed>%d</ISOSpeed>\n", *************** *** 843,846 **** --- 848,852 ---- g_free(utf8); } + /* As long as darkframe is not in the GUI we save it only to ID files.*/ } buf = uf_markup_buf(buf, "</UFRaw>\n"); *************** *** 893,896 **** --- 899,903 ---- dst->autoBlack = src->autoBlack; dst->unclip = src->unclip; + g_strlcpy(dst->darkframeFile, src->darkframeFile, max_path); /* We only copy the current BaseCurve */ if (src->BaseCurveIndex<=camera_curve) { *************** *** 1044,1047 **** --- 1051,1058 ---- if (cmd->type>=0) conf->type = cmd->type; if (cmd->createID>=0) conf->createID = cmd->createID; + if (strlen(cmd->darkframeFile)>0) + g_strlcpy(conf->darkframeFile, cmd->darkframeFile, max_path); + if (cmd->darkframe!=NULL) + conf->darkframe = cmd->darkframe; if (strlen(cmd->outputPath)>0) g_strlcpy(conf->outputPath, cmd->outputPath, max_path); *************** *** 1124,1127 **** --- 1135,1139 ---- "--out-path=PATH PATH for output file (default use input file's path).\n" "--output=FILE Output file name, use '-' to output to stdout.\n" + "--darkframe=FILE Use FILE for raw darkframe subtraction.\n" "--overwrite Overwrite existing files without asking (default no).\n" "\n" *************** *** 1186,1190 **** char *baseCurveName=NULL, *baseCurveFile=NULL, *curveName=NULL, *curveFile=NULL, *outTypeName=NULL, ! *createIDName=NULL, *outPath=NULL, *output=NULL, *conf=NULL, *interpolationName=NULL; static struct option options[] = { {"wb", 1, 0, 'w'}, --- 1198,1203 ---- char *baseCurveName=NULL, *baseCurveFile=NULL, *curveName=NULL, *curveFile=NULL, *outTypeName=NULL, ! *createIDName=NULL, *outPath=NULL, *output=NULL, *conf=NULL, ! *interpolationName=NULL, *darkframeFile=NULL; static struct option options[] = { {"wb", 1, 0, 'w'}, *************** *** 1208,1211 **** --- 1221,1225 ---- {"out-path", 1, 0, 'p'}, {"output", 1, 0, 'o'}, + {"darkframe",1,0,'a'}, {"conf", 1, 0, 'C'}, /* Binary flags that don't have a value are here at the end */ *************** *** 1228,1232 **** &cmd->exposure, &cmd->black, &interpolationName, &cmd->shrink, &cmd->size, &cmd->compression, ! &outTypeName, &createIDName, &outPath, &output, &conf }; cmd->autoExposure = disabled_state; cmd->autoBlack = disabled_state; --- 1242,1246 ---- &cmd->exposure, &cmd->black, &interpolationName, &cmd->shrink, &cmd->size, &cmd->compression, ! &outTypeName, &createIDName, &outPath, &output, &darkframeFile, &conf }; cmd->autoExposure = disabled_state; cmd->autoBlack = disabled_state; *************** *** 1293,1296 **** --- 1307,1311 ---- case 'p': case 'o': + case 'a': case 'C': *(char **)optPointer[index] = optarg; *************** *** 1517,1520 **** --- 1532,1546 ---- g_strlcpy(cmd->outputFilename, output, max_path); } + g_strlcpy(cmd->darkframeFile, "", max_path); + if (darkframeFile!=NULL) { + if (*argc-optind>1) { + ufraw_message(UFRAW_ERROR, "can have only 1 darkframe"); + return -1; + } + char *df = uf_file_set_absolute(darkframeFile); + cmd->darkframe = ufraw_load_darkframe(df); + g_strlcpy(cmd->darkframeFile, df, max_path); + g_free(df); + } /* cmd->inputFilename is used to store the conf file */ g_strlcpy(cmd->inputFilename, "", max_path); Index: ufraw_ufraw.c =================================================================== RCS file: /cvsroot/ufraw/ufraw/ufraw_ufraw.c,v retrieving revision 1.51 retrieving revision 1.52 diff -C2 -d -r1.51 -r1.52 *** ufraw_ufraw.c 24 Jun 2006 16:20:28 -0000 1.51 --- ufraw_ufraw.c 28 Jun 2006 23:08:11 -0000 1.52 *************** *** 177,180 **** --- 177,207 ---- } + ufraw_data *ufraw_load_darkframe(char *darkframeFile) + { + ufraw_data *uf; + if (strlen(darkframeFile)>0) { + uf = ufraw_open(darkframeFile); + if (!uf){ + ufraw_message(UFRAW_ERROR, + "darkframe error: %s is not a raw file\n", darkframeFile); + return NULL; + } + uf->conf = g_new(conf_data, 1); + *uf->conf = conf_default; + /* disable all auto settings on darkframe */ + uf->conf->autoExposure = disabled_state; + uf->conf->autoBlack = disabled_state; + if (ufraw_load_raw(uf)==UFRAW_SUCCESS){ + ufraw_message(UFRAW_BATCH_MESSAGE, "using darkframe %s\n", + uf->filename); + return uf; + } + else + ufraw_message(UFRAW_ERROR, "error loading darkframe %s\n", + uf->filename); + } + return NULL; + } + int ufraw_config(ufraw_data *uf, conf_data *rc, conf_data *conf, conf_data *cmd) { *************** *** 257,261 **** 1/uf->conf->shutter); else ! g_snprintf(uf->conf->shutterText, max_name, "%0.1f s", uf->conf->shutter); uf->conf->aperture = raw->aperture; --- 284,288 ---- 1/uf->conf->shutter); else ! g_snprintf(uf->conf->shutterText, max_name, "%0.1f s", uf->conf->shutter); uf->conf->aperture = raw->aperture; *************** *** 283,287 **** fseek(raw->ifp, pos, SEEK_SET); if (nc.m_numAnchors<2) nc = conf_default.BaseCurve[0]; ! g_strlcpy(nc.name, uf->conf->BaseCurve[custom_curve].name, max_name); uf->conf->BaseCurve[custom_curve] = nc; --- 310,314 ---- fseek(raw->ifp, pos, SEEK_SET); if (nc.m_numAnchors<2) nc = conf_default.BaseCurve[0]; ! g_strlcpy(nc.name, uf->conf->BaseCurve[custom_curve].name, max_name); uf->conf->BaseCurve[custom_curve] = nc; *************** *** 299,303 **** if (!strncmp(buf, "CS ", sizeof(buf))) use_custom_curve=1; ! // down the line, we need to translate the other values into // tone curves! } --- 326,330 ---- if (!strncmp(buf, "CS ", sizeof(buf))) use_custom_curve=1; ! // down the line, we need to translate the other values into // tone curves! } *************** *** 321,328 **** uf->conf->BaseCurveIndex = linear_curve; } ! return UFRAW_SUCCESS; } int ufraw_load_raw(ufraw_data *uf) { --- 348,389 ---- uf->conf->BaseCurveIndex = linear_curve; } ! /* Using DarkframeFile from the configuration is disabled since we still ! * cannot open two raw files simultaniously */ ! /* ! if (strcmp(uf->conf->darkframeFile, cmd->darkframeFile)!=0) ! uf->conf->darkframe = ufraw_load_darkframe(uf->conf->darkframeFile); ! */ return UFRAW_SUCCESS; } + void ufraw_substract_darkframe(ufraw_data *uf) + { + dcraw_data *df = uf->conf->darkframe->raw; + dcraw_data *org = uf->raw; + int i, cl; + + if (org->raw.width!=df->raw.width && + org->raw.width!=df->raw.width && + org->raw.colors!=df->raw.colors){ + + ufraw_message(UFRAW_SET_WARNING, "incompatible darkframe"); + return; + } + + for( i=0; i<org->raw.height*org->raw.width; i++ ) { + for( cl=0; cl<org->raw.colors; cl++ ){ + org->raw.image[i][cl] = + org->raw.image[i][cl] >= df->raw.image[i][cl] ? + org->raw.image[i][cl] - df->raw.image[i][cl] : + 0; + } + } + org->black = org->black >= df->black ? + org->black - df->black : + 0; + ufraw_message(UFRAW_SET_LOG, "subtracted darkframe '%s'\n", + uf->conf->darkframeFile); + } + int ufraw_load_raw(ufraw_data *uf) { *************** *** 334,340 **** return status; } uf->rgbMax = raw->rgbMax - raw->black; memcpy(uf->rgb_cam, raw->rgb_cam, sizeof uf->rgb_cam); ! if (uf->conf->chanMul[0]<0) ufraw_set_wb(uf); ufraw_auto_expose(uf); --- 395,405 ---- return status; } + /* raw->black can change in ufraw_subtract_darkframe() so we must + * calculate uf->rgbMax first */ uf->rgbMax = raw->rgbMax - raw->black; + if (uf->conf->darkframe!=NULL) + ufraw_substract_darkframe(uf); memcpy(uf->rgb_cam, raw->rgb_cam, sizeof uf->rgb_cam); ! if (uf->conf->chanMul[0]<0) ufraw_set_wb(uf); ufraw_auto_expose(uf); *************** *** 388,392 **** shrink = 2; dcraw_finalize_shrink(&final, raw, shrink); ! uf->image.height = final.height; uf->image.width = final.width; --- 453,457 ---- shrink = 2; dcraw_finalize_shrink(&final, raw, shrink); ! uf->image.height = final.height; uf->image.width = final.width; *************** *** 597,601 **** rgbWB[c] = 0; for (cc=0; cc<raw->colors; cc++) ! rgbWB[c] += raw->rgb_cam[c][cc] * raw->pre_mul[cc] / uf->conf->chanMul[cc]; } --- 662,666 ---- rgbWB[c] = 0; for (cc=0; cc<raw->colors; cc++) ! rgbWB[c] += raw->rgb_cam[c][cc] * raw->pre_mul[cc] / uf->conf->chanMul[cc]; } Index: ufraw-batch.c =================================================================== RCS file: /cvsroot/ufraw/ufraw/ufraw-batch.c,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** ufraw-batch.c 25 Jan 2006 06:20:15 -0000 1.4 --- ufraw-batch.c 28 Jun 2006 23:08:11 -0000 1.5 *************** *** 65,68 **** --- 65,70 ---- ufraw_message(UFRAW_WARNING, "no input file, nothing to do."); } + cmd.darkframe=ufraw_load_darkframe(cmd.darkframeFile); + for (; optInd<argc; optInd++) { uf = ufraw_open(argv[optInd]); *************** *** 83,86 **** --- 85,89 ---- g_free(uf); } + // ufraw_close(cmd.darkframe); exit(0); } Index: ufraw.c =================================================================== RCS file: /cvsroot/ufraw/ufraw/ufraw.c,v retrieving revision 1.17 retrieving revision 1.18 diff -C2 -d -r1.17 -r1.18 *** ufraw.c 25 Jan 2006 06:20:15 -0000 1.17 --- ufraw.c 28 Jun 2006 23:08:11 -0000 1.18 *************** *** 96,103 **** --- 96,106 ---- } } + cmd.darkframe=ufraw_load_darkframe(cmd.darkframeFile); + if (optInd==argc) { status = ufraw_config(NULL, &rc, &conf, &cmd); if (status==UFRAW_ERROR) exit(1); ufraw_chooser(&rc, NULL); + // ufraw_close(cmd.darkframe); exit(0); } *************** *** 108,111 **** --- 111,115 ---- if (status==UFRAW_ERROR) exit(1); ufraw_chooser(&rc, argv[optInd]); + // ufraw_close(cmd.darkframe); exit(0); } *************** *** 124,127 **** --- 128,132 ---- if (dummyWindow!=NULL) gtk_widget_destroy(dummyWindow); + // ufraw_close(cmd.darkframe); exit(0); } |