e6d96db7a4921f61c4e5adb1e8daca3248d93efc
[gencolormap.git] / cmdline.cpp
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 #include <vector>
25 #include <cstdio>
26 #include <cstdlib>
27 #include <cstring>
28 #include <cmath>
29
30 #include <getopt.h>
31 extern char *optarg;
32 extern int optind;
33
34 #include "colormap.hpp"
35
36
37 int main(int argc, char* argv[])
38 {
39     bool print_version = false;
40     bool print_help = false;
41     int type = -1;
42     int n = -1;
43     float hue = -1.0f;
44     float divergence = -1.0f;
45     float contrast = -1.0f;
46     float saturation = -1.0f;
47     float brightness = -1.0f;
48     float warmth = -1.0f;
49     struct option options[] = {
50         { "version",    no_argument,       0, 'v' },
51         { "help",       no_argument,       0, 'H' },
52         { "type",       required_argument, 0, 't' },
53         { "n",          required_argument, 0, 'n' },
54         { "hue",        required_argument, 0, 'h' },
55         { "divergence", required_argument, 0, 'd' },
56         { "contrast",   required_argument, 0, 'c' },
57         { "saturation", required_argument, 0, 's' },
58         { "brightness", required_argument, 0, 'b' },
59         { "warmth",     required_argument, 0, 'w' },
60         { 0, 0, 0, 0 }
61     };
62     int retval = 0;
63
64     for (;;) {
65         int c = getopt_long(argc, argv, "vHt:n:h:d:c:s:b:w:", options, NULL);
66         if (c == -1)
67             break;
68         switch (c) {
69         case 'v':
70             print_version = true;
71             break;
72         case 'H':
73             print_help = true;
74             break;
75         case 't':
76             type = (strcmp(optarg, "sequential") == 0 ? 0
77                     : strcmp(optarg, "diverging") == 0 ? 1
78                     : strcmp(optarg, "qualitative") == 0 ? 2
79                     : -2);
80             break;
81         case 'n':
82             n = atoi(optarg);
83             break;
84         case 'h':
85             hue = atof(optarg) * M_PI / 180.0;
86             break;
87         case 'd':
88             divergence = atof(optarg) * M_PI / 180.0;
89             break;
90         case 'c':
91             contrast = atof(optarg);
92             break;
93         case 's':
94             saturation = atof(optarg);
95             break;
96         case 'b':
97             brightness = atof(optarg);
98             break;
99         case 'w':
100             warmth = atof(optarg);
101             break;
102         default:
103             retval = 1;
104             break;
105         }
106     }
107     if (retval != 0)
108         return retval;
109
110     if (print_version) {
111         printf("gencolormap version 0.1\n"
112                 "Copyright (C) 2015 Computer Graphics Group, University of Siegen.\n"
113                 "Written by Martin Lambers <martin.lambers@uni-siegen.de>.\n"
114                 "This is free software under the terms of the MIT/Expat License.\n"
115                 "There is NO WARRANTY, to the extent permitted by law.\n");
116         return retval;
117     }
118
119     if (!print_help) {
120         if (type < 0) {
121             fprintf(stderr, "Invalid or missing option -t|--type.\n");
122             print_help = true;
123             retval = 1;
124         }
125         if (n < 2) {
126             fprintf(stderr, "Invalid or missing option -n|--n.\n");
127             print_help = true;
128             retval = 1;
129         }
130         if (hue < 0.0f) {
131             fprintf(stderr, "Invalid or missing option -h|--hue.\n");
132             print_help = true;
133             retval = 1;
134         }
135     }
136     if (print_help) {
137         printf("Usage: %s\n"
138                 "  -t|--type=sequential   Generate a sequential color map\n"
139                 "  -t|--type=diverging    Generate a diverging color map\n"
140                 "  -t|--type=qualitative  Generate a qualitative color map\n"
141                 "  -n|--n=N               Set number of colors in the map\n"
142                 "  -h|--hue=H             Set hue in [0,360] degrees\n"
143                 "  [-d|--divergence=D]    Set divergence for div. and qual. maps\n"
144                 "  [-c|--contrast=C]      Set contrast in [0,1]\n"
145                 "  [-s|--saturation=S]    Set saturation in [0,1]\n"
146                 "  [-b|--brightness=B]    Set brightness in [0,1]\n"
147                 "  [-w|--warmth=W]        Set color warmth in [0,1] for seq. and div. maps\n"
148                 "Generates a color map and prints it to standard output as sRGB triplets.\n"
149                 "Report bugs to <martin.lambers@uni-siegen.de>.\n", argv[0]);
150         return retval;
151     }
152
153     if (divergence < 0.0f) {
154         if (type <= 1)
155             divergence = 2.0f / 3.0f * static_cast<float>(M_PI);
156         else
157             divergence = ColorMap::DefaultQualitativeDivergence;
158     }
159     if (contrast < 0.0f) {
160         if (type <= 1)
161             if (n > 0 && n < 9)
162                 contrast = ColorMap::DefaultContrastForSmallN(n);
163             else
164                 contrast = ColorMap::DefaultContrast;
165         else
166             contrast = ColorMap::DefaultQualitativeContrast;
167     }
168     if (saturation < 0.0f) {
169         if (type <= 1)
170             saturation = ColorMap::DefaultSaturation;
171         else
172             saturation = ColorMap::DefaultQualitativeSaturation;
173     }
174     if (brightness < 0.0f) {
175         if (type <= 1)
176             brightness = ColorMap::DefaultBrightness;
177         else
178             brightness = ColorMap::DefaultQualitativeBrightness;
179     }
180     if (warmth < 0.0f) {
181         warmth = ColorMap::DefaultWarmth;
182     }
183
184     std::vector<unsigned char> colormap(3 * n);
185     if (type == 0) {
186         ColorMap::Sequential(n, &(colormap[0]), hue,
187                 contrast, saturation, brightness, warmth);
188     } else if (type == 1) {
189         ColorMap::Diverging(n, &(colormap[0]), hue, divergence,
190                 contrast, saturation, brightness, warmth);
191     } else {
192         ColorMap::Qualitative(n, &(colormap[0]), hue, divergence,
193                 contrast, saturation, brightness);
194     }
195
196     for (int i = 0; i < n; i++) {
197         printf("%d, %d, %d\n", colormap[3 * i + 0], colormap[3 * i + 1], colormap[3 * i + 2]);
198     }
199
200     return retval;
201 }