6 #include "../src/mark.h"
11 #include "../src/dir_seperator.h"
13 #include "../src/opticalflow.h"
16 struct frame_list *frame_list = NULL;
18 /* currently loaded image */
19 GdkPixbuf *timeline_pixbuf = NULL;
20 int timeline_selected = 0;
21 int timeline_frames = 0;
22 int timeline_scale = 10;
23 int timeline_width, timeline_height = 30;
25 static void draw_timeline_frame(int frame)
34 if (frame == timeline_selected) {
38 if (frame_list && frame_list[frame].marked) {
47 if (frame_list && frame_list[frame].marked) {
54 data = gdk_pixbuf_get_pixels(timeline_pixbuf);
55 rs = gdk_pixbuf_get_rowstride(timeline_pixbuf);
57 for (i = 0; i < timeline_height; i++) {
58 data[rs*i + frame*timeline_scale*3 + 0] = 0;
59 data[rs*i + frame*timeline_scale*3 + 1] = 0;
60 data[rs*i + frame*timeline_scale*3 + 2] = 0;
61 for (j = 1; j < timeline_scale; j++) {
62 data[rs*i + (frame*timeline_scale+j)*3 + 0] = r;
63 data[rs*i + (frame*timeline_scale+j)*3 + 1] = g;
64 data[rs*i + (frame*timeline_scale+j)*3 + 2] = b;
67 if (frame_list && frame_list[frame].keyframe) {
71 for (i = 0; i < timeline_scale/2; i++) {
72 for (j = i + 1; j < timeline_scale - i; j++) {
73 data[rs*i + (frame*timeline_scale+j)*3 + 0] = r;
74 data[rs*i + (frame*timeline_scale+j)*3 + 1] = g;
75 data[rs*i + (frame*timeline_scale+j)*3 + 2] = b;
77 data[rs*(timeline_height-1-i) + (frame*timeline_scale+j)*3 + 0] = r;
78 data[rs*(timeline_height-1-i) + (frame*timeline_scale+j)*3 + 1] = g;
79 data[rs*(timeline_height-1-i) + (frame*timeline_scale+j)*3 + 2] = b;
85 /* load directory and create pixbuf */
86 void create_timeline(const char *filename)
90 char temp[256], name[256], suffix[256];
97 while ((q = strchr(p, '.')))
100 printerror("File '%s' does not have a 'prefix.suffix' format\n", filename);
103 strcpy(suffix, p - 1);
106 if ((strlen(filename) < 5 || !!strcmp(suffix, ".ppm"))) {
107 printerror("File '%s' does not have '.ppm' suffix\n", filename);
117 p = filename + strlen(filename) - strlen(suffix);
118 while (p != filename) {
120 if (*p < '0' || *p > '9') {
125 if (*p < '0' || *p > '9') {
127 // printf("single file\n");
128 frame_list = malloc(sizeof(struct frame_list));
129 memset(frame_list, 0, sizeof(struct frame_list));
130 strcpy(frame_list[0].filename, filename);
133 /* calculate image file name */
134 int digits = filename + strlen(filename) - strlen(suffix) - p;
135 int start, count = 0;
136 strncpy(temp, p, digits);
139 // printf("count digits=%s num=%d start=%d\n", temp, digits, start);
140 strncpy(temp, filename, p - filename);
141 temp[p - filename] = '\0';
142 // printf("prefix=%s\n", temp);
143 sprintf(strchr(temp, '\0'), "%%0%dd%s", digits, suffix);
144 // printf("complete=%s\n", temp);
145 /* look back for index */
147 sprintf(name, temp, start - 1);
148 fp = fopen(name, "r");
154 /* count forward index */
155 for (i = start; ; i++) {
156 sprintf(name, temp, start + count);
157 fp = fopen(name, "r");
165 frame_list = malloc(sizeof(struct frame_list) * count);
166 memset(frame_list, 0, sizeof(struct frame_list) * count);
167 for (i = 0; i < count; i++) {
168 sprintf(frame_list[i].filename, temp, start + i);
170 timeline_frames = count;
172 /* get marked frames */
173 for (i = 0; i < timeline_frames; i++) {
174 sprintf(temp, "%s_marked", frame_list[i].filename);
175 frame_list[i].marked = 0;
176 fp = fopen(temp, "r");
180 frame_list[i].marked = 1;
186 if (timeline_frames == 0)
189 if (timeline_frames > 1)
190 gtk_widget_show(timeline_scroll);
192 timeline_width = timeline_frames * timeline_scale;
194 timeline_pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB, FALSE, 8, timeline_width, timeline_height);
196 for (i = 0; i < timeline_frames; i++)
197 draw_timeline_frame(i);
199 gtk_widget_set_size_request(timeline_drawing_area, timeline_width, timeline_height);
202 /* disable optical flow and set default */
209 load_palette(frame_list[0].filename);
210 for (i = 0; i < 255; i++)
213 load_flow(frame_list[0].filename);
219 void destroy_timeline(void)
221 gtk_widget_hide(timeline_scroll);
223 if (!timeline_pixbuf)
226 g_object_unref(timeline_pixbuf);
227 timeline_pixbuf = NULL;
232 timeline_selected = 0;
235 /* draw (area) of pixbuf */
236 void draw_timeline(int x, int y, int w, int h)
238 GdkDrawable *draw = gtk_widget_get_window(timeline_drawing_area);
240 if (!timeline_pixbuf)
245 if (x >= timeline_width)
249 if (y >= timeline_height)
251 if (x + w > timeline_width)
252 w = timeline_width - x;
253 if (y + h > timeline_height)
254 h = timeline_height - y;
256 //printf("%d %d %d %d\n", x, y, w, h);
258 if (!timeline_pixbuf)
261 gdk_draw_pixbuf(draw, NULL, timeline_pixbuf, x, y, x, y, w, h, GDK_RGB_DITHER_NONE, 0, 0);
264 int timeline_select_and_save(int old_frame, int new_frame)
267 /* no frame loaded, no list */
268 if (!frame_list|| !img_pixbuf)
272 if (anything_modified) {
273 if (img_mark_buffer) {
274 if (save_marked(img_mark_buffer, img_width, img_height, frame_list[old_frame].filename) > 0)
275 frame_list[old_frame].marked = 1;
277 frame_list[old_frame].marked = 0;
281 save_palette(frame_list[0].filename);
283 if (timeline_frames > 1)
284 save_flow(frame_list[0].filename);
290 timeline_selected = new_frame;
292 create_image(frame_list[new_frame].filename);
294 if (flowview && flow_enable && img_grey_buffer)
296 (new_frame > 0) ? frame_list[new_frame - 1].filename : NULL,
297 (new_frame < timeline_frames - 1) ? frame_list[new_frame + 1].filename : NULL,
299 img_width, img_height,
305 if (timeline_frames > 1) {
306 GdkDrawable *draw = gtk_widget_get_window(timeline_drawing_area);
307 draw_timeline_frame(old_frame);
308 draw_timeline_frame(new_frame);
309 gdk_draw_pixbuf(draw, NULL, timeline_pixbuf, 0, 0, 0, 0, timeline_width, timeline_height, GDK_RGB_DITHER_NONE, 0, 0);
312 /* adjust position of timeline scroll */
314 GtkAdjustment *adjustment;
316 x = new_frame * timeline_scale;
317 w = timeline_scroll->allocation.width - timeline_scale - 4;
318 adjustment = gtk_scrolled_window_get_hadjustment(GTK_SCROLLED_WINDOW(timeline_scroll));
319 pos = gtk_adjustment_get_value(adjustment);
321 gtk_adjustment_set_value(adjustment, x);
322 gtk_scrolled_window_set_hadjustment(GTK_SCROLLED_WINDOW(timeline_scroll), adjustment);
325 gtk_adjustment_set_value(adjustment, pos + x + - (pos + w));
326 gtk_scrolled_window_set_hadjustment(GTK_SCROLLED_WINDOW(timeline_scroll), adjustment);
332 /* while pointing at timeline, show current frame that we point to */
333 int timeline_point(int x, int y)
335 int frame = x / timeline_scale;
337 if (x < 0 || y < 0 || frame < 0 || frame >= timeline_frames) {
338 timeline_show_name(timeline_selected);
342 timeline_show_name(frame);
346 void timeline_show_name(int frame)
354 if (frame != timeline_selected) {
355 sprintf(text, "Click to select frame %d", frame);
357 p = frame_list[frame].filename;
358 while (strchr(p, DIR_SEPERATOR))
359 p = strchr(p, DIR_SEPERATOR) + 1;
360 if (timeline_frames > 1)
361 sprintf(text, "Frame %d: %s", frame, p);
364 if (img_scale_x != 16)
365 sprintf(strchr(text, '\0'), " (%d%%)", img_scale_x*100/16);
367 gtk_label_set_text(img_label, text);
370 int timeline_clicked(int x, int y)
372 int old_frame = timeline_selected;
373 int new_frame = x / timeline_scale;
377 if (new_frame >= timeline_frames)
380 if (old_frame == new_frame)
383 return timeline_select_and_save(old_frame, new_frame);
387 /* get filename of first grey image directory */
388 static char *get_filename(const char *filename)
390 static char name[256];
393 strcpy(name, filename);
394 /* remove until DIR_SEPERATOR */
396 if (name[strlen(name) - 1] == DIR_SEPERATOR)
398 name[strlen(name) - 1] = '\0';
400 /* add palette name */
401 strcat(name, "sequence");
406 int save_sequence(void)
415 if (timeline_frames <= 1)
418 name = get_filename(frame_list[0].filename);
419 // printf("save sequence '%s'\n", name);
420 fp = fopen(name, "w");
422 printf("failed to save sequence '%s'\n", name);
425 for (i = 0; i < timeline_frames; i++) {
426 p = frame_list[i].filename;
427 while (p && strchr(p, DIR_SEPERATOR))
428 p = strchr(p, DIR_SEPERATOR) + 1;
429 fprintf(fp, "\"%s\"%s\n", p, (frame_list[i].keyframe) ? " keyframe" : "");
436 int load_sequence(void)
447 if (timeline_frames <= 1)
450 name = get_filename(frame_list[0].filename);
451 // printf("load sequence '%s'\n", name);
452 fp = fopen(name, "r");
454 printf("failed to load sequence '%s'\n", name);
457 for (i = 0; i < timeline_frames; i++) {
458 rc = fgets(buffer, sizeof(buffer), fp);
461 p = strchr(buffer + 1, '\"');
465 if (strstr(p, "keyframe"))
466 frame_list[i].keyframe = 1;
468 frame_list[i].keyframe = 0;
475 void toggle_keyframe(void)
477 if (!frame_list|| !img_pixbuf)
480 anything_modified = 1;
482 GdkDrawable *draw = gtk_widget_get_window(timeline_drawing_area);
484 frame_list[timeline_selected].keyframe = 1 - frame_list[timeline_selected].keyframe;
485 draw_timeline_frame(timeline_selected);
486 gdk_draw_pixbuf(draw, NULL, timeline_pixbuf, 0, 0, 0, 0, timeline_width, timeline_height, GDK_RGB_DITHER_NONE, 0, 0);