fa2c4dbe |
1 | |
f0d936c0 |
2 | #include "Drawing.h" |
76a67e8a |
3 | #include <gtk/gtk.h> |
4 | #include <gdk/gdk.h> |
f0d936c0 |
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 | |
76a67e8a |
31 | struct _Drawing_t { |
32 | GtkWidget *Drawing_Area_V; |
33 | GdkPixmap *Pixmap; |
f0d936c0 |
34 | |
76a67e8a |
35 | gint height, width, depth; |
f0d936c0 |
36 | |
76a67e8a |
37 | }; |
f0d936c0 |
38 | |
39 | |
76a67e8a |
40 | Drawing_t *Drawing_construct(void) |
f0d936c0 |
41 | { |
42 | |
76a67e8a |
43 | Drawing_t *Drawing = g_new(Drawing_t, 1); |
f0d936c0 |
44 | |
45 | Drawing->Drawing_Area_V = gtk_drawing_area_new (); |
46 | |
47 | g_object_set_data_full( |
48 | G_OBJECT(Drawing->Drawing_Area_V), |
76a67e8a |
49 | "Link_Drawing_Data", |
f0d936c0 |
50 | Drawing, |
fa2c4dbe |
51 | (GDestroyNotify)Drawing_destroy); |
f0d936c0 |
52 | |
76a67e8a |
53 | gtk_widget_modify_bg( Drawing->Drawing_Area_V, |
f0d936c0 |
54 | GTK_STATE_NORMAL, |
55 | &CF_Colors[BLACK]); |
56 | |
76a67e8a |
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 | |
f0d936c0 |
69 | return Drawing; |
70 | } |
71 | |
72 | void Drawing_destroy(Drawing_t *Drawing) |
73 | { |
74 | |
76a67e8a |
75 | // Do not unref here, Drawing_t destroyed by it's widget. |
76 | //g_object_unref( G_OBJECT(Drawing->Drawing_Area_V)); |
f0d936c0 |
77 | |
78 | g_free(Drawing); |
79 | } |
80 | |
76a67e8a |
81 | GtkWidget *Drawing_getWidget(Drawing_t *Drawing) |
82 | { |
83 | return Drawing->Drawing_Area_V; |
84 | } |
85 | |
f0d936c0 |
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 | */ |
fa2c4dbe |
92 | void convert_pixels_to_time( |
93 | Drawing_t *Drawing, |
94 | guint x, |
95 | LttTime *window_time_begin, |
96 | LttTime *window_time_end, |
76a67e8a |
97 | LttTime *time) |
f0d936c0 |
98 | { |
fa2c4dbe |
99 | LttTime window_time_interval; |
f0d936c0 |
100 | |
76a67e8a |
101 | TimeSub(window_time_interval, *window_time_end, *window_time_begin); |
f0d936c0 |
102 | |
103 | |
fa2c4dbe |
104 | TimeMul(*time, window_time_interval, |
105 | (x/(float)Drawing->width)); |
76a67e8a |
106 | TimeAdd(*time, *window_time_begin, *time); |
f0d936c0 |
107 | |
fa2c4dbe |
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, |
76a67e8a |
117 | guint *x) |
fa2c4dbe |
118 | { |
119 | LttTime window_time_interval; |
76a67e8a |
120 | float interval_float, time_float; |
fa2c4dbe |
121 | |
122 | TimeSub(window_time_interval, window_time_end, window_time_begin); |
123 | |
76a67e8a |
124 | TimeSub(time, time, window_time_begin); |
fa2c4dbe |
125 | |
76a67e8a |
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); |
f0d936c0 |
132 | |
133 | } |
134 | |
fa2c4dbe |
135 | |
136 | |
76a67e8a |
137 | void Drawing_Resize(Drawing_t *Drawing, guint h, guint w) |
f0d936c0 |
138 | { |
f0d936c0 |
139 | Drawing->height = h ; |
76a67e8a |
140 | Drawing->width = w ; |
f0d936c0 |
141 | |
76a67e8a |
142 | gtk_widget_set_size_request ( Drawing->Drawing_Area_V, |
143 | Drawing->width, |
f0d936c0 |
144 | Drawing->height); |
145 | |
146 | |
147 | } |