9944d8c4a72a426a07ed2d33a5ea535811dd4461 galt Sun Feb 7 23:26:52 2016 -0800 Issue 16666. Makes autoscale work with multi-region for wig, bedGraph, bigWig, and multiWig. doWiggle still TODO. diff --git src/hg/hgTracks/hgTracks.c src/hg/hgTracks/hgTracks.c index 1e7eec5..56a3ab6 100644 --- src/hg/hgTracks/hgTracks.c +++ src/hg/hgTracks/hgTracks.c @@ -1515,30 +1515,48 @@ { trackPastTabX = insideX + insideWidth/2 - size/2; trackPastTabWidth = size; } #endif///def IMAGEv2_SHORT_TOGGLE mapBoxToggleVis(hvg, trackPastTabX, y+1,trackPastTabWidth, insideHeight, (theImgBox ? track : parentTrack)); } y += fontHeight; } y += track->totalHeight(track, track->limitedVis); } return y; } +static void doPreDrawItems(struct track *track, struct hvGfx *hvg, MgFont *font, + int y, long *lastTime) +/* Do Pre-Draw track items. */ +{ +int fontHeight = mgFontLineHeight(font); +if (isCenterLabelIncluded(track)) + y += fontHeight; +if (track->preDrawItems) + track->preDrawItems(track, winStart, winEnd, hvg, insideX, y, insideWidth, + font, track->ixColor, track->limitedVis); +if (measureTiming && lastTime) + { + long thisTime = clock1000(); + track->drawTime = thisTime - *lastTime; + *lastTime = thisTime; + } +} + static int doDrawItems(struct track *track, struct hvGfx *hvg, MgFont *font, int y, long *lastTime) /* Draw track items. Return y coord */ { int fontHeight = mgFontLineHeight(font); int pixWidth = tl.picWidth; if (isCenterLabelIncluded(track)) y += fontHeight; if (track->limitedVis == tvPack) { hvGfxSetClip(hvg, gfxBorder+trackTabWidth+1, y, pixWidth-2*gfxBorder-trackTabWidth-1, track->height); } else hvGfxSetClip(hvg, insideX, y, insideWidth, track->height); @@ -5316,52 +5334,78 @@ sliceHeight = yEnd - yStart - 1; curImgTrack = imgBoxTrackFind(theImgBox,track->tdb,NULL); if (sliceHeight > 0) { //warn("GTEX 7: track %s, sliceHeight=%d\n", track->shortLabel, sliceHeight); curSlice = imgTrackSliceUpdateOrAdd(curImgTrack,stData,theOneImg,NULL, sliceWidth[stData],sliceHeight, sliceOffsetX[stData],sliceOffsetY); (void) sliceMapFindOrStart(curSlice,track->tdb->track,NULL); // No common linkRoot } } if (trackShouldUseAjaxRetrieval(track)) y += REMOTE_TRACK_HEIGHT; else { - int savey = y; // DEBUG REMOVE + int savey = y; struct track *winTrack; + // do preDraw + if (track->preDrawItems) + { + for (window=windows, winTrack=track; window; window=window->next, winTrack=winTrack->nextWindow) + { + setGlobalsFromWindow(window); + if (winTrack->limitedVis == tvHide) + { + warn("Draw tracks skipping %s because winTrack->limitedVis=hide", winTrack->track); + continue; + } + if (insideWidth >= 1) // do not try to draw if width < 1. + { + doPreDrawItems(winTrack, hvg, font, y, &lastTime); + } + } + } + + setGlobalsFromWindow(windows); // first window + // do preDrawMultiRegion across all windows, e.g. wig autoScale + if (track->preDrawMultiRegion) + { + track->preDrawMultiRegion(track); + } + + // doDrawItems for (window=windows, winTrack=track; window; window=window->next, winTrack=winTrack->nextWindow) { setGlobalsFromWindow(window); //warn("Draw tracks track dump %s\n", makeTrackDumpLink(track)); // DEBUG REMOVE if (winTrack->limitedVis == tvHide) { warn("Draw tracks skipping %s because winTrack->limitedVis=hide", winTrack->track); continue; } if (insideWidth >= 1) // do not try to draw if width < 1. { int ynew = doDrawItems(winTrack, hvg, font, y, &lastTime); //warn("y=%d ynew=%d (ynew-y)=%d flatTrack->maxHeight=%d", y, ynew, ynew - y, flatTrack->maxHeight); if ((ynew-y) > flatTrack->maxHeight) // so compiler does not complain ynew is not used. errAbort("oops track too high!"); } } setGlobalsFromWindow(windows); // first window - y = savey + flatTrack->maxHeight; // DEBUG REMOVE + y = savey + flatTrack->maxHeight; } if (theImgBox && track->limitedVis == tvDense && tdbIsCompositeChild(track->tdb)) mapBoxToggleVis(hvg, 0, yStart,tl.picWidth, sliceHeight,track); // Strange mapBoxToggleLogic handles reverse complement itself so x=0,width=tl.picWidth if (yEnd != y) warn("Slice height for track %s does not add up. Expecting %d != %d actual", track->shortLabel, yEnd - yStart - 1, y - yStart); } y++; } if (galtDebug) warn("post draw tracks leftLabels");