1 /* ColorMap.c */
2 /**********************************************************************************************************
3 Copyright (c) 2002-2013 Abdul-Rahman Allouche. All rights reserved
4 
5 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
6 documentation files (the Gabedit), to deal in the Software without restriction, including without limitation
7 the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software,
8 and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
9 
10   The above copyright notice and this permission notice shall be included in all copies or substantial portions
11   of the Software.
12 
13 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
14 TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
15 THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
16 CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
17 DEALINGS IN THE SOFTWARE.
18 ************************************************************************************************************/
19 
20 #include "../../Config.h"
21 #include "../Common/Global.h"
22 #include "GlobalOrb.h"
23 #include <gdk/gdkkeysyms.h>
24 #include "../Utils/Utils.h"
25 #include "../Utils/UtilsCairo.h"
26 #include "../Utils/Constants.h"
27 #include "ColorMap.h"
28 #include "GLArea.h"
29 
30 /*
31 static ColorMap myColorMap =  {0,NULL};
32 static GtkWidget *handleboxShow;
33 static GdkGC *gc = NULL;
34 */
35 /******************************************************************************************************************************/
36 /*
37 static void print_colorMap(ColorMap* colorMap)
38 {
39 	gint i;
40 	printf("Number of Color = %d\n",colorMap->numberOfColors);
41 	for(i=0; i<colorMap->numberOfColors; i++)
42 	{
43 		printf("%lf %0.2f %0.2f %0.2f\n",colorMap->colorValue[i].value,colorMap->colorValue[i].color[0],colorMap->colorValue[i].color[1],colorMap->colorValue[i].color[2]);
44 	}
45 	printf("\n");
46 }
47 */
48 /******************************************************************************************************************************/
colormap_free(ColorMap * colorMap)49 void colormap_free(ColorMap* colorMap)
50 {
51 	if(!colorMap) return;
52 	if(!colorMap->colorValue)
53 	{
54 
55 		colorMap->numberOfColors = 0;
56 		return;
57 	}
58 	g_free(colorMap->colorValue);
59 	colorMap->numberOfColors = 0;
60 }
61 /******************************************************************************************************************************/
colormap_alloc(ColorMap * colorMap,gint numberOfColors)62 static void colormap_alloc(ColorMap* colorMap, gint numberOfColors)
63 {
64 	if(colorMap->colorValue)
65 		colormap_free(colorMap);
66 
67 	if(numberOfColors<1) numberOfColors = 1;
68 	colorMap->numberOfColors = numberOfColors;
69 	colorMap->colorValue = g_malloc(numberOfColors*sizeof(OneColorValue));
70 }
71 /******************************************************************************************************************************/
new_colorMap(gdouble color[],gdouble value)72 static ColorMap new_colorMap(gdouble color[], gdouble value)
73 {
74 	gint c;
75 	ColorMap colorMap = {0,NULL};
76 	colormap_alloc(&colorMap, 1);
77 	for(c=0; c<3; c++)
78 		colorMap.colorValue[0].color[c] = color[c];
79 	colorMap.colorValue[0].value = value;
80 	return colorMap;
81 }
82 /******************************************************************************************************************************/
add_to_colorMap(ColorMap * colorMap,gdouble color[],gdouble value)83 static void add_to_colorMap(ColorMap* colorMap, gdouble color[], gdouble value)
84 {
85 	gint i;
86 	gint c;
87 	OneColorValue* colorValue = NULL;
88 	colorValue = g_malloc((colorMap->numberOfColors+1)*sizeof(OneColorValue));
89 	for(i=0; i<colorMap->numberOfColors; i++)
90 		colorValue[i] = colorMap->colorValue[i];
91 
92 	for(c=0;c<3;c++)
93 		colorValue[colorMap->numberOfColors].color[c] = color[c];
94 	colorValue[colorMap->numberOfColors].value = value;
95 	g_free( colorMap->colorValue);
96 	colorMap->colorValue = colorValue;
97 	colorMap->numberOfColors++;
98 }
99 /******************************************************************************************************************************/
sort_colorMap(ColorMap * colorMap)100 static void sort_colorMap(ColorMap* colorMap)
101 {
102 	gint i;
103 	gint j;
104 	gint k;
105 	OneColorValue tmp;
106 	for(i=0;i<colorMap->numberOfColors-1;i++)
107 	{
108 		k = i;
109 		for(j=i+1;j<colorMap->numberOfColors;j++)
110 			if(colorMap->colorValue[k].value>colorMap->colorValue[j].value)
111 				k = j;
112 		if(k != i)
113 		{
114 			tmp = colorMap->colorValue[i];
115 			colorMap->colorValue[i] = colorMap->colorValue[k];
116 			colorMap->colorValue[k] = tmp;
117 		}
118 	}
119 }
120 /******************************************************************************************************************************/
new_colorMap_min_max_multicolor(gdouble minValue,gdouble maxValue)121 ColorMap*  new_colorMap_min_max_multicolor(gdouble minValue, gdouble maxValue)
122 {
123 	gint i;
124 	gint j;
125 	gint k;
126 	gdouble h = 0;
127 	gint ns = 4;
128 	gint nc = 20;
129 	gint n = nc *ns+1;
130 	gdouble color[3];
131 	ColorMap* colorMap;
132 
133 	h = (maxValue-minValue)/(n-1) ;
134 	color[0] = 1.0; color[1] = 0.0; color[2] = 0.0;
135 
136 	colorMap = g_malloc(sizeof(ColorMap));
137 	*colorMap = new_colorMap(color, minValue);
138 	k = 1;
139 	for(j=0;j<ns;j++)
140 	for(i=0;i<nc;i++)
141 	{
142 
143 		if(j==0) color[1] += 1.0/nc;
144 		if(j==1) color[0] -= 1.0/nc;
145 		if(j==2) color[2] += 1.0/nc;
146 		if(j==3) color[1] -= 1.0/nc;
147 		add_to_colorMap(colorMap, color, minValue +k*h);
148 		k++;
149 	}
150 	sort_colorMap(colorMap);
151 	return colorMap;
152 }
153 /******************************************************************************************************************************/
new_colorMap_fromGrid_multicolor(Grid * grid)154 ColorMap*  new_colorMap_fromGrid_multicolor(Grid* grid)
155 {
156 	gint i;
157 	gint j;
158 	gint k;
159 	gdouble maxValue = 0;
160 	gdouble minValue = 0;
161 	gboolean beg = TRUE;
162 	gdouble h = 0;
163 	gint ns = 4;
164 	gint nc = 20;
165 	gint n = nc *ns+1;
166 	gdouble color[3];
167 	gdouble v;
168 	ColorMap* colorMap;
169 
170 	if(!grid)return NULL;
171 
172 	for(i=0;i<grid->N[0];i++)
173 	{
174 		for(j=0;j<grid->N[1];j++)
175 		{
176 			for(k=0;k<grid->N[2];k++)
177 			{
178 				v = grid->point[i][j][k].C[4] ;
179 				if(beg)
180 				{
181 					beg = FALSE;
182         				minValue =  v;
183         				maxValue =  v;
184 				}
185                 		else
186 				{
187         				if(minValue > v) minValue =  v;
188         				if(maxValue < v) maxValue =  v;
189 				}
190 			}
191 		}
192 	}
193 	h = (maxValue-minValue)/(n-1) ;
194 	color[0] = 1.0; color[1] = 0.0; color[2] = 0.0;
195 
196 	colorMap = g_malloc(sizeof(ColorMap));
197 	*colorMap = new_colorMap(color, minValue);
198 	k = 1;
199 	for(j=0;j<ns;j++)
200 	for(i=0;i<nc;i++)
201 	{
202 
203 		if(j==0) color[1] += 1.0/nc;
204 		if(j==1) color[0] -= 1.0/nc;
205 		if(j==2) color[2] += 1.0/nc;
206 		if(j==3) color[1] -= 1.0/nc;
207 		add_to_colorMap(colorMap, color, minValue +k*h);
208 		k++;
209 	}
210 	sort_colorMap(colorMap);
211 	/*myColorMap = colorMap;*/
212 	return colorMap;
213 	/* print_colorMap(myColorMap);*/
214 }
215 /******************************************************************************************************************************/
new_colorMap_min_max_unicolor(gdouble minValue,gdouble maxValue,gdouble Color[])216 ColorMap*  new_colorMap_min_max_unicolor(gdouble minValue, gdouble maxValue, gdouble Color[])
217 {
218 	gdouble color[3];
219 	ColorMap* colorMap;
220 
221 	gdouble max = color[0];
222 	gint c;
223 
224 	for(c=0;c<3;c++) color[c] = Color[c];
225 	max = color[0];
226 	if(max<color[1]) max = color[1];
227 	if(max<color[2]) max = color[2];
228 	if(max<1e-3)
229 	{
230 		color[0] = 1.0;
231 		color[1] = 1.0;
232 		color[2] = 1.0;
233 		max = 1.0;
234 	}
235 
236 	for(c=0;c<3;c++) color[c] /= max;
237 	colorMap = g_malloc(sizeof(ColorMap));
238 	*colorMap = new_colorMap(color, minValue);
239 	color[0] = 0; color[1] = 0; color[2] = 0;
240 	add_to_colorMap(colorMap, color, maxValue );
241 	sort_colorMap(colorMap);
242 	return colorMap;
243 }
244 /******************************************************************************************************************************/
new_colorMap_fromGrid_unicolor(Grid * grid,gdouble Color[])245 ColorMap*  new_colorMap_fromGrid_unicolor(Grid* grid, gdouble Color[])
246 {
247 	gint i;
248 	gint j;
249 	gint k;
250 	gdouble maxValue = 0;
251 	gdouble minValue = 0;
252 	gboolean beg = TRUE;
253 	gdouble color[3];
254 	gdouble v;
255 	ColorMap* colorMap;
256 	gdouble max;
257 	gint c;
258 
259 	if(!grid)return NULL;
260 
261 	for(i=0;i<grid->N[0];i++)
262 	{
263 		for(j=0;j<grid->N[1];j++)
264 		{
265 			for(k=0;k<grid->N[2];k++)
266 			{
267 				v = grid->point[i][j][k].C[4] ;
268 				if(beg)
269 				{
270 					beg = FALSE;
271         				minValue =  v;
272         				maxValue =  v;
273 				}
274                 		else
275 				{
276         				if(minValue > v) minValue =  v;
277         				if(maxValue < v) maxValue =  v;
278 				}
279 			}
280 		}
281 	}
282 
283 	for(c=0;c<3;c++) color[c] = Color[c];
284 	max = color[0];
285 	if(max<color[1]) max = color[1];
286 	if(max<color[2]) max = color[2];
287 	if(max<1e-3)
288 	{
289 		color[0] = 1.0;
290 		color[1] = 1.0;
291 		color[2] = 1.0;
292 		max = 1;
293 	}
294 	for(c=0;c<3;c++) color[c] /= max;
295 	colorMap = g_malloc(sizeof(ColorMap));
296 	*colorMap = new_colorMap(color, minValue);
297 	color[0] = 0; color[1] = 0; color[2] = 0;
298 	add_to_colorMap(colorMap, color, maxValue );
299 	sort_colorMap(colorMap);
300 	/*myColorMap = colorMap;*/
301 	return colorMap;
302 	/* print_colorMap(myColorMap);*/
303 }
304 /******************************************************************************************************************************/
new_colorMap_min_max_2colors(gdouble minValue,gdouble maxValue,gdouble Color1[],gdouble Color2[])305 ColorMap*  new_colorMap_min_max_2colors(gdouble minValue, gdouble maxValue, gdouble Color1[], gdouble Color2[])
306 {
307 	gdouble color[3];
308 	gdouble color1[3];
309 	gdouble color2[3];
310 	ColorMap* colorMap;
311 	gint c;
312 
313 	gdouble max1;
314 	gdouble max2;
315 
316 	for(c=0;c<3;c++) color1[c] = Color1[c];
317 	for(c=0;c<3;c++) color2[c] = Color2[c];
318 
319 	max1 = color1[0];
320 	if(max1<color1[1]) max1 = color1[1];
321 	if(max1<color1[2]) max1 = color1[2];
322 	if(max1<1e-3)
323 	{
324 		color1[0] = 1.0;
325 		color1[1] = 1.0;
326 		color1[2] = 1.0;
327 		max1 = 1.0;
328 	}
329 	max2 = color2[0];
330 	if(max2<color2[1]) max2 = color2[1];
331 	if(max2<color2[2]) max2 = color2[2];
332 	if(max2<1e-3)
333 	{
334 		color2[0] = 1.0;
335 		color2[1] = 1.0;
336 		color2[2] = 1.0;
337 		max2 = 1.0;
338 	}
339 
340 	color[0] = 0; color[1] = 0; color[2] = 0;
341 	for(c=0;c<3;c++) color1[c] /= max1;
342 	for(c=0;c<3;c++) color2[c] /= max2;
343 	colorMap = g_malloc(sizeof(ColorMap));
344 	*colorMap = new_colorMap(color1, minValue);
345 	add_to_colorMap(colorMap, color, minValue+(maxValue-minValue)/2 );
346 	add_to_colorMap(colorMap, color2, maxValue );
347 
348 	sort_colorMap(colorMap);
349 	return colorMap;
350 }
351 /******************************************************************************************************************************/
new_colorMap_fromGrid_2colors(Grid * grid,gdouble Color1[],gdouble Color2[])352 ColorMap*  new_colorMap_fromGrid_2colors(Grid* grid, gdouble Color1[], gdouble Color2[])
353 {
354 	gint i;
355 	gint j;
356 	gint k;
357 	gint c;
358 	gdouble maxValue = 0;
359 	gdouble minValue = 0;
360 	gboolean beg = TRUE;
361 	gdouble color[3];
362 	gdouble color1[3];
363 	gdouble color2[3];
364 	gdouble v;
365 	ColorMap* colorMap;
366 	gdouble max1;
367 	gdouble max2;
368 
369 	for(c=0;c<3;c++) color1[c] = Color1[c];
370 	for(c=0;c<3;c++) color2[c] = Color2[c];
371 
372 	if(!grid)return NULL;
373 
374 	for(i=0;i<grid->N[0];i++)
375 	{
376 		for(j=0;j<grid->N[1];j++)
377 		{
378 			for(k=0;k<grid->N[2];k++)
379 			{
380 				v = grid->point[i][j][k].C[4] ;
381 				if(beg)
382 				{
383 					beg = FALSE;
384         				minValue =  v;
385         				maxValue =  v;
386 				}
387                 		else
388 				{
389         				if(minValue > v) minValue =  v;
390         				if(maxValue < v) maxValue =  v;
391 				}
392 			}
393 		}
394 	}
395 	max1 = color1[0];
396 	if(max1<color1[1]) max1 = color1[1];
397 	if(max1<color1[2]) max1 = color1[2];
398 	if(max1<1e-3)
399 	{
400 		color1[0] = 1.0;
401 		color1[1] = 1.0;
402 		color1[2] = 1.0;
403 		max1 = 1.0;
404 	}
405 	max2 = color2[0];
406 	if(max2<color2[1]) max2 = color2[1];
407 	if(max2<color2[2]) max2 = color2[2];
408 	if(max2<1e-3)
409 	{
410 		color2[0] = 1.0;
411 		color2[1] = 1.0;
412 		color2[2] = 1.0;
413 		max2 = 1.0;
414 	}
415 
416 	for(c=0;c<3;c++) color1[c] /= max1;
417 	for(c=0;c<3;c++) color2[c] /= max2;
418 	colorMap = g_malloc(sizeof(ColorMap));
419 	*colorMap = new_colorMap(color1, minValue);
420 	add_to_colorMap(colorMap, color, minValue+(maxValue-minValue)/2 );
421 	add_to_colorMap(colorMap, color2, maxValue );
422 	sort_colorMap(colorMap);
423 	return colorMap;
424 }
425 /******************************************************************************************************************************/
new_colorMap_min_max(gdouble minValue,gdouble maxValue)426 ColorMap*  new_colorMap_min_max(gdouble minValue, gdouble maxValue)
427 {
428 	if(colorMapType == 1)
429 		return new_colorMap_min_max_multicolor(minValue,maxValue);
430 	else if(colorMapType == 2)
431 		return new_colorMap_min_max_2colors(minValue,maxValue, colorMapColors[0], colorMapColors[1]);
432 	else
433 		return new_colorMap_min_max_unicolor(minValue,maxValue, colorMapColors[2]);
434 }
435 /******************************************************************************************************************************/
new_colorMap_fromGrid(Grid * grid)436 ColorMap*  new_colorMap_fromGrid(Grid* grid)
437 {
438 	if(colorMapType == 1)
439 		return new_colorMap_fromGrid_multicolor(grid);
440 	else if(colorMapType == 2)
441 		return new_colorMap_fromGrid_2colors(grid,colorMapColors[0], colorMapColors[1]);
442 	else
443 		return new_colorMap_fromGrid_unicolor(grid,colorMapColors[2]);
444 
445 }
446 /******************************************************************************************************************************/
set_Color_From_colorMap(ColorMap * colorMap,gdouble color[],gdouble value)447 void  set_Color_From_colorMap(ColorMap* colorMap, gdouble color[], gdouble value)
448 {
449 	gint i = 0;
450 	gint k = 0;
451 	gint c;
452 	gdouble l,l1,l2;
453 	if(colorMap->numberOfColors<1)
454 	{
455 		for(c=0;c<3;c++)
456 			color[c] = 0.5;
457 		return;
458 	}
459 	if(value<=colorMap->colorValue[i].value)
460 	{
461 		for(c=0;c<3;c++)
462 			color[c] = colorMap->colorValue[i].color[c];
463 		return;
464 	}
465 	i = colorMap->numberOfColors-1;
466 	if(value>=colorMap->colorValue[i].value)
467 	{
468 		for(c=0;c<3;c++)
469 			color[c] = colorMap->colorValue[i].color[c];
470 		return;
471 	}
472 
473 	k = 0;
474 	for(i=1;i<colorMap->numberOfColors-1;i++)
475 	{
476 		if(value>=colorMap->colorValue[i].value && value<=colorMap->colorValue[i+1].value)
477 		{
478 			k = i;
479 			break;
480 		}
481 	}
482 	l = colorMap->colorValue[k+1].value-colorMap->colorValue[k].value;
483 	l1 = value-colorMap->colorValue[k].value;
484 	l2 = l-l1;
485 	if(l>0 && l1>=0 && l2>=0)
486 	{
487 		l1 = l1/l;
488 		l2 = l2/l;
489 		for(c=0;c<3;c++)
490 			color[c] = colorMap->colorValue[k].color[c]*l2+colorMap->colorValue[k+1].color[c]*l1;
491 	}
492 	else
493 	for(c=0;c<3;c++)
494 		color[c] = colorMap->colorValue[k].color[c];
495 }
496 /******************************************************************************************************************************/
reset_colorMap(GtkWidget * entry,gpointer data)497 void  reset_colorMap(GtkWidget* entry, gpointer data)
498 {
499 	gdouble maxValue = 0;
500 	gdouble minValue = 0;
501 	G_CONST_RETURN gchar* tmp;
502 	ColorMap* colorMap = g_object_get_data(G_OBJECT(entry),"ColorMap");
503 	ColorMap* newColorMap = NULL;
504 	GtkWidget* handlebox = g_object_get_data(G_OBJECT(entry), "Handlebox");
505 	GtkWidget* darea = g_object_get_data(G_OBJECT(entry), "DrawingArea");
506 	GtkWidget* otherEntry = g_object_get_data(G_OBJECT(entry), "OtherEntry");
507 
508 	if(!colorMap) return;
509 
510 	if(colorMap->numberOfColors<1) return;
511 
512 
513 	if(data) /* this is right entry */
514 	{
515 		minValue = colorMap->colorValue[0].value;
516 		tmp  = gtk_entry_get_text(GTK_ENTRY(entry));
517 		maxValue = atof(tmp);
518 	}
519 	else
520 	{
521 		maxValue = colorMap->colorValue[colorMap->numberOfColors-1].value;
522 		tmp  = gtk_entry_get_text(GTK_ENTRY(entry));
523 		minValue = atof(tmp);
524 	}
525 	newColorMap = new_colorMap_min_max(minValue, maxValue);
526 	colormap_free(colorMap);
527 	g_free(colorMap);
528 
529 	colorMap = newColorMap;
530 	g_object_set_data(G_OBJECT(entry),"ColorMap", colorMap);
531 	g_object_set_data(G_OBJECT(handlebox),"ColorMap", colorMap);
532 	g_object_set_data(G_OBJECT(darea),"ColorMap", colorMap);
533 	g_object_set_data(G_OBJECT(otherEntry),"ColorMap", colorMap);
534 
535 	/* print_colorMap(&myColorMap);*/
536 	RebuildSurf = TRUE;
537 	glarea_rafresh(GLArea);
538 	color_map_hide(handlebox);
539 	color_map_refresh(handlebox);
540 	color_map_show(handlebox);
541 }
542 /********************************************************************************/
configure_event(GtkWidget * widget,GdkEventConfigure * event)543 static gint configure_event( GtkWidget *widget, GdkEventConfigure *event )
544 {
545 
546   	gint height = 0;
547 	GdkColor color;
548 	GdkColor tmpcolor;
549 	GdkColormap *colormap   = NULL;
550   	GdkPixmap *pixmap = (GdkPixmap *)g_object_get_data(G_OBJECT(widget), "Pixmap");
551  	PangoFontDescription *font_desc = pango_font_description_from_string ("helvetica bold 12");
552 	cairo_t* cr = (cairo_t *)g_object_get_data(G_OBJECT(widget), "Cairo");
553 	gboolean Ok = TRUE;
554         GdkVisual* vis;
555 	gchar t[BSIZE];
556 	ColorMap* myColorMap = g_object_get_data(G_OBJECT(widget),"ColorMap");
557 	GdkGC *gc = g_object_get_data(G_OBJECT(widget),"Gdkgc");
558 
559 	gint i;
560 
561 
562 	if (pixmap) g_object_unref(pixmap);
563 	if (cr) cairo_destroy (cr);
564 
565 	pixmap = gdk_pixmap_new(widget->window, widget->allocation.width, widget->allocation.height, -1);
566 	cr = gdk_cairo_create (pixmap);
567 
568 	colormap  = gdk_drawable_get_colormap(widget->window);
569 
570   	height = widget->allocation.height;
571         vis = gdk_colormap_get_visual(colormap);
572         if(vis->depth >15) Ok = TRUE;
573 	else Ok = FALSE;
574 
575 	 color.red = 40000;
576 	 color.green = 40000;
577 	 color.blue = 40000;
578 
579 	gdk_colormap_alloc_color(colormap, &color, FALSE, TRUE);
580 
581 	if(Ok)
582 	{
583 
584 		gdouble max  = myColorMap->colorValue[myColorMap->numberOfColors-1].value;
585 		gdouble min  = myColorMap->colorValue[0].value;
586   		for(i=0;i<widget->allocation.width;i++)
587   		{
588 			gdouble v = i/(gdouble)(widget->allocation.width)*(max-min)+min;
589 			gdouble color[3];
590 
591 			set_Color_From_colorMap(myColorMap, color, v);
592 			tmpcolor.red = (gushort)(color[0]*65535);
593 			tmpcolor.green = (gushort)(color[1]*65535);
594 			tmpcolor.blue = (gushort)(color[2]*65535);
595 
596 			gdk_colormap_alloc_color(colormap, &tmpcolor, FALSE, TRUE);
597 			gdk_gc_set_foreground(gc,&tmpcolor);
598     			gdk_draw_line(pixmap,gc,i,0,i,height);
599 
600   		}
601 
602   		for(i=widget->allocation.width/4;i<widget->allocation.width-widget->allocation.width/8;i+=widget->allocation.width/4)
603   		{
604 			gdouble v = i/(gdouble)(widget->allocation.width)*(max-min)+min;
605 			{
606 				gint x = i;
607 				gint y = height-height/4;
608 
609 				if(fabs(v)>1e-3) sprintf(t,"%0.3f",v);
610 				else sprintf(t,"%0.3e",v);
611 
612 	 			color.red = 0;
613 	 			color.green = 0;
614 	 			color.blue = 0;
615 				gdk_colormap_alloc_color(colormap, &color,TRUE,TRUE);
616 				gdk_gc_set_foreground(gc,&color);
617 
618 				gdk_gc_set_line_attributes(gc,0,GDK_LINE_SOLID,GDK_CAP_ROUND,GDK_JOIN_ROUND);
619 				if(font_desc)
620 					gabedit_cairo_string(cr, widget, font_desc, gc, x, y, t, TRUE,TRUE);
621 			}
622 		}
623 	}
624 	else
625 	{
626 		gdk_gc_set_foreground(gc,&color);
627   		for(i=0;i<widget->allocation.width;i++)
628     			gdk_draw_line(pixmap,gc,i,0,i,height);
629   	}
630 
631   	g_object_set_data(G_OBJECT(widget), "Pixmap", pixmap);
632   	g_object_set_data(G_OBJECT(widget), "Cairo", cr);
633 	if(font_desc) pango_font_description_free (font_desc);
634   	return TRUE;
635 }
636 /********************************************************************************/
expose_event(GtkWidget * widget,GdkEventExpose * event)637 static gint expose_event(GtkWidget  *widget,GdkEventExpose *event )
638 {
639   	GdkPixmap *pixmap = NULL;
640 
641 	if(event->count >0)
642 		return FALSE;
643 
644   	pixmap = (GdkPixmap *)g_object_get_data(G_OBJECT(widget), "Pixmap");
645 	if(pixmap)
646 		gdk_draw_drawable(widget->window,
647                   widget->style->fg_gc[GTK_WIDGET_STATE (widget)],
648                   pixmap,
649                   event->area.x, event->area.y,
650                   event->area.x, event->area.y,
651                   event->area.width, event->area.height);
652   	return FALSE;
653 }
654 /********************************************************************************/
add_drawing_area(GtkWidget * table,gint i)655 static GtkWidget *add_drawing_area(GtkWidget *table, gint i)
656 {
657 	GtkWidget *darea;
658 	GdkPixmap *pixmap = NULL;
659 	cairo_t* cr = NULL;
660 
661 	darea = gtk_drawing_area_new();
662 	 gtk_widget_set_size_request(GTK_WIDGET(darea), 300, -1);
663 
664 
665 	gtk_table_attach(GTK_TABLE(table),darea,i,i+1,0,1,
666 			(GtkAttachOptions)(GTK_FILL | GTK_EXPAND),
667 			(GtkAttachOptions)(GTK_FILL | GTK_EXPAND),
668 			0,0);
669 	gtk_widget_realize(darea);
670 	pixmap = gdk_pixmap_new(darea->window,darea->allocation.width,darea->allocation.height,-1);
671 	cr = gdk_cairo_create (pixmap);
672 	g_object_set_data(G_OBJECT(darea), "Pixmap", pixmap);
673 	g_object_set_data(G_OBJECT(darea), "Cairo", cr);
674 
675 	g_signal_connect(G_OBJECT(darea),"configure_event",(GCallback)configure_event,NULL);
676 	g_signal_connect(G_OBJECT(darea),"expose_event",(GCallback)expose_event,NULL);
677 	return darea;
678 }
679 /******************************************************************************************************************************/
create_color_map_show(GtkWidget * box,ColorMap * colorMap,gchar * label)680 GtkWidget* create_color_map_show(GtkWidget* box, ColorMap* colorMap, gchar* label)
681 {
682   	GtkWidget *handlebox;
683 	GtkWidget* table;
684 	GtkWidget* entry;
685 	GtkWidget* entryLeft;
686 	GtkWidget* entryRight;
687 	GtkWidget *darea;
688 	GdkGC *gc = NULL;
689 	gint i;
690 
691   	handlebox = gtk_handle_box_new ();
692   	gtk_handle_box_set_shadow_type(GTK_HANDLE_BOX(handlebox),GTK_SHADOW_NONE);
693 	gtk_handle_box_set_handle_position  (GTK_HANDLE_BOX(handlebox),GTK_POS_LEFT);
694   	gtk_widget_show (handlebox);
695   	gtk_box_pack_start (GTK_BOX (box), handlebox, FALSE, FALSE, 0);
696 	table = gtk_table_new(1,4,FALSE);
697 
698 	gtk_container_add (GTK_CONTAINER (handlebox), table);
699 
700 	i = 0;
701 	if(label)
702 	{
703 		GtkWidget* labelWid = gtk_label_new(label);
704 		gtk_widget_show(labelWid);
705 		gtk_table_attach(GTK_TABLE(table),labelWid,i,i+1,0,1,
706 			(GtkAttachOptions)(GTK_FILL | GTK_SHRINK),
707 			(GtkAttachOptions)(GTK_FILL | GTK_SHRINK),
708 			0,0);
709 	}
710 	i = 1;
711 	entry = gtk_entry_new();
712 	gtk_widget_set_size_request(entry,80,-1);
713 	gtk_widget_show(entry);
714 	gtk_table_attach(GTK_TABLE(table),entry,i,i+1,0,i,
715 			(GtkAttachOptions)(GTK_FILL | GTK_SHRINK),
716 			(GtkAttachOptions)(GTK_FILL | GTK_SHRINK),
717 			0,0);
718 	entryLeft = entry;
719 
720 	i = 2;
721 	gc = gdk_gc_new(PrincipalWindow->window);
722 	darea = add_drawing_area(table, i);
723 
724 	i = 3;
725 	entry = gtk_entry_new();
726 	gtk_widget_set_size_request(entry,80,-1);
727 	gtk_widget_show(entry);
728 	gtk_table_attach(GTK_TABLE(table),entry,i,i+1,0,1,
729 			(GtkAttachOptions)(GTK_FILL | GTK_SHRINK),
730 			(GtkAttachOptions)(GTK_FILL | GTK_SHRINK),
731 			0,0);
732 	entryRight = entry;
733 
734 	gtk_widget_show(table);
735 	g_object_set_data(G_OBJECT(handlebox), "EntryLeft", entryLeft);
736 	g_object_set_data(G_OBJECT(handlebox), "EntryRight", entryRight);
737 	g_object_set_data(G_OBJECT(handlebox), "DrawingArea", darea);
738 	g_object_set_data(G_OBJECT(handlebox),"ColorMap", colorMap);
739 	g_object_set_data(G_OBJECT(handlebox),"Gdkgc", gc);
740 
741 	g_object_set_data(G_OBJECT(darea),"ColorMap", colorMap);
742 	g_object_set_data(G_OBJECT(darea),"Gdkgc", gc);
743 
744 	g_object_set_data(G_OBJECT(entryLeft), "DrawingArea", darea);
745 	g_object_set_data(G_OBJECT(entryRight), "DrawingArea", darea);
746 
747 	g_object_set_data(G_OBJECT(entryLeft),"ColorMap", colorMap);
748 	g_object_set_data(G_OBJECT(entryRight),"ColorMap", colorMap);
749 
750 	g_object_set_data(G_OBJECT(entryLeft),"Handlebox", handlebox);
751 	g_object_set_data(G_OBJECT(entryRight),"Handlebox", handlebox);
752 
753 	g_object_set_data(G_OBJECT(entryLeft),"DrawingArea", darea);
754 	g_object_set_data(G_OBJECT(entryRight),"DrawingArea", darea);
755 
756 	g_object_set_data(G_OBJECT(entryLeft),"OtherEntry", entryRight);
757 	g_object_set_data(G_OBJECT(entryRight),"OtherEntry", entryLeft);
758 
759 
760 	g_signal_connect(G_OBJECT (entryLeft), "activate",(GCallback)reset_colorMap, NULL);
761 	g_signal_connect(G_OBJECT (entryRight), "activate",(GCallback)reset_colorMap, GTK_OBJECT(entryLeft));
762 
763 	return handlebox;
764 }
765 /******************************************************************************************************************************/
color_map_show(GtkWidget * handlebox)766 void color_map_show(GtkWidget* handlebox)
767 {
768 	GtkWidget* entryLeft = g_object_get_data(G_OBJECT(handlebox), "EntryLeft");
769 	GtkWidget* entryRight = g_object_get_data(G_OBJECT(handlebox), "EntryRight");
770 	ColorMap* myColorMap = g_object_get_data(G_OBJECT(handlebox), "ColorMap");
771 	gchar tmp[BSIZE];
772 
773 	if(myColorMap->numberOfColors>0)
774 	{
775 		if(fabs(myColorMap->colorValue[0].value)>1e-3)
776 			sprintf(tmp,"%0.3f",myColorMap->colorValue[0].value);
777 		else
778 			if(fabs(myColorMap->colorValue[0].value)<1e-8)
779 				sprintf(tmp,"%0.1e",myColorMap->colorValue[0].value);
780 			else
781 				sprintf(tmp,"%lf",myColorMap->colorValue[0].value);
782 
783 		gtk_entry_set_text(GTK_ENTRY(entryLeft),tmp);
784 		if(fabs(myColorMap->colorValue[myColorMap->numberOfColors-1].value)>1e-3)
785 			sprintf(tmp,"%0.3f",myColorMap->colorValue[myColorMap->numberOfColors-1].value);
786 		else
787 			if(fabs(myColorMap->colorValue[myColorMap->numberOfColors-1].value)<1e-8)
788 				sprintf(tmp,"%0.1e",myColorMap->colorValue[myColorMap->numberOfColors-1].value);
789 			else
790 				sprintf(tmp,"%lf",myColorMap->colorValue[myColorMap->numberOfColors-1].value);
791 		gtk_entry_set_text(GTK_ENTRY(entryRight),tmp);
792 	}
793 
794 	gtk_widget_show_all(handlebox);
795 }
796 /******************************************************************************************************************************/
color_map_refresh(GtkWidget * handlebox)797 void color_map_refresh(GtkWidget* handlebox)
798 {
799 	GtkWidget* darea = g_object_get_data(G_OBJECT(handlebox), "DrawingArea");
800 	configure_event(darea, NULL);
801 }
802 /******************************************************************************************************************************/
color_map_hide(GtkWidget * handlebox)803 void color_map_hide(GtkWidget* handlebox)
804 {
805 	gtk_widget_hide(handlebox);
806 }
807