Author: Goedson Teixeira Paixao Description: Fixes rotation operations Implement the rotation in multiples of 90 degrees using the gdk_pixbuf_rotate_simple function instead of the custom (and broken) rotation algorithm Bug-Debian: http://bugs.debian.org/497487 Bug-Ubuntu: https://bugs.edge.launchpad.net/ubuntu/+source/gpaint/+bug/262942 Forwarded: https://savannah.gnu.org/patch/?6643 Index: b/src/drawing.c =================================================================== --- a/src/drawing.c 2009-12-19 17:12:10.000000000 -0200 +++ b/src/drawing.c 2009-12-19 17:12:11.000000000 -0200 @@ -462,12 +462,23 @@ } void -drawing_rotate(gpaint_drawing *drawing, double degrees) +drawing_rotate(gpaint_drawing *drawing, int degrees) { gpaint_image *image = drawing_create_image(drawing); if (image) { - image_rotate(image, degrees); + switch (degrees) + { + case 0: + case 90: + case 180: + case 270: + image_rotate_simple(image, degrees); + break; + default: + image_rotate(image, degrees); + break; + } /* copy rotated image on the pixmap */ gdk_pixmap_unref(drawing->backing_pixmap); Index: b/src/drawing.h =================================================================== --- a/src/drawing.h 2009-12-19 17:11:48.000000000 -0200 +++ b/src/drawing.h 2009-12-19 17:12:11.000000000 -0200 @@ -58,6 +58,6 @@ void drawing_clear(gpaint_drawing *drawing); void drawing_clear_selection(gpaint_drawing *drawing, gpaint_point_array *points); gboolean drawing_prompt_to_save(gpaint_drawing *drawing); -void drawing_rotate(gpaint_drawing *drawing, double degrees); +void drawing_rotate(gpaint_drawing *drawing, int degrees); #endif Index: b/src/image.c =================================================================== --- a/src/image.c 2009-12-19 17:11:48.000000000 -0200 +++ b/src/image.c 2009-12-19 17:12:11.000000000 -0200 @@ -628,6 +628,27 @@ return 0; } +int +image_rotate_simple (gpaint_image *image, int degrees) +{ + GdkPixbuf *newpixbuf; + + switch (degrees) + { + case GDK_PIXBUF_ROTATE_NONE: + case GDK_PIXBUF_ROTATE_COUNTERCLOCKWISE: + case GDK_PIXBUF_ROTATE_UPSIDEDOWN: + case GDK_PIXBUF_ROTATE_CLOCKWISE: + newpixbuf = gdk_pixbuf_rotate_simple (image->pixbuf, degrees); + gdk_pixbuf_unref (image->pixbuf); + image->pixbuf = newpixbuf; + return 0; + break; + default: + return 1; + } +} + GdkPixbuf* image_pixbuf(gpaint_image* image) { return image->pixbuf; Index: b/src/image.h =================================================================== --- a/src/image.h 2009-12-19 17:11:48.000000000 -0200 +++ b/src/image.h 2009-12-19 17:12:11.000000000 -0200 @@ -45,5 +45,6 @@ int image_flip_x(gpaint_image *image); int image_flip_y(gpaint_image *image); int image_rotate(gpaint_image *image, double radians); +int image_rotate_simple(gpaint_image *image, int degrees); GdkPixbuf* image_pixbuf(gpaint_image *image); #endif Index: b/src/menu.c =================================================================== --- a/src/menu.c 2009-12-19 17:12:10.000000000 -0200 +++ b/src/menu.c 2009-12-19 17:12:11.000000000 -0200 @@ -486,9 +486,9 @@ sscanf(name, "rotate_%c%d_menu", &sign, °rees); debug2("sign = %c degrees = %d", sign, degrees); - if (sign=='n') + if (sign=='p') { - degrees *= -1; + degrees = 360 - degrees; } canvas_focus_lost(canvas); drawing_rotate(canvas->drawing, degrees);