b9b145172ab5b09275cbc5726724dbfbdec9980d kent Wed Oct 12 14:34:35 2011 -0700 More color experiments hopefully that will result eventually in rainbow fringe graphs that work with more cell lines. diff --git src/lib/rainbow.c src/lib/rainbow.c index d8646b9..3bb540c 100644 --- src/lib/rainbow.c +++ src/lib/rainbow.c @@ -1,112 +1,151 @@ /* 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}, +struct rgbColor saturatedRainbowTable[28] = { +/* This table was built by hand for the default Autodesk Animator palette, and then edited + * to reduce the amount of green colors that are indistinguishable. */ + {255, 0, 0}, + {255, 64, 0}, + {255, 128, 0}, + {255, 164, 0}, + {255, 210, 0}, + {255, 255, 0}, + {210, 255, 0}, + {164, 255, 0}, + {128, 255, 0}, + {0, 255, 0}, + {0, 255, 128}, + {0, 255, 164}, + {0, 255, 210}, + {0, 255, 255}, + {0, 210, 255}, + {0, 164, 255}, + {0, 128, 255}, + {0, 64, 255}, + {0, 0, 255}, + {64, 0, 255}, + {128, 0, 255}, + {164, 0, 255}, + {210, 0, 255}, + {255, 0, 255}, + {255, 0, 210}, + {255, 0, 164}, + {255, 0, 128}, + {255, 0, 64}, }; -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 lightRainbowTable[28] = { +/* This is a mixture of 1/2 white and 1/2 saturated rainbow. It's good for rainbow + * fringe graphs with a moderate amount of colors (up to about 10) */ + {255,128,128}, + {255,160,128}, + {255,192,128}, + {255,210,128}, + {255,233,128}, + {255,255,128}, + {233,255,128}, + {210,255,128}, + {192,255,128}, + {128,255,128}, + {128,255,192}, + {128,255,210}, + {128,255,233}, + {128,255,255}, + {128,233,255}, + {128,210,255}, + {128,192,255}, + {128,160,255}, + {128,128,255}, + {160,128,255}, + {192,128,255}, + {210,128,255}, + {233,128,255}, + {255,128,255}, + {255,128,233}, + {255,128,210}, + {255,128,192}, + {255,128,160}, +}; + +static struct rgbColor veryLightRainbowTable[30] = { +/* This is a mixture of 2/3 white and 1/3 saturated rainbow. It's good for rainbow + * fringe graphs with a lot of colors (more than 10) */ + {255,174,174}, + {255,191,174}, + {255,207,174}, + {255,223,174}, + {255,239,174}, + {255,255,174}, + {239,255,174}, + {223,255,174}, + {207,255,174}, + {191,255,174}, + {174,255,174}, + {174,255,191}, + {174,255,207}, + {174,255,223}, + {174,255,239}, + {174,255,255}, + {174,239,255}, + {174,223,255}, + {174,207,255}, + {174,191,255}, + {174,174,255}, + {191,174,255}, + {207,174,255}, + {223,174,255}, + {239,174,255}, + {255,174,255}, + {255,174,239}, + {255,174,223}, + {255,174,207}, + {255,174,191}, }; 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 veryLightRainbowAtPos(double pos) +/* Given pos, a number between 0 and 1, return a light 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(veryLightRainbowTable, ArraySize(veryLightRainbowTable), pos); +} + 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); }