688f78f42838193e689c16dfc311919a4f211ca5
[gencolormap.git] / colormap.hpp
1 /*
2  * Copyright (C) 2015 Computer Graphics Group, University of Siegen
3  * Written by Martin Lambers <martin.lambers@uni-siegen.de>
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining a copy
6  * of this software and associated documentation files (the "Software"), to deal
7  * in the Software without restriction, including without limitation the rights
8  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9  * copies of the Software, and to permit persons to whom the Software is
10  * furnished to do so, subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice shall be included in
13  * all copies or substantial portions of the Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
18  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21  * SOFTWARE.
22  */
23
24 #ifndef COLORMAP_HPP
25 #define COLORMAP_HPP
26
27 /* Generate color maps for scientific visualization purposes.
28  *
29  * This implements the methods described in
30  * "Generating Color Palettes using Intuitive Parameters" by
31  * Martijn Wijffelaars, Roel Vliegen, Jarke J. van Wijk and Erik-Jan van der
32  * Linden, Eurographics/IEEE-VGTC Symposium on Visualization 2008
33  *
34  * Usage:
35  *
36  * Decide which type of color map you need and how many colors the map should
37  * contain:
38  * - For a continuous range of values (e.g. temperature, size, ...):
39  *   Sequential map with a single hue, at least 200 colors
40  * - For a continuous of values around a neutral middle (e.g. deviation from an
41  *   ideal value):
42  *   Diverging map, composed of two sequential maps with a neutral color in the
43  *   middle, at least 200 colors
44  *
45  * Allocate memory for your color map, and call the function that generates your
46  * map. All colors are represented as unsigned char sRGB triplets, with each
47  * value in [0,255].
48  */
49
50 namespace ColorMap {
51
52 const float DefaultContrast = 0.88f;
53 float DefaultContrastForSmallN(int n); // only for discrete color maps, i.e. n <= 9
54 const float DefaultSaturation = 0.6f;
55 const float DefaultBrightness = 0.75f;
56 const float DefaultWarmth = 0.15f;
57
58 // Create a sequential color map with n colors of the given hue in [0,2*PI].
59 void Sequential(int n, unsigned char* srgb_colormap, float hue,
60         float contrast = DefaultContrast,
61         float saturation = DefaultSaturation,
62         float brightness = DefaultBrightness,
63         float warmth = DefaultWarmth);
64
65 // Create a diverging color map with n colors. Half of them will have hue0 (in
66 // [0,2*PI]), the other half will have a hue that has the distance given by
67 // divergence (in [0,2*PI]) to hue0, and they will meet in the middle at a
68 // neutral color.
69 void Diverging(int n, unsigned char* srgb_colormap, float hue0, float divergence,
70         float contrast = DefaultContrast,
71         float saturation = DefaultSaturation,
72         float brightness = DefaultBrightness,
73         float warmth = DefaultWarmth);
74
75 const float DefaultQualitativeDivergence = 6.2831853071795864769; // 2*PI
76 const float DefaultQualitativeContrast = 0.5f;
77 const float DefaultQualitativeSaturation = 0.5f;
78 const float DefaultQualitativeBrightness = 1.0f;
79
80 // Create a qualitative color map with n colors. The colors will have the same
81 // saturation; lightness and hue will differ. The parameter hue0 sets the hue of
82 // the first color, and the parameter divergence defines the hue range starting
83 // from hue0 that can be used for the colors.
84 void Qualitative(int n, unsigned char* colormap, float hue0,
85         float divergence = DefaultQualitativeDivergence,
86         float contrast = DefaultQualitativeContrast,
87         float saturation = DefaultQualitativeSaturation,
88         float brightness = DefaultQualitativeBrightness);
89
90 }
91
92 #endif