e3a309047a5dbe7623f7a0f1c4a3a12163fa6290
jcasper
  Mon Oct 13 14:09:50 2025 -0700
Initial pass at reducing glyphs to a simple line when zoomed out, refs #35498

diff --git src/hg/hgTracks/simpleTracks.c src/hg/hgTracks/simpleTracks.c
index a4204665135..7846adf5d75 100644
--- src/hg/hgTracks/simpleTracks.c
+++ src/hg/hgTracks/simpleTracks.c
@@ -1756,79 +1756,73 @@
 // A glyph might be defined on a wide range - find the center and draw specifically there
 // so we don't have a glyph shifting if only part of that window is in view.
 int centeredStart, centeredEnd;
 centeredStart = (chromStart + chromEnd)/2;
 centeredEnd = (chromStart + chromEnd+1)/2;
 int ptCount, i, x0, y0;
 if (!scaledBoxToPixelCoords(centeredStart, centeredEnd, scale, xOff, &startX, &endX))
     return;  // apparently we don't intersect the window
 middleX = (startX+endX)/2.0;
 switch (glyph)
     {
     case GLYPH_CIRCLE:
         hvGfxCircle(hvg, middleX, middleY, heightPer/2, fillColor, TRUE);
         hvGfxCircle(hvg, middleX, middleY, heightPer/2, outlineColor, FALSE);
         break;
+    case GLYPH_1PX:
+        hvGfxLine(hvg, middleX, middleY-heightPer/2, middleX, middleY+heightPer/2, outlineColor);
+        break;
     default:
         ptCount = glyphShapes[glyph].nPoints;
         struct gfxPoly *poly = gfxPolyNew();
         for (i=0; i<ptCount; i++)
             {
             x0 = middleX + (glyphShapes[glyph].points[i].x-0.5)*glyphHeight;
             y0 = middleY + (glyphShapes[glyph].points[i].y-0.5)*glyphHeight;
             gfxPolyAddPoint(poly, x0, y0);
             }
         hvGfxDrawPoly(hvg,poly,fillColor,TRUE);
         hvGfxDrawPoly(hvg,poly,outlineColor,FALSE);
         gfxPolyFree(&poly);
         break;
     }
 }
 
-#define GLYPH_STRING_CIRCLE "Circle"
-#define GLYPH_STRING_TRIANGLE "Triangle"
-#define GLYPH_STRING_INV_TRIANGLE "InvTriangle"
-#define GLYPH_STRING_SQUARE "Square"
-#define GLYPH_STRING_DIAMOND "Diamond"
-#define GLYPH_STRING_OCTAGON "Octagon"
-#define GLYPH_STRING_STAR "Star"
-#define GLYPH_STRING_PENTAGRAM "Pentagram"
-#define GLYPH_STRING_PLUS "Plus"
-#define GLYPH_STRING_X "X"
-
 glyphType parseGlyphType(char *glyphStr)
 /* Return the enum glyph type for a string specifying a glyph.
  * Defaults to GLYPH_CIRCLE if the string is unrecognized. */
 {
 if (sameWordOk(glyphStr, GLYPH_STRING_TRIANGLE))
     return GLYPH_TRIANGLE;
 if (sameWordOk(glyphStr, GLYPH_STRING_INV_TRIANGLE))
     return GLYPH_INV_TRIANGLE;
 if (sameWordOk(glyphStr, GLYPH_STRING_SQUARE))
     return GLYPH_SQUARE;
 if (sameWordOk(glyphStr, GLYPH_STRING_DIAMOND))
     return GLYPH_DIAMOND;
 if (sameWordOk(glyphStr, GLYPH_STRING_OCTAGON))
     return GLYPH_OCTAGON;
 if (sameWordOk(glyphStr, GLYPH_STRING_STAR))
     return GLYPH_STAR;
 if (sameWordOk(glyphStr, GLYPH_STRING_PENTAGRAM))
     return GLYPH_PENTAGRAM;
 if (sameWordOk(glyphStr, GLYPH_STRING_PLUS))
     return GLYPH_PLUS;
 if (sameWordOk(glyphStr, GLYPH_STRING_X))
     return GLYPH_X;
+if (sameWordOk(glyphStr, GLYPH_STRING_1PX))
+    return GLYPH_1PX;
 
 return GLYPH_CIRCLE;
 }
 
 void filterItemsOnNames(struct track *tg)
 /* Only keep items with a name in the .nameFilter cart var. 
  * Not using filterItems(), because filterItems has no state at all. */
 {
 char varName[SMALLBUF];
 safef(varName, sizeof(varName), "%s.nameFilter", tg->tdb->track);
 char *nameFilterStr = cartNonemptyString(cart, varName);
 
 if (nameFilterStr==NULL)
     return;