restrict movements to 15 degrees (the circle way)

--Sven
This commit is contained in:
Sven Neumann 1999-11-25 01:59:14 +00:00
parent f0cde43787
commit d82cdfc84b
7 changed files with 97 additions and 282 deletions

View File

@ -1,3 +1,8 @@
Thu Nov 25 02:56:01 MET 1999 Sven Neumann <sven@gimp.org>
* app/blend.c
* app/paint_core.c: Ctrl now restrict to 15 degrees (on a circle)
Wed Nov 24 17:38:45 PST 1999 Manish Singh <yosh@gimp.org>
* Made 1.1.12 release

View File

@ -587,8 +587,8 @@ blend_motion (Tool *tool,
&blend_tool->endx, &blend_tool->endy, FALSE, 1);
/* Restrict to multiples of 15 degrees if shift is pressed */
if (mevent->state & GDK_SHIFT_MASK)
/* Restrict to multiples of 15 degrees if ctrl is pressed */
if (mevent->state & GDK_CONTROL_MASK)
{
int tangens2[6] = { 34, 106, 196, 334, 618, 1944 };
int cosinus[7] = { 256, 247, 222, 181, 128, 66, 0 };
@ -612,58 +612,6 @@ blend_motion (Tool *tool,
blend_tool->endx = blend_tool->startx + dx;
blend_tool->endy = blend_tool->starty + dy;
}
/* Use another way to restrict to multiples of 15 degrees if ctrl is pressed */
else 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)
{
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;
}
}
blend_tool->endx = blend_tool->startx + dx;
blend_tool->endy = blend_tool->starty + dy;
}
gtk_statusbar_pop (GTK_STATUSBAR (gdisp->statusbar), blend_tool->context_id);
if (gdisp->dot_for_dot)

View File

@ -587,8 +587,8 @@ blend_motion (Tool *tool,
&blend_tool->endx, &blend_tool->endy, FALSE, 1);
/* Restrict to multiples of 15 degrees if shift is pressed */
if (mevent->state & GDK_SHIFT_MASK)
/* Restrict to multiples of 15 degrees if ctrl is pressed */
if (mevent->state & GDK_CONTROL_MASK)
{
int tangens2[6] = { 34, 106, 196, 334, 618, 1944 };
int cosinus[7] = { 256, 247, 222, 181, 128, 66, 0 };
@ -612,58 +612,6 @@ blend_motion (Tool *tool,
blend_tool->endx = blend_tool->startx + dx;
blend_tool->endy = blend_tool->starty + dy;
}
/* Use another way to restrict to multiples of 15 degrees if ctrl is pressed */
else 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)
{
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;
}
}
blend_tool->endx = blend_tool->startx + dx;
blend_tool->endy = blend_tool->starty + dy;
}
gtk_statusbar_pop (GTK_STATUSBAR (gdisp->statusbar), blend_tool->context_id);
if (gdisp->dot_for_dot)

View File

@ -244,26 +244,31 @@ paint_core_button_press (Tool *tool,
paint_core->startwheel = paint_core->lastwheel;
#endif /* GTK_HAVE_SIX_VALUATORS */
/* restrict to horizontal/vertical lines, if modifiers are pressed */
if (bevent->state & GDK_MOD1_MASK)
/* Restrict to multiples of 15 degrees if ctrl is pressed */
if (bevent->state & GDK_CONTROL_MASK)
{
if (bevent->state & GDK_CONTROL_MASK)
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 = paint_core->curx - paint_core->lastx;
dy = paint_core->cury - paint_core->lasty;
if (dy)
{
double dx, dy;
dx = paint_core->curx - paint_core->lastx;
dy = paint_core->cury - paint_core->lasty;
paint_core->curx = paint_core->lastx +
(dx > 0 ? MAX (fabs (dx), fabs (dy)) : - MAX (fabs (dx), fabs (dy)));
paint_core->cury = paint_core->lasty +
(dy > 0 ? MAX (fabs (dx), fabs (dy)) : - MAX (fabs (dx), fabs (dy)));
radius = sqrt (SQR (dx) + SQR (dy));
frac = abs ((dx << 8) / dy);
for (i = 0; i < 6; i++)
{
if (frac < tangens2[i])
break;
}
dx = dx > 0 ? (cosinus[6-i] * radius) >> 8 : - ((cosinus[6-i] * radius) >> 8);
dy = dy > 0 ? (cosinus[i] * radius) >> 8 : - ((cosinus[i] * radius) >> 8);
}
else
paint_core->curx = paint_core->lastx;
paint_core->curx = paint_core->lastx + dx;
paint_core->cury = paint_core->lasty + dy;
}
else if (bevent->state & GDK_CONTROL_MASK)
paint_core->cury = paint_core->lasty;
}
tool->state = ACTIVE;
@ -448,29 +453,33 @@ paint_core_cursor_update (Tool *tool,
dx = paint_core->curx - paint_core->lastx;
dy = paint_core->cury - paint_core->lasty;
/* restrict to horizontal/vertical lines, if modifiers are pressed */
if (mevent->state & GDK_MOD1_MASK)
/* Restrict to multiples of 15 degrees if ctrl is pressed */
if (mevent->state & GDK_CONTROL_MASK)
{
if (mevent->state & GDK_CONTROL_MASK)
int idx = dx;
int idy = dy;
int tangens2[6] = { 34, 106, 196, 334, 618, 1944 };
int cosinus[7] = { 256, 247, 222, 181, 128, 66, 0 };
int i, radius, frac;
if (idy)
{
dx = paint_core->curx - paint_core->lastx;
dy = paint_core->cury - paint_core->lasty;
paint_core->curx = paint_core->lastx +
(dx > 0 ? MAX (fabs (dx), fabs (dy)) : - MAX (fabs (dx), fabs (dy)));
paint_core->cury = paint_core->lasty +
(dy > 0 ? MAX (fabs (dx), fabs (dy)) : - MAX (fabs (dx), fabs (dy)));
radius = sqrt (SQR (idx) + SQR (idy));
frac = abs ((idx << 8) / idy);
for (i = 0; i < 6; i++)
{
if (frac < tangens2[i])
break;
}
dx = idx > 0 ? (cosinus[6-i] * radius) >> 8 : - ((cosinus[6-i] * radius) >> 8);
dy = idy > 0 ? (cosinus[i] * radius) >> 8 : - ((cosinus[i] * radius) >> 8);
}
else
paint_core->curx = paint_core->lastx;
paint_core->curx = paint_core->lastx + dx;
paint_core->cury = paint_core->lasty + dy;
}
else if (mevent->state & GDK_CONTROL_MASK)
paint_core->cury = paint_core->lasty;
/* show distance in statusbar */
dx = paint_core->curx - paint_core->lastx;
dy = paint_core->cury - paint_core->lasty;
if (gdisp->dot_for_dot)
{
d = sqrt (SQR (dx) + SQR (dy));

View File

@ -587,8 +587,8 @@ blend_motion (Tool *tool,
&blend_tool->endx, &blend_tool->endy, FALSE, 1);
/* Restrict to multiples of 15 degrees if shift is pressed */
if (mevent->state & GDK_SHIFT_MASK)
/* Restrict to multiples of 15 degrees if ctrl is pressed */
if (mevent->state & GDK_CONTROL_MASK)
{
int tangens2[6] = { 34, 106, 196, 334, 618, 1944 };
int cosinus[7] = { 256, 247, 222, 181, 128, 66, 0 };
@ -612,58 +612,6 @@ blend_motion (Tool *tool,
blend_tool->endx = blend_tool->startx + dx;
blend_tool->endy = blend_tool->starty + dy;
}
/* Use another way to restrict to multiples of 15 degrees if ctrl is pressed */
else 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)
{
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;
}
}
blend_tool->endx = blend_tool->startx + dx;
blend_tool->endy = blend_tool->starty + dy;
}
gtk_statusbar_pop (GTK_STATUSBAR (gdisp->statusbar), blend_tool->context_id);
if (gdisp->dot_for_dot)

View File

@ -587,8 +587,8 @@ blend_motion (Tool *tool,
&blend_tool->endx, &blend_tool->endy, FALSE, 1);
/* Restrict to multiples of 15 degrees if shift is pressed */
if (mevent->state & GDK_SHIFT_MASK)
/* Restrict to multiples of 15 degrees if ctrl is pressed */
if (mevent->state & GDK_CONTROL_MASK)
{
int tangens2[6] = { 34, 106, 196, 334, 618, 1944 };
int cosinus[7] = { 256, 247, 222, 181, 128, 66, 0 };
@ -612,58 +612,6 @@ blend_motion (Tool *tool,
blend_tool->endx = blend_tool->startx + dx;
blend_tool->endy = blend_tool->starty + dy;
}
/* Use another way to restrict to multiples of 15 degrees if ctrl is pressed */
else 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)
{
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;
}
}
blend_tool->endx = blend_tool->startx + dx;
blend_tool->endy = blend_tool->starty + dy;
}
gtk_statusbar_pop (GTK_STATUSBAR (gdisp->statusbar), blend_tool->context_id);
if (gdisp->dot_for_dot)

View File

@ -244,26 +244,31 @@ paint_core_button_press (Tool *tool,
paint_core->startwheel = paint_core->lastwheel;
#endif /* GTK_HAVE_SIX_VALUATORS */
/* restrict to horizontal/vertical lines, if modifiers are pressed */
if (bevent->state & GDK_MOD1_MASK)
/* Restrict to multiples of 15 degrees if ctrl is pressed */
if (bevent->state & GDK_CONTROL_MASK)
{
if (bevent->state & GDK_CONTROL_MASK)
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 = paint_core->curx - paint_core->lastx;
dy = paint_core->cury - paint_core->lasty;
if (dy)
{
double dx, dy;
dx = paint_core->curx - paint_core->lastx;
dy = paint_core->cury - paint_core->lasty;
paint_core->curx = paint_core->lastx +
(dx > 0 ? MAX (fabs (dx), fabs (dy)) : - MAX (fabs (dx), fabs (dy)));
paint_core->cury = paint_core->lasty +
(dy > 0 ? MAX (fabs (dx), fabs (dy)) : - MAX (fabs (dx), fabs (dy)));
radius = sqrt (SQR (dx) + SQR (dy));
frac = abs ((dx << 8) / dy);
for (i = 0; i < 6; i++)
{
if (frac < tangens2[i])
break;
}
dx = dx > 0 ? (cosinus[6-i] * radius) >> 8 : - ((cosinus[6-i] * radius) >> 8);
dy = dy > 0 ? (cosinus[i] * radius) >> 8 : - ((cosinus[i] * radius) >> 8);
}
else
paint_core->curx = paint_core->lastx;
paint_core->curx = paint_core->lastx + dx;
paint_core->cury = paint_core->lasty + dy;
}
else if (bevent->state & GDK_CONTROL_MASK)
paint_core->cury = paint_core->lasty;
}
tool->state = ACTIVE;
@ -448,29 +453,33 @@ paint_core_cursor_update (Tool *tool,
dx = paint_core->curx - paint_core->lastx;
dy = paint_core->cury - paint_core->lasty;
/* restrict to horizontal/vertical lines, if modifiers are pressed */
if (mevent->state & GDK_MOD1_MASK)
/* Restrict to multiples of 15 degrees if ctrl is pressed */
if (mevent->state & GDK_CONTROL_MASK)
{
if (mevent->state & GDK_CONTROL_MASK)
int idx = dx;
int idy = dy;
int tangens2[6] = { 34, 106, 196, 334, 618, 1944 };
int cosinus[7] = { 256, 247, 222, 181, 128, 66, 0 };
int i, radius, frac;
if (idy)
{
dx = paint_core->curx - paint_core->lastx;
dy = paint_core->cury - paint_core->lasty;
paint_core->curx = paint_core->lastx +
(dx > 0 ? MAX (fabs (dx), fabs (dy)) : - MAX (fabs (dx), fabs (dy)));
paint_core->cury = paint_core->lasty +
(dy > 0 ? MAX (fabs (dx), fabs (dy)) : - MAX (fabs (dx), fabs (dy)));
radius = sqrt (SQR (idx) + SQR (idy));
frac = abs ((idx << 8) / idy);
for (i = 0; i < 6; i++)
{
if (frac < tangens2[i])
break;
}
dx = idx > 0 ? (cosinus[6-i] * radius) >> 8 : - ((cosinus[6-i] * radius) >> 8);
dy = idy > 0 ? (cosinus[i] * radius) >> 8 : - ((cosinus[i] * radius) >> 8);
}
else
paint_core->curx = paint_core->lastx;
paint_core->curx = paint_core->lastx + dx;
paint_core->cury = paint_core->lasty + dy;
}
else if (mevent->state & GDK_CONTROL_MASK)
paint_core->cury = paint_core->lasty;
/* show distance in statusbar */
dx = paint_core->curx - paint_core->lastx;
dy = paint_core->cury - paint_core->lasty;
if (gdisp->dot_for_dot)
{
d = sqrt (SQR (dx) + SQR (dy));