06d7be056190c14b85e71bc12523f18ea6815b5e
markd
  Mon Dec 7 00:50:29 2020 -0800
BLAT mmap index support merge with master

diff --git src/hg/hgTracks/config.c src/hg/hgTracks/config.c
index 644a53a..4d517c9 100644
--- src/hg/hgTracks/config.c
+++ src/hg/hgTracks/config.c
@@ -48,101 +48,153 @@
     labels[i] = name;
     i++;
     }
 
 char* currentTheme = cartOptionalString(cart, "theme"); 
 hDropList("theme", labels, i, currentTheme);
 slFreeList(themes);
 hPrintf("</TD>");
 }
 
 char *freeTypeFontNames[] = {
 "AvantGarde-Book",
 "AvantGarde-Demi",
 "AvantGarde-BookOblique",
 "AvantGarde-DemiOblique",
-"Bookman-Light",
-"Bookman-Demi",
-"Bookman-LightItalic",
-"Bookman-DemiItalic",
-"NewCenturySchlbk-Roman",
-"NewCenturySchlbk-Bold",
-"NewCenturySchlbk-Italic",
-"NewCenturySchlbk-BoldItalic",
 "Helvetica",
 "Helvetica-Bold",
 "Helvetica-Oblique",
 "Helvetica-BoldOblique",
 "Helvetica-Narrow",
 "Helvetica-Narrow-Bold",
 "Helvetica-Narrow-Oblique",
 "Helvetica-Narrow-BoldOblique",
 "Times-Roman",
 "Times-Bold",
 "Times-Italic",
 "Times-BoldItalic",
 "Courier",
 "Courier-Bold",
 "Courier-Oblique",
 "Courier-BoldOblique",
-"Palatino-Roman",
-"Palatino-Bold",
-"Palatino-Italic",
-"Palatino-BoldItalic",
 "ZapfChancery-MediumItalic",
 };
 
 char *freeTypeFontFiles[] = {
 "a010013l.pfb",
 "a010015l.pfb",
 "a010033l.pfb",
 "a010035l.pfb",
-"b018012l.pfb",
-"b018015l.pfb",
-"b018032l.pfb",
-"b018035l.pfb",
-"c059013l.pfb",
-"c059016l.pfb",
-"c059033l.pfb",
-"c059036l.pfb",
 "n019003l.pfb",
 "n019004l.pfb",
 "n019023l.pfb",
 "n019024l.pfb",
 "n019043l.pfb",
 "n019044l.pfb",
 "n019063l.pfb",
 "n019064l.pfb",
 "n021003l.pfb",
 "n021004l.pfb",
 "n021023l.pfb",
 "n021024l.pfb",
 "n022003l.pfb",
 "n022004l.pfb",
 "n022023l.pfb",
 "n022024l.pfb",
-"p052003l.pfb",
-"p052004l.pfb",
-"p052023l.pfb",
-"p052024l.pfb",
 "z003034l.pfb",
 };
 
+char *emptyStyles[] = {
+"Normal"
+};
+
 static void textFontDropDown()
 /* Create drop down for font size. */
 {
-hDropList(textFontVar, freeTypeFontNames, ArraySize(freeTypeFontNames), tl.textFont);
+/* get current values for font and style */
+char *currentFontName = cloneString(tl.textFont);
+char *currentStyle = strchr(currentFontName, '-');
+if (currentStyle)
+    *currentStyle++ = 0;
+else
+    currentStyle = "Normal";
+
+char *faceNames[sizeof(freeTypeFontNames)];
+int ii;
+int numFonts = 0;
+struct dyString *dy = dyStringNew(1024);
+dyStringPrintf(dy, "  fontStyles = [];\n");
+
+int numStyle = 0;
+char *lastName = NULL;
+
+faceNames[numFonts++] = "Bitmap";
+dyStringPrintf(dy, "  fontStyles['Bitmap'] = ['Normal'];");
+
+for (ii=0; ii < ArraySize(freeTypeFontNames); ii++)
+    {
+    char *fontName = cloneString(freeTypeFontNames[ii]);
+    char *style = strchr(fontName, '-');
+
+    if (style)
+        *style++ = 0;
+
+    if ((lastName == NULL) || differentString(lastName, fontName))
+        {
+        faceNames[numFonts] = fontName;
+        if (lastName != NULL)
+            dyStringPrintf(dy, "  ];\n");
+
+        dyStringPrintf(dy, "  fontStyles['%s'] = [", fontName);
+        numStyle = 0;
+        numFonts++;
+        }
+
+    if (style == NULL)
+        style = cloneString("Normal");
+    if (numStyle)
+        dyStringPrintf(dy, ",");
+    dyStringPrintf(dy, "'%s'", style);
+    numStyle++;
+
+    lastName = fontName;
+    }
+    dyStringPrintf(dy, "  ];\n");
+
+dyStringPrintf(dy, "$(\"[name='%s']\").change(function()\n", textFontVar);
+dyStringPrintf(dy, "{\n");
+dyStringPrintf(dy, "  $(\"[name='textStyle']\").empty();");
+dyStringPrintf(dy, "  val= $(this).find(':selected').val(); \n");
+dyStringPrintf(dy, "  if (fontStyles[val].length == 1) {\n");
+dyStringPrintf(dy, "    $(\"[id='textStyleDrop']\").hide();$(\"[id='textStyleName']\").hide();\n");
+dyStringPrintf(dy, "    $(\"[name='textStyle']\").val('Normal');\n");
+dyStringPrintf(dy, "  } else {\n");
+dyStringPrintf(dy, "    $(\"[id='textStyleDrop']\").show();$(\"[id='textStyleName']\").show();\n");
+dyStringPrintf(dy, "  }\n");
+dyStringPrintf(dy, "  for(ii=0; ii < fontStyles[val].length; ii++) { $(\"[name='textStyle']\").append( new Option(fontStyles[val][ii],fontStyles[val][ii],))};\n");
+dyStringPrintf(dy, "});\n");
+dyStringPrintf(dy, "$(\"[name='textFont']\").change();\n");
+dyStringPrintf(dy, "$(\"[name='textStyle']\").val('%s');\n", currentStyle);
+jsInline(dy->string);
+
+hDropList(textFontVar, faceNames, numFonts, currentFontName);
+}
+
+static void textStyleDropDown()
+/* Create drop down for font size. */
+{
+hDropList(textStyleVar, emptyStyles, ArraySize(emptyStyles), emptyStyles[0]);
 }
 
 static void textSizeDropDown()
 /* Create drop down for font size. */
 {
 static char *sizes[] = {"6", "8", "10", "12", "14", "18", "24", "34"};
 hDropList(textSizeVar, sizes, ArraySize(sizes), tl.textSize);
 }
 
 static void trackConfig(struct track *trackList, struct group *groupList,
 	char *groupTarget,  int changeVis)
 /* Put up track configurations. If groupTarget is
  * NULL then set visibility for tracks in all groups.  Otherwise,
  * just set it for the given group.  If vis is -2, then visibility is
  * unchanged.  If -1 then set visibility to default, otherwise it should
@@ -495,58 +547,62 @@
 cartSaveSession(cart);
 
 hPrintf("<INPUT TYPE=HIDDEN NAME=\"hgTracksConfigPage\" VALUE=\"\">");
 /* do not want all the submit buttons named the same thing, this one is: */
 cgiMakeButton("topSubmit", "submit");
 
 // 3 column table
 hPrintf("<TABLE style=\"border:0px; \">\n");
 hPrintf("<TR><TD>image width:");
 hPrintf("<TD style=\"text-align: right\">");
 hIntVar("pix", tl.picWidth, 4);
 hPrintf("<TD>pixels</TR>");
 
 hPrintf("<TR><TD>label area width:");
 hPrintf("<TD style=\"text-align: right\">");
-hIntVar("hgt.labelWidth", leftLabelWidthChars, 2);
+hIntVar(leftLabelWidthVar, tl.leftLabelWidthChars, 2);
 hPrintf("<TD>characters<TD></TR>");
 
 hPrintf("<TR><TD>text size:");
 hPrintf("<TD style=\"text-align: right\">");
 textSizeDropDown();
 hPrintf("</TD>");
 if (trackLayoutInclFontExtras())
     {
     hPrintf("<TD>");
     char *defaultStyle = cartUsualString(cart, "fontType", "medium");
     cartMakeRadioButton(cart, "fontType", "medium", defaultStyle);
     hPrintf("&nbsp;medium&nbsp;");
     cartMakeRadioButton(cart, "fontType", "fixed", defaultStyle);
     hPrintf("&nbsp;fixed&nbsp;");
     cartMakeRadioButton(cart, "fontType", "bold", defaultStyle);
     hPrintf("&nbsp;bold&nbsp;");
     hPrintf("&nbsp;");
     hPrintf("</TD>");
     }
 hPrintf("</TR>");
 
 if (sameString(cfgOptionDefault("freeType", "off"), "on"))
     {
     hPrintf("<TR><TD>font:");
     hPrintf("<TD style=\"text-align: right\">");
     textFontDropDown();
-    hPrintf("</TD>");
+    hPrintf("</TD></TR>");
+    hPrintf("<TR><TD id='textStyleName'>style:");
+    hPrintf("<TD style=\"text-align: right\" id='textStyleDrop' >");
+    textStyleDropDown();
+    hPrintf("</TR>");
     hPrintf("</TR>");
     }
 
 themeDropDown(cart);
 
 hTableStart();
 if (ideoTrack != NULL)
     {
     hPrintf("<TR><TD>");
     hCheckBox("ideogram", cartUsualBoolean(cart, "ideogram", TRUE));
     hPrintf("</TD><TD>");
     hPrintf("Display chromosome ideogram above main graphic");
     hPrintf("</TD></TR>\n");
     }
 hPrintf("<TR><TD>");