6 #include "../src/mark.h"
11 #include "../src/settings.h"
12 #include "../src/dir_seperator.h"
14 #include "../src/opticalflow.h"
17 struct frame_list *frame_list = NULL;
19 /* currently loaded image */
20 GdkPixbuf *timeline_pixbuf = NULL;
21 int timeline_selected = 0;
22 int timeline_frames = 0;
23 int timeline_scale = 10;
24 int timeline_width, timeline_height = 30;
26 static void draw_timeline_frame(int frame)
35 if (frame == timeline_selected) {
39 if (frame_list && frame_list[frame].marked) {
48 if (frame_list && frame_list[frame].marked) {
55 data = gdk_pixbuf_get_pixels(timeline_pixbuf);
56 rs = gdk_pixbuf_get_rowstride(timeline_pixbuf);
58 for (i = 0; i < timeline_height; i++) {
59 data[rs*i + frame*timeline_scale*3 + 0] = 0;
60 data[rs*i + frame*timeline_scale*3 + 1] = 0;
61 data[rs*i + frame*timeline_scale*3 + 2] = 0;
62 for (j = 1; j < timeline_scale; j++) {
63 data[rs*i + (frame*timeline_scale+j)*3 + 0] = r;
64 data[rs*i + (frame*timeline_scale+j)*3 + 1] = g;
65 data[rs*i + (frame*timeline_scale+j)*3 + 2] = b;
68 if (frame_list && frame_list[frame].keyframe) {
72 for (i = 0; i < timeline_scale/2; i++) {
73 for (j = i + 1; j < timeline_scale - i; j++) {
74 data[rs*i + (frame*timeline_scale+j)*3 + 0] = r;
75 data[rs*i + (frame*timeline_scale+j)*3 + 1] = g;
76 data[rs*i + (frame*timeline_scale+j)*3 + 2] = b;
78 data[rs*(timeline_height-1-i) + (frame*timeline_scale+j)*3 + 0] = r;
79 data[rs*(timeline_height-1-i) + (frame*timeline_scale+j)*3 + 1] = g;
80 data[rs*(timeline_height-1-i) + (frame*timeline_scale+j)*3 + 2] = b;
86 /* load directory and create pixbuf */
87 void create_timeline(const char *filename)
91 char temp[256], name[256], suffix[256];
98 while ((q = strchr(p, '.')))
101 printerror("File '%s' does not have a 'prefix.suffix' format\n", filename);
104 strcpy(suffix, p - 1);
107 if ((strlen(filename) < 5 || !!strcmp(suffix, ".ppm"))) {
108 printerror("File '%s' does not have '.ppm' suffix\n", filename);
118 p = filename + strlen(filename) - strlen(suffix);
119 while (p != filename) {
121 if (*p < '0' || *p > '9') {
126 if (*p < '0' || *p > '9') {
128 // printf("single file\n");
129 frame_list = malloc(sizeof(struct frame_list));
130 memset(frame_list, 0, sizeof(struct frame_list));
131 strcpy(frame_list[0].filename, filename);
134 /* calculate image file name */
135 int digits = filename + strlen(filename) - strlen(suffix) - p;
136 int start, count = 0;
137 strncpy(temp, p, digits);
140 // printf("count digits=%s num=%d start=%d\n", temp, digits, start);
141 strncpy(temp, filename, p - filename);
142 temp[p - filename] = '\0';
143 // printf("prefix=%s\n", temp);
144 sprintf(strchr(temp, '\0'), "%%0%dd%s", digits, suffix);
145 // printf("complete=%s\n", temp);
146 /* look back for index */
148 sprintf(name, temp, start - 1);
149 fp = fopen(name, "r");
155 /* count forward index */
156 for (i = start; ; i++) {
157 sprintf(name, temp, start + count);
158 fp = fopen(name, "r");
166 frame_list = malloc(sizeof(struct frame_list) * count);
167 memset(frame_list, 0, sizeof(struct frame_list) * count);
168 for (i = 0; i < count; i++) {
169 sprintf(frame_list[i].filename, temp, start + i);
171 timeline_frames = count;
173 /* get marked frames */
174 for (i = 0; i < timeline_frames; i++) {
175 sprintf(temp, "%s_marked", frame_list[i].filename);
176 frame_list[i].marked = 0;
177 fp = fopen(temp, "r");
181 frame_list[i].marked = 1;
187 if (timeline_frames == 0)
190 if (timeline_frames > 1)
191 gtk_widget_show(timeline_scroll);
193 timeline_width = timeline_frames * timeline_scale;
195 timeline_pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB, FALSE, 8, timeline_width, timeline_height);
197 for (i = 0; i < timeline_frames; i++)
198 draw_timeline_frame(i);
200 gtk_widget_set_size_request(timeline_drawing_area, timeline_width, timeline_height);
203 /* disable optical flow and set default */
210 load_settings(frame_list[0].filename);
211 load_palette(frame_list[0].filename);
212 for (i = 0; i < 255; i++)
218 void destroy_timeline(void)
220 gtk_widget_hide(timeline_scroll);
222 if (!timeline_pixbuf)
225 g_object_unref(timeline_pixbuf);
226 timeline_pixbuf = NULL;
231 timeline_selected = 0;
234 /* draw (area) of pixbuf */
235 void draw_timeline(int x, int y, int w, int h)
237 GdkDrawable *draw = gtk_widget_get_window(timeline_drawing_area);
239 if (!timeline_pixbuf)
244 if (x >= timeline_width)
248 if (y >= timeline_height)
250 if (x + w > timeline_width)
251 w = timeline_width - x;
252 if (y + h > timeline_height)
253 h = timeline_height - y;
255 //printf("%d %d %d %d\n", x, y, w, h);
257 if (!timeline_pixbuf)
260 gdk_draw_pixbuf(draw, NULL, timeline_pixbuf, x, y, x, y, w, h, GDK_RGB_DITHER_NONE, 0, 0);
263 int timeline_select_and_save(int old_frame, int new_frame)
266 /* no frame loaded, no list */
267 if (!frame_list|| !img_pixbuf)
271 if (anything_modified) {
272 if (img_mark_buffer) {
273 if (save_marked(img_mark_buffer, img_width, img_height, frame_list[old_frame].filename) > 0)
274 frame_list[old_frame].marked = 1;
276 frame_list[old_frame].marked = 0;
280 save_palette(frame_list[0].filename);
281 if (timeline_frames > 1)
282 save_settings(frame_list[0].filename);
287 timeline_selected = new_frame;
289 create_image(frame_list[new_frame].filename, 0);
291 if (flowview && flow_enable && img_grey_buffer)
293 (new_frame > 0) ? frame_list[new_frame - 1].filename : NULL,
294 (new_frame < timeline_frames - 1) ? frame_list[new_frame + 1].filename : NULL,
296 img_width, img_height,
302 if (timeline_frames > 1) {
303 GdkDrawable *draw = gtk_widget_get_window(timeline_drawing_area);
304 draw_timeline_frame(old_frame);
305 draw_timeline_frame(new_frame);
306 gdk_draw_pixbuf(draw, NULL, timeline_pixbuf, 0, 0, 0, 0, timeline_width, timeline_height, GDK_RGB_DITHER_NONE, 0, 0);
309 /* adjust position of timeline scroll */
311 GtkAdjustment *adjustment;
313 x = new_frame * timeline_scale;
314 w = timeline_scroll->allocation.width - timeline_scale - 4;
315 adjustment = gtk_scrolled_window_get_hadjustment(GTK_SCROLLED_WINDOW(timeline_scroll));
316 pos = gtk_adjustment_get_value(adjustment);
318 gtk_adjustment_set_value(adjustment, x);
319 gtk_scrolled_window_set_hadjustment(GTK_SCROLLED_WINDOW(timeline_scroll), adjustment);
322 gtk_adjustment_set_value(adjustment, pos + x + - (pos + w));
323 gtk_scrolled_window_set_hadjustment(GTK_SCROLLED_WINDOW(timeline_scroll), adjustment);
329 /* while pointing at timeline, show current frame that we point to */
330 int timeline_point(int x, int y)
332 int frame = x / timeline_scale;
334 if (x < 0 || y < 0 || frame < 0 || frame >= timeline_frames) {
335 timeline_show_name(timeline_selected);
339 timeline_show_name(frame);
343 void timeline_show_name(int frame)
351 if (frame != timeline_selected) {
352 sprintf(text, "Click to select frame %d", frame);
354 p = frame_list[frame].filename;
355 while (strchr(p, DIR_SEPERATOR))
356 p = strchr(p, DIR_SEPERATOR) + 1;
357 if (timeline_frames > 1)
358 sprintf(text, "Frame %d: %s", frame, p);
361 if (img_scale_x != 16)
362 sprintf(strchr(text, '\0'), " (%d%%)", img_scale_x*100/16);
364 gtk_label_set_text(img_label, text);
367 int timeline_clicked(int x, int y)
369 int old_frame = timeline_selected;
370 int new_frame = x / timeline_scale;
374 if (new_frame >= timeline_frames)
377 if (old_frame == new_frame)
380 return timeline_select_and_save(old_frame, new_frame);
384 /* get filename of first grey image directory */
385 static char *get_filename(const char *filename)
387 static char name[256];
390 strcpy(name, filename);
391 /* remove until DIR_SEPERATOR */
393 if (name[strlen(name) - 1] == DIR_SEPERATOR)
395 name[strlen(name) - 1] = '\0';
397 /* add palette name */
398 strcat(name, "sequence");
403 int save_sequence(void)
412 if (timeline_frames <= 1)
415 name = get_filename(frame_list[0].filename);
416 // printf("save sequence '%s'\n", name);
417 fp = fopen(name, "w");
419 printf("failed to save sequence '%s'\n", name);
422 for (i = 0; i < timeline_frames; i++) {
423 p = frame_list[i].filename;
424 while (p && strchr(p, DIR_SEPERATOR))
425 p = strchr(p, DIR_SEPERATOR) + 1;
426 fprintf(fp, "\"%s\"%s\n", p, (frame_list[i].keyframe) ? " keyframe" : "");
433 int load_sequence(void)
444 if (timeline_frames <= 1)
447 name = get_filename(frame_list[0].filename);
448 // printf("load sequence '%s'\n", name);
449 fp = fopen(name, "r");
451 printf("failed to load sequence '%s'\n", name);
454 for (i = 0; i < timeline_frames; i++) {
455 rc = fgets(buffer, sizeof(buffer), fp);
458 p = strchr(buffer + 1, '\"');
462 if (strstr(p, "keyframe"))
463 frame_list[i].keyframe = 1;
465 frame_list[i].keyframe = 0;
472 void toggle_keyframe(void)
474 if (!frame_list|| !img_pixbuf)
477 anything_modified = 1;
479 GdkDrawable *draw = gtk_widget_get_window(timeline_drawing_area);
481 frame_list[timeline_selected].keyframe = 1 - frame_list[timeline_selected].keyframe;
482 draw_timeline_frame(timeline_selected);
483 gdk_draw_pixbuf(draw, NULL, timeline_pixbuf, 0, 0, 0, 0, timeline_width, timeline_height, GDK_RGB_DITHER_NONE, 0, 0);