Hi,
I join some patches to be applied to rawstudio-svn-2079.
The toolbox patch add spinbuttons to the sliders, as many users asked
for it.
Also it set the default value for tint to 1.0, don't know if this is a
problem only for me, my raw files appears way to reddish...
The x3f patch permit auto rotation of x3f files according to the x3f
header's rotation field. It also add a check in dcraw.cc to be sure x3f
pixels values do not exceed 4095. Surely this check must be done
somewhere else (to not modify dcraw.cc), but it seemed to me the
easiest way for now, as my computing skills are not so good.
It also add two new fields to the metadata struct: exposure and
sharpness, as those are defined in the x3f header.
Plus I tried to get the extended data correctly loaded, so that work
done with Sigma Photo Pro could be reused in rawstudio. the result is
truly not exact, but I will try to enhance this.
TODO:
- I can't save as jpeg anymore, as the jpeg writer tries to write exif
datas, but x3f's exif are not well recognized by libexiv2.
- I would like to be able to store the corrections applied in rawstudio
directly in the x3f file, as extended data permit this.
- I would like to try to implement the X3FillLight function.
- I would also like to implement a better white balance correction for
x3f files.
Regards,
Ille
diff -urN rawstudio-svn2079.orig/src/rs-curve.c rawstudio-svn2079/src/rs-curve.c
--- rawstudio-svn2079.orig/src/rs-curve.c 2008-10-28 04:15:03.000000000 +0100
+++ rawstudio-svn2079/src/rs-curve.c 2008-11-27 01:08:19.000000000 +0100
@@ -656,7 +656,7 @@
gint x = (gint)(knots[2*curve->active_knot + 0]*width);
gint y = (gint)(height*(1-knots[2*curve->active_knot + 1]));
gdk_gc_set_rgb_fg_color(gc, &red);
- gdk_draw_rectangle(window, gc, FALSE, x-3, y-3, 6, 6);
+ gdk_draw_rectangle(window, gc, FALSE, x-4, y-4, 8, 8);
}
g_free(knots);
diff -urN rawstudio-svn2079.orig/src/rs-settings.c rawstudio-svn2079/src/rs-settings.c
--- rawstudio-svn2079.orig/src/rs-settings.c 2008-10-28 04:15:03.000000000 +0100
+++ rawstudio-svn2079/src/rs-settings.c 2008-11-27 02:33:41.000000000 +0100
@@ -93,7 +93,7 @@
settings->warmth = 0.0;
if (mask & MASK_TINT)
- settings->tint = 0.0;
+ settings->tint = 1.0;
if (mask & MASK_SHARPEN)
settings->sharpen = 0.0;
diff -urN rawstudio-svn2079.orig/src/toolbox.c rawstudio-svn2079/src/toolbox.c
--- rawstudio-svn2079.orig/src/toolbox.c 2008-10-28 04:15:03.000000000 +0100
+++ rawstudio-svn2079/src/toolbox.c 2008-11-27 01:09:11.000000000 +0100
@@ -208,7 +208,7 @@
static GtkWidget *
gui_make_scale_from_adj(RSSettings *settings, gulong settings_signal_id, GCallback cb, GtkAdjustment *adj, RSSettingsMask mask)
{
- GtkWidget *hscale, *box, *rimage, *revent;
+ GtkWidget *hscale, *box, *rimage, *revent, *spin;
struct cb_carrier *rc = g_malloc(sizeof(struct cb_carrier));
rc->obj = G_OBJECT(adj);
rc->mask = mask;
@@ -222,6 +222,13 @@
gtk_scale_set_value_pos( GTK_SCALE(hscale), GTK_POS_LEFT);
gtk_scale_set_digits(GTK_SCALE(hscale), 2);
+
+ /* or the spin_button, we will need a callback to bind it to the
+ hscale so that changes get reflected by the other. Should I use
+ the same adj? */
+ spin=gtk_spin_button_new((GtkAdjustment *)adj,0.01,2);
+ gtk_widget_set_size_request(spin,60,25);
+/* g_signal_connect(); */
rimage = gtk_image_new_from_stock(GTK_STOCK_REFRESH, GTK_ICON_SIZE_MENU);
revent = gtk_event_box_new();
@@ -233,7 +240,8 @@
G_CALLBACK (gui_adj_reset_callback), rc);
gtk_box_pack_start (GTK_BOX (box), hscale, TRUE, TRUE, 0);
- gtk_box_pack_start (GTK_BOX (box), revent, FALSE, TRUE, 0);
+ gtk_box_pack_start (GTK_BOX (box), spin, FALSE, FALSE, 2);
+ gtk_box_pack_start (GTK_BOX (box), revent, FALSE, TRUE, 2);
return(box);
}
diff -urN rawstudio-svn2079.orig/po/fr.po rawstudio-svn2079/po/fr.po
--- rawstudio-svn2079.orig/po/fr.po 2008-11-13 04:15:34.000000000 +0100
+++ rawstudio-svn2079/po/fr.po 2008-11-27 02:44:46.000000000 +0100
@@ -761,7 +761,7 @@
#: src/toolbox.c:504 src/rs-actions.c:353
msgid "Hue"
-msgstr "Teinte"
+msgstr "Hue"
#: src/toolbox.c:505 src/rs-actions.c:354
msgid "Contrast"
diff -urN rawstudio-svn2079.orig/src/dcraw.cc rawstudio-svn2079/src/dcraw.cc
--- rawstudio-svn2079.orig/src/dcraw.cc 2008-10-28 04:15:03.000000000 +0100
+++ rawstudio-svn2079/src/dcraw.cc 2008-11-27 01:25:58.000000000 +0100
@@ -3387,6 +3387,7 @@
FORC3 {
i = image[row*width+col][c] + ipix[c] - sum;
if (i < 0) i = 0;
+ if (i > 4095) i = 4095;
image[row*width+col][c] = i;
}
}
diff -urN rawstudio-svn2079.orig/src/rawstudio.c rawstudio-svn2079/src/rawstudio.c
--- rawstudio-svn2079.orig/src/rawstudio.c 2008-10-28 04:15:03.000000000 +0100
+++ rawstudio-svn2079/src/rawstudio.c 2008-11-27 01:13:01.000000000 +0100
@@ -106,7 +106,7 @@
REGISTER_FILETYPE(".srf", _("Sony"), rs_image16_open_dcraw, rs_tiff_load_meta);
REGISTER_FILETYPE(".kdc", _("Kodak"), rs_image16_open_dcraw, rs_tiff_load_meta);
REGISTER_FILETYPE(".dcr", _("Kodak"), rs_image16_open_dcraw, rs_tiff_load_meta);
- REGISTER_FILETYPE(".x3f", _("Sigma"), rs_image16_open_dcraw, rs_x3f_load_meta);
+ REGISTER_FILETYPE(".x3f", _("Sigma"), rs_image16_open_x3f, rs_x3f_load_meta);
REGISTER_FILETYPE(".orf", _("Olympus"), rs_image16_open_dcraw, rs_tiff_load_meta);
REGISTER_FILETYPE(".raw", _("Panasonic raw"), rs_image16_open_dcraw, rs_tiff_load_meta);
REGISTER_FILETYPE(".pef", _("Pentax raw"), rs_image16_open_dcraw, rs_tiff_load_meta);
diff -urN rawstudio-svn2079.orig/src/rs-metadata.c rawstudio-svn2079/src/rs-metadata.c
--- rawstudio-svn2079.orig/src/rs-metadata.c 2008-10-28 04:15:03.000000000 +0100
+++ rawstudio-svn2079/src/rs-metadata.c 2008-11-27 01:13:01.000000000 +0100
@@ -95,6 +95,8 @@
metadata->cam_mul[0] = -1.0;
metadata->contrast = -1.0;
metadata->saturation = -1.0;
+ metadata->exposure = 0.0;
+ metadata->sharpness = -1.0;
metadata->color_tone = -1.0;
metadata->focallength = -1;
for(i=0;i<4;i++)
diff -urN rawstudio-svn2079.orig/src/rs-metadata.h rawstudio-svn2079/src/rs-metadata.h
--- rawstudio-svn2079.orig/src/rs-metadata.h 2008-10-28 04:15:03.000000000 +0100
+++ rawstudio-svn2079/src/rs-metadata.h 2008-11-27 01:13:01.000000000 +0100
@@ -74,6 +74,8 @@
gdouble contrast;
gdouble saturation;
gdouble color_tone;
+ gdouble exposure;
+ gdouble sharpness;
gshort focallength;
RS_MATRIX4 adobe_coeff;
GdkPixbuf *thumbnail;
diff -urN rawstudio-svn2079.orig/src/rs-photo.c rawstudio-svn2079/src/rs-photo.c
--- rawstudio-svn2079.orig/src/rs-photo.c 2008-10-28 04:15:03.000000000 +0100
+++ rawstudio-svn2079/src/rs-photo.c 2008-11-27 01:13:01.000000000 +0100
@@ -553,9 +553,12 @@
{
/* White balance */
if (!(mask & MASK_WB))
- if (!rs_photo_set_wb_from_camera(photo, i))
- rs_photo_set_wb_auto(photo, i);
-
+ if (!rs_photo_set_wb_from_camera(photo, i)) {
+ if (photo->metadata->make & MAKE_SIGMA)
+ rs_photo_set_wb_from_mul(photo, i, photo->metadata->cam_mul);
+ else
+ rs_photo_set_wb_auto(photo, i);
+ }
/* Contrast */
if (!(mask & MASK_CONTRAST) && (photo->metadata->contrast != -1.0))
rs_photo_set_contrast(photo, i, photo->metadata->contrast);
diff -urN rawstudio-svn2079.orig/src/x3f-meta.c rawstudio-svn2079/src/x3f-meta.c
--- rawstudio-svn2079.orig/src/x3f-meta.c 2008-10-28 04:15:03.000000000 +0100
+++ rawstudio-svn2079/src/x3f-meta.c 2008-11-27 10:13:25.000000000 +0100
@@ -143,25 +144,47 @@
if ((file.version_major == 2) && (file.version_minor == 2))
{
- /* Copy all data types in one go */
- raw_strcpy(rawfile, G_STRUCT_OFFSET(X3F_FILE, extended_data_types), file.extended_data_types, 32);
+
+ meta->cam_mul[0] = .97;
+ meta->cam_mul[1] = 1;
+ meta->cam_mul[2] = 1;
+
+ /* Copy all data types in one go */
+ raw_strcpy(rawfile, G_STRUCT_OFFSET(X3F_FILE, extended_data_types), file.extended_data_types, 32);
for(i=0;i<32;i++)
{
/* This could have endianness problems! */
raw_get_float(rawfile, G_STRUCT_OFFSET(X3F_FILE, extended_data)+i*4, &file.extended_data[i]);
switch (file.extended_data_types[i])
{
case X3F_EXTENDED_DATA_COLOR_ADJUST_RED:
- meta->cam_mul[0] = file.extended_data[i];
+ meta->cam_mul[0] += 1/file.extended_data[i];
break;
case X3F_EXTENDED_DATA_COLOR_ADJUST_GREEN:
- meta->cam_mul[1] = file.extended_data[i];
- meta->cam_mul[3] = file.extended_data[i];
+ meta->cam_mul[1] += 1/file.extended_data[i];
+ meta->cam_mul[3] += 1/file.extended_data[i];
break;
case X3F_EXTENDED_DATA_COLOR_ADJUST_BLUE:
- meta->cam_mul[2] = file.extended_data[i];
+ meta->cam_mul[2] += 1/file.extended_data[i];
+ break;
+ case X3F_EXTENDED_DATA_SATURATION_ADJUST:
+ meta->saturation = (file.extended_data[i]+2)*3/4;
break;
+ case X3F_EXTENDED_DATA_EXPOSURE_ADJUST:
+ meta->exposure = (file.extended_data[i]+2)*3/4;
+ break;
+ case X3F_EXTENDED_DATA_CONTRAST_ADJUST:
+ /* Ok, SPP assume the range is from -2 to 2
+ but RS expect a range from 0 to 3
+ Also 0 in RS means no contrast, as -2 in SPP means
+ half contrast (equivalent for 3 and 2*/
+ meta->contrast = (file.extended_data[i]+2)*1.5/4;
+ break;
+ case X3F_EXTENDED_DATA_SHARPNESS_ADJUST:
+ if (file.extended_data[i]>0)
+ meta->sharpness = (file.extended_data[i]+2)*10/4;
+ break;
default:
break;
}
@@ -277,6 +302,14 @@
pixbuf = gdk_pixbuf_new_from_data(raw_get_map(rawfile)+start, GDK_COLORSPACE_RGB, FALSE, 8,
width, height, rowstride, NULL, NULL);
+ if (file.rotation > 0)
+ {
+ /* gdk_pixbuf_rotate_simple rotates trigonometric */
+ pixbuf2=gdk_pixbuf_rotate_simple(pixbuf,360-file.rotation);
+ g_object_unref(pixbuf);
+ pixbuf=pixbuf2;
+ }
+
if (pixbuf)
{
ratio = ((gdouble) gdk_pixbuf_get_width(pixbuf))/((gdouble) gdk_pixbuf_get_height(pixbuf));
@@ -291,3 +324,30 @@
raw_close_file(rawfile);
return;
}
+
+/* DCraw does not read the rotation field stored in the x3f file so we
+ should take care of this */
+
+RS_IMAGE16 *rs_image16_open_x3f(const gchar *filename,
+ gboolean half_size)
+{
+ RS_IMAGE16 *photo;
+ RAWFILE *rawfile;
+ guint rotation;
+
+ // First load the x3f with dcraw
+ photo=rs_image16_open_dcraw(filename,half_size);
+
+ rawfile = raw_open_file(filename);
+ if (!rawfile) return(NULL);
+ if (!raw_strcmp(rawfile, 0, "FOVb", 4))
+ {
+ raw_close_file(rawfile);
+ return(NULL);
+ }
+
+ raw_set_byteorder(rawfile, 0x4949); /* x3f is always little endian */
+ raw_get_uint(rawfile,36,&rotation);
+ rs_image16_orientation(photo, rotation/90);
+ return photo;
+}
diff -urN rawstudio-svn2079.orig/src/x3f-meta.h rawstudio-svn2079/src/x3f-meta.h
--- rawstudio-svn2079.orig/src/x3f-meta.h 2008-10-28 04:15:03.000000000 +0100
+++ rawstudio-svn2079/src/x3f-meta.h 2008-11-27 01:13:01.000000000 +0100
@@ -18,3 +18,4 @@
*/
extern void rs_x3f_load_meta(const gchar *filename, RSMetadata *meta);
+RS_IMAGE16 *rs_image16_open_x3f(const gchar *filename, gboolean half_size);
_______________________________________________
Rawstudio-dev mailing list
[email protected]
http://rawstudio.org/cgi-bin/mailman/listinfo/rawstudio-dev