basic drawing widget, nothing drawn for now
[lttv.git] / ltt / branches / poly / lttv / modules / guiControlFlow / Drawing.c
1
2 #include "Drawing.h"
3 #include <gtk/gtk.h>
4 #include <gdk/gdk.h>
5
6 /*****************************************************************************
7 * Drawing functions *
8 *****************************************************************************/
9
10 typedef enum
11 {
12 RED,
13 GREEN,
14 BLUE,
15 WHITE,
16 BLACK
17
18 } ControlFlowColors;
19
20 /* Vector of unallocated colors */
21 static GdkColor CF_Colors [] =
22 {
23 { 0, 0xffff, 0x0000, 0x0000 }, // RED
24 { 0, 0x0000, 0xffff, 0x0000 }, // GREEN
25 { 0, 0x0000, 0x0000, 0xffff }, // BLUE
26 { 0, 0xffff, 0xffff, 0xffff }, // WHITE
27 { 0, 0x0000, 0x0000, 0x0000 } // BLACK
28 };
29
30
31 struct _Drawing_t {
32 GtkWidget *Drawing_Area_V;
33 GdkPixmap *Pixmap;
34
35 gint height, width, depth;
36
37 };
38
39
40 Drawing_t *Drawing_construct(void)
41 {
42
43 Drawing_t *Drawing = g_new(Drawing_t, 1);
44
45 Drawing->Drawing_Area_V = gtk_drawing_area_new ();
46
47 g_object_set_data_full(
48 G_OBJECT(Drawing->Drawing_Area_V),
49 "Link_Drawing_Data",
50 Drawing,
51 (GDestroyNotify)Drawing_destroy);
52
53 gtk_widget_modify_bg( Drawing->Drawing_Area_V,
54 GTK_STATE_NORMAL,
55 &CF_Colors[BLACK]);
56
57 gdk_window_get_geometry(Drawing->Drawing_Area_V->window,
58 NULL, NULL,
59 &(Drawing->width),
60 &(Drawing->height),
61 &(Drawing->depth));
62
63 Drawing->Pixmap = gdk_pixmap_new(
64 Drawing->Drawing_Area_V->window,
65 Drawing->width,
66 Drawing->height,
67 Drawing->depth);
68
69 return Drawing;
70 }
71
72 void Drawing_destroy(Drawing_t *Drawing)
73 {
74
75 // Do not unref here, Drawing_t destroyed by it's widget.
76 //g_object_unref( G_OBJECT(Drawing->Drawing_Area_V));
77
78 g_free(Drawing);
79 }
80
81 GtkWidget *Drawing_getWidget(Drawing_t *Drawing)
82 {
83 return Drawing->Drawing_Area_V;
84 }
85
86 /* get_time_from_pixels
87 *
88 * Get the time interval from window time and pixels, and pixels requested. This
89 * function uses TimeMul, which should only be used if the float value is lower
90 * that 4, and here it's always lower than 1, so it's ok.
91 */
92 void convert_pixels_to_time(
93 Drawing_t *Drawing,
94 guint x,
95 LttTime *window_time_begin,
96 LttTime *window_time_end,
97 LttTime *time)
98 {
99 LttTime window_time_interval;
100
101 TimeSub(window_time_interval, *window_time_end, *window_time_begin);
102
103
104 TimeMul(*time, window_time_interval,
105 (x/(float)Drawing->width));
106 TimeAdd(*time, *window_time_begin, *time);
107
108 }
109
110
111
112 void convert_time_to_pixels(
113 LttTime window_time_begin,
114 LttTime window_time_end,
115 LttTime time,
116 Drawing_t *Drawing,
117 guint *x)
118 {
119 LttTime window_time_interval;
120 float interval_float, time_float;
121
122 TimeSub(window_time_interval, window_time_end, window_time_begin);
123
124 TimeSub(time, time, window_time_begin);
125
126 interval_float = (window_time_interval.tv_sec * NANSECOND_CONST)
127 + window_time_interval.tv_nsec;
128 time_float = (time.tv_sec * NANSECOND_CONST)
129 + time.tv_nsec;
130
131 *x = (guint)(time_float/interval_float * Drawing->width);
132
133 }
134
135
136
137 void Drawing_Resize(Drawing_t *Drawing, guint h, guint w)
138 {
139 Drawing->height = h ;
140 Drawing->width = w ;
141
142 gtk_widget_set_size_request ( Drawing->Drawing_Area_V,
143 Drawing->width,
144 Drawing->height);
145
146
147 }
This page took 0.03201 seconds and 4 git commands to generate.