/[CvsGraph]/cvsgraph/cvsgraph.c
ViewVC logotype

Diff of /cvsgraph/cvsgraph.c

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph | View Patch Patch

revision 1.31, Mon Mar 10 22:57:21 2003 UTC revision 1.32, Fri Mar 14 01:38:39 2003 UTC
# Line 58  Line 58 
58  /*#define NOGDFILL      1*/  /*#define NOGDFILL      1*/
59  /*#define DEBUG_IMAGEMAP        1*/  /*#define DEBUG_IMAGEMAP        1*/
60    
61  #define LOOPSAFEGUARD   100     /* Max itterations in possible infinite loops */  #define LOOPSAFEGUARD   10000   /* Max itterations in possible infinite loops */
62    
63  #ifndef MAX  #ifndef MAX
64  # define MAX(a,b)       ((a) > (b) ? (a) : (b))  # define MAX(a,b)       ((a) > (b) ? (a) : (b))
# Line 1388  Line 1388 
1388          }          }
1389          draw_rbox(im, lx+xp, yp, rx+xp, yp+b->h, 5, &conf.branch_color, &conf.branch_bgcolor);          draw_rbox(im, lx+xp, yp, rx+xp, yp+b->h, 5, &conf.branch_color, &conf.branch_bgcolor);
1390          yy = conf.branch_tspace;          yy = conf.branch_tspace;
1391          draw_string(im, b->branch->branch, &conf.branch_font, x2+xp, yp+yy, ALIGN_HC, &conf.branch_color);          if(!b->nfolds)
         yy += get_sheight(b->branch->branch, &conf.branch_font);  
         for(i = 0; i < b->ntags; i++)  
1392          {          {
1393                  draw_string(im, b->tags[i]->tag, &conf.branch_tag_font, x2+xp, yp+yy, ALIGN_HC, &conf.branch_tag_color);                  draw_string(im, b->branch->branch, &conf.branch_font, x2+xp, yp+yy, ALIGN_HC, &conf.branch_color);
1394                  yy += get_sheight(b->tags[i]->tag, &conf.branch_font);                  yy += get_sheight(b->branch->branch, &conf.branch_font);
1395                    for(i = 0; i < b->ntags; i++)
1396                    {
1397                            draw_string(im, b->tags[i]->tag, &conf.branch_tag_font, x2+xp, yp+yy, ALIGN_HC, &conf.branch_tag_color);
1398                            yy += get_sheight(b->tags[i]->tag, &conf.branch_font);
1399                    }
1400            }
1401            else
1402            {
1403                    int y1, y2;
1404                    int tx = lx + b->fw + conf.branch_lspace;
1405                    int nx = tx - get_swidth(" ", &conf.branch_font);
1406                    draw_string(im, b->branch->branch, &conf.branch_font, nx+xp, yp+yy, ALIGN_HR, &conf.branch_color);
1407                    y1 = get_sheight(b->branch->branch, &conf.branch_font);
1408                    draw_string(im, b->tags[0]->tag, &conf.branch_tag_font, tx+xp, yp+yy, ALIGN_HL, &conf.branch_tag_color);
1409                    y2 = get_sheight(b->tags[0]->tag, &conf.branch_font);
1410                    yy += MAX(y1, y2);
1411                    for(i = 0; i < b->nfolds; i++)
1412                    {
1413                            draw_string(im, b->folds[i]->branch->branch, &conf.branch_font, nx+xp, yp+yy, ALIGN_HR, &conf.branch_color);
1414                            y1 = get_sheight(b->folds[i]->branch->branch, &conf.branch_font);
1415                            draw_string(im, b->folds[i]->tags[0]->tag, &conf.branch_tag_font, tx+xp, yp+yy, ALIGN_HL, &conf.branch_tag_color);
1416                            y2 = get_sheight(b->folds[i]->tags[0]->tag, &conf.branch_font);
1417                            yy += MAX(y1, y2);
1418                    }
1419          }          }
1420  }  }
1421    
# Line 1431  Line 1453 
1453                                  draw_rev(im, r);                                  draw_rev(im, r);
1454                                  xx = r->cx;                                  xx = r->cx;
1455                          }                          }
1456                          if(conf.branch_dupbox)                          if(conf.branch_dupbox && b->nrevs)
1457                          {                          {
1458                                  i = b->cx - b->tw + b->w;                                  i = b->cx - b->tw + b->w;
1459                                  gdImageLine(im, xx, b->y, i+b->w, b->y, conf.rev_color.id);                                  gdImageLine(im, xx, b->y, i+b->w, b->y, conf.rev_color.id);
# Line 1461  Line 1483 
1483                                  draw_rev(im, r);                                  draw_rev(im, r);
1484                                  xx = r->cx + r->w;                                  xx = r->cx + r->w;
1485                          }                          }
1486                          if(conf.branch_dupbox)                          if(conf.branch_dupbox && b->nrevs)
1487                          {                          {
1488                                  i = b->cx + b->tw - b->w;                                  i = b->cx + b->tw - b->w;
1489                                  gdImageLine(im, xx, b->y, i, b->y, conf.rev_color.id);                                  gdImageLine(im, xx, b->y, i, b->y, conf.rev_color.id);
# Line 1494  Line 1516 
1516                                  draw_rev(im, r);                                  draw_rev(im, r);
1517                                  yy = r->y;                                  yy = r->y;
1518                          }                          }
1519                          if(conf.branch_dupbox)                          if(conf.branch_dupbox && b->nrevs)
1520                          {                          {
1521                                  i = b->y - b->th + b->h;                                  i = b->y - b->th + b->h;
1522                                  gdImageLine(im, b->cx, yy, b->cx, i, conf.rev_color.id);                                  gdImageLine(im, b->cx, yy, b->cx, i, conf.rev_color.id);
# Line 1524  Line 1546 
1546                                  draw_rev(im, r);                                  draw_rev(im, r);
1547                                  yy = r->y + r->h;                                  yy = r->y + r->h;
1548                          }                          }
1549                          if(conf.branch_dupbox)                          if(conf.branch_dupbox && b->nrevs)
1550                          {                          {
1551                                  i = b->y + b->th - b->h;                                  i = b->y + b->th - b->h;
1552                                  gdImageLine(im, b->cx, yy, b->cx, i, conf.rev_color.id);                                  gdImageLine(im, b->cx, yy, b->cx, i, conf.rev_color.id);
# Line 1591  Line 1613 
1613                          continue;       /* This can happen with detached tags and self-references */                          continue;       /* This can happen with detached tags and self-references */
1614                  if(conf.left_right)                  if(conf.left_right)
1615                  {                  {
1616                          if(fr->y < tr->y)                          if(fr->branch == tr->branch)
1617                          {                          {
1618                                  y1 = fr->y + fr->h/2;                                  y1 = fr->y - fr->h/2;
1619                                  y2 = tr->y - tr->h/2;                                  y2 = tr->y - tr->h/2;
1620                          }                          }
1621                          else                          else
1622                          {                          {
1623                                  y1 = fr->y - fr->h/2;                                  if(fr->y < tr->y)
1624                                  y2 = tr->y + tr->h/2;                                  {
1625                                            y1 = fr->y + fr->h/2;
1626                                            y2 = tr->y - tr->h/2;
1627                                    }
1628                                    else
1629                                    {
1630                                            y1 = fr->y - fr->h/2;
1631                                            y2 = tr->y + tr->h/2;
1632                                    }
1633                          }                          }
1634                          x1 = fr->cx + fr->w/2;                          x1 = fr->cx + fr->w/2;
1635                          x2 = tr->cx + tr->w/2;                          x2 = tr->cx + tr->w/2;
1636                  }                  }
1637                  else                  else
1638                  {                  {
1639                          if(fr->cx < tr->cx)                          if(fr->branch == tr->branch)
1640                          {                          {
1641                                  x1 = fr->cx + fr->w/2;                                  x1 = fr->cx - fr->w/2;
1642                                  x2 = tr->cx - tr->w/2;                                  x2 = tr->cx - tr->w/2;
1643                          }                          }
1644                          else                          else
1645                          {                          {
1646                                  x1 = fr->cx - fr->w/2;                                  if(fr->cx < tr->cx)
1647                                  x2 = tr->cx + tr->w/2;                                  {
1648                                            x1 = fr->cx + fr->w/2;
1649                                            x2 = tr->cx - tr->w/2;
1650                                    }
1651                                    else
1652                                    {
1653                                            x1 = fr->cx - fr->w/2;
1654                                            x2 = tr->cx + tr->w/2;
1655                                    }
1656                          }                          }
1657                          y1 = fr->y + rcs->merges[i].from->yofs;                          y1 = fr->y + rcs->merges[i].from->yofs;
1658                          y2 = tr->y + rcs->merges[i].to->yofs;                          y2 = tr->y + rcs->merges[i].to->yofs;
# Line 1629  Line 1667 
1667                  {                  {
1668                          if(conf.left_right)                          if(conf.left_right)
1669                          {                          {
1670                                  if(y1 > y2)                                  if(fr->branch == tr->branch)
1671                                  {                                  {
1672                                          gdImageLine(im, x1, y1, x1, y1-3, conf.merge_color.id);                                          int yy = (y1 < y2 ? y1 : y2) - 5;
1673                                          gdImageLine(im, x2, y2+1, x2, y2+3+1, conf.merge_color.id);                                          gdImageLine(im, x1, y1, x1, yy, conf.merge_color.id);
1674                                          gdImageLine(im, x1, y1-3, x2, y2+3+1, conf.merge_color.id);                                          gdImageLine(im, x2, y2, x2, yy, conf.merge_color.id);
1675                                            gdImageLine(im, x1, yy, x2, yy, conf.merge_color.id);
1676                                  }                                  }
1677                                  else                                  else
1678                                  {                                  {
1679                                          gdImageLine(im, x1, y1+1, x1, y1+3+1, conf.merge_color.id);                                          if(y1 > y2)
1680                                          gdImageLine(im, x2, y2, x2, y2-3, conf.merge_color.id);                                          {
1681                                          gdImageLine(im, x1, y1+3+1, x2, y2-3, conf.merge_color.id);                                                  gdImageLine(im, x1, y1, x1, y1-3, conf.merge_color.id);
1682                                                    gdImageLine(im, x2, y2+1, x2, y2+3+1, conf.merge_color.id);
1683                                                    gdImageLine(im, x1, y1-3, x2, y2+3+1, conf.merge_color.id);
1684                                            }
1685                                            else
1686                                            {
1687                                                    gdImageLine(im, x1, y1+1, x1, y1+3+1, conf.merge_color.id);
1688                                                    gdImageLine(im, x2, y2, x2, y2-3, conf.merge_color.id);
1689                                                    gdImageLine(im, x1, y1+3+1, x2, y2-3, conf.merge_color.id);
1690                                            }
1691                                  }                                  }
1692                          }                          }
1693                          else                          else
1694                          {                          {
1695                                  if(x1 > x2)                                  if(fr->branch == tr->branch)
1696                                  {                                  {
1697                                          gdImageLine(im, x1, y1, x1-3, y1, conf.merge_color.id);                                          int xx = (x1 < x2 ? x1 : x2) - 5;
1698                                          gdImageLine(im, x2, y2, x2+3, y2, conf.merge_color.id);                                          gdImageLine(im, xx, y1, x1, y1, conf.merge_color.id);
1699                                          gdImageLine(im, x1-3, y1, x2+3, y2, conf.merge_color.id);                                          gdImageLine(im, xx, y2, x2, y2, conf.merge_color.id);
1700                                            gdImageLine(im, xx, y1, xx, y2, conf.merge_color.id);
1701                                  }                                  }
1702                                  else                                  else
1703                                  {                                  {
1704                                          gdImageLine(im, x1, y1, x1+3, y1, conf.merge_color.id);                                          if(x1 > x2)
1705                                          gdImageLine(im, x2, y2, x2-3, y2, conf.merge_color.id);                                          {
1706                                          gdImageLine(im, x1+3, y1, x2-3, y2, conf.merge_color.id);                                                  gdImageLine(im, x1, y1, x1-3, y1, conf.merge_color.id);
1707                                                    gdImageLine(im, x2, y2, x2+3, y2, conf.merge_color.id);
1708                                                    gdImageLine(im, x1-3, y1, x2+3, y2, conf.merge_color.id);
1709                                            }
1710                                            else
1711                                            {
1712                                                    gdImageLine(im, x1, y1, x1+3, y1, conf.merge_color.id);
1713                                                    gdImageLine(im, x2, y2, x2-3, y2, conf.merge_color.id);
1714                                                    gdImageLine(im, x1+3, y1, x2-3, y2, conf.merge_color.id);
1715                                            }
1716                                  }                                  }
1717                          }                          }
1718                  }                  }
# Line 1697  Line 1755 
1755                  draw_merges(im, rcs, 0);                  draw_merges(im, rcs, 0);
1756    
1757          for(i = 0; i < rcs->nbranches; i++)          for(i = 0; i < rcs->nbranches; i++)
1758                  draw_branch(im, rcs->branches[i]);          {
1759                    if(!rcs->branches[i]->folded)
1760                            draw_branch(im, rcs->branches[i]);
1761            }
1762    
1763          draw_merges(im, rcs, 1);        /* The dots of the merge dest */          draw_merges(im, rcs, 1);        /* The dots of the merge dest */
1764    
# Line 1798  Line 1859 
1859                  /* Recurse to move branches of branched revisions */                  /* Recurse to move branches of branched revisions */
1860                  for(i = b->nrevs-1; i >= 0; i--)                  for(i = b->nrevs-1; i >= 0; i--)
1861                  {                  {
1862                          initial_reposition_branch(b->revs[i], y, h);                          initial_reposition_branch_lr(b->revs[i], y, h);
1863                  }                  }
1864          }          }
1865  }  }
# Line 1953  Line 2014 
2014          if(l)   *l = br->cx - br->tw/2;          if(l)   *l = br->cx - br->tw/2;
2015          if(r)   *r = br->cx + br->tw/2;          if(r)   *r = br->cx + br->tw/2;
2016          if(t)   *t = br->y;          if(t)   *t = br->y;
2017          if(b)   *b = br->y + br->th + (conf.branch_dupbox ? conf.rev_minline + br->h : 0);          if(b)   *b = br->y + br->th + ((conf.branch_dupbox && br->nrevs) ? conf.rev_minline + br->h : 0);
2018  }  }
2019    
2020  static void branch_ext_bbox(branch_t *br, int *l, int *r, int *t, int *b)  static void branch_ext_bbox(branch_t *br, int *l, int *r, int *t, int *b)
# Line 2310  Line 2371 
2371                  fprintf(stderr, "auto_stretch: safeguard terminated possible infinite loop; please report.\n");                  fprintf(stderr, "auto_stretch: safeguard terminated possible infinite loop; please report.\n");
2372  }  }
2373    
2374    static void fold_branch(rcsfile_t *rcs, revision_t *r)
2375    {
2376            int i, j;
2377            branch_t *btag = NULL;
2378    
2379            if(r->nbranches < 2)
2380                    return;         /* Should not happen... */
2381    
2382            for(i = 0; i < r->nbranches; i++)
2383            {
2384                    branch_t *b = r->branches[i];
2385                    if(!b->nrevs && b->ntags < 2)
2386                    {
2387                            /* No commits in this branch and no duplicate tags */
2388                            if(!btag)
2389                                    btag = b;
2390                            else
2391                            {
2392                                    /* We have consecutive empty branches, fold */
2393                                    b->folded = 1;
2394                                    for(j = 0; j < rcs->nbranches; j++)
2395                                    {
2396                                            if(b == rcs->branches[j])
2397                                            {
2398                                                    /* Zap the branch from the admin */
2399                                                    memmove(&rcs->branches[j],
2400                                                            &rcs->branches[j+1],
2401                                                            (rcs->nbranches - j - 1)*sizeof(rcs->branches[0]));
2402                                                    rcs->nbranches--;
2403                                                    break;
2404                                            }
2405    
2406                                    }
2407                                    memmove(&r->branches[i], &r->branches[i+1], (r->nbranches - i - 1)*sizeof(r->branches[0]));
2408                                    r->nbranches--;
2409                                    i--;    /* We have one less now */
2410    
2411                                    /* Add to the fold-list */
2412                                    btag->folds = xrealloc(btag->folds, (btag->nfolds+1) * sizeof(btag->folds[0]));
2413                                    btag->folds[btag->nfolds] = b;
2414                                    btag->nfolds++;
2415                            }
2416                    }
2417                    else
2418                    {
2419                            btag = NULL;
2420                            /* Recursively fold sub-branches */
2421                            for(j = 0; j < b->nrevs; j++)
2422                                    fold_branch(rcs, b->revs[j]);
2423                    }
2424            }
2425    }
2426    
2427  void make_layout(rcsfile_t *rcs)  void make_layout(rcsfile_t *rcs)
2428  {  {
2429          int i, j;          int i, j;
# Line 2337  Line 2451 
2451                  }                  }
2452          }          }
2453    
2454            /* Fold all empty branched in one box on the same branchpoint */
2455            if(conf.branch_fold)
2456            {
2457                    for(i = 0; i < rcs->branches[0]->nrevs; i++)
2458                    {
2459                            if(rcs->branches[0]->revs[i]->nbranches > 1)
2460                                    fold_branch(rcs, rcs->branches[0]->revs[i]);
2461                    }
2462            }
2463    
2464          /* Calculate the box-sizes of the revisions */          /* Calculate the box-sizes of the revisions */
2465          for(i = 0; i < rcs->nsrev; i++)          for(i = 0; i < rcs->nsrev; i++)
2466          {          {
# Line 2369  Line 2493 
2493                  branch_t *bp = rcs->branches[i];                  branch_t *bp = rcs->branches[i];
2494                  int w;                  int w;
2495                  int h;                  int h;
2496                  w = get_swidth(bp->branch->branch, &conf.branch_font);                  if(!bp->nfolds)
                 h = get_sheight(bp->branch->branch, &conf.branch_font);  
                 for(j = 0; j < bp->ntags; j++)  
2497                  {                  {
2498                          int ww = get_swidth(bp->tags[j]->tag, &conf.branch_tag_font);                          w = get_swidth(bp->branch->branch, &conf.branch_font);
2499                          if(ww > w) w = ww;                          h = get_sheight(bp->branch->branch, &conf.branch_font);
2500                          h += get_sheight(bp->tags[j]->tag, &conf.branch_tag_font);                          for(j = 0; j < bp->ntags; j++)
2501                            {
2502                                    int ww = get_swidth(bp->tags[j]->tag, &conf.branch_tag_font);
2503                                    if(ww > w) w = ww;
2504                                    h += get_sheight(bp->tags[j]->tag, &conf.branch_tag_font);
2505                            }
2506                    }
2507                    else
2508                    {
2509                            int h1, h2;
2510                            int w1, w2;
2511                            int fw;
2512                            w1 = get_swidth(bp->branch->branch, &conf.branch_font);
2513                            w1 += get_swidth(" ", &conf.branch_font);
2514                            w2 = get_swidth(bp->tags[0]->tag, &conf.branch_tag_font);
2515                            fw = w1;
2516                            w = w1 + w2;
2517                            h1 = get_sheight(bp->branch->branch, &conf.branch_font);
2518                            h2 = get_sheight(bp->tags[0]->tag, &conf.branch_tag_font);
2519                            h = MAX(h1, h2);
2520                            for(j = 0; j < bp->nfolds; j++)
2521                            {
2522                                    w1 = get_swidth(bp->folds[j]->branch->branch, &conf.branch_font);
2523                                    w1 += get_swidth(" ", &conf.branch_font);
2524                                    w2 = get_swidth(bp->folds[j]->tags[0]->tag, &conf.branch_tag_font);
2525                                    if(w1 > fw)
2526                                            fw = w1;
2527                                    if(w1 + w2 > w)
2528                                            w = w1 + w2;
2529                                    h1 = get_sheight(bp->folds[j]->branch->branch, &conf.branch_font);
2530                                    h2 = get_sheight(bp->folds[j]->tags[0]->tag, &conf.branch_tag_font);
2531                                    h += MAX(h1, h2);
2532                            }
2533                            bp->fw = fw;
2534                  }                  }
2535                  w += conf.branch_lspace + conf.branch_rspace;                  w += conf.branch_lspace + conf.branch_rspace;
2536                  h += conf.branch_tspace + conf.branch_bspace;                  h += conf.branch_tspace + conf.branch_bspace;
# Line 2389  Line 2544 
2544                                          h = bp->revs[j]->h;                                          h = bp->revs[j]->h;
2545                                  w += bp->revs[j]->w + conf.rev_minline;                                  w += bp->revs[j]->w + conf.rev_minline;
2546                          }                          }
2547                          if(conf.branch_dupbox)                          if(conf.branch_dupbox && bp->nrevs)
2548                                  w += bp->w + conf.rev_minline;                                  w += bp->w + conf.rev_minline;
2549                  }                  }
2550                  else                  else
# Line 2400  Line 2555 
2555                                          w = bp->revs[j]->w;                                          w = bp->revs[j]->w;
2556                                  h += bp->revs[j]->h + conf.rev_minline;                                  h += bp->revs[j]->h + conf.rev_minline;
2557                          }                          }
2558                          if(conf.branch_dupbox)                          if(conf.branch_dupbox && bp->nrevs)
2559                                  h += bp->h + conf.rev_minline;                                  h += bp->h + conf.rev_minline;
2560                  }                  }
2561                  bp->th = h;                  bp->th = h;
# Line 2691  Line 2846 
2846                                  xfree(alt);                                  xfree(alt);
2847                          }                          }
2848                  }                  }
2849                  if(conf.branch_dupbox)                  if(conf.branch_dupbox && b->nrevs)
2850                  {                  {
2851                          if(conf.left_right)                          if(conf.left_right)
2852                          {                          {
# Line 2895  Line 3050 
3050    
3051          conf.anti_alias         = 1;          conf.anti_alias         = 1;
3052          conf.thick_lines        = 1;          conf.thick_lines        = 1;
3053            conf.branch_fold        = 1;
3054    
3055          conf.cvsroot            = xstrdup("");          conf.cvsroot            = xstrdup("");
3056          conf.cvsmodule          = xstrdup("");          conf.cvsmodule          = xstrdup("");

Legend:
Removed from v.1.31  
changed lines
  Added in v.1.32

  ViewVC Help
Powered by ViewVC 1.1.0 with CvsGraph 1.7.0