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;