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");