mirror of
https://gitlab.gnome.org/GNOME/gimp
synced 2024-10-21 03:52:33 +00:00
new function that swaps the vertical and horizontal axis for the saved
2007-08-24 Raphael Quinet <raphael@gimp.org> * plug-ins/jpeg/jpeg-settings.c (jpeg_swap_original_settings): new function that swaps the vertical and horizontal axis for the saved subsampling parameters and quantization tables. * plug-ins/jpeg/jpeg-exif.c (jpeg_exif_rotate): swap the saved settings when the image is rotated. Fixes bug #466593. * devel-docs/release-howto.txt: added note about having admin access to Bugzilla and to the news section on www.gimp.org. svn path=/trunk/; revision=23370
This commit is contained in:
parent
a2bf6db38a
commit
91d99d4d63
12
ChangeLog
12
ChangeLog
|
@ -1,3 +1,15 @@
|
|||
2007-08-24 Raphaël Quinet <raphael@gimp.org>
|
||||
|
||||
* plug-ins/jpeg/jpeg-settings.c (jpeg_swap_original_settings): new
|
||||
function that swaps the vertical and horizontal axis for the saved
|
||||
subsampling parameters and quantization tables.
|
||||
|
||||
* plug-ins/jpeg/jpeg-exif.c (jpeg_exif_rotate): swap the saved
|
||||
settings when the image is rotated. Fixes bug #466593.
|
||||
|
||||
* devel-docs/release-howto.txt: added note about having admin
|
||||
access to Bugzilla and to the news section on www.gimp.org.
|
||||
|
||||
2007-08-24 Raphaël Quinet <raphael@gimp.org>
|
||||
|
||||
* tools/pdbgen/pdb/selection.pdb: fixed incorrect description of
|
||||
|
|
|
@ -70,7 +70,7 @@
|
|||
|
||||
( ) Check out or update the 'gimp-web' module and change
|
||||
downloads/index.htrw. Commit this change, the web server should
|
||||
then update itself soon (usually less than half an hour).
|
||||
then update itself soon (usually less than an hour).
|
||||
|
||||
( ) Bump the version number in configure.in and commit this change.
|
||||
|
||||
|
|
|
@ -18,8 +18,8 @@
|
|||
|
||||
/*
|
||||
* EXIF-handling code for the jpeg plugin. May eventually be better
|
||||
* to move this stuff into libgimpbase and make it available for
|
||||
* other plugins.
|
||||
* to move this stuff into libgimpbase or a new libgimpmetadata and
|
||||
* make it available for other plugins.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
@ -45,6 +45,7 @@
|
|||
#include "gimpexif.h"
|
||||
|
||||
#include "jpeg.h"
|
||||
#include "jpeg-settings.h"
|
||||
|
||||
#include "libgimp/stdplugins-intl.h"
|
||||
|
||||
|
@ -248,20 +249,24 @@ jpeg_exif_rotate (gint32 image_ID,
|
|||
|
||||
case 5: /* flipped diagonally around '\' */
|
||||
gimp_image_rotate (image_ID, GIMP_ROTATE_90);
|
||||
jpeg_swap_original_settings (image_ID);
|
||||
gimp_image_flip (image_ID, GIMP_ORIENTATION_HORIZONTAL);
|
||||
break;
|
||||
|
||||
case 6: /* 90 CW */
|
||||
gimp_image_rotate (image_ID, GIMP_ROTATE_90);
|
||||
jpeg_swap_original_settings (image_ID);
|
||||
break;
|
||||
|
||||
case 7: /* flipped diagonally around '/' */
|
||||
gimp_image_rotate (image_ID, GIMP_ROTATE_90);
|
||||
jpeg_swap_original_settings (image_ID);
|
||||
gimp_image_flip (image_ID, GIMP_ORIENTATION_VERTICAL);
|
||||
break;
|
||||
|
||||
case 8: /* 90 CCW */
|
||||
gimp_image_rotate (image_ID, GIMP_ROTATE_270);
|
||||
jpeg_swap_original_settings (image_ID);
|
||||
break;
|
||||
|
||||
default: /* can't happen */
|
||||
|
|
|
@ -31,14 +31,15 @@
|
|||
* Additional data following the quantization tables is currently
|
||||
* ignored and can be used for future extensions.
|
||||
*
|
||||
* The parasite contains the original subsampling for each component
|
||||
* instead of saving only the subsampling type as used by the jpeg
|
||||
* plug-in ("subsmp") in order to improve the compatibility with
|
||||
* future versions of the plug-in that may support more subsampling
|
||||
* types. The same applies to the other settings: for example, up to
|
||||
* 4 quantization tables will be saved in the parasite even if the
|
||||
* current code cannot restore more than 3 of them (4 tables may be
|
||||
* needed by unusual JPEG color spaces such as JCS_CMYK or JCS_YCCK).
|
||||
* In order to improve the compatibility with future versions of the
|
||||
* plug-in that may support more subsampling types ("subsmp"), the
|
||||
* parasite contains the original subsampling for each component
|
||||
* instead of saving only one byte containing the subsampling type as
|
||||
* used by the jpeg plug-in. The same applies to the other settings:
|
||||
* for example, up to 4 quantization tables will be saved in the
|
||||
* parasite even if the current code cannot restore more than 2 of
|
||||
* them (4 tables may be needed by unusual JPEG color spaces such as
|
||||
* JCS_CMYK or JCS_YCCK).
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
@ -280,14 +281,13 @@ jpeg_restore_original_tables (gint32 image_ID,
|
|||
if (src_size >= 4)
|
||||
{
|
||||
src = gimp_parasite_data (parasite);
|
||||
src += 2;
|
||||
num_components = *src++;
|
||||
num_tables = *src++;
|
||||
num_components = src[2];
|
||||
num_tables = src[3];
|
||||
|
||||
if (src_size >= (4 + num_components * 2 + num_tables * 128)
|
||||
&& num_tables == num_quant_tables)
|
||||
{
|
||||
src += num_components * 2;
|
||||
src += 4 + num_components * 2;
|
||||
quant_tables = g_new (guint *, num_tables);
|
||||
|
||||
for (t = 0; t < num_tables; t++)
|
||||
|
@ -310,3 +310,83 @@ jpeg_restore_original_tables (gint32 image_ID,
|
|||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* jpeg_swap_original_settings:
|
||||
* @image_ID: the image that may contain original jpeg settings in a parasite.
|
||||
*
|
||||
* Swap the horizontal and vertical axis for the saved subsampling
|
||||
* parameters and quantization tables. This should be done if the
|
||||
* image has been rotated by +90 or -90 degrees or if it has been
|
||||
* mirrored along its diagonal.
|
||||
*/
|
||||
void
|
||||
jpeg_swap_original_settings (gint32 image_ID)
|
||||
{
|
||||
GimpParasite *parasite;
|
||||
const guchar *src;
|
||||
glong src_size;
|
||||
gint num_components;
|
||||
gint num_tables;
|
||||
guchar *new_data;
|
||||
guchar *dest;
|
||||
gint t;
|
||||
gint i;
|
||||
gint j;
|
||||
|
||||
parasite = gimp_image_parasite_find (image_ID, "jpeg-settings");
|
||||
if (parasite)
|
||||
{
|
||||
src_size = gimp_parasite_data_size (parasite);
|
||||
if (src_size >= 4)
|
||||
{
|
||||
src = gimp_parasite_data (parasite);
|
||||
num_components = src[2];
|
||||
num_tables = src[3];
|
||||
|
||||
if (src_size >= (4 + num_components * 2 + num_tables * 128))
|
||||
{
|
||||
new_data = g_new (guchar, src_size);
|
||||
dest = new_data;
|
||||
*dest++ = *src++;
|
||||
*dest++ = *src++;
|
||||
*dest++ = *src++;
|
||||
*dest++ = *src++;
|
||||
for (i = 0; i < num_components; i++)
|
||||
{
|
||||
dest[0] = src[1];
|
||||
dest[1] = src[0];
|
||||
dest += 2;
|
||||
src += 2;
|
||||
}
|
||||
for (t = 0; t < num_tables; t++)
|
||||
{
|
||||
for (i = 0; i < 8; i++)
|
||||
{
|
||||
for (j = 0; j < 8; j++)
|
||||
{
|
||||
dest[i * 16 + j * 2] = src[j * 16 + i * 2];
|
||||
dest[i * 16 + j * 2 + 1] = src[j * 16 + i * 2 + 1];
|
||||
}
|
||||
}
|
||||
dest += 128;
|
||||
src += 128;
|
||||
if (src_size > (4 + num_components * 2 + num_tables * 128))
|
||||
{
|
||||
memcpy (dest, src, src_size - (4 + num_components * 2
|
||||
+ num_tables * 128));
|
||||
}
|
||||
}
|
||||
gimp_parasite_free (parasite);
|
||||
parasite = gimp_parasite_new ("jpeg-settings",
|
||||
GIMP_PARASITE_PERSISTENT,
|
||||
src_size,
|
||||
new_data);
|
||||
g_free (new_data);
|
||||
gimp_image_parasite_attach (image_ID, parasite);
|
||||
}
|
||||
}
|
||||
gimp_parasite_free (parasite);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue