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. */
11 #include "visualizer.h"
13 /*****************************************************************************
15 *****************************************************************************/
16 static BOOL palette_initialized
= FALSE
;
17 static char* color_names
[PALETTE_SIZE
];
19 void set_color_names(); // defined below
22 if(!palette_initialized
) { set_color_names(); palette_initialized
=TRUE
; }
23 for(int i
=0;i
<PALETTE_SIZE
;i
++) stack_depth
[i
]=0;
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
) {
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
;
55 void Palette::pop_color(ColorName c
) {
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
) {
69 if((file
= fopen(filename
, "r"))==NULL
) {
70 debug("WARNING: Couldn't open palette file %s.\n",filename
);
72 char buf
[255]; int line
=0;
73 while(fgets(buf
,255,file
)) {
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
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;
87 debug("WARNING: no color named %s (%s line %d)\n",
90 debug("WARNING: bad color at %s line %d; should be NAME R G B [A]\n",
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);