Fix typos.
[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 (type < 0) {
120         fprintf(stderr, "Invalid or missing option -t|--type.\n");
121         print_help = true;
122         retval = 1;
123     }
124     if (n < 2) {
125         fprintf(stderr, "Invalid or missing option -n|--n.\n");
126         print_help = true;
127         retval = 1;
128     }
129     if (hue < 0.0f) {
130         fprintf(stderr, "Invalid or missing option -h|--hue.\n");
131         print_help = true;
132         retval = 1;
133     }
134     if (divergence < 0.0f) {
135         if (type <= 1)
136             divergence = 2.0f / 3.0f * static_cast<float>(M_PI);
137         else
138             divergence = ColorMap::DefaultQualitativeDivergence;
139     }
140     if (contrast < 0.0f) {
141         if (type <= 1)
142             if (n > 0 && n < 9)
143                 contrast = ColorMap::DefaultContrastForSmallN(n);
144             else
145                 contrast = ColorMap::DefaultContrast;
146         else
147             contrast = ColorMap::DefaultQualitativeContrast;
148     }
149     if (saturation < 0.0f) {
150         if (type <= 1)
151             saturation = ColorMap::DefaultSaturation;
152         else
153             saturation = ColorMap::DefaultQualitativeSaturation;
154     }
155     if (brightness < 0.0f) {
156         if (type <= 1)
157             brightness = ColorMap::DefaultBrightness;
158         else
159             brightness = ColorMap::DefaultQualitativeBrightness;
160     }
161     if (warmth < 0.0f) {
162         warmth = ColorMap::DefaultWarmth;
163     }
164
165     if (print_help) {
166         printf("Usage: %s\n"
167                 "  -t|--type=sequential   Generate a sequential color map\n"
168                 "  -t|--type=diverging    Generate a diverging color map\n"
169                 "  -t|--type=qualitative  Generate a sequential color map\n"
170                 "  -n|--n=N               Set number of colors in the map\n"
171                 "  -h|--hue=H             Set hue in [0,360] degrees\n"
172                 "  [-d|--divergence=D]    Set divergence for div. and qual. maps\n"
173                 "  [-c|--contrast=C]      Set contrast in [0,1]\n"
174                 "  [-s|--saturation=S]    Set saturation in [0,1]\n"
175                 "  [-b|--brightness=B]    Set brightness in [0,1]\n"
176                 "  [-w|--warmth=W]        Set color warmth in [0,1] for seq. and div. maps\n"
177                 "Generates a color map and prints it to standard output as sRGB triplets.\n"
178                 "Report bugs to <martin.lambers@uni-siegen.de>.\n", argv[0]);
179         return retval;
180     }
181
182     std::vector<unsigned char> colormap(3 * n);
183     if (type == 0) {
184         ColorMap::Sequential(n, &(colormap[0]), hue,
185                 contrast, saturation, brightness, warmth);
186     } else if (type == 1) {
187         ColorMap::Diverging(n, &(colormap[0]), hue, divergence,
188                 contrast, saturation, brightness, warmth);
189     } else {
190         ColorMap::Qualitative(n, &(colormap[0]), hue, divergence,
191                 contrast, saturation, brightness);
192     }
193
194     for (int i = 0; i < n; i++) {
195         printf("%d, %d, %d\n", colormap[3 * i + 0], colormap[3 * i + 1], colormap[3 * i + 2]);
196     }
197
198     return retval;
199 }