Preliminary, but functional, autotoolsification
[proto.git] / src / shared / palette.cpp
blobac54e93380a4bc223bfcd5813ae4529f974db1e0
1 /* Dynamically reconfigurable coloring for GUI
2 Copyright (C) 2005-2008, Jonathan Bachrach, Jacob Beal, and contributors
3 listed in the AUTHORS file in the MIT Proto distribution's top directory.
5 This file is part of MIT Proto, and is distributed under the terms of
6 the GNU General Public License, with a linking exception, as described
7 in the file LICENSE in the MIT Proto distribution's top directory. */
9 #include "config.h"
10 #include <stdio.h>
11 #include "visualizer.h"
13 /*****************************************************************************
14 * PALETTE *
15 *****************************************************************************/
16 static BOOL palette_initialized = FALSE;
17 static char* color_names[PALETTE_SIZE];
19 void set_color_names(); // defined below
21 Palette::Palette() {
22 if(!palette_initialized) { set_color_names(); palette_initialized=TRUE; }
23 for(int i=0;i<PALETTE_SIZE;i++) stack_depth[i]=0;
24 default_palette();
27 void Palette::use_color(ColorName c) {
28 glColor4f(colors[c][0],colors[c][1],colors[c][2],colors[c][3]);
30 void Palette::scale_color(ColorName c,flo r, flo g, flo b, flo a) {
31 glColor4f(colors[c][0]*r,colors[c][1]*g,colors[c][2]*b,colors[c][3]*a);
34 void Palette::set_background(ColorName c) {
35 glClearColor(colors[c][0],colors[c][1],colors[c][2],colors[c][3]);
38 void Palette::set_color(ColorName c, flo r, flo g, flo b) {
39 set_color(c,r,g,b,1);
41 void Palette::set_color(ColorName c, flo r, flo g, flo b, flo a) {
42 colors[c][0]=r; colors[c][1]=g; colors[c][2]=b; colors[c][3]=a;
45 void Palette::push_color(ColorName c, flo r, flo g, flo b) {
46 push_color(c,r,g,b,1);
48 void Palette::push_color(ColorName c, flo r, flo g, flo b, flo a) {
49 if(stack_depth[c]>=PALETTE_STACK_SIZE)
50 uerror("Color stack depth exceeeded at %s",color_names[c]);
51 for(int i=0;i<4;i++) color_stack[c][stack_depth[c]][i] = colors[c][i];
52 colors[c][0]=r; colors[c][1]=g; colors[c][2]=b; colors[c][3]=a;
53 stack_depth[c]++;
55 void Palette::pop_color(ColorName c) {
56 stack_depth[c]--;
57 if(stack_depth[c]<0)
58 uerror("Empty color stack popped for %s",color_names[c]);
59 for(int i=0;i<4;i++) colors[c][i] = color_stack[c][stack_depth[c]][i];
62 void Palette::substitute_color(ColorName c, ColorName overlay) {
63 push_color(c, colors[overlay][0], colors[overlay][1],
64 colors[overlay][2], colors[overlay][3]);
67 void Palette::overlay_from_file(char* filename) {
68 FILE* file;
69 if((file = fopen(filename, "r"))==NULL) {
70 debug("WARNING: Couldn't open palette file %s.\n",filename);
71 } else {
72 char buf[255]; int line=0;
73 while(fgets(buf,255,file)) {
74 line++;
75 char name[255]; flo r, g, b, a;
76 int n = sscanf(buf,"%s %f %f %f %f",&name,&r,&g,&b,&a);
77 if(n==EOF || n==0 || name[0]=='#') continue; // whitespace or comment
78 if(n>=4) {
79 if(n==4) a=1;
80 int c;
81 for(c=0;c<PALETTE_SIZE;c++) {
82 if(strcmp(name,color_names[c])==0) {
83 set_color((ColorName)c,r,g,b,a); break;
86 if(c==PALETTE_SIZE)
87 debug("WARNING: no color named %s (%s line %d)\n",
88 name,filename,line);
89 } else {
90 debug("WARNING: bad color at %s line %d; should be NAME R G B [A]\n",
91 filename,line);
94 fclose(file);
98 /*****************************************************************************
99 * COLOR NAMES & SPECIFICATIONS *
100 *****************************************************************************/
101 // necessary to match enums and strings
102 void set_color_names() {
103 for(int i=0;i<PALETTE_SIZE;i++) { color_names[i]=""; } // default
104 color_names[BACKGROUND] = "BACKGROUND";
105 color_names[TIME_DISPLAY] = "TIME_DISPLAY";
106 color_names[FPS_DISPLAY] = "FPS_DISPLAY";
107 color_names[LAG_WARNING] = "LAG_WARNING";
108 color_names[PHOTO_FLASH] = "PHOTO_FLASH";
109 color_names[SIMPLE_BODY] = "SIMPLE_BODY";
110 color_names[MOTE_BODY] = "MOTE_BODY";
111 color_names[DRAG_SELECTION] = "DRAG_SELECTION";
112 color_names[DEVICE_SELECTED] = "DEVICE_SELECTED";
113 color_names[DEVICE_ID] = "DEVICE_ID";
114 color_names[DEVICE_SCRIPT] = "DEVICE_SCRIPT";
115 color_names[DEVICE_VALUE] = "DEVICE_VALUE";
116 color_names[DEVICE_PROBES] = "DEVICE_PROBES";
117 color_names[VECTOR_BODY] = "VECTOR_BODY";
118 color_names[VECTOR_TIP] = "VECTOR_TIP";
119 color_names[USER_SENSOR_1] = "USER_SENSOR_1";
120 color_names[USER_SENSOR_2] = "USER_SENSOR_2";
121 color_names[USER_SENSOR_3] = "USER_SENSOR_3";
122 color_names[RGB_LED] = "RGB_LED";
123 color_names[RED_LED] = "RED_LED";
124 color_names[GREEN_LED] = "GREEN_LED";
125 color_names[BLUE_LED] = "BLUE_LED";
126 color_names[RADIO_RANGE_RING] = "RADIO_RANGE_RING";
127 color_names[NET_CONNECTION_FUZZY] = "NET_CONNECTION_FUZZY";
128 color_names[NET_CONNECTION_SHARP] = "NET_CONNECTION_SHARP";
129 color_names[NET_CONNECTION_LOGICAL] = "NET_CONNECTION_LOGICAL";
130 color_names[RADIO_CELL_INFO] = "RADIO_CELL_INFO";
131 color_names[RADIO_BACKOFF] = "RADIO_BACKOFF";
132 color_names[DEVICE_DEBUG] = "DEVICE_DEBUG";
133 color_names[BUTTON_COLOR] = "BUTTON_COLOR";
134 color_names[ODE_SELECTED] = "ODE_SELECTED";
135 color_names[ODE_DISABLED] = "ODE_DISABLED";
136 color_names[ODE_BOT] = "ODE_BOT";
137 color_names[ODE_EDGES] = "ODE_EDGES";
138 color_names[ODE_WALL] = "ODE_WALL";
139 //color_names[] = "";
142 // set the default colors
143 void Palette::default_palette() {
144 set_color(BACKGROUND,0,0,0,0.5); // black background
145 set_color(TIME_DISPLAY,1,0,1);
146 set_color(FPS_DISPLAY,1,0,1);
147 set_color(LAG_WARNING,1,0,0);
148 set_color(PHOTO_FLASH, 1, 1, 1, 1);
149 set_color(SIMPLE_BODY, 1.0, 0.25, 0.0, 0.8);
150 set_color(MOTE_BODY,1,0,1,0.8);
151 set_color(DRAG_SELECTION, 1, 1, 0, 0.5);
152 set_color(DEVICE_SELECTED, 0.5, 0.5, 0.5, 0.8);
153 set_color(DEVICE_ID, 1, 0, 0, 0.8);
154 set_color(DEVICE_SCRIPT, 1, 0, 0, 0.8);
155 set_color(DEVICE_VALUE, 0.5, 0.5, 1, 0.8);
156 set_color(DEVICE_PROBES, 0, 1, 0, 0.8);
157 set_color(VECTOR_BODY, 0, 0, 1, 0.8);
158 set_color(VECTOR_TIP, 1, 0, 1, 0.8);
159 set_color(USER_SENSOR_1, 1.0, 0.5, 0, 0.8);
160 set_color(USER_SENSOR_2, 0.5, 0, 1.0, 0.8);
161 set_color(USER_SENSOR_3, 1.0, 0, 0.5, 0.8);
162 set_color(RGB_LED, 1, 1, 1, 0.8);
163 set_color(RED_LED, 1, 0, 0, 0.8);
164 set_color(GREEN_LED, 0, 1, 0, 0.8);
165 set_color(BLUE_LED, 0, 0, 1, 0.8);
166 set_color(RADIO_RANGE_RING, 0.25, 0.25, 0.25, 0.8);
167 set_color(NET_CONNECTION_FUZZY, 0, 1, 0, 0.25);
168 set_color(NET_CONNECTION_SHARP, 0, 1, 0, 1);
169 set_color(NET_CONNECTION_LOGICAL, 0.5, 0.5, 1, 0.8);
170 set_color(RADIO_CELL_INFO, 0, 1, 1, 0.8);
171 set_color(RADIO_BACKOFF, 1, 0, 0, 0.8);
172 set_color(DEVICE_DEBUG, 1, 0.8, 0.8, 0.5);
173 set_color(BUTTON_COLOR, 0, 1.0, 0.5, 0.8);
174 set_color(ODE_SELECTED, 0, 0.7, 1, 1);
175 set_color(ODE_DISABLED, 0.8, 0, 0, 0.7);
176 set_color(ODE_BOT, 1, 0, 0, 0.7);
177 set_color(ODE_EDGES, 0, 0, 1, 1);
178 set_color(ODE_WALL, 1, 0, 0, 0.1);
179 //set_color(, 0, 0, 0, 0);