8a868485872a387701911104129a3c48f61a0756
kent
  Tue Mar 15 12:22:29 2011 -0700
Adding rainbow generating routines.
diff --git src/lib/rainbow.c src/lib/rainbow.c
new file mode 100644
index 0000000..d8646b9
--- /dev/null
+++ src/lib/rainbow.c
@@ -0,0 +1,112 @@
+/* rainbow - stuff to generate rainbow colors. */
+
+#include "common.h"
+#include "memgfx.h"
+#include "rainbow.h"
+
+struct rgbColor saturatedRainbowTable[30] = {
+/* This table was built by hand for the default Autodesk Animator palette. */
+    {252, 12, 60},
+    {252, 12, 12},
+    {252, 60, 12},
+    {252, 108, 12},
+    {252, 156, 12},
+    {252, 204, 12},
+    {252, 252, 12},
+    {204, 252, 12},
+    {156, 252, 12},
+    {108, 252, 12},
+    {60, 252, 12},
+    {12, 252, 12},
+    {12, 252, 60},
+    {12, 252, 108},
+    {12, 252, 156},
+    {12, 252, 204},
+    {12, 252, 252},
+    {12, 204, 252},
+    {12, 156, 252},
+    {12, 108, 252},
+    {12, 60, 252},
+    {12, 12, 252},
+    {60, 12, 252},
+    {108, 12, 252},
+    {156, 12, 252},
+    {204, 12, 252},
+    {252, 12, 252},
+    {252, 12, 204},
+    {252, 12, 156},
+    {252, 12, 108},
+    };
+
+static struct rgbColor lightRainbowTable[30] = {
+/* This one is processed some to make the lightness of the colors more even across the
+ * spectrum, and also just lighter in general.  It's good for rainbow fringe graphs. */
+    {239, 126, 148},
+    {249, 131, 131},
+    {235, 145, 123},
+    {222, 158, 116},
+    {210, 170, 110},
+    {200, 181, 105},
+    {190, 190, 100},
+    {178, 197, 103},
+    {165, 203, 107},
+    {150, 210, 110},
+    {135, 218, 114},
+    {118, 226, 118},
+    {114, 218, 135},
+    {110, 210, 150},
+    {107, 203, 165},
+    {103, 197, 178},
+    {100, 190, 190},
+    {105, 181, 200},
+    {110, 170, 210},
+    {116, 158, 222},
+    {123, 145, 235},
+    {131, 131, 249},
+    {148, 126, 239},
+    {165, 121, 230},
+    {180, 116, 222},
+    {194, 112, 214},
+    {207, 108, 207},
+    {214, 112, 194},
+    {222, 116, 180},
+    {230, 121, 165},
+    };
+
+static struct rgbColor interpolatedHue(struct rgbColor *table, int tableSize, double pos)
+/* Given pos, a number between 0 and 1, return interpolated color, doing interpolation
+ * between first and last color for numbers close to 1. */
+{
+double wrappedPos = pos - floor(pos);	/* Make it so numbers higher than 1 keep circling rainbow */
+double scaledPos = tableSize * wrappedPos;
+double startSlot = floor(scaledPos);	
+double endFactor = scaledPos - startSlot;
+double startFactor = 1.0 - endFactor;
+int startIx = startSlot;
+int endIx = startIx + 1;
+if (endIx == tableSize)
+    endIx = 0;
+
+struct rgbColor *start = table+startIx;
+struct rgbColor *end = table+endIx;
+struct rgbColor col;
+col.r = start->r * startFactor + end->r * endFactor;
+col.g = start->g * startFactor + end->g * endFactor;
+col.b = start->b * startFactor + end->b * endFactor;
+return col;
+}
+
+struct rgbColor lightRainbowAtPos(double pos)
+/* Given pos, a number between 0 and 1, return a lightish rainbow rgbColor
+ * where 0 maps to red,  0.1 is orange, and 0.9 is violet and 1.0 is back to red */
+{
+return interpolatedHue(lightRainbowTable, ArraySize(lightRainbowTable), pos);
+}
+
+struct rgbColor saturatedRainbowAtPos(double pos)
+/* Given pos, a number between 0 and 1, return a saturated rainbow rgbColor
+ * where 0 maps to red,  0.1 is orange, and 0.9 is violet and 1.0 is back to red */
+{
+return interpolatedHue(saturatedRainbowTable, ArraySize(saturatedRainbowTable), pos);
+}
+