The conversion of RGB channel multipliers to Temperature/Green values
cannot be done without loosing information. Therefore, the RGB values
should prevail over Temperature/Green when they are loaded from an
ID file.

diff --git a/ufraw.h b/ufraw.h
index f143a68..6f037cc 100644
--- a/ufraw.h
+++ b/ufraw.h
@@ -407,7 +407,7 @@ void ufraw_invalidate_darkframe_layer(ufraw_data *uf);
 void ufraw_invalidate_despeckle_layer(ufraw_data *uf);
 void ufraw_invalidate_whitebalance_layer(ufraw_data *uf);
 void ufraw_invalidate_smoothing_layer(ufraw_data *uf);
-int ufraw_set_wb(ufraw_data *uf);
+int ufraw_set_wb(ufraw_data *uf, gboolean interactive);
 void ufraw_auto_expose(ufraw_data *uf);
 void ufraw_auto_black(ufraw_data *uf);
 void ufraw_auto_curve(ufraw_data *uf);
diff --git a/ufraw_settings.cc b/ufraw_settings.cc
index 185cb31..5076ec9 100644
--- a/ufraw_settings.cc
+++ b/ufraw_settings.cc
@@ -342,7 +342,7 @@ void Image::SetWB(const char *mode)
     }
     if (mode != NULL)
         wb.Set(mode);
-    ufraw_set_wb(uf);
+    ufraw_set_wb(uf, TRUE);
     if (wb.IsEqual(uf_spot_wb))
         wb.Set(uf_manual_wb);
 }
diff --git a/ufraw_ufraw.c b/ufraw_ufraw.c
index 2245fb0..d15cd15 100644
--- a/ufraw_ufraw.c
+++ b/ufraw_ufraw.c
@@ -727,7 +727,7 @@ int ufraw_load_raw(ufraw_data *uf)
         UFObject *wbTuning = ufgroup_element(uf->conf->ufobject,
                                              ufWBFineTuning);
         double oldTuning = ufnumber_value(wbTuning);
-        ufraw_set_wb(uf);
+        ufraw_set_wb(uf, FALSE);
         /* Here ufobject's automation goes against us. A change in
          * ChannelMultipliers might change ufWB to uf_manual_wb.
          * So we need to change it back. */
@@ -2015,7 +2015,7 @@ void ufraw_invalidate_smoothing_layer(ufraw_data *uf)
     ufraw_invalidate_layer(uf, ufraw_first_phase);
 }
 
-int ufraw_set_wb(ufraw_data *uf)
+int ufraw_set_wb(ufraw_data *uf, gboolean interactive)
 {
     dcraw_data *raw = uf->raw;
     double rgbWB[3];
@@ -2032,38 +2032,40 @@ int ufraw_set_wb(ufraw_data *uf)
     /* For uf_manual_wb we calculate chanMul from the temperature/green. */
     /* For all other it is the other way around. */
     if (ufarray_is_equal(wb, uf_manual_wb)) {
-        double chanMulArray[4] = {1, 1, 1, 1 };
-        Temperature_to_RGB(ufnumber_value(temperature), rgbWB);
-        rgbWB[1] = rgbWB[1] / ufnumber_value(green);
-        /* Suppose we shot a white card at some temperature:
-         * rgbWB[3] = rgb_cam[3][4] * preMul[4] * camWhite[4]
-         * Now we want to make it white (1,1,1), so we replace preMul
-         * with chanMul, which is defined as:
-         * chanMul[4][4] = cam_rgb[4][3] * (1/rgbWB[3][3]) * rgb_cam[3][4]
-         *             * preMul[4][4]
-         * We "upgraded" preMul, chanMul and rgbWB to diagonal matrices.
-         * This allows for the manipulation:
-         * (1/chanMul)[4][4] = (1/preMul)[4][4] * cam_rgb[4][3] * rgbWB[3][3]
-         *             * rgb_cam[3][4]
-         * We use the fact that rgb_cam[3][4] * (1,1,1,1) = (1,1,1) and get:
-         * (1/chanMul)[4] = (1/preMul)[4][4] * cam_rgb[4][3] * rgbWB[3]
-         */
-        if (uf->raw_color) {
-            /* If there is no color matrix it is simple */
-            if (uf->colors > 1)
-                for (c = 0; c < 3; c++)
-                    chanMulArray[c] = raw->pre_mul[c] / rgbWB[c];
-            ufnumber_array_set(chanMul, chanMulArray);
-        } else {
-            for (c = 0; c < uf->colors; c++) {
-                double chanMulInv = 0;
-                for (cc = 0; cc < 3; cc++)
-                    chanMulInv += 1 / raw->pre_mul[c] * raw->cam_rgb[c][cc]
-                                  * rgbWB[cc];
-                chanMulArray[c] = 1 / chanMulInv;
-            }
-            ufnumber_array_set(chanMul, chanMulArray);
-        }
+       if (interactive) {
+           double chanMulArray[4] = {1, 1, 1, 1 };
+           Temperature_to_RGB(ufnumber_value(temperature), rgbWB);
+           rgbWB[1] = rgbWB[1] / ufnumber_value(green);
+           /* Suppose we shot a white card at some temperature:
+            * rgbWB[3] = rgb_cam[3][4] * preMul[4] * camWhite[4]
+            * Now we want to make it white (1,1,1), so we replace preMul
+            * with chanMul, which is defined as:
+            * chanMul[4][4] = cam_rgb[4][3] * (1/rgbWB[3][3]) * rgb_cam[3][4]
+            *          * preMul[4][4]
+            * We "upgraded" preMul, chanMul and rgbWB to diagonal matrices.
+            * This allows for the manipulation:
+            * (1/chanMul)[4][4] = (1/preMul)[4][4] * cam_rgb[4][3] * 
rgbWB[3][3]
+            *          * rgb_cam[3][4]
+            * We use the fact that rgb_cam[3][4] * (1,1,1,1) = (1,1,1) and get:
+            * (1/chanMul)[4] = (1/preMul)[4][4] * cam_rgb[4][3] * rgbWB[3]
+            */
+           if (uf->raw_color) {
+               /* If there is no color matrix it is simple */
+               if (uf->colors > 1)
+                   for (c = 0; c < 3; c++)
+                       chanMulArray[c] = raw->pre_mul[c] / rgbWB[c];
+               ufnumber_array_set(chanMul, chanMulArray);
+           } else {
+               for (c = 0; c < uf->colors; c++) {
+                   double chanMulInv = 0;
+                   for (cc = 0; cc < 3; cc++)
+                       chanMulInv += 1 / raw->pre_mul[c] * raw->cam_rgb[c][cc]
+                                     * rgbWB[cc];
+                   chanMulArray[c] = 1 / chanMulInv;
+               }
+               ufnumber_array_set(chanMul, chanMulArray);
+           }
+       }
         ufnumber_set(wbTuning, 0);
         return UFRAW_SUCCESS;
     }
@@ -2174,7 +2176,7 @@ int ufraw_set_wb(ufraw_data *uf)
                 ufnumber_array_set(chanMul, wb_preset[lastTuning].channel);
             } else {
                 ufobject_set_string(wb, uf_manual_wb);
-                ufraw_set_wb(uf);
+                ufraw_set_wb(uf, interactive);
                 return UFRAW_WARNING;
             }
         }
-- 
Frank

------------------------------------------------------------------------------
_______________________________________________
ufraw-devel mailing list
ufraw-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ufraw-devel

Reply via email to