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, ¤t); 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); } } }