Commit 91d99d4d authored by Raphael Quinet's avatar Raphael Quinet Committed by Raphaël Quinet

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
parent a2bf6db3
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);
}
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment