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