Fossil

Check-in [a3bfe425]
Login

Check-in [a3bfe425]

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:Graph layout: Strive harder for merge arrows to come straight up out of the top of leaf nodes.
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA3-256: a3bfe425e0eb18eab6b3291d5f051a1ee7fa39ce5bf08759dd82da1402297b7d
User & Date: drh 2022-03-10 12:35:34
Context
2022-03-10
12:50
Graph layout: Reduce the top-margin requirement for a merge arrow that comes straight up out of the top of a leaf node. ... (check-in: 6b56d890 user: drh tags: trunk)
12:35
Graph layout: Strive harder for merge arrows to come straight up out of the top of leaf nodes. ... (check-in: a3bfe425 user: drh tags: trunk)
2022-03-08
20:47
On file listing pages, sort files that have numbers as part of their name in numeric order. ... (check-in: 59dfca5e user: drh tags: trunk)
Changes
Hide Diffs Unified Diffs Ignore Whitespace Patch

Changes to src/graph.c.

367
368
369
370
371
372
373














374
375
376
377
378
379
380
381
382
383
384
385
386
387
388








389
390
391
392
393
394
395
396
    for(p=pPrior; p && (n--)>0; p=p->pPrev){
      pPrior->selfUp++;
      p->railInUse |= mask;
    }
  }
}















/*
** Create a merge-arrow riser going from pParent up to pChild.
*/
static void createMergeRiser(
  GraphContext *p,
  GraphRow *pParent,
  GraphRow *pChild,
  int isCherrypick
){
  int u;
  u64 mask;
  GraphRow *pLoop;

  if( pParent->mergeOut<0 ){
    u = pParent->aiRiser[pParent->iRail];








    if( u>0 && u<pChild->idx ){
      /* The thick arrow up to the next primary child of pDesc goes
      ** further up than the thin merge arrow riser, so draw them both
      ** on the same rail. */
      pParent->mergeOut = pParent->iRail;
    }else if( pParent->idx - pChild->idx < pParent->selfUp ){
      pParent->mergeOut = pParent->iRail;
    }else{







>
>
>
>
>
>
>
>
>
>
>
>
>
>





|
|
|







>
>
>
>
>
>
>
>
|







367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
    for(p=pPrior; p && (n--)>0; p=p->pPrev){
      pPrior->selfUp++;
      p->railInUse |= mask;
    }
  }
}


/*
** Check to see if rail iRail is clear from pBottom up to and including
** pTop.
*/
static int railIsClear(GraphRow *pBottom, int iTop, int iRail){
  u64 m = BIT(iRail);
  while( pBottom && pBottom->idx>=iTop ){
    if( pBottom->railInUse & m ) return 0;
    pBottom = pBottom->pPrev;
  }
  return 1;
}

/*
** Create a merge-arrow riser going from pParent up to pChild.
*/
static void createMergeRiser(
  GraphContext *p,
  GraphRow *pParent,    /* Lower node from which the merge line begins */
  GraphRow *pChild,     /* Upper node at which the merge line ends */
  int isCherrypick      /* True for a cherry-pick merge */
){
  int u;
  u64 mask;
  GraphRow *pLoop;

  if( pParent->mergeOut<0 ){
    u = pParent->aiRiser[pParent->iRail];
    if( u<0 && railIsClear(pParent->pPrev, pChild->idx-1, pParent->iRail) ){
      /* pParent is a leaf and the merge-line can be drawn straight up.*/
      pParent->mergeOut = pParent->iRail;
      mask = BIT(pParent->iRail);
      for(pLoop=pChild->pNext; pLoop && pLoop->rid!=pParent->rid;
           pLoop=pLoop->pNext){
        pLoop->railInUse |= mask;
      }
    }else if( u>0 && u<pChild->idx ){
      /* The thick arrow up to the next primary child of pDesc goes
      ** further up than the thin merge arrow riser, so draw them both
      ** on the same rail. */
      pParent->mergeOut = pParent->iRail;
    }else if( pParent->idx - pChild->idx < pParent->selfUp ){
      pParent->mergeOut = pParent->iRail;
    }else{