don't default to clip_result == TRUE (unlike the other transform

2003-05-20  Michael Natterer  <mitch@gimp.org>

	* app/core/gimpchannel.c (gimp_channel_rotate): don't default to
	clip_result == TRUE (unlike the other transform functions).

	* app/core/gimpdrawable-transform.c
	(gimp_drawable_transform_tiles_rotate): fixed offset calculation.

	* app/core/gimpimage-rotate.c: change the image size *after* all items
	are rotated. Adjust all items' offsets after rotation. Rotate the
	resolutions too. Seems to work now and fixes bug #6101.

	* app/core/gimpimage.c (gimp_image_size_changed): emit
	"size_changed" on all vectors.

	* app/core/gimpitem-linked.[ch]: added gimp_item_linked_rotate().

	* app/gui/drawable-commands.c: flip and rotate linked items too.

	* app/vectors/gimpvectors.c (gimp_vectors_rotate): fixed rotation
	angles.

	Unrelated:

	* app/core/gimpimage-merge.c: don't #include "path.h".
This commit is contained in:
Michael Natterer 2003-05-20 15:26:38 +00:00 committed by Michael Natterer
parent a996ba3956
commit 966fb5595f
13 changed files with 212 additions and 39 deletions

View File

@ -1,3 +1,29 @@
2003-05-20 Michael Natterer <mitch@gimp.org>
* app/core/gimpchannel.c (gimp_channel_rotate): don't default to
clip_result == TRUE (unlike the other transform functions).
* app/core/gimpdrawable-transform.c
(gimp_drawable_transform_tiles_rotate): fixed offset calculation.
* app/core/gimpimage-rotate.c: change the image size *after* all items
are rotated. Adjust all items' offsets after rotation. Rotate the
resolutions too. Seems to work now and fixes bug #6101.
* app/core/gimpimage.c (gimp_image_size_changed): emit
"size_changed" on all vectors.
* app/core/gimpitem-linked.[ch]: added gimp_item_linked_rotate().
* app/gui/drawable-commands.c: flip and rotate linked items too.
* app/vectors/gimpvectors.c (gimp_vectors_rotate): fixed rotation
angles.
Unrelated:
* app/core/gimpimage-merge.c: don't #include "path.h".
2003-05-20 Sven Neumann <sven@gimp.org> 2003-05-20 Sven Neumann <sven@gimp.org>
* app/core/gimpdrawable-transform.c * app/core/gimpdrawable-transform.c

View File

@ -33,6 +33,8 @@
#include "core/gimpdrawable-equalize.h" #include "core/gimpdrawable-equalize.h"
#include "core/gimpdrawable-invert.h" #include "core/gimpdrawable-invert.h"
#include "core/gimpimage.h" #include "core/gimpimage.h"
#include "core/gimpimage-undo.h"
#include "core/gimpitem-linked.h"
#include "widgets/gimpitemtreeview.h" #include "widgets/gimpitemtreeview.h"
@ -150,7 +152,18 @@ drawable_flip_cmd_callback (GtkWidget *widget,
break; break;
} }
gimp_item_flip (item, (GimpOrientationType) action, axis, TRUE); if (gimp_item_get_linked (item))
gimp_image_undo_group_start (gimage, GIMP_UNDO_GROUP_TRANSFORM,
_("Flip Layer"));
gimp_item_flip (item, (GimpOrientationType) action, axis, FALSE);
if (gimp_item_get_linked (item))
{
gimp_item_linked_flip (item, (GimpOrientationType) action, axis, FALSE);
gimp_image_undo_group_end (gimage);
}
gimp_image_flush (gimage); gimp_image_flush (gimage);
} }
@ -173,7 +186,19 @@ drawable_rotate_cmd_callback (GtkWidget *widget,
center_x = ((gdouble) off_x + (gdouble) gimp_item_width (item) / 2.0); center_x = ((gdouble) off_x + (gdouble) gimp_item_width (item) / 2.0);
center_y = ((gdouble) off_y + (gdouble) gimp_item_height (item) / 2.0); center_y = ((gdouble) off_y + (gdouble) gimp_item_height (item) / 2.0);
gimp_item_rotate (item, (GimpRotationType) action, center_x, center_y, TRUE); if (gimp_item_get_linked (item))
gimp_image_undo_group_start (gimage, GIMP_UNDO_GROUP_TRANSFORM,
_("Rotate Layer"));
gimp_item_rotate (item, (GimpRotationType) action, center_x, center_y, FALSE);
if (gimp_item_get_linked (item))
{
gimp_item_linked_rotate (item, (GimpRotationType) action,
center_x, center_y, FALSE);
gimp_image_undo_group_end (gimage);
}
gimp_image_flush (gimage); gimp_image_flush (gimage);
} }

View File

@ -585,22 +585,28 @@ gimp_drawable_transform_tiles_rotate (GimpDrawable *drawable,
switch (rotate_type) switch (rotate_type)
{ {
case GIMP_ROTATE_90: case GIMP_ROTATE_90:
new_x = ROUND (center_x + (gdouble) orig_y - center_y); new_x = ROUND (center_x -
new_y = ROUND (center_y + (gdouble) orig_x - center_x); (gdouble) (orig_y + orig_height) + center_y);
new_y = ROUND (center_y +
(gdouble) orig_x - center_x);
new_width = orig_height; new_width = orig_height;
new_height = orig_width; new_height = orig_width;
break; break;
case GIMP_ROTATE_180: case GIMP_ROTATE_180:
new_x = ROUND ((gdouble) orig_x - 2.0 * center_x) + orig_width - 1; new_x = ROUND (center_x -
new_y = ROUND ((gdouble) orig_y - 2.0 * center_y) + orig_height - 1; ((gdouble) (orig_x + orig_width) - center_x));
new_y = ROUND (center_y -
((gdouble) (orig_y + orig_height) - center_y));
new_width = orig_width; new_width = orig_width;
new_height = orig_height; new_height = orig_height;
break; break;
case GIMP_ROTATE_270: case GIMP_ROTATE_270:
new_x = ROUND (center_x - (gdouble) orig_y - center_y); new_x = ROUND (center_x +
new_y = ROUND (center_y - (gdouble) orig_x - center_x); (gdouble) orig_y - center_y);
new_y = ROUND (center_y -
(gdouble) (orig_x + orig_width) + center_x);
new_width = orig_height; new_width = orig_height;
new_height = orig_width; new_height = orig_width;
break; break;

View File

@ -442,8 +442,7 @@ gimp_channel_rotate (GimpItem *item,
gimp_image_undo_group_start (gimage, GIMP_UNDO_GROUP_TRANSFORM, gimp_image_undo_group_start (gimage, GIMP_UNDO_GROUP_TRANSFORM,
_("Rotate Channel")); _("Rotate Channel"));
if (G_TYPE_FROM_INSTANCE (item) == GIMP_TYPE_CHANNEL) /* don't default to clip_result == TRUE here */
clip_result = TRUE;
GIMP_ITEM_CLASS (parent_class)->rotate (item, GIMP_ITEM_CLASS (parent_class)->rotate (item,
rotate_type, center_x, center_y, rotate_type, center_x, center_y,

View File

@ -442,8 +442,7 @@ gimp_channel_rotate (GimpItem *item,
gimp_image_undo_group_start (gimage, GIMP_UNDO_GROUP_TRANSFORM, gimp_image_undo_group_start (gimage, GIMP_UNDO_GROUP_TRANSFORM,
_("Rotate Channel")); _("Rotate Channel"));
if (G_TYPE_FROM_INSTANCE (item) == GIMP_TYPE_CHANNEL) /* don't default to clip_result == TRUE here */
clip_result = TRUE;
GIMP_ITEM_CLASS (parent_class)->rotate (item, GIMP_ITEM_CLASS (parent_class)->rotate (item,
rotate_type, center_x, center_y, rotate_type, center_x, center_y,

View File

@ -585,22 +585,28 @@ gimp_drawable_transform_tiles_rotate (GimpDrawable *drawable,
switch (rotate_type) switch (rotate_type)
{ {
case GIMP_ROTATE_90: case GIMP_ROTATE_90:
new_x = ROUND (center_x + (gdouble) orig_y - center_y); new_x = ROUND (center_x -
new_y = ROUND (center_y + (gdouble) orig_x - center_x); (gdouble) (orig_y + orig_height) + center_y);
new_y = ROUND (center_y +
(gdouble) orig_x - center_x);
new_width = orig_height; new_width = orig_height;
new_height = orig_width; new_height = orig_width;
break; break;
case GIMP_ROTATE_180: case GIMP_ROTATE_180:
new_x = ROUND ((gdouble) orig_x - 2.0 * center_x) + orig_width - 1; new_x = ROUND (center_x -
new_y = ROUND ((gdouble) orig_y - 2.0 * center_y) + orig_height - 1; ((gdouble) (orig_x + orig_width) - center_x));
new_y = ROUND (center_y -
((gdouble) (orig_y + orig_height) - center_y));
new_width = orig_width; new_width = orig_width;
new_height = orig_height; new_height = orig_height;
break; break;
case GIMP_ROTATE_270: case GIMP_ROTATE_270:
new_x = ROUND (center_x - (gdouble) orig_y - center_y); new_x = ROUND (center_x +
new_y = ROUND (center_y - (gdouble) orig_x - center_x); (gdouble) orig_y - center_y);
new_y = ROUND (center_y -
(gdouble) (orig_x + orig_width) + center_x);
new_width = orig_height; new_width = orig_height;
new_height = orig_width; new_height = orig_width;
break; break;

View File

@ -46,8 +46,6 @@
#include "gimpparasitelist.h" #include "gimpparasitelist.h"
#include "gimpundostack.h" #include "gimpundostack.h"
#include "path.h"
#include "gimp-intl.h" #include "gimp-intl.h"

View File

@ -50,11 +50,12 @@ gimp_image_rotate (GimpImage *gimage,
GList *list; GList *list;
gdouble center_x; gdouble center_x;
gdouble center_y; gdouble center_y;
gint tmp;
gint num_channels; gint num_channels;
gint num_layers; gint num_layers;
gint num_vectors; gint num_vectors;
gint progress_current = 1; gint progress_current = 1;
gint new_image_width;
gint new_image_height;
gboolean size_changed = FALSE; gboolean size_changed = FALSE;
g_return_if_fail (GIMP_IS_IMAGE (gimage)); g_return_if_fail (GIMP_IS_IMAGE (gimage));
@ -82,17 +83,16 @@ gimp_image_rotate (GimpImage *gimage,
{ {
case GIMP_ROTATE_90: case GIMP_ROTATE_90:
case GIMP_ROTATE_270: case GIMP_ROTATE_270:
gimp_image_undo_push_image_size (gimage, NULL); new_image_width = gimage->height;
new_image_height = gimage->width;
tmp = gimage->width; size_changed = TRUE;
gimage->width = gimage->height;
gimage->height = tmp;
size_changed = TRUE;
break; break;
case GIMP_ROTATE_180: case GIMP_ROTATE_180:
break; new_image_width = gimage->width;
new_image_height = gimage->height;
size_changed = FALSE;
break;
} }
/* Rotate all channels */ /* Rotate all channels */
@ -102,7 +102,13 @@ gimp_image_rotate (GimpImage *gimage,
{ {
item = (GimpItem *) list->data; item = (GimpItem *) list->data;
gimp_item_rotate (item, rotate_type, center_x, center_y, TRUE); gimp_item_rotate (item, rotate_type, center_x, center_y, FALSE);
if (size_changed)
{
item->offset_x = 0;
item->offset_y = 0;
}
if (progress_func) if (progress_func)
(* progress_func) (0, num_vectors + num_channels + num_layers, (* progress_func) (0, num_vectors + num_channels + num_layers,
@ -119,6 +125,19 @@ gimp_image_rotate (GimpImage *gimage,
gimp_item_rotate (item, rotate_type, center_x, center_y, FALSE); gimp_item_rotate (item, rotate_type, center_x, center_y, FALSE);
if (size_changed)
{
item->offset_x = 0;
item->offset_y = 0;
item->width = new_image_width;
item->height = new_image_height;
gimp_item_translate (item,
ROUND (center_y - center_x),
ROUND (center_x - center_y),
FALSE);
}
if (progress_func) if (progress_func)
(* progress_func) (0, num_vectors + num_channels + num_layers, (* progress_func) (0, num_vectors + num_channels + num_layers,
progress_current++, progress_current++,
@ -127,18 +146,33 @@ gimp_image_rotate (GimpImage *gimage,
/* Don't forget the selection mask! */ /* Don't forget the selection mask! */
gimp_item_rotate (GIMP_ITEM (gimage->selection_mask), gimp_item_rotate (GIMP_ITEM (gimage->selection_mask),
rotate_type, center_x, center_y, TRUE); rotate_type, center_x, center_y, FALSE);
GIMP_ITEM (gimage->selection_mask)->offset_x = 0;
GIMP_ITEM (gimage->selection_mask)->offset_y = 0;
gimp_image_mask_invalidate (gimage); gimp_image_mask_invalidate (gimage);
/* Rotate all layers */ /* Rotate all layers */
for (list = GIMP_LIST (gimage->layers)->list; for (list = GIMP_LIST (gimage->layers)->list;
list; list;
list = g_list_next (list)) list = g_list_next (list))
{ {
gint off_x, off_y;
gint width, height;
item = (GimpItem *) list->data; item = (GimpItem *) list->data;
gimp_item_offsets (item, &off_x, &off_y);
width = gimp_item_width (item);
height = gimp_item_height (item);
gimp_item_rotate (item, rotate_type, center_x, center_y, FALSE); gimp_item_rotate (item, rotate_type, center_x, center_y, FALSE);
if (size_changed)
gimp_item_translate (item,
ROUND (center_y - center_x),
ROUND (center_x - center_y),
FALSE);
if (progress_func) if (progress_func)
(* progress_func) (0, num_vectors + num_channels + num_layers, (* progress_func) (0, num_vectors + num_channels + num_layers,
progress_current++, progress_current++,
@ -148,6 +182,26 @@ gimp_image_rotate (GimpImage *gimage,
/* Rotate all Guides */ /* Rotate all Guides */
gimp_image_rotate_guides (gimage, rotate_type); gimp_image_rotate_guides (gimage, rotate_type);
/* Resize the image (if needed) */
if (size_changed)
{
gimp_image_undo_push_image_size (gimage, NULL);
gimage->width = new_image_width;
gimage->height = new_image_height;
if (gimage->xresolution != gimage->yresolution)
{
gdouble tmp;
gimp_image_undo_push_image_resolution (gimage, NULL);
tmp = gimage->xresolution;
gimage->yresolution = gimage->xresolution;
gimage->xresolution = tmp;
}
}
/* Make sure the projection matches the gimage size */ /* Make sure the projection matches the gimage size */
gimp_image_projection_allocate (gimage); gimp_image_projection_allocate (gimage);
@ -184,7 +238,7 @@ gimp_image_rotate_guides (GimpImage *gimage,
case GIMP_ORIENTATION_HORIZONTAL: case GIMP_ORIENTATION_HORIZONTAL:
gimp_image_undo_push_image_guide (gimage, NULL, guide); gimp_image_undo_push_image_guide (gimage, NULL, guide);
guide->orientation = GIMP_ORIENTATION_VERTICAL; guide->orientation = GIMP_ORIENTATION_VERTICAL;
guide->position = gimage->width - guide->position; guide->position = gimage->height - guide->position;
break; break;
case GIMP_ORIENTATION_VERTICAL: case GIMP_ORIENTATION_VERTICAL:
@ -226,7 +280,7 @@ gimp_image_rotate_guides (GimpImage *gimage,
case GIMP_ORIENTATION_VERTICAL: case GIMP_ORIENTATION_VERTICAL:
gimp_image_undo_push_image_guide (gimage, NULL, guide); gimp_image_undo_push_image_guide (gimage, NULL, guide);
guide->orientation = GIMP_ORIENTATION_HORIZONTAL; guide->orientation = GIMP_ORIENTATION_HORIZONTAL;
guide->position = gimage->height - guide->position; guide->position = gimage->width - guide->position;
break; break;
default: default:

View File

@ -688,6 +688,9 @@ gimp_image_size_changed (GimpViewable *viewable)
gimp_container_foreach (gimage->channels, gimp_container_foreach (gimage->channels,
(GFunc) gimp_viewable_size_changed, (GFunc) gimp_viewable_size_changed,
NULL); NULL);
gimp_container_foreach (gimage->vectors,
(GFunc) gimp_viewable_size_changed,
NULL);
for (list = GIMP_LIST (gimage->layers)->list; list; list = g_list_next (list)) for (list = GIMP_LIST (gimage->layers)->list; list; list = g_list_next (list))
{ {

View File

@ -88,6 +88,33 @@ gimp_item_linked_flip (GimpItem *item,
g_list_free (linked_list); g_list_free (linked_list);
} }
void
gimp_item_linked_rotate (GimpItem *item,
GimpRotationType rotate_type,
gdouble center_x,
gdouble center_y,
gboolean clip_result)
{
GimpImage *gimage;
GList *linked_list;
GList *list;
g_return_if_fail (GIMP_IS_ITEM (item));
g_return_if_fail (gimp_item_get_linked (item) == TRUE);
gimage = gimp_item_get_image (item);
g_return_if_fail (GIMP_IS_IMAGE (gimage));
linked_list = gimp_item_linked_get_list (gimage, item);
for (list = linked_list; list; list = g_list_next (list))
gimp_item_rotate (GIMP_ITEM (list->data),
rotate_type, center_x, center_y, clip_result);
g_list_free (linked_list);
}
void void
gimp_item_linked_transform (GimpItem *item, gimp_item_linked_transform (GimpItem *item,
GimpMatrix3 matrix, GimpMatrix3 matrix,

View File

@ -28,6 +28,11 @@ void gimp_item_linked_flip (GimpItem *item,
GimpOrientationType flip_type, GimpOrientationType flip_type,
gdouble axis, gdouble axis,
gboolean clip_result); gboolean clip_result);
void gimp_item_linked_rotate (GimpItem *item,
GimpRotationType rotate_type,
gdouble center_x,
gdouble center_y,
gboolean clip_result);
void gimp_item_linked_transform (GimpItem *item, void gimp_item_linked_transform (GimpItem *item,
GimpMatrix3 matrix, GimpMatrix3 matrix,
GimpTransformDirection direction, GimpTransformDirection direction,

View File

@ -33,6 +33,8 @@
#include "core/gimpdrawable-equalize.h" #include "core/gimpdrawable-equalize.h"
#include "core/gimpdrawable-invert.h" #include "core/gimpdrawable-invert.h"
#include "core/gimpimage.h" #include "core/gimpimage.h"
#include "core/gimpimage-undo.h"
#include "core/gimpitem-linked.h"
#include "widgets/gimpitemtreeview.h" #include "widgets/gimpitemtreeview.h"
@ -150,7 +152,18 @@ drawable_flip_cmd_callback (GtkWidget *widget,
break; break;
} }
gimp_item_flip (item, (GimpOrientationType) action, axis, TRUE); if (gimp_item_get_linked (item))
gimp_image_undo_group_start (gimage, GIMP_UNDO_GROUP_TRANSFORM,
_("Flip Layer"));
gimp_item_flip (item, (GimpOrientationType) action, axis, FALSE);
if (gimp_item_get_linked (item))
{
gimp_item_linked_flip (item, (GimpOrientationType) action, axis, FALSE);
gimp_image_undo_group_end (gimage);
}
gimp_image_flush (gimage); gimp_image_flush (gimage);
} }
@ -173,7 +186,19 @@ drawable_rotate_cmd_callback (GtkWidget *widget,
center_x = ((gdouble) off_x + (gdouble) gimp_item_width (item) / 2.0); center_x = ((gdouble) off_x + (gdouble) gimp_item_width (item) / 2.0);
center_y = ((gdouble) off_y + (gdouble) gimp_item_height (item) / 2.0); center_y = ((gdouble) off_y + (gdouble) gimp_item_height (item) / 2.0);
gimp_item_rotate (item, (GimpRotationType) action, center_x, center_y, TRUE); if (gimp_item_get_linked (item))
gimp_image_undo_group_start (gimage, GIMP_UNDO_GROUP_TRANSFORM,
_("Rotate Layer"));
gimp_item_rotate (item, (GimpRotationType) action, center_x, center_y, FALSE);
if (gimp_item_get_linked (item))
{
gimp_item_linked_rotate (item, (GimpRotationType) action,
center_x, center_y, FALSE);
gimp_image_undo_group_end (gimage);
}
gimp_image_flush (gimage); gimp_image_flush (gimage);
} }

View File

@ -452,13 +452,13 @@ gimp_vectors_rotate (GimpItem *item,
switch (rotate_type) switch (rotate_type)
{ {
case GIMP_ROTATE_90: case GIMP_ROTATE_90:
angle = - G_PI_2; angle = G_PI_2;
break; break;
case GIMP_ROTATE_180: case GIMP_ROTATE_180:
angle = G_PI; angle = G_PI;
break; break;
case GIMP_ROTATE_270: case GIMP_ROTATE_270:
angle = G_PI_2; angle = - G_PI_2;
break; break;
} }