3351b7938091d8bccaea76ef006d729f5e169a4f
braney
Tue Sep 24 17:23:10 2024 -0700
if we go over the 32k PNG size limit, put all the tracks that can wiggle
into wiggle mode and try again
diff --git src/hg/hgTracks/hgTracks.c src/hg/hgTracks/hgTracks.c
index 614a35b..7e156b1 100644
--- src/hg/hgTracks/hgTracks.c
+++ src/hg/hgTracks/hgTracks.c
@@ -4861,30 +4861,40 @@
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;
@@ -5018,30 +5028,33 @@
// 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);
}
@@ -5086,65 +5099,108 @@
}
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 flatTracks
+// Construct pre-flatTracks
+struct trackRef *preFlatTracks = NULL;
for (track = trackList; track != NULL; track = track->next)
{
if (isLimitedVisHiddenForAllWindows(track))
continue;
if (tdbIsComposite(track->tdb))
{
struct track *subtrack;
if (isCompositeInAggregate(track))
- flatTracksAdd(&flatTracks, track, cart, orderedWiggles);
+ addPreFlatTrack(&preFlatTracks, track);
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
{
- flatTracksAdd(&flatTracks,subtrack,cart, orderedWiggles);
+ addPreFlatTrack(&preFlatTracks, track);
}
}
}
}
else
{
- flatTracksAdd(&flatTracks,track,cart, orderedWiggles);
+ 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;
}
+ 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:
\"%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++);
}
}
@@ -5152,70 +5208,45 @@
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:
\"%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)