src/hg/instinct/hgHeatmap2/hgCircleMaps.c 1.10

1.10 2009/03/03 00:40:13 jsanborn
updated text color for dark median backgrounds
Index: src/hg/instinct/hgHeatmap2/hgCircleMaps.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/instinct/hgHeatmap2/hgCircleMaps.c,v
retrieving revision 1.9
retrieving revision 1.10
diff -b -B -U 4 -r1.9 -r1.10
--- src/hg/instinct/hgHeatmap2/hgCircleMaps.c	2 Mar 2009 01:30:30 -0000	1.9
+++ src/hg/instinct/hgHeatmap2/hgCircleMaps.c	3 Mar 2009 00:40:13 -0000	1.10
@@ -68,8 +68,9 @@
 
     boolean drawSummary;     /* draw summary (pie chart) */
     boolean subgrouped;      /* if successful subgrouping applied */
 
+    Color bgColor;           /* Background color (default = MG_WHITE) */
     struct hash *data;       /* data for center (pie chart) */
 };
 
 char *heatMapDbProfile = "localDb";
@@ -148,8 +149,9 @@
 
 cm->drawSummary = FALSE;
 cm->subgrouped = FALSE;
 
+cm->bgColor = MG_WHITE;
 return cm;
 }
 
 struct ring *cloneRing(struct ring *rg)
@@ -454,12 +456,13 @@
 
 double numSamples = (double) slCount(cm->samples);
 
 int rStart = 0;
-int rStop = cm->minR;
+int rStop = cm->minR - 2;
 
 cm->data = hashNew(0);
 
+int maxSamples = -1;
 struct ring *rg;
 for (rg = cm->rings; rg; rg = rg->next)
     {    
     if (rg->numSamples == 0)
@@ -469,8 +472,16 @@
     
     vgMakeColorGradient(vg, rg->zeroColor, rg->highColor, EXPR_DATA_SHADES, upShades);
     vgMakeColorGradient(vg, rg->zeroColor, rg->lowColor, EXPR_DATA_SHADES, downShades);
 
+    valCol = getColor(rg->median, rg->gain, rg->maxDev, upShades, downShades);
+
+    if (rg->numSamples > maxSamples)
+	{ /* Only set background color according to median color of largest subset */
+	maxSamples = rg->numSamples;
+	cm->bgColor = valCol;
+	}
+	
     double i = 0.0;
     struct slName *sl;
     for (sl = cm->samples; sl; sl = sl->next)
 	{
@@ -485,9 +496,8 @@
 	el = hashLookup(cm->data, sl->name);
 	if (el)
 	    continue;  // only save the first
 	
-	valCol = getColor(rg->median, rg->gain, rg->maxDev, upShades, downShades);
 	vgRadiusBox(vg, x0, y0, rStart, rStop, tStart, tStop, valCol);
 	hashAddInt(cm->data, sl->name, 1);
 	}
     }
@@ -568,8 +578,18 @@
 for (rg = cm->rings; rg; rg = rg->next)
     drawRing(vg, cm, rg);
 }
 
+void drawName(struct vGfx *vg, struct circleMap *cm)
+{
+Color textCol = vgContrastingColor(vg, cm->bgColor);
+
+/* Draw gene label in center */
+MgFont *font = mgSmallFont(); 
+if (mgFontStringWidth(font, cm->name) < cm->minR * 2.0)
+    vgTextCentered(vg, 0, 0, cm->width, cm->width, textCol, font, cm->name);  
+}
+
 void drawCircleMap(struct vGfx *vg, struct circleMap *cm)
 {
 if (!cm)
     return;
@@ -577,12 +597,9 @@
 if (cm->drawSummary)
     drawCenter(vg, cm);
 
 drawRings(vg, cm);
-/* Draw gene label in center */
-MgFont *font = mgSmallFont(); 
-if (mgFontStringWidth(font, cm->name) < cm->minR * 2.0)
-    vgTextCentered(vg, 0, 0, cm->width, cm->width, MG_BLACK, font, cm->name);  
+drawName(vg, cm);
 }
 
 char *circleMapGif(struct circleMap *cm)
 /* Create genome GIF file and HT that includes it. */