d7861537f514c72ecd89dd51389794cd8f07baef
braney
  Wed Sep 25 09:15:28 2024 -0700
Revert "if we go over the 32k PNG size limit, put all the tracks that can wiggle"

This reverts commit 3351b7938091d8bccaea76ef006d729f5e169a4f.

diff --git src/hg/hgTracks/hgTracks.c src/hg/hgTracks/hgTracks.c
index 25daa7a..e0ae7f2 100644
--- src/hg/hgTracks/hgTracks.c
+++ src/hg/hgTracks/hgTracks.c
@@ -4860,40 +4860,30 @@
         slReverse(&track->items);
         slReverse(&squishTrack->items);
         
         squishTrack->track = cloneString(buffer);
         squishTrack->originalTrack = cloneString(track->track);
         squishTrack->shortLabel = cloneString(track->shortLabel);
         squishTrack->longLabel = cloneString(track->longLabel);
 
         /* insert the squished track */
         track->next = squishTrack;
         squishTrack->next = nextTrack;
         }
     }
 }
 
-boolean forceWiggle; // we've run out of space so all tracks become coverage tracks
-
-static void addPreFlatTrack(struct trackRef **list, struct track *track)
-{
-struct trackRef *trackRef;
-AllocVar(trackRef);
-trackRef->track = track;
-slAddHead(list, trackRef);
-}
-
 void makeActiveImage(struct track *trackList, char *psOutput)
 /* Make image and image map. */
 {
 struct track *track;
 MgFont *font = tl.font;
 struct hvGfx *hvg;
 struct tempName pngTn;
 char *mapName = "map";
 int fontHeight = mgFontLineHeight(font);
 int trackPastTabX = (withLeftLabels ? trackTabWidth : 0);
 int trackTabX = gfxBorder;
 int trackPastTabWidth = tl.picWidth - trackPastTabX;
 int pixWidth, pixHeight;
 int y=0;
 int titleHeight = fontHeight;
@@ -5027,33 +5017,30 @@
 
 // For multiple windows, sets height and visibility
 //       as well as making the flatTrack list.
 
 // TODO there is a chance that for pack and squish
 // I might need to trigger a track-height check here
 // since it is after all items are loaded for all windows
 // but before things are checked for overflow or limitedVis?
 // The fixed non-overflow tracks like knownGene used to initialize
 // ss and track height during loadItems(). That was delayed
 // because we now need all windows to be fully loaded before
 // calculating their joint ss layout and height.
 
 // set heights and visibilities.
 struct window *window = NULL;
-
-// we may come through this way twice if we exceed the 32k limit for screen image
-retry:
 for(window=windows;window;window=window->next)
     {
     setGlobalsFromWindow(window);
     trackList = window->trackList;
     for (track = trackList; track != NULL; track = track->next)
 	{
 	if (tdbIsCompositeChild(track->tdb)) // When single track is requested via AJAX,
 	    {
 	    limitedVisFromComposite(track);  // it could be a subtrack
 	    }
 	else
 	    {
 	    limitVisibility(track);
 	    }
 
@@ -5098,108 +5085,65 @@
     }
 
 if (wigOrder != NULL)
     {
     orderedWiggles = slNameListFromString(wigOrder, ' ');
     struct slName *name = orderedWiggles;
     // if we're sorting, remove existing sort order for this composite
     for(; name; name = name->next)
         {
         char buffer[1024];
         safef(buffer, sizeof buffer,  "%s_imgOrd", name->name);
         cartRemove(cart, buffer);
         }
     }
 
-// Construct pre-flatTracks 
-struct trackRef *preFlatTracks = NULL;
+// Construct flatTracks
 for (track = trackList; track != NULL; track = track->next)
     {
     if (isLimitedVisHiddenForAllWindows(track))
         continue;
 
     if (tdbIsComposite(track->tdb))
         {
         struct track *subtrack;
         if (isCompositeInAggregate(track))
-            addPreFlatTrack(&preFlatTracks, track);
+            flatTracksAdd(&flatTracks, track, cart, orderedWiggles);
         else
             {
             boolean doHideEmpties = doHideEmptySubtracksNoMultiBed(cart, track);
                 // If multibed was found, it has been used to suppress loading,
                 // and subtracks lacking items in window are already set hidden
             for (subtrack = track->subtracks; subtrack != NULL; subtrack = subtrack->next)
                 {
                 if (!isSubtrackVisible(subtrack))
                     continue;
 
                 if (!isLimitedVisHiddenForAllWindows(subtrack) && 
                         !(doHideEmpties && slCount(subtrack->items) == 0))
                         // Ignore subtracks with no items in window
                     {
-                    addPreFlatTrack(&preFlatTracks, track);
+                    flatTracksAdd(&flatTracks,subtrack,cart, orderedWiggles);
                     }
                 }
             }
         }
     else
 	{	
-        addPreFlatTrack(&preFlatTracks, track);
-	}
-    }
-
-// check total height
-#define MAXSAFEHEIGHT "maxTrackImageHeightPx"
-int maxSafeHeight = atoi(cfgOptionDefault(MAXSAFEHEIGHT, "32000"));
-boolean safeHeight = TRUE;
-struct trackRef *pfRef;
-int tmpPixHeight = pixHeight;
-for(pfRef = preFlatTracks; pfRef; pfRef = pfRef->next)
-    {
-    struct track *pf = pfRef->track;
-    int totalHeight = tmpPixHeight+trackPlusLabelHeight(pf,fontHeight);
-    if (totalHeight > maxSafeHeight)
-        {
-        if (!forceWiggle)
-            {
-            forceWiggle = TRUE;
-            goto retry;
+        flatTracksAdd(&flatTracks,track,cart, orderedWiggles);
 	}
-        char numBuf[SMALLBUF];
-        sprintLongWithCommas(numBuf, maxSafeHeight);
-        if (safeHeight)  // Only one message
-            warn("Image is over %s pixels high (%d pix) at the following track which is now "
-                 "hidden:<BR>\"%s\".%s", numBuf, totalHeight, pf->tdb->longLabel,
-                 (pf->next != NULL ?
-                      "\nAdditional tracks may have also been hidden at this zoom level." : ""));
-        safeHeight = FALSE;
-	struct track *winTrack;
-	for(winTrack=pf;winTrack;winTrack=winTrack->nextWindow)
-	    {
-	    pf->limitedVis = tvHide;
-	    pf->limitedVisSet = TRUE;
     }
-        }
-    if (!isLimitedVisHiddenForAllWindows(pf))
-        tmpPixHeight += trackPlusLabelHeight(pf, fontHeight);
-    }
-pixHeight = tmpPixHeight;
-
-// Construct flatTracks
-for(; preFlatTracks; preFlatTracks = preFlatTracks->next)
-    flatTracksAdd(&flatTracks,preFlatTracks->track,cart, orderedWiggles);
-
 flatTracksSort(&flatTracks); // Now we should have a perfectly good flat track list!
 
 if (orderedWiggles)
     {
     // save order to cart
     struct flatTracks *ft;
     char buffer[4096];
     int count = 1;
     for(ft = flatTracks; ft; ft = ft->next)
         {
         safef(buffer, sizeof buffer, "%s_imgOrd", ft->track->track);
         cartSetInt(cart, buffer, count++);
         }
     }
 
@@ -5207,45 +5151,70 @@
 for (flatTrack = flatTracks; flatTrack != NULL; flatTrack = flatTrack->next)
     {
     track = flatTrack->track;
 
     if (track->limitedVis == tvHide)
 	{
 	continue;
 	}
 
     setFlatTrackMaxHeight(flatTrack, fontHeight);
 
     }
 
 
 // fill out track->prevTrack, and check for maxSafeHeight
+boolean safeHeight = TRUE;
+/* firefox on Linux worked almost up to 34,000 at the default 620 width */
+/* More recent hardware/browsers may be able to handle more - we had a success with an 8192x64891 image */
+#define MAXSAFEHEIGHT "maxTrackImageHeightPx"
+int maxSafeHeight = atoi(cfgOptionDefault(MAXSAFEHEIGHT, "32000"));
 struct track *prevTrack = NULL;
 for (flatTrack = flatTracks,prevTrack=NULL; flatTrack != NULL; flatTrack = flatTrack->next)
     {
     track = flatTrack->track;
     assert(track->limitedVis != tvHide);
+    // ORIG int totalHeight = pixHeight+trackPlusLabelHeight(track,fontHeight);
+    int totalHeight = pixHeight+flatTrack->maxHeight;
+    if (totalHeight > maxSafeHeight)
+        {
+        char numBuf[SMALLBUF];
+        sprintLongWithCommas(numBuf, maxSafeHeight);
+        if (safeHeight)  // Only one message
+            warn("Image is over %s pixels high (%d pix) at the following track which is now "
+                 "hidden:<BR>\"%s\".%s", numBuf, totalHeight, track->tdb->longLabel,
+                 (flatTrack->next != NULL ?
+                      "\nAdditional tracks may have also been hidden at this zoom level." : ""));
+        safeHeight = FALSE;
+	struct track *winTrack;
+	for(winTrack=track;winTrack;winTrack=winTrack->nextWindow)
+	    {
+	    track->limitedVis = tvHide;
+	    track->limitedVisSet = TRUE;
+	    }
+        }
     if (!isLimitedVisHiddenForAllWindows(track))
         {
 	struct track *winTrack;
 	for(winTrack=track;winTrack;winTrack=winTrack->nextWindow)
 	    { // TODO this is currently still only using one prev track value.
 	    winTrack->prevTrack = prevTrack; // Important for keeping track of conditional center labels!
 	    }
         // ORIG pixHeight += trackPlusLabelHeight(track, fontHeight);
 	if (!theImgBox) // prevTrack may have altered the height, so recalc height
 	    setFlatTrackMaxHeight(flatTrack, fontHeight);
+	pixHeight += flatTrack->maxHeight;
         prevTrack = track;
         }
     }
 
 // allocate hvg png of pixWidth, pixHeight
 imagePixelHeight = pixHeight;
 if (psOutput)
     {
     hvg = hvGfxOpenPostScript(pixWidth, pixHeight, psOutput);
     hvgSide = hvg; // Always only one image
     }
 else
     {
     boolean transparentImage = FALSE;
     if (theImgBox!=NULL)