AcePerl
view release on metacpan or search on metacpan
acelib/bump.c view on Meta::CPAN
*py = ynew ;
bump->yAscii = ynew ;
}
BOOL bumpAdd (BUMP bump, int wid, float height,
int *px, float *py, BOOL doIt)
/* works by resetting x, y */
{
int i, j ;
int x = *px ;
float ynew, y = *py ;
if (bump->magic != &BUMP_MAGIC)
messcrash ("bumpAdd received corrupt bump->magic");
if (x + wid + bump->minSpace > bump->n)
x = bump->n - wid - bump->minSpace ;
if (x < 0)
x = 0 ;
if (wid > bump->n) /* prevent infinite loops */
wid = bump->n ;
if (y <= MINBUMP)
y = MINBUMP + 1 ;
ynew = y ;
while (TRUE)
{ for (i = x, j = wid ; i < bump->n ; ++i) /* always start at x */
{ if (bump->bottom[i] > y + bump->sloppy)
{ j = wid ;
ynew = y ; /* this line was missing in the old code */
}
else
{ if (bump->bottom[i] > ynew)
ynew = bump->bottom[i] ;
if (!--j) /* have found a gap */
break ;
}
}
if (!j)
{
if (doIt)
{
for (j = 0 ; j < wid ; j++) /* advance bump */
bump->bottom[i - j] = ynew+height ;
if (bump->max < i + 1)
bump->max = i + 1 ;
}
*px = i - wid + 1 ;
*py = ynew ;
return TRUE ;
}
y += 1 ; /* try next row down */
if (!doIt && bump->maxDy && y - *py > bump->maxDy)
return FALSE ;
}
}
/* abbreviate text, if vertical bump exceeds dy
return accepted length
*/
int bumpText (BUMP bump, char *text, int *px, float *py, float dy, BOOL vertical)
{
int w, n, x = *px;
float y = *py, h, old = bump->maxDy ;
if (bump->magic != &BUMP_MAGIC)
messcrash ("bumpText received corrupt bump->magic");
if (!text || !*text) return 0 ;
n = strlen(text) ;
bump->maxDy = dy ;
while (TRUE)
{
x = *px ; y = *py ; /* try always from desired position */
if (vertical) /*like in the genetic map */
{ w = n + 1 ; h = 1 ;}
else /* like in pmap */
{ w = 1 ; h = n + 1 ;}
if (bumpAdd (bump, w, h, &x, &y, FALSE))
{ /* success */
bump->maxDy = old ;
bumpRegister(bump, w, h, &x, &y) ;
*px = x ; *py = y ;
return n ;
}
if (n > 7)
{ n = 7 ; continue ; }
if (n > 3)
{ bump->maxDy = 2 * dy ; n = 3 ; continue ; }
if (n > 1)
{ bump->maxDy = 3 * dy ; n = 1 ; continue ; }
bump->maxDy = old ;
return 0 ; /* failure */
}
}
/**************************************************/
/**************************************************/
( run in 0.971 second using v1.01-cache-2.11-cpan-acf6aa7dc9e )