43f042236ce180b8e0712d43c8baabc4ad8df1cd
max
  Sat Jul 25 18:21:54 2026 -0700
hgTracks: add compactPack mode and codon strand-direction arrows

When zoomed to codon-coloring level, draw strand-direction chevrons across the
exons (white over coding codons when too small to label, contrasting color over
UTRs), and a per-codon arrow between amino-acid letters via drawScaledBoxWithText.
Add a compactPack trackDb setting for shorter pack/squish rows and a small
squish-mode codon font. Adds mgFontForCellHeight() to memgfx and enables
compactPack on the JASPAR track.

diff --git src/hg/hgTracks/cds.h src/hg/hgTracks/cds.h
index 35159fbdd4d..a545e88067d 100644
--- src/hg/hgTracks/cds.h
+++ src/hg/hgTracks/cds.h
@@ -162,30 +162,40 @@
         int maxPixels, int winStart, Color originalColor);
 /*draw a box that is colored by the bases inside it and its
  * orientation. Stop codons are red, start are green, otherwise they
  * alternate light/dark blue colors. */
 
 void baseColorOverdrawDiff(struct track *tg,  struct linkedFeatures *lf,
 			   struct hvGfx *hvg, int xOff,
 			   int y, double scale, int heightPer,
 			   struct dnaSeq *qSeq, int qOffset, struct psl *psl,
 			   int winStart, enum baseColorDrawOpt drawOpt);
 /* If we're drawing different bases/codons, and zoomed out past base/codon 
  * level, draw 1-pixel wide red lines only where bases/codons differ from 
  * genomic.  This tests drawing mode and zoom level but assumes that lf itself 
  * has been drawn already and we're not in dense mode etc. */
 
+void baseColorDrawCdsArrows(struct track *tg, struct linkedFeatures *lf,
+                            struct hvGfx *hvg, int xOff, int y, double scale,
+                            int heightPer, int winStart, enum baseColorDrawOpt drawOpt,
+                            Color color);
+/* When zoomed in enough to color codons, distribute strand-direction chevrons
+ * across each exon on top of the boxes: white over the coding codons (only when
+ * they are too small to label), and the feature's contrasting color at a wider
+ * spacing over the UTRs as a cue that they are non-coding.  No-op below the
+ * codon-color zoom level, when coding coloring is off, or when strand unknown. */
+
 void baseColorOverdrawQInsert(struct track *tg,  struct linkedFeatures *lf,
 			      struct hvGfx *hvg, int xOff,
 			      int y, double scale, int heightPer,
 			      struct dnaSeq *qSeq, int qOffset, struct psl *psl,
 			      MgFont *font, int winStart, enum baseColorDrawOpt drawOpt,
 			      boolean indelShowQInsert, boolean indelShowPolyA);
 /* If applicable, draw 1-pixel wide orange lines for query insertions in the
  * middle of the query, 1-pixel wide purple lines for query insertions at the 
  * end of the query, and 1-pixel wide green (instead of purple) when a query 
  * insertion at the end is a valid poly-A tail. */
 
 
 struct simpleFeature *baseColorCodonsFromDna(int frame, int chromStart,
 					     int chromEnd, struct dnaSeq *seq,
 					     bool reverse);