mirror of https://github.com/GNOME/gimp.git
added a "Don't ask me again" toggle to the EXIF rotation query dialog.
2006-12-22 Sven Neumann <sven@gimp.org> * plug-ins/jpeg/jpeg-exif.c: added a "Don't ask me again" toggle to the EXIF rotation query dialog. Store the user's choice in the "exif-orientation-rotate" parasite. * devel-docs/parasites.txt: document the new global parasite.
This commit is contained in:
parent
64b3361b61
commit
641e1474b8
|
@ -1,3 +1,11 @@
|
||||||
|
2006-12-22 Sven Neumann <sven@gimp.org>
|
||||||
|
|
||||||
|
* plug-ins/jpeg/jpeg-exif.c: added a "Don't ask me again" toggle
|
||||||
|
to the EXIF rotation query dialog. Store the user's choice in the
|
||||||
|
"exif-orientation-rotate" parasite.
|
||||||
|
|
||||||
|
* devel-docs/parasites.txt: document the new global parasite.
|
||||||
|
|
||||||
2006-12-20 Sven Neumann <sven@gimp.org>
|
2006-12-20 Sven Neumann <sven@gimp.org>
|
||||||
|
|
||||||
* configure.in: set variable GIMP_COMMAND depending on whether
|
* configure.in: set variable GIMP_COMMAND depending on whether
|
||||||
|
|
|
@ -157,6 +157,12 @@ Global data follows no strict rules.
|
||||||
The ExifData structure serialized into a character array by
|
The ExifData structure serialized into a character array by
|
||||||
libexif (using exif_data_save_data).
|
libexif (using exif_data_save_data).
|
||||||
|
|
||||||
|
"exif-orientation-rotate" (GLOBAL, PERSISTENT)
|
||||||
|
Whether a load plug-in should automatically rotate the image
|
||||||
|
according to the orientation specified in the EXIF data. This
|
||||||
|
has values "yes" or "no". If the parasite is not set, the
|
||||||
|
plug-in should ask the user what to do.
|
||||||
|
|
||||||
"icc-profile" (IMAGE, PERSISTENT)
|
"icc-profile" (IMAGE, PERSISTENT)
|
||||||
This contains an ICC profile describing the color space the
|
This contains an ICC profile describing the color space the
|
||||||
image was produced in. TIFF images stored in PhotoShop do
|
image was produced in. TIFF images stored in PhotoShop do
|
||||||
|
|
|
@ -49,9 +49,13 @@
|
||||||
#include "libgimp/stdplugins-intl.h"
|
#include "libgimp/stdplugins-intl.h"
|
||||||
|
|
||||||
|
|
||||||
#define THUMBNAIL_SIZE 128
|
#define THUMBNAIL_SIZE 128
|
||||||
|
#define JPEG_EXIF_ROTATE_PARASITE "exif-orientation-rotate"
|
||||||
|
|
||||||
static gboolean jpeg_rotate_query (gint32 image_ID);
|
|
||||||
|
static void jpeg_exif_rotate (gint32 image_ID,
|
||||||
|
gint orientation);
|
||||||
|
static gboolean jpeg_exif_rotate_query (gint32 image_ID);
|
||||||
|
|
||||||
|
|
||||||
/* Replacement for exif_data_new_from_file() to work around
|
/* Replacement for exif_data_new_from_file() to work around
|
||||||
|
@ -112,41 +116,7 @@ jpeg_apply_exif_data_to_image (const gchar *filename,
|
||||||
if ((entry = exif_content_get_entry (exif_data->ifd[EXIF_IFD_0],
|
if ((entry = exif_content_get_entry (exif_data->ifd[EXIF_IFD_0],
|
||||||
EXIF_TAG_ORIENTATION)))
|
EXIF_TAG_ORIENTATION)))
|
||||||
{
|
{
|
||||||
gint orient = exif_get_short (entry->data, byte_order);
|
jpeg_exif_rotate (image_ID, exif_get_short (entry->data, byte_order));
|
||||||
|
|
||||||
if (orient > 1 && orient <= 8 &&
|
|
||||||
load_interactive && jpeg_rotate_query (image_ID))
|
|
||||||
{
|
|
||||||
switch (orient)
|
|
||||||
{
|
|
||||||
case 1: /* standard orientation, do nothing */
|
|
||||||
break;
|
|
||||||
case 2: /* flipped right-left */
|
|
||||||
gimp_image_flip (image_ID, GIMP_ORIENTATION_HORIZONTAL);
|
|
||||||
break;
|
|
||||||
case 3: /* rotated 180 */
|
|
||||||
break;
|
|
||||||
case 4: /* flipped top-bottom */
|
|
||||||
gimp_image_flip (image_ID, GIMP_ORIENTATION_VERTICAL);
|
|
||||||
break;
|
|
||||||
case 5: /* flipped diagonally around '\' */
|
|
||||||
gimp_image_rotate (image_ID, GIMP_ROTATE_90);
|
|
||||||
gimp_image_flip (image_ID, GIMP_ORIENTATION_HORIZONTAL);
|
|
||||||
break;
|
|
||||||
case 6: /* 90 CW */
|
|
||||||
gimp_image_rotate (image_ID, GIMP_ROTATE_90);
|
|
||||||
break;
|
|
||||||
case 7: /* flipped diagonally around '/' */
|
|
||||||
gimp_image_rotate (image_ID, GIMP_ROTATE_90);
|
|
||||||
gimp_image_flip (image_ID, GIMP_ORIENTATION_VERTICAL);
|
|
||||||
break;
|
|
||||||
case 8: /* 90 CCW */
|
|
||||||
gimp_image_rotate (image_ID, GIMP_ROTATE_270);
|
|
||||||
break;
|
|
||||||
default: /* can't happen */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
exif_data_unref (exif_data);
|
exif_data_unref (exif_data);
|
||||||
|
@ -250,13 +220,86 @@ jpeg_setup_exif_for_save (ExifData *exif_data,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
jpeg_exif_rotate (gint32 image_ID,
|
||||||
|
gint orientation)
|
||||||
|
{
|
||||||
|
GimpParasite *parasite;
|
||||||
|
gboolean query = load_interactive;
|
||||||
|
|
||||||
|
if (orientation < 2 || orientation > 8)
|
||||||
|
return;
|
||||||
|
|
||||||
|
parasite = gimp_parasite_find (JPEG_EXIF_ROTATE_PARASITE);
|
||||||
|
|
||||||
|
if (parasite)
|
||||||
|
{
|
||||||
|
if (strncmp (gimp_parasite_data (parasite), "yes",
|
||||||
|
gimp_parasite_data_size (parasite)) == 0)
|
||||||
|
{
|
||||||
|
query = FALSE;
|
||||||
|
}
|
||||||
|
else if (strncmp (gimp_parasite_data (parasite), "no",
|
||||||
|
gimp_parasite_data_size (parasite)) == 0)
|
||||||
|
{
|
||||||
|
gimp_parasite_free (parasite);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
gimp_parasite_free (parasite);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (query && ! jpeg_exif_rotate_query (image_ID))
|
||||||
|
return;
|
||||||
|
|
||||||
|
switch (orientation)
|
||||||
|
{
|
||||||
|
case 1: /* standard orientation, do nothing */
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2: /* flipped right-left */
|
||||||
|
gimp_image_flip (image_ID, GIMP_ORIENTATION_HORIZONTAL);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 3: /* rotated 180 */
|
||||||
|
gimp_image_rotate (image_ID, GIMP_ROTATE_180);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 4: /* flipped top-bottom */
|
||||||
|
gimp_image_flip (image_ID, GIMP_ORIENTATION_VERTICAL);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 5: /* flipped diagonally around '\' */
|
||||||
|
gimp_image_rotate (image_ID, GIMP_ROTATE_90);
|
||||||
|
gimp_image_flip (image_ID, GIMP_ORIENTATION_HORIZONTAL);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 6: /* 90 CW */
|
||||||
|
gimp_image_rotate (image_ID, GIMP_ROTATE_90);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 7: /* flipped diagonally around '/' */
|
||||||
|
gimp_image_rotate (image_ID, GIMP_ROTATE_90);
|
||||||
|
gimp_image_flip (image_ID, GIMP_ORIENTATION_VERTICAL);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 8: /* 90 CCW */
|
||||||
|
gimp_image_rotate (image_ID, GIMP_ROTATE_270);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default: /* can't happen */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
jpeg_rotate_query (gint32 image_ID)
|
jpeg_exif_rotate_query (gint32 image_ID)
|
||||||
{
|
{
|
||||||
GtkWidget *dialog;
|
GtkWidget *dialog;
|
||||||
GtkWidget *hbox;
|
GtkWidget *hbox;
|
||||||
GtkWidget *vbox;
|
GtkWidget *vbox;
|
||||||
GtkWidget *label;
|
GtkWidget *label;
|
||||||
|
GtkWidget *toggle;
|
||||||
GdkPixbuf *pixbuf;
|
GdkPixbuf *pixbuf;
|
||||||
gint response;
|
gint response;
|
||||||
|
|
||||||
|
@ -343,8 +386,25 @@ jpeg_rotate_query (gint32 image_ID)
|
||||||
gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
|
gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
|
||||||
gtk_widget_show (label);
|
gtk_widget_show (label);
|
||||||
|
|
||||||
|
toggle = gtk_check_button_new_with_mnemonic (_("_Don't ask me again"));
|
||||||
|
gtk_box_pack_end (GTK_BOX (vbox), toggle, FALSE, FALSE, 0);
|
||||||
|
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), FALSE);
|
||||||
|
gtk_widget_show (toggle);
|
||||||
|
|
||||||
response = gimp_dialog_run (GIMP_DIALOG (dialog));
|
response = gimp_dialog_run (GIMP_DIALOG (dialog));
|
||||||
|
|
||||||
|
if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (toggle)))
|
||||||
|
{
|
||||||
|
GimpParasite *parasite;
|
||||||
|
const gchar *str = (response == GTK_RESPONSE_OK) ? "yes" : "no";
|
||||||
|
|
||||||
|
parasite = gimp_parasite_new (JPEG_EXIF_ROTATE_PARASITE,
|
||||||
|
GIMP_PARASITE_PERSISTENT,
|
||||||
|
strlen (str), str);
|
||||||
|
gimp_parasite_attach (parasite);
|
||||||
|
gimp_parasite_free (parasite);
|
||||||
|
}
|
||||||
|
|
||||||
gtk_widget_destroy (dialog);
|
gtk_widget_destroy (dialog);
|
||||||
|
|
||||||
return (response == GTK_RESPONSE_OK);
|
return (response == GTK_RESPONSE_OK);
|
||||||
|
|
Loading…
Reference in New Issue