Hi, I think we aggreed that for the paint tools it would be nice to have only one modifier key to restrict lines to certain angles. Before I implement this, I want you to give me your opinion, how this restriction to multiples of 15 degrees should feel like. Since this is quite difficult to explain, I have just checked in a modification to the blend tool: Holding <Shift> restricts you to 15 degrees and puts the endpoint on the circle you are defining with your mouse and the startpoint. Holding <Ctrl> restricts you to 15 degrees too, but puts the endpoint on a rectangle defined by your mouse and the closest 15-degrees angle. The latter mimics the behaviour of the selection tools (which I think shouldn't be changed). So please give this a try and tell me which version you prefer. And please, don't tell me to make it configurable... For those of you that don't update their gimp regulary from CVS, I have attached a patch that should work against the latest release (and probably earlier releases too). Salut, Sven
Index: app/blend.c =================================================================== RCS file: /cvs/gnome/gimp/app/blend.c,v retrieving revision 1.59 diff -u -r1.59 blend.c --- app/blend.c 1999/10/26 18:27:23 1.59 +++ app/blend.c 1999/11/18 17:50:49 @@ -588,10 +588,10 @@ /* Restrict to multiples of 15 degrees if shift is pressed */ - if (mevent->state & GDK_SHIFT_MASK) + if (mevent->state & GDK_SHIFT_MASK) { - int tangens[6] = { 34, 106, 196, 334, 618, 1944 }; - int cosinus[7] = { 256, 247, 222, 181, 128, 66, 0 }; + int tangens2[6] = { 34, 106, 196, 334, 618, 1944 }; + int cosinus[7] = { 256, 247, 222, 181, 128, 66, 0 }; int dx, dy, i, radius, frac; dx = blend_tool->endx - blend_tool->startx; @@ -603,7 +603,7 @@ frac = abs ((dx << 8) / dy); for (i = 0; i < 6; i++) { - if (frac < tangens[i]) + if (frac < tangens2[i]) break; } dx = dx > 0 ? (cosinus[6-i] * radius) >> 8 : - ((cosinus[6-i] * radius) >> 8); @@ -612,27 +612,58 @@ blend_tool->endx = blend_tool->startx + dx; blend_tool->endy = blend_tool->starty + dy; } - - /* restrict to horizontal/vertical blend, if modifiers are pressed */ - if (mevent->state & GDK_MOD1_MASK) + /* Use another way to restrict to multiples of 15 degrees if ctrl is pressed */ + else if (mevent->state & GDK_CONTROL_MASK) { - if (mevent->state & GDK_CONTROL_MASK) + int tangens[5] = { 69, 148, 256, 443, 955 }; + int tangens2[6] = { 34, 106, 196, 334, 618, 1944 }; + int dx, dy, i, frac; + + dx = blend_tool->endx - blend_tool->startx; + dy = blend_tool->endy - blend_tool->starty; + + if (dy) { - int dx, dy; - - dx = blend_tool->endx - blend_tool->startx; - dy = blend_tool->endy - blend_tool->starty; - - blend_tool->endx = blend_tool->startx + - (dx > 0 ? MAX (abs (dx), abs (dy)) : - MAX (abs (dx), abs (dy))); - blend_tool->endy = blend_tool->starty + - (dy > 0 ? MAX (abs (dx), abs (dy)) : - MAX (abs (dx), abs (dy))); + frac = abs ((dx << 8) / dy); + for (i = 0; i < 6; i++) + { + if (frac < tangens2[i]) + break; + } + switch (i) + { + case (0): + dx = 0; + break; + case (1): + case (2): + dx = dx * dy > 0 ? + (tangens[i-1] * dy) / 256 : - ((tangens[i-1] * dy) / 256); + break; + case (3): + if (abs (dx) < abs (dy)) + dx = dx * dy > 0 ? + (tangens[i-1] * dy) / 256 : - ((tangens[i-1] * dy) / 256); + else + dy = dx * dy > 0 ? + (tangens[5-i] * dx) / 256 : - ((tangens[5-i] * dx) / 256); + break; + case (4): + case (5): + dy = dx * dy > 0 ? + (tangens[5-i] * dx) / 256 : - ((tangens[5-i] * dx) / 256); + break; + case (6): + dy = 0; + break; + default: + g_warning ("blend_motion: should never be reached!"); + break; + } } - else - blend_tool->endx = blend_tool->startx; + blend_tool->endx = blend_tool->startx + dx; + blend_tool->endy = blend_tool->starty + dy; } - else if (mevent->state & GDK_CONTROL_MASK) - blend_tool->endy = blend_tool->starty; gtk_statusbar_pop (GTK_STATUSBAR (gdisp->statusbar), blend_tool->context_id); if (gdisp->dot_for_dot)