26
26
#include "gimpcontext.h"
27
#include "gimpguide.h"
27
28
#include "gimpimage.h"
28
29
#include "gimpimage-flip.h"
29
30
#include "gimpimage-guides.h"
31
#include "gimpimage-sample-points.h"
30
32
#include "gimpimage-undo.h"
31
33
#include "gimpimage-undo-push.h"
32
34
#include "gimpitem.h"
33
35
#include "gimplist.h"
34
36
#include "gimpprogress.h"
37
#include "gimpsamplepoint.h"
38
gimp_image_flip (GimpImage *gimage,
41
gimp_image_flip (GimpImage *image,
39
42
GimpContext *context,
40
43
GimpOrientationType flip_type,
41
44
GimpProgress *progress)
47
gdouble progress_current = 1.0;
49
gdouble progress_current = 1.0;
49
g_return_if_fail (GIMP_IS_IMAGE (gimage));
51
g_return_if_fail (GIMP_IS_IMAGE (image));
50
52
g_return_if_fail (GIMP_IS_CONTEXT (context));
51
53
g_return_if_fail (progress == NULL || GIMP_IS_PROGRESS (progress));
53
gimp_set_busy (gimage->gimp);
55
gimp_set_busy (image->gimp);
57
59
case GIMP_ORIENTATION_HORIZONTAL:
58
axis = (gdouble) gimage->width / 2.0;
60
axis = (gdouble) image->width / 2.0;
61
63
case GIMP_ORIENTATION_VERTICAL:
62
axis = (gdouble) gimage->height / 2.0;
64
axis = (gdouble) image->height / 2.0;
70
progress_max = (gimage->channels->num_children +
71
gimage->layers->num_children +
72
gimage->vectors->num_children +
72
progress_max = (image->channels->num_children +
73
image->layers->num_children +
74
image->vectors->num_children +
73
75
1 /* selection */);
75
gimp_image_undo_group_start (gimage, GIMP_UNDO_GROUP_IMAGE_FLIP, NULL);
77
gimp_image_undo_group_start (image, GIMP_UNDO_GROUP_IMAGE_FLIP, NULL);
77
79
/* Flip all channels */
78
for (list = GIMP_LIST (gimage->channels)->list;
80
for (list = GIMP_LIST (image->channels)->list;
80
82
list = g_list_next (list))
82
item = (GimpItem *) list->data;
84
GimpItem *item = list->data;
84
86
gimp_item_flip (item, context, flip_type, axis, TRUE);
90
92
/* Flip all vectors */
91
for (list = GIMP_LIST (gimage->vectors)->list;
93
for (list = GIMP_LIST (image->vectors)->list;
93
95
list = g_list_next (list))
95
item = (GimpItem *) list->data;
97
GimpItem *item = list->data;
97
99
gimp_item_flip (item, context, flip_type, axis, FALSE);
103
105
/* Don't forget the selection mask! */
104
gimp_item_flip (GIMP_ITEM (gimp_image_get_mask (gimage)), context,
106
gimp_item_flip (GIMP_ITEM (gimp_image_get_mask (image)), context,
105
107
flip_type, axis, TRUE);
108
110
gimp_progress_set_value (progress, progress_current++ / progress_max);
110
112
/* Flip all layers */
111
for (list = GIMP_LIST (gimage->layers)->list;
113
for (list = GIMP_LIST (image->layers)->list;
113
115
list = g_list_next (list))
115
item = (GimpItem *) list->data;
117
GimpItem *item = list->data;
117
119
gimp_item_flip (item, context, flip_type, axis, FALSE);
123
125
/* Flip all Guides */
124
for (list = gimage->guides; list; list = g_list_next (list))
126
for (list = image->guides; list; list = g_list_next (list))
126
GimpGuide *guide = list->data;
128
GimpGuide *guide = list->data;
129
gint position = gimp_guide_get_position (guide);
128
switch (guide->orientation)
130
case GIMP_ORIENTATION_HORIZONTAL:
131
switch (gimp_guide_get_orientation (guide))
133
case GIMP_ORIENTATION_HORIZONTAL:
131
134
if (flip_type == GIMP_ORIENTATION_VERTICAL)
132
gimp_image_move_guide (gimage, guide,
133
gimage->height - guide->position, TRUE);
135
gimp_image_move_guide (image, guide,
136
image->height - position, TRUE);
136
case GIMP_ORIENTATION_VERTICAL:
139
case GIMP_ORIENTATION_VERTICAL:
137
140
if (flip_type == GIMP_ORIENTATION_HORIZONTAL)
138
gimp_image_move_guide (gimage, guide,
139
gimage->width - guide->position, TRUE);
147
gimp_image_undo_group_end (gimage);
149
gimp_unset_busy (gimage->gimp);
141
gimp_image_move_guide (image, guide,
142
image->width - position, TRUE);
150
/* Flip all sample points */
151
for (list = image->sample_points; list; list = g_list_next (list))
153
GimpSamplePoint *sample_point = list->data;
155
if (flip_type == GIMP_ORIENTATION_VERTICAL)
156
gimp_image_move_sample_point (image, sample_point,
158
image->height - sample_point->y,
161
if (flip_type == GIMP_ORIENTATION_HORIZONTAL)
162
gimp_image_move_sample_point (image, sample_point,
163
image->width - sample_point->x,
168
gimp_image_undo_group_end (image);
170
gimp_unset_busy (image->gimp);