From: Udi F. <udi...@us...> - 2007-04-26 21:09:29
|
Update of /cvsroot/ufraw/ufraw In directory sc8-pr-cvs8.sourceforge.net:/tmp/cvs-serv7597 Modified Files: ufraw.h ufraw_conf.c ufraw_embedded.c ufraw_icons.c ufraw_preview.c ufraw_ufraw.c Log Message: Added rotate/flip support, based on patch by Bruce Guenter. Icons taken from gthumb sources, which are also GPLv2. Index: ufraw_embedded.c =================================================================== RCS file: /cvsroot/ufraw/ufraw/ufraw_embedded.c,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** ufraw_embedded.c 25 Dec 2006 17:50:43 -0000 1.9 --- ufraw_embedded.c 26 Apr 2007 21:09:13 -0000 1.10 *************** *** 52,56 **** fseek(raw->ifp, raw->thumbOffset, SEEK_SET); ! if ( uf->conf->shrink<2 && uf->conf->size==0 && uf->conf->flip==0 && uf->conf->type==embedded_jpeg_type && raw->thumbType==jpeg_thumb_type) { --- 52,56 ---- fseek(raw->ifp, raw->thumbOffset, SEEK_SET); ! if ( uf->conf->shrink<2 && uf->conf->size==0 && uf->conf->orientation==0 && uf->conf->type==embedded_jpeg_type && raw->thumbType==jpeg_thumb_type) { *************** *** 175,184 **** } } ! if (uf->conf->flip!=0) { unsigned r, nr, c, nc, tmp; int m; unsigned height = dstHeight; unsigned width = dstWidth; ! if (uf->conf->flip & 4) { tmp = height; height = width; --- 175,184 ---- } } ! if (uf->conf->orientation!=0) { unsigned r, nr, c, nc, tmp; int m; unsigned height = dstHeight; unsigned width = dstWidth; ! if (uf->conf->orientation & 4) { tmp = height; height = width; *************** *** 187,196 **** unsigned char *newBuffer = g_new(unsigned char, width * height * 3); for (r=0; r<dstHeight; r++) { ! if (uf->conf->flip & 2) nr = dstHeight - r - 1; else nr = r; for (c=0; c<dstWidth; c++) { ! if (uf->conf->flip & 1) nc = dstWidth - c -1; else nc = c; ! if (uf->conf->flip & 4) tmp = nc*width+nr; else tmp = nr*width+nc; for (m=0; m<3; m++) { --- 187,196 ---- unsigned char *newBuffer = g_new(unsigned char, width * height * 3); for (r=0; r<dstHeight; r++) { ! if (uf->conf->orientation & 2) nr = dstHeight - r - 1; else nr = r; for (c=0; c<dstWidth; c++) { ! if (uf->conf->orientation & 1) nc = dstWidth - c -1; else nc = c; ! if (uf->conf->orientation & 4) tmp = nc*width+nr; else tmp = nr*width+nc; for (m=0; m<3; m++) { *************** *** 202,206 **** g_free(uf->thumb.buffer); uf->thumb.buffer = newBuffer; ! if (uf->conf->flip & 4) { dstHeight = height; dstWidth = width; --- 202,206 ---- g_free(uf->thumb.buffer); uf->thumb.buffer = newBuffer; ! if (uf->conf->orientation & 4) { dstHeight = height; dstWidth = width; *************** *** 239,243 **** } } ! if ( uf->conf->shrink<2 && uf->conf->size==0 && uf->conf->flip==0 && uf->conf->type==embedded_jpeg_type && raw->thumbType==jpeg_thumb_type) { --- 239,243 ---- } } ! if ( uf->conf->shrink<2 && uf->conf->size==0 && uf->conf->orientation==0 && uf->conf->type==embedded_jpeg_type && raw->thumbType==jpeg_thumb_type) { Index: ufraw_preview.c =================================================================== RCS file: /cvsroot/ufraw/ufraw/ufraw_preview.c,v retrieving revision 1.83 retrieving revision 1.84 diff -C2 -d -r1.83 -r1.84 *** ufraw_preview.c 31 Mar 2007 18:52:40 -0000 1.83 --- ufraw_preview.c 26 Apr 2007 21:09:13 -0000 1.84 *************** *** 27,30 **** --- 27,31 ---- #include <gtk/gtk.h> #include <glib/gi18n.h> + #include "dcraw_api.h" #include "ufraw.h" #include "curveeditor_widget.h" *************** *** 1150,1153 **** --- 1151,1170 ---- } + static void flip_image(GtkWidget *widget, int flip) + { + preview_data *data = get_preview_data(widget); + + if (data->FreezeDialog) return; + ufraw_flip_image(data->UF, flip); + + if (flip & 4) { + int temp = data->UF->predictedWidth; + data->UF->predictedWidth = data->UF->predictedHeight; + data->UF->predictedHeight = temp; + } + create_base_image(data); + render_preview(data, render_default); + } + GtkWidget *notebook_page_new(GtkNotebook *notebook, char *text, char *icon, GtkTooltips *tooltips) *************** *** 2641,2644 **** --- 2658,2702 ---- /* End of Zoom page */ + /* Start of Orientation page */ + page = notebook_page_new(notebook, _("Orientation"), + NULL, data->ToolTips); + + table = GTK_TABLE(table_with_frame(page, NULL, TRUE)); + + label = gtk_label_new(_("Rotate:")); + gtk_table_attach(table, label, 0, 1, 0, 1, 0, 0, 0, 0); + + button = gtk_button_new(); + gtk_container_add(GTK_CONTAINER(button), gtk_image_new_from_stock( + "rotate-90", GTK_ICON_SIZE_LARGE_TOOLBAR)); + gtk_table_attach(table, button, 1, 2, 0, 1, 0, 0, 0, 0); + g_signal_connect(G_OBJECT(button), "clicked", + G_CALLBACK(flip_image), (gpointer)6); + + button = gtk_button_new(); + gtk_container_add(GTK_CONTAINER(button), gtk_image_new_from_stock( + "rotate-270", GTK_ICON_SIZE_LARGE_TOOLBAR)); + gtk_table_attach(table, button, 2, 3, 0, 1, 0, 0, 0, 0); + g_signal_connect(G_OBJECT(button), "clicked", + G_CALLBACK(flip_image), (gpointer)5); + + label = gtk_label_new(_("Flip:")); + gtk_table_attach(table, label, 0, 1, 1, 2, 0, 0, 0, 0); + + button = gtk_button_new(); + gtk_container_add(GTK_CONTAINER(button), gtk_image_new_from_stock( + "flip-horiz", GTK_ICON_SIZE_LARGE_TOOLBAR)); + gtk_table_attach(table, button, 1, 2, 1, 2, 0, 0, 0, 0); + g_signal_connect(G_OBJECT(button), "clicked", + G_CALLBACK(flip_image), (gpointer)1); + + button = gtk_button_new(); + gtk_container_add(GTK_CONTAINER(button), gtk_image_new_from_stock( + "flip-vert", GTK_ICON_SIZE_LARGE_TOOLBAR)); + gtk_table_attach(table, button, 2, 3, 1, 2, 0, 0, 0, 0); + g_signal_connect(G_OBJECT(button), "clicked", + G_CALLBACK(flip_image), (gpointer)2); + /* End of Orientation page */ + /* Start of EXIF page */ page = notebook_page_new(notebook, _("EXIF"), NULL, NULL); Index: ufraw.h =================================================================== RCS file: /cvsroot/ufraw/ufraw/ufraw.h,v retrieving revision 1.48 retrieving revision 1.49 diff -C2 -d -r1.48 -r1.49 *** ufraw.h 31 Mar 2007 18:52:40 -0000 1.48 --- ufraw.h 26 Apr 2007 21:09:13 -0000 1.49 *************** *** 170,174 **** /* EXIF data */ ! int flip; float iso_speed, shutter, aperture, focal_len; char exifSource[max_name], isoText[max_name], shutterText[max_name], --- 170,174 ---- /* EXIF data */ ! int orientation; float iso_speed, shutter, aperture, focal_len; char exifSource[max_name], isoText[max_name], shutterText[max_name], *************** *** 220,223 **** --- 220,224 ---- int ufraw_convert_image(ufraw_data *uf); void ufraw_close(ufraw_data *uf); + int ufraw_flip_image(ufraw_data *uf, int flip); int ufraw_set_wb(ufraw_data *uf); void ufraw_auto_expose(ufraw_data *uf); Index: ufraw_icons.c =================================================================== RCS file: /cvsroot/ufraw/ufraw/ufraw_icons.c,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** ufraw_icons.c 15 Mar 2007 23:50:56 -0000 1.4 --- ufraw_icons.c 26 Apr 2007 21:09:13 -0000 1.5 *************** *** 82,84 **** --- 82,100 ---- iconset = gtk_icon_set_new_from_pixbuf(pixbuf); gtk_icon_factory_add(factory, "base-curve", iconset); + + pixbuf = gdk_pixbuf_new_from_inline(-1, flip_horiz_24, FALSE, NULL); + iconset = gtk_icon_set_new_from_pixbuf(pixbuf); + gtk_icon_factory_add(factory, "flip-horiz", iconset); + + pixbuf = gdk_pixbuf_new_from_inline(-1, flip_vert_24, FALSE, NULL); + iconset = gtk_icon_set_new_from_pixbuf(pixbuf); + gtk_icon_factory_add(factory, "flip-vert", iconset); + + pixbuf = gdk_pixbuf_new_from_inline(-1, rotate_90_24, FALSE, NULL); + iconset = gtk_icon_set_new_from_pixbuf(pixbuf); + gtk_icon_factory_add(factory, "rotate-90", iconset); + + pixbuf = gdk_pixbuf_new_from_inline(-1, rotate_270_24, FALSE, NULL); + iconset = gtk_icon_set_new_from_pixbuf(pixbuf); + gtk_icon_factory_add(factory, "rotate-270", iconset); } Index: ufraw_conf.c =================================================================== RCS file: /cvsroot/ufraw/ufraw/ufraw_conf.c,v retrieving revision 1.54 retrieving revision 1.55 diff -C2 -d -r1.54 -r1.55 *** ufraw_conf.c 31 Mar 2007 06:18:49 -0000 1.54 --- ufraw_conf.c 26 Apr 2007 21:09:13 -0000 1.55 *************** *** 95,99 **** /* EXIF data */ ! 0, /* flip */ 0.0, 0.0, 0.0, 0.0, /* iso_speed, shutter, aperture, focal_len */ "", "", "", "", /* exifSource, isoText, shutterText, apertureText */ --- 95,99 ---- /* EXIF data */ ! -1, /* orientation */ 0.0, 0.0, 0.0, 0.0, /* iso_speed, shutter, aperture, focal_len */ "", "", "", "", /* exifSource, isoText, shutterText, apertureText */ *************** *** 535,538 **** --- 535,539 ---- g_free(utf8); } + if (!strcmp("Orientation", element)) sscanf(temp, "%d", &c->orientation); if (!strcmp("Shrink", element)) sscanf(temp, "%d", &c->shrink); if (!strcmp("Size", element)) sscanf(temp, "%d", &c->size); *************** *** 918,921 **** --- 919,924 ---- "<DarkframeFile>%s</DarkframeFile>\n", c->darkframeFile); buf = uf_markup_buf(buf, "<Timestamp>%s</Timestamp>\n", c->timestamp); + buf = uf_markup_buf(buf, "<Orientation>%d</Orientation>\n", + c->orientation); buf = uf_markup_buf(buf, "<ISOSpeed>%s</ISOSpeed>\n", c->isoText); buf = uf_markup_buf(buf, "<Shutter>%s</Shutter>\n", c->shutterText); *************** *** 981,984 **** --- 984,988 ---- g_strlcpy(dst->make, src->make, max_name); g_strlcpy(dst->model, src->model, max_name); + dst->orientation = src->orientation; dst->threshold = src->threshold; dst->exposure = src->exposure; Index: ufraw_ufraw.c =================================================================== RCS file: /cvsroot/ufraw/ufraw/ufraw_ufraw.c,v retrieving revision 1.87 retrieving revision 1.88 diff -C2 -d -r1.87 -r1.88 *** ufraw_ufraw.c 31 Mar 2007 18:01:24 -0000 1.87 --- ufraw_ufraw.c 26 Apr 2007 21:09:13 -0000 1.88 *************** *** 376,380 **** /* Check if we are loading an ID file */ if (uf!=NULL) { - uf->LoadingID = FALSE; if (uf->conf!=NULL) { uf->LoadingID = TRUE; --- 376,379 ---- *************** *** 386,389 **** --- 385,389 ---- *uf->conf = tmp; } else { + uf->LoadingID = FALSE; uf->conf = g_new(conf_data, 1); *uf->conf = *rc; *************** *** 448,452 **** g_strlcpy(uf->conf->make, raw->make, max_name); g_strlcpy(uf->conf->model, raw->model, max_name); ! uf->conf->flip = raw->flip; if (uf->exifBuf==NULL) { g_strlcpy(uf->conf->exifSource, "DCRaw", max_name); --- 448,453 ---- g_strlcpy(uf->conf->make, raw->make, max_name); g_strlcpy(uf->conf->model, raw->model, max_name); ! if ( !uf->LoadingID || uf->conf->orientation<0 ) ! uf->conf->orientation = raw->flip; if (uf->exifBuf==NULL) { g_strlcpy(uf->conf->exifSource, "DCRaw", max_name); *************** *** 703,707 **** // preview_progress(uf->widget, _("Loading image"), 0.4); uf->image.image = final.image; ! dcraw_flip_image(&final, raw->flip); uf->image.height = final.height; uf->image.width = final.width; --- 704,708 ---- // preview_progress(uf->widget, _("Loading image"), 0.4); uf->image.image = final.image; ! dcraw_flip_image(&final, uf->conf->orientation); uf->image.height = final.height; uf->image.width = final.width; *************** *** 710,713 **** --- 711,731 ---- } + int ufraw_flip_image(ufraw_data *uf, int flip) + { + const int flipMatrix[8][8] = { + { 0, 1, 2, 3, 4, 5, 6, 7 }, /* No flip */ + { 1, 0, 3, 2, 5, 4, 7, 6 }, /* Flip horizontal */ + { 2, 3, 0, 1, 6, 7, 4, 5 }, /* Flip vertical */ + { 3, 2, 1, 0, 7, 6, 5, 4 }, /* Rotate 180 */ + { 4, 6, 5, 7, 0, 2, 1, 3 }, /* Flip over diagonal "\" */ + { 5, 7, 4, 6, 1, 3, 0, 2 }, /* Rotate 270 */ + { 6, 4, 7, 5, 2, 0, 3, 1 }, /* Rotate 90 */ + { 7, 5, 6, 4, 3, 1, 2, 0 } /* Flip over diagonal "/" */ + }; + uf->conf->orientation = flipMatrix[uf->conf->orientation][flip]; + + return UFRAW_SUCCESS; + } + int ufraw_set_wb(ufraw_data *uf) { |