a50ed53aff81d6fb3e34e6913ce18578292bc24e
hiram
  Tue Jun 28 15:00:42 2016 -0700
implement an arbitrary 10-color palette scheme for scaffold/contig coloring refs #17580

diff --git src/hg/hgTracks/simpleTracks.c src/hg/hgTracks/simpleTracks.c
index e09f283..9897588 100644
--- src/hg/hgTracks/simpleTracks.c
+++ src/hg/hgTracks/simpleTracks.c
@@ -154,35 +154,40 @@
 Color shadesOfGreenOnWhite[EXPR_DATA_SHADES];
 Color shadesOfRedOnWhite[EXPR_DATA_SHADES];
 Color shadesOfBlueOnWhite[EXPR_DATA_SHADES];
 Color shadesOfYellowOnWhite[EXPR_DATA_SHADES];
 Color shadesOfRedOnYellow[EXPR_DATA_SHADES];
 Color shadesOfBlueOnYellow[EXPR_DATA_SHADES];
 Color orangeColor = 0;
 Color brickColor = 0;
 Color blueColor = 0;
 Color darkBlueColor = 0;
 Color greenColor = 0;
 Color darkGreenColor = 0;
 boolean exprBedColorsMade = FALSE; /* Have the shades of Green, Red, and Blue been allocated? */
 int maxRGBShade = EXPR_DATA_SHADES - 1;
 
+Color scafColor[SCAF_COLORS+1];
+/* declare colors for scaffold coloring, +1 for unused scaffold 0 color */
+
 Color chromColor[CHROM_COLORS+1];
 /* Declare colors for chromosome coloring, +1 for unused chrom 0 color */
 
 /* Have the 3 shades of 8 chromosome colors been allocated? */
 boolean chromosomeColorsMade = FALSE;
+/* have the 10 scaffold colors been allocated */
+static boolean scafColorsMade = FALSE;
 
 int maxItemsInFullTrack = 1000;  /* Maximum number of items displayed in full */
 int maxItemsToUseOverflowDefault = 10000; /* # of items to allow overflow mode*/
 
 /* These variables persist from one incarnation of this program to the
  * next - living mostly in the cart. */
 
 // multi-window variables global to hgTracks
 struct window *windows = NULL;  // list of windows in image
 struct window *currentWindow = NULL;
 bool trackLoadingInProgress;  // flag to delay ss layout until all windows are ready.
 int fullInsideX;      // full-image insideX
 int fullInsideWidth;  // full-image insideWidth
 
 struct virtRegion *virtRegionList = NULL;     // list of regions in virtual chrom
@@ -3301,30 +3306,49 @@
 #define CHROM_BREAK_DARK_COLOR_ZOOM 200000
 
 Color getChromBreakGreenColor()
 {
 return (winEnd-winStart > CHROM_BREAK_DARK_COLOR_ZOOM ?
             darkGreenColor : greenColor);
 }
 
 Color getChromBreakBlueColor()
 {
 return (winEnd-winStart > CHROM_BREAK_DARK_COLOR_ZOOM ?
             darkBlueColor : blueColor);
 }
 
 /*	See inc/chromColors.h for color defines	*/
+static void makeScaffoldShades(struct hvGfx *hvg)
+/* Allocate 10 colors for arbitrary scaffold/contig coloring */
+{
+    /*	color zero is for error conditions only	*/
+scafColor[0] = hvGfxFindColorIx(hvg, 0, 0, 0);
+scafColor[1] = hvGfxFindColorIx(hvg, SCAF1_R, SCAF1_G, SCAF1_B);
+scafColor[2] = hvGfxFindColorIx(hvg, SCAF2_R, SCAF2_G, SCAF2_B);
+scafColor[3] = hvGfxFindColorIx(hvg, SCAF3_R, SCAF3_G, SCAF3_B);
+scafColor[4] = hvGfxFindColorIx(hvg, SCAF4_R, SCAF4_G, SCAF4_B);
+scafColor[5] = hvGfxFindColorIx(hvg, SCAF5_R, SCAF5_G, SCAF5_B);
+scafColor[6] = hvGfxFindColorIx(hvg, SCAF6_R, SCAF6_G, SCAF6_B);
+scafColor[7] = hvGfxFindColorIx(hvg, SCAF7_R, SCAF7_G, SCAF7_B);
+scafColor[8] = hvGfxFindColorIx(hvg, SCAF8_R, SCAF8_G, SCAF8_B);
+scafColor[9] = hvGfxFindColorIx(hvg, SCAF9_R, SCAF9_G, SCAF9_B);
+scafColor[10] = hvGfxFindColorIx(hvg, SCAF10_R, SCAF10_G, SCAF10_B);
+scafColorsMade = TRUE;
+}
+
+/*	See inc/chromColors.h for color defines	*/
 void makeChromosomeShades(struct hvGfx *hvg)
 /* Allocate the  shades of 8 colors in 3 shades to cover 24 chromosomes  */
 {
     /*	color zero is for error conditions only	*/
 chromColor[0] = hvGfxFindColorIx(hvg, 0, 0, 0);
 chromColor[1] = hvGfxFindColorIx(hvg, CHROM_1_R, CHROM_1_G, CHROM_1_B);
 chromColor[2] = hvGfxFindColorIx(hvg, CHROM_2_R, CHROM_2_G, CHROM_2_B);
 chromColor[3] = hvGfxFindColorIx(hvg, CHROM_3_R, CHROM_3_G, CHROM_3_B);
 chromColor[4] = hvGfxFindColorIx(hvg, CHROM_4_R, CHROM_4_G, CHROM_4_B);
 chromColor[5] = hvGfxFindColorIx(hvg, CHROM_5_R, CHROM_5_G, CHROM_5_B);
 chromColor[6] = hvGfxFindColorIx(hvg, CHROM_6_R, CHROM_6_G, CHROM_6_B);
 chromColor[7] = hvGfxFindColorIx(hvg, CHROM_7_R, CHROM_7_G, CHROM_7_B);
 chromColor[8] = hvGfxFindColorIx(hvg, CHROM_8_R, CHROM_8_G, CHROM_8_B);
 chromColor[9] = hvGfxFindColorIx(hvg, CHROM_9_R, CHROM_9_G, CHROM_9_B);
 chromColor[10] = hvGfxFindColorIx(hvg, CHROM_10_R, CHROM_10_G, CHROM_10_B);
@@ -9033,36 +9057,36 @@
 /* perhaps a contig name of some other prefix */
 if (NULL == skipped && scaffoldPrefixes == prefixes)
     {
     skipped = cloneString(name);
     chopSuffixAt(skipped, 'v');  /* remove the vNN version, usually v1 */
     eraseNonDigits(skipped);  /* strip characters, leave digits only */
     if (0 == strlen(skipped))  /* if none left, did not work */
        skipped = NULL;
     }
 return skipped;
 }
 
 Color getScaffoldColor(char *scaffoldNum, struct hvGfx *hvg)
 /* assign fake chrom color to scaffold/contig, based on number */
 {
-int chromNum = atoi(scaffoldNum) % CHROM_COLORS;
-if (!chromosomeColorsMade)
-    makeChromosomeShades(hvg);
-if (chromNum < 0 || chromNum > CHROM_COLORS)
-    chromNum = 0;
-return chromColor[chromNum];
+int scafNum = atoi(scaffoldNum) % SCAF_COLORS + 1;
+if (!scafColorsMade)
+    makeScaffoldShades(hvg);
+if (scafNum < 0 || scafNum > SCAF_COLORS)
+    scafNum = 0;
+return scafColor[scafNum];
 }
 
 Color getSeqColorDefault(char *seqName, struct hvGfx *hvg, Color defaultColor)
 /* Return color of chromosome/scaffold/contig/numeric string, or
  * defaultColor if seqName doesn't look like any of those. */
 {
 char *skipped = maybeSkipPrefix(seqName, chromPrefixes);
 if (skipped != NULL)
     return getChromColor(skipped, hvg);
 skipped = maybeSkipPrefix(seqName, scaffoldPrefixes);
 if (skipped != NULL)
     return getScaffoldColor(skipped, hvg);
 if (isdigit(seqName[0]))
     return getScaffoldColor(seqName, hvg);
 return defaultColor;