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 )