23
23
#include <gtk/gtk.h>
25
#include "libgimpmath/gimpmath.h"
26
25
#include "libgimpwidgets/gimpwidgets.h"
28
27
#include "tools-types.h"
30
29
#include "core/gimp-transform-utils.h"
31
#include "core/gimpimage.h"
32
#include "core/gimpdrawable-transform.h"
33
#include "core/gimptoolinfo.h"
35
31
#include "widgets/gimphelp-ids.h"
37
#include "display/gimpdisplay.h"
40
#warning FIXME #include "dialogs/dialogs-types.h"
42
#include "dialogs/dialogs-types.h"
43
#include "dialogs/info-dialog.h"
45
33
#include "gimpsheartool.h"
46
34
#include "gimptoolcontrol.h"
47
35
#include "gimptransformoptions.h"
57
45
/* the minimum movement before direction of shear can be determined (pixels) */
61
51
/* local function prototypes */
63
static void gimp_shear_tool_class_init (GimpShearToolClass *klass);
64
static void gimp_shear_tool_init (GimpShearTool *shear_tool);
66
53
static void gimp_shear_tool_dialog (GimpTransformTool *tr_tool);
67
54
static void gimp_shear_tool_dialog_update (GimpTransformTool *tr_tool);
69
56
static void gimp_shear_tool_prepare (GimpTransformTool *tr_tool,
57
GimpDisplay *display);
71
58
static void gimp_shear_tool_motion (GimpTransformTool *tr_tool,
59
GimpDisplay *display);
73
60
static void gimp_shear_tool_recalc (GimpTransformTool *tr_tool,
76
static void shear_x_mag_changed (GtkWidget *widget,
77
GimpTransformTool *tr_tool);
78
static void shear_y_mag_changed (GtkWidget *widget,
79
GimpTransformTool *tr_tool);
82
/* private variables */
84
static GimpTransformToolClass *parent_class = NULL;
87
/* public functions */
61
GimpDisplay *display);
63
static void shear_x_mag_changed (GtkAdjustment *adj,
64
GimpTransformTool *tr_tool);
65
static void shear_y_mag_changed (GtkAdjustment *adj,
66
GimpTransformTool *tr_tool);
69
G_DEFINE_TYPE (GimpShearTool, gimp_shear_tool, GIMP_TYPE_TRANSFORM_TOOL)
90
73
gimp_shear_tool_register (GimpToolRegisterCallback callback,
99
_("Shear the layer or selection"),
82
_("Shear Tool: Shear the layer, selection or path"),
100
83
N_("S_hear"), "<shift>S",
101
84
NULL, GIMP_HELP_TOOL_SHEAR,
102
85
GIMP_STOCK_TOOL_SHEAR,
107
gimp_shear_tool_get_type (void)
109
static GType tool_type = 0;
113
static const GTypeInfo tool_info =
115
sizeof (GimpShearToolClass),
116
(GBaseInitFunc) NULL,
117
(GBaseFinalizeFunc) NULL,
118
(GClassInitFunc) gimp_shear_tool_class_init,
119
NULL, /* class_finalize */
120
NULL, /* class_data */
121
sizeof (GimpShearTool),
123
(GInstanceInitFunc) gimp_shear_tool_init,
126
tool_type = g_type_register_static (GIMP_TYPE_TRANSFORM_TOOL,
135
90
gimp_shear_tool_class_init (GimpShearToolClass *klass)
137
92
GimpTransformToolClass *trans_class = GIMP_TRANSFORM_TOOL_CLASS (klass);
139
parent_class = g_type_class_peek_parent (klass);
141
94
trans_class->dialog = gimp_shear_tool_dialog;
142
95
trans_class->dialog_update = gimp_shear_tool_dialog_update;
143
96
trans_class->prepare = gimp_shear_tool_prepare;
154
107
gimp_tool_control_set_tool_cursor (tool->control, GIMP_TOOL_CURSOR_SHEAR);
156
tr_tool->use_center = FALSE;
157
tr_tool->shell_desc = _("Shearing Information");
158
tr_tool->progress_text = _("Shearing...");
109
tr_tool->undo_desc = Q_("command|Shear");
110
tr_tool->progress_text = _("Shearing");
112
tr_tool->use_grid = TRUE;
162
116
gimp_shear_tool_dialog (GimpTransformTool *tr_tool)
164
118
GimpShearTool *shear = GIMP_SHEAR_TOOL (tr_tool);
166
info_dialog_add_spinbutton (tr_tool->info_dialog,
167
_("Shear magnitude X:"),
169
-65536, 65536, 1, 15, 1, 1, 0,
170
G_CALLBACK (shear_x_mag_changed),
173
info_dialog_add_spinbutton (tr_tool->info_dialog,
174
_("Shear magnitude Y:"),
176
-65536, 65536, 1, 15, 1, 1, 0,
177
G_CALLBACK (shear_y_mag_changed),
122
table = gtk_table_new (2, 2, FALSE);
123
gtk_container_set_border_width (GTK_CONTAINER (table), 6);
124
gtk_table_set_row_spacings (GTK_TABLE (table), 2);
125
gtk_table_set_col_spacings (GTK_TABLE (table), 6);
126
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (tr_tool->dialog)->vbox), table,
128
gtk_widget_show (table);
130
button = gimp_spin_button_new (&shear->x_adj,
131
0, -65536, 65536, 1, 15, 1, 1, 0);
132
gtk_entry_set_width_chars (GTK_ENTRY (button), SB_WIDTH);
133
gimp_table_attach_aligned (GTK_TABLE (table), 0, 0, _("Shear magnitude _X:"),
134
0.0, 0.5, button, 1, TRUE);
136
g_signal_connect (shear->x_adj, "value-changed",
137
G_CALLBACK (shear_x_mag_changed),
140
button = gimp_spin_button_new (&shear->y_adj,
141
0, -65536, 65536, 1, 15, 1, 1, 0);
142
gtk_entry_set_width_chars (GTK_ENTRY (button), SB_WIDTH);
143
gimp_table_attach_aligned (GTK_TABLE (table), 0, 1, _("Shear magnitude _Y:"),
144
0.0, 0.5, button, 1, TRUE);
146
g_signal_connect (shear->y_adj, "value-changed",
147
G_CALLBACK (shear_y_mag_changed),
184
154
GimpShearTool *shear = GIMP_SHEAR_TOOL (tr_tool);
186
shear->xshear_val = tr_tool->trans_info[XSHEAR];
187
shear->yshear_val = tr_tool->trans_info[YSHEAR];
189
info_dialog_update (tr_tool->info_dialog);
190
info_dialog_show (tr_tool->info_dialog);
156
gtk_adjustment_set_value (GTK_ADJUSTMENT (shear->x_adj),
157
tr_tool->trans_info[XSHEAR]);
158
gtk_adjustment_set_value (GTK_ADJUSTMENT (shear->y_adj),
159
tr_tool->trans_info[YSHEAR]);
194
163
gimp_shear_tool_prepare (GimpTransformTool *tr_tool,
164
GimpDisplay *display)
197
166
tr_tool->trans_info[HORZ_OR_VERT] = GIMP_ORIENTATION_UNKNOWN;
198
167
tr_tool->trans_info[XSHEAR] = 0.0;
239
205
/* if the direction is known, keep track of the magnitude */
240
if (tr_tool->trans_info[HORZ_OR_VERT] != GIMP_ORIENTATION_UNKNOWN)
242
dir = tr_tool->trans_info[HORZ_OR_VERT];
244
switch (tr_tool->function)
246
case TRANSFORM_HANDLE_1:
247
if (dir == GIMP_ORIENTATION_HORIZONTAL)
248
tr_tool->trans_info[XSHEAR] -= diffx;
250
tr_tool->trans_info[YSHEAR] -= diffy;
253
case TRANSFORM_HANDLE_2:
254
if (dir == GIMP_ORIENTATION_HORIZONTAL)
255
tr_tool->trans_info[XSHEAR] -= diffx;
257
tr_tool->trans_info[YSHEAR] += diffy;
260
case TRANSFORM_HANDLE_3:
261
if (dir == GIMP_ORIENTATION_HORIZONTAL)
262
tr_tool->trans_info[XSHEAR] += diffx;
264
tr_tool->trans_info[YSHEAR] -= diffy;
267
case TRANSFORM_HANDLE_4:
268
if (dir == GIMP_ORIENTATION_HORIZONTAL)
269
tr_tool->trans_info[XSHEAR] += diffx;
271
tr_tool->trans_info[YSHEAR] += diffy;
206
if (tr_tool->trans_info[HORZ_OR_VERT] == GIMP_ORIENTATION_HORIZONTAL)
208
if (tr_tool->cury > (tr_tool->ty1 + tr_tool->ty3) / 2)
209
tr_tool->trans_info[XSHEAR] += diffx;
211
tr_tool->trans_info[XSHEAR] -= diffx;
213
else if (tr_tool->trans_info[HORZ_OR_VERT] == GIMP_ORIENTATION_VERTICAL)
215
if (tr_tool->curx > (tr_tool->tx1 + tr_tool->tx2) / 2)
216
tr_tool->trans_info[YSHEAR] += diffy;
218
tr_tool->trans_info[YSHEAR] -= diffy;
281
223
gimp_shear_tool_recalc (GimpTransformTool *tr_tool,
224
GimpDisplay *display)
286
228
if (tr_tool->trans_info[XSHEAR] == 0.0 &&
287
229
tr_tool->trans_info[YSHEAR] == 0.0)
288
tr_tool->trans_info[HORZ_OR_VERT] = GIMP_ORIENTATION_UNKNOWN;
231
tr_tool->trans_info[HORZ_OR_VERT] = GIMP_ORIENTATION_UNKNOWN;
290
234
if (tr_tool->trans_info[HORZ_OR_VERT] == GIMP_ORIENTATION_HORIZONTAL)
291
235
amount = tr_tool->trans_info[XSHEAR];
293
237
amount = tr_tool->trans_info[YSHEAR];
295
gimp_transform_matrix_shear (tr_tool->x1,
239
gimp_matrix3_identity (&tr_tool->transform);
240
gimp_transform_matrix_shear (&tr_tool->transform,
297
243
tr_tool->x2 - tr_tool->x1,
298
244
tr_tool->y2 - tr_tool->y1,
299
245
tr_tool->trans_info[HORZ_OR_VERT],
301
&tr_tool->transform);
305
shear_x_mag_changed (GtkWidget *widget,
250
shear_x_mag_changed (GtkAdjustment *adj,
306
251
GimpTransformTool *tr_tool)
310
value = GTK_ADJUSTMENT (widget)->value;
253
gdouble value = gtk_adjustment_get_value (adj);
312
255
if (value != tr_tool->trans_info[XSHEAR])