e3ab5bcc4bf9024a1c21c8ad5f7ef21ffc9a67cc
kate
  Wed Jan 3 15:21:09 2018 -0800
Add curve drawing (ellipse and bezier).  Code by Zingl Alois, 2016, posted to github and  http://members.chello.at/~easyfilter/bresenham.html. refs #17512

diff --git src/hg/hgTracks/longRangeTrack.c src/hg/hgTracks/longRangeTrack.c
index 4b1a12c..bbe1bc4 100644
--- src/hg/hgTracks/longRangeTrack.c
+++ src/hg/hgTracks/longRangeTrack.c
@@ -1,17 +1,18 @@
 
 #include "common.h"
+#include "memgfx.h"
 #include "hgTracks.h"
 #include "longRange.h"
 
 
 static int longRangeHeight(struct track *tg, enum trackVisibility vis)
 /* calculate height of all the snakes being displayed */
 {
 if ( tg->visibility == tvDense)
     return  tl.fontHeight;
 int min, max, deflt, current; 
 cartTdbFetchMinMaxPixels(cart, tg->tdb, LONG_MINHEIGHT, LONG_MAXHEIGHT, atoi(LONG_DEFHEIGHT),
                                 &min, &max, &deflt, &current);
 return tg->height = current;
 }
 
@@ -128,56 +129,82 @@
                 int width = vgGetFontStringWidth(hvg->vg, font, buffer);
                 mapBoxHgcOrHgGene(hvg, longRange->s, longRange->s, sx - width/2, yPos, 
                                 width, fontHeight, tg->track, itemBuf, statusBuf, NULL, TRUE, NULL);
                 }
             }
         continue;
         }
 
     // same chromosome
     boolean sOnScreen = (longRange->s >= seqStart) && (longRange->s < seqEnd);
     boolean eOnScreen = (longRange->e >= seqStart) && (longRange->e < seqEnd);
     if (!(sOnScreen || eOnScreen))
         continue;
 
     double longRangeWidth = longRange->e - longRange->s;
-    int peak = (sameHeight - 15) * ((double)longRangeWidth / maxWidth) + yOff + 10;
+    //int peak = (sameHeight - 15) * ((double)longRangeWidth / maxWidth) + yOff + 10;
+    int peakHeight = (sameHeight - 15) * ((double)longRangeWidth / maxWidth) + 10;
+    int peak = yOff + peakHeight;
+//uglyf("peak: %d. ", peak);
     if (tg->visibility == tvDense)
         peak = yOff + tg->height;
 
     if (sOnScreen)
         {
         // draw foot of 'lower' region
         hvGfxLine(hvg, sx - sFootWidth, yOff, sx + sFootWidth, yOff, color);
 
         // draw vertical
+        if (!eOnScreen)
             hvGfxLine(hvg, sx, yOff, sx, peak, color);
         }
     if (eOnScreen)
         {
         // draw foot of 'upper' region
         hvGfxLine(hvg, ex - eFootWidth, yOff, ex + eFootWidth, yOff, color);
 
         // draw vertical
+        if (!sOnScreen)
             hvGfxLine(hvg, ex, yOff, ex, peak, color); //OLD
         }
-
+    if (sOnScreen && eOnScreen)
+        {
+        // draw arc
+        //int xTop = (ex - sx + 1)/2 + sx;        // TODO
+        //int xTop = ex; // demo
+        //int yTop = (sameHeight - 15) * ((double)longRangeWidth / maxWidth) - yOff - 10;
+        //int yTop = peak + 10;   // full ellipse test
+        //int yLeft = yOff; // full ellipse test
+        //int yTop = peak + 10;   // demo
+        //int yLeft = yOff - 10; // demo
+        //hvGfxEllipse(hvg, sx, yLeft, ex, yTop, color); // demo
+        //hvGfxEllipse(hvg, sx, yOff - peakHeight, ex, peak + 10, color); // demo
+        int yLeft = yOff + peakHeight;
+        int yTop = yOff - peakHeight;
+    hvGfxEllipseDraw(hvg, sx, yLeft, ex, yTop, color, ELLIPSE_BOTTOM); // demo
+        //uglyf("(%d,%d) (%d,%d) (%d,%d).  ", sx, yOff, (ex-sx+1)/2 + sx, peak, ex, yOff);
+
+    //hvGfxCurve(hvg, sx, yOff, (ex-sx+1)/2 + sx, peak+60, ex, yOff, color);
+        //hvGfxLine(hvg, sx, yLeft, MG_RED);
+        //hvGfxLine(hvg, xTop, yTop, MG_GREEN);
+        }
     if (tg->visibility == tvFull)
         {
         // draw link between regions (dense mode just shows feet ??)
         unsigned ePeak = eOnScreen ? ex : xOff + width;
         unsigned sPeak = sOnScreen ? sx : xOff;
+        if (!sOnScreen || !eOnScreen)
             hvGfxLine(hvg, sPeak, peak, ePeak, peak, color);
 
         if (sOnScreen)
             mapBoxHgcOrHgGene(hvg, longRange->s, longRange->e, sx - 2, yOff, 4, peak - yOff,
                                    tg->track, itemBuf, statusBuf, NULL, TRUE, NULL);
         if (eOnScreen)
             mapBoxHgcOrHgGene(hvg, longRange->s, longRange->e, ex - 2, yOff, 4, peak - yOff,
                                    tg->track, itemBuf, statusBuf, NULL, TRUE, NULL);
 
         mapBoxHgcOrHgGene(hvg, longRange->s, longRange->e, sPeak, peak-2, ePeak - sPeak, 4,
                                tg->track, itemBuf, statusBuf, NULL, TRUE, NULL);
         }
     }
 }