1 #include "awindowgui.h"
4 #include "cwindowgui.h"
6 #include "edlsession.h"
8 #include "levelwindowgui.h"
10 #include "localsession.h"
12 #include "mainsession.h"
14 #include "meterpanel.h"
15 #include "mwindowgui.h"
17 #include "overlayframe.h"
19 #include "playtransport.h"
20 #include "recordgui.h"
21 #include "recordmonitor.h"
22 #include "resourcepixmap.h"
23 #include "statusbar.h"
26 #include "trackcanvas.h"
28 #include "vwindowgui.h"
43 theme_title = DEFAULT_THEME;
48 BC_WindowBase::get_resources()->bg_color = BLOND;
49 BC_WindowBase::get_resources()->button_up = 0xffc000;
50 BC_WindowBase::get_resources()->button_highlighted = 0xffe000;
51 BC_WindowBase::get_resources()->recursive_resizing = 0;
64 #include "data/about_png.h"
65 about_bg = new VFrame(about_png);
66 #include "data/microsoft_credit_png.h"
67 about_microsoft = new VFrame(microsoft_credit_png);
77 // Need to delete everything here
82 aspect_ratios.remove_all_objects();
83 frame_rates.remove_all_objects();
84 frame_sizes.remove_all_objects();
85 sample_rates.remove_all_objects();
86 zoom_values.remove_all_objects();
89 void Theme::flush_images()
91 if(data_buffer) delete [] data_buffer;
92 if(contents_buffer) delete [] contents_buffer;
95 contents.remove_all();
98 void Theme::initialize()
100 // Force to use local data for images
101 extern unsigned char _binary_theme_data_start[];
102 set_data(_binary_theme_data_start);
104 // Set images which weren't set by subclass
105 new_image("mode_add", "mode_add.png");
106 new_image("mode_divide", "mode_divide.png");
107 new_image("mode_multiply", "mode_multiply.png");
108 new_image("mode_normal", "mode_normal.png");
109 new_image("mode_replace", "mode_replace.png");
110 new_image("mode_subtract", "mode_subtract.png");
114 // unsigned char* Theme::get_image(char *title)
119 // FILE *fd = fopen(path, "r");
123 // fprintf(stderr, "Theme::get_image: %s when opening %s\n", strerror(errno), path);
125 // int data_offset, contents_offset;
128 // int contents_size;
130 // fseek(fd, -8, SEEK_END);
131 // total_bytes = ftell(fd);
132 // fread(&data_offset, 1, 4, fd);
133 // fread(&contents_offset, 1, 4, fd);
136 // fseek(fd, data_offset, SEEK_SET);
137 // data_size = contents_offset - data_offset;
138 // data_buffer = new char[data_size];
139 // fread(data_buffer, 1, data_size, fd);
141 // fseek(fd, contents_offset, SEEK_SET);
142 // contents_size = total_bytes - contents_offset;
143 // contents_buffer = new char[contents_size];
144 // fread(contents_buffer, 1, contents_size, fd);
146 // char *start_of_title = contents_buffer;
147 // for(int i = 0; i < contents_size; )
149 // if(contents_buffer[i] == 0)
151 // contents.append(start_of_title);
153 // offsets.append(*(int*)(contents_buffer + i));
155 // start_of_title = contents_buffer + i;
163 // if(last_image && !strcasecmp(last_image, title))
165 // return (unsigned char*)(data_buffer + last_offset);
168 // for(int i = 0; i < contents.total; i++)
170 // if(!strcasecmp(contents.values[i], title))
172 // last_offset = offsets.values[i];
173 // last_image = contents.values[i];
174 // return (unsigned char*)(data_buffer + offsets.values[i]);
178 // fprintf(stderr, "Theme::get_image: %s not found.\n", title);
183 void Theme::build_menus()
187 aspect_ratios.append(new BC_ListBoxItem("3:2"));
188 aspect_ratios.append(new BC_ListBoxItem("4:3"));
189 aspect_ratios.append(new BC_ListBoxItem("16:9"));
190 aspect_ratios.append(new BC_ListBoxItem("2.10:1"));
191 aspect_ratios.append(new BC_ListBoxItem("2.20:1"));
192 aspect_ratios.append(new BC_ListBoxItem("2.25:1"));
193 aspect_ratios.append(new BC_ListBoxItem("2.30:1"));
194 aspect_ratios.append(new BC_ListBoxItem("2.35:1"));
195 aspect_ratios.append(new BC_ListBoxItem("2.66:1"));
196 frame_sizes.append(new BC_ListBoxItem("160x120"));
197 frame_sizes.append(new BC_ListBoxItem("240x180"));
198 frame_sizes.append(new BC_ListBoxItem("320x240"));
199 frame_sizes.append(new BC_ListBoxItem("360x240"));
200 frame_sizes.append(new BC_ListBoxItem("400x300"));
201 frame_sizes.append(new BC_ListBoxItem("512x384"));
202 frame_sizes.append(new BC_ListBoxItem("640x480"));
203 frame_sizes.append(new BC_ListBoxItem("720x480"));
204 frame_sizes.append(new BC_ListBoxItem("720x576"));
205 frame_sizes.append(new BC_ListBoxItem("1280x720"));
206 frame_sizes.append(new BC_ListBoxItem("960x1080"));
207 frame_sizes.append(new BC_ListBoxItem("1920x1080"));
208 frame_sizes.append(new BC_ListBoxItem("1920x1088"));
209 sample_rates.append(new BC_ListBoxItem("8000"));
210 sample_rates.append(new BC_ListBoxItem("16000"));
211 sample_rates.append(new BC_ListBoxItem("22050"));
212 sample_rates.append(new BC_ListBoxItem("32000"));
213 sample_rates.append(new BC_ListBoxItem("44100"));
214 sample_rates.append(new BC_ListBoxItem("48000"));
215 sample_rates.append(new BC_ListBoxItem("96000"));
216 sample_rates.append(new BC_ListBoxItem("192000"));
217 frame_rates.append(new BC_ListBoxItem("1"));
218 frame_rates.append(new BC_ListBoxItem("5"));
219 frame_rates.append(new BC_ListBoxItem("10"));
220 frame_rates.append(new BC_ListBoxItem("12"));
221 frame_rates.append(new BC_ListBoxItem("15"));
222 frame_rates.append(new BC_ListBoxItem("23.97"));
223 frame_rates.append(new BC_ListBoxItem("24"));
224 frame_rates.append(new BC_ListBoxItem("25"));
225 frame_rates.append(new BC_ListBoxItem("29.97"));
226 frame_rates.append(new BC_ListBoxItem("30"));
227 frame_rates.append(new BC_ListBoxItem("50"));
228 frame_rates.append(new BC_ListBoxItem("59.94"));
229 frame_rates.append(new BC_ListBoxItem("60"));
230 char string[BCTEXTLEN];
231 for(int i = 1; i < 17; i++)
233 sprintf(string, "%d", (int)pow(2, i));
234 zoom_values.append(new BC_ListBoxItem(string));
239 void Theme::overlay(VFrame *dst, VFrame *src, int in_x1, int in_x2)
243 unsigned char **in_rows;
244 unsigned char **out_rows;
248 w = MIN(src->get_w(), dst->get_w());
249 h = MIN(dst->get_h(), src->get_h());
256 h = MIN(dst->get_h(), src->get_h());
258 in_rows = src->get_rows();
259 out_rows = dst->get_rows();
261 switch(src->get_color_model())
264 switch(dst->get_color_model())
267 for(int i = 0; i < h; i++)
269 unsigned char *in_row = in_rows[i] + in_x1 * 4;
270 unsigned char *out_row = out_rows[i];
271 for(int j = 0; j < w; j++)
273 int opacity = in_row[3];
274 int transparency = 0xff - opacity;
275 out_row[0] = (in_row[0] * opacity + out_row[0] * transparency) / 0xff;
276 out_row[1] = (in_row[1] * opacity + out_row[1] * transparency) / 0xff;
277 out_row[2] = (in_row[2] * opacity + out_row[2] * transparency) / 0xff;
278 out_row[3] = MAX(in_row[3], out_row[3]);
285 for(int i = 0; i < h; i++)
287 unsigned char *in_row = in_rows[i] + in_x1 * 4;
288 unsigned char *out_row = out_rows[i];
289 for(int j = 0; j < w; j++)
291 int opacity = in_row[3];
292 int transparency = 0xff - opacity;
293 out_row[0] = (in_row[0] * opacity + out_row[0] * transparency) / 0xff;
294 out_row[1] = (in_row[1] * opacity + out_row[1] * transparency) / 0xff;
295 out_row[2] = (in_row[2] * opacity + out_row[2] * transparency) / 0xff;
306 void Theme::build_transport(VFrame** &data,
307 unsigned char *png_overlay,
311 if(!png_overlay) return;
312 VFrame default_data(png_overlay);
313 data = new VFrame*[3];
314 data[0] = new VFrame(0, default_data.get_w(), default_data.get_h(), BC_RGBA8888);
315 data[1] = new VFrame(0, default_data.get_w(), default_data.get_h(), BC_RGBA8888);
316 data[2] = new VFrame(0, default_data.get_w(), default_data.get_h(), BC_RGBA8888);
317 data[0]->clear_frame();
318 data[1]->clear_frame();
319 data[2]->clear_frame();
321 for(int i = 0; i < 3; i++)
325 if(!bg_data[i]) break;
331 in_x2 = default_data.get_w();
335 in_x1 = (int)(bg_data[i]->get_w() * 0.33);
336 in_x2 = in_x1 + default_data.get_w();
340 in_x1 = bg_data[i]->get_w() - default_data.get_w();
341 in_x2 = in_x1 + default_data.get_w();
362 void Theme::build_patches(VFrame** &data,
363 unsigned char *png_overlay,
367 if(!png_overlay || !bg_data) return;
368 VFrame default_data(png_overlay);
369 data = new VFrame*[5];
370 data[0] = new VFrame(0, default_data.get_w(), default_data.get_h(), BC_RGBA8888);
371 data[1] = new VFrame(0, default_data.get_w(), default_data.get_h(), BC_RGBA8888);
372 data[2] = new VFrame(0, default_data.get_w(), default_data.get_h(), BC_RGBA8888);
373 data[3] = new VFrame(0, default_data.get_w(), default_data.get_h(), BC_RGBA8888);
374 data[4] = new VFrame(0, default_data.get_w(), default_data.get_h(), BC_RGBA8888);
376 for(int i = 0; i < 5; i++)
385 in_x2 = default_data.get_w();
389 in_x1 = (int)(bg_data[i]->get_w() * 0.33);
390 in_x2 = in_x1 + default_data.get_w();
394 in_x1 = bg_data[i]->get_w() - default_data.get_w();
395 in_x2 = in_x1 + default_data.get_w();
413 void Theme::build_button(VFrame** &data,
414 unsigned char *png_overlay,
419 if(!png_overlay) return;
420 VFrame default_data(png_overlay);
422 if(!up_vframe || !hi_vframe || !dn_vframe) return;
423 data = new VFrame*[3];
424 data[0] = new VFrame(0, default_data.get_w(), default_data.get_h(), BC_RGBA8888);
425 data[1] = new VFrame(0, default_data.get_w(), default_data.get_h(), BC_RGBA8888);
426 data[2] = new VFrame(0, default_data.get_w(), default_data.get_h(), BC_RGBA8888);
427 data[0]->copy_from(up_vframe);
428 data[1]->copy_from(hi_vframe);
429 data[2]->copy_from(dn_vframe);
430 for(int i = 0; i < 3; i++)
435 void Theme::build_toggle(VFrame** &data,
436 unsigned char *png_overlay,
439 VFrame *checked_vframe,
441 VFrame *checkedhi_vframe)
448 !checkedhi_vframe) return;
449 VFrame default_data(png_overlay);
450 data = new VFrame*[5];
451 data[0] = new VFrame(0, default_data.get_w(), default_data.get_h(), BC_RGBA8888);
452 data[1] = new VFrame(0, default_data.get_w(), default_data.get_h(), BC_RGBA8888);
453 data[2] = new VFrame(0, default_data.get_w(), default_data.get_h(), BC_RGBA8888);
454 data[3] = new VFrame(0, default_data.get_w(), default_data.get_h(), BC_RGBA8888);
455 data[4] = new VFrame(0, default_data.get_w(), default_data.get_h(), BC_RGBA8888);
456 data[0]->copy_from(up_vframe);
457 data[1]->copy_from(hi_vframe);
458 data[2]->copy_from(checked_vframe);
459 data[3]->copy_from(dn_vframe);
460 data[4]->copy_from(checkedhi_vframe);
461 for(int i = 0; i < 5; i++)
466 #define TIMEBAR_HEIGHT 10
467 #define PATCHBAY_W 145
471 void Theme::get_mwindow_sizes(MWindowGUI *gui, int w, int h)
475 void Theme::draw_mwindow_bg(MWindowGUI *gui)
482 void Theme::draw_awindow_bg(AWindowGUI *gui)
484 gui->clear_box(0, 0, mwindow->session->awindow_w, mwindow->session->awindow_h);
488 void Theme::draw_vwindow_bg(VWindowGUI *gui)
492 // mwindow->session->vwindow_w,
493 // mwindow->session->vwindow_h);
495 // gui->draw_3segmenth(vtimebar_x,
504 void Theme::draw_cwindow_bg(CWindowGUI *gui)
506 gui->clear_box(0, 0, mwindow->session->cwindow_w, mwindow->session->cwindow_h);
510 void Theme::draw_lwindow_bg(LevelWindowGUI *gui)
512 gui->clear_box(0, 0, mwindow->session->lwindow_w, mwindow->session->lwindow_h);
517 void Theme::draw_rmonitor_bg(RecordMonitorGUI *gui)
519 gui->clear_box(0, 0, mwindow->session->rmonitor_w, mwindow->session->rmonitor_h);
524 void Theme::draw_rwindow_bg(RecordGUI *gui)
526 printf("Theme::draw_rwindow_bg 1\n");
527 gui->clear_box(0, 0, mwindow->session->rwindow_w, mwindow->session->rwindow_h);
531 void Theme::draw_resource_bg(TrackCanvas *canvas,
532 ResourcePixmap *pixmap,
543 switch(mwindow->edl->local_session->zoom_track)
545 case 1024: image = resource1024_bg_data; break;
546 case 512: image = resource512_bg_data; break;
547 case 256: image = resource256_bg_data; break;
548 case 128: image = resource128_bg_data; break;
549 case 64: image = resource64_bg_data; break;
551 case 32: image = resource32_bg_data; break;
554 canvas->draw_3segmenth(x1,
563 void Theme::get_vwindow_sizes(VWindowGUI *gui)
567 void Theme::get_cwindow_sizes(CWindowGUI *gui, int cwindow_controls)
571 void Theme::get_awindow_sizes(AWindowGUI *gui)
576 // afolders_y = deletedisk_data[0]->get_h();
578 afolders_w = mwindow->session->afolders_w;
579 afolders_h = mwindow->session->awindow_h - afolders_y;
580 adivider_x = afolders_x + afolders_w;
583 adivider_h = afolders_h;
584 alist_x = afolders_x + afolders_w + 5;
585 alist_y = afolders_y;
586 alist_w = mwindow->session->awindow_w - alist_x;
587 alist_h = afolders_h;
590 void Theme::get_rmonitor_sizes(int do_audio,
602 rmonitor_canvas_y = 30;
608 rmonitor_canvas_y = 0;
617 rmonitor_channel_x = x;
618 rmonitor_channel_y = 5;
620 rmonitor_canvas_y = 35;
626 rmonitor_interlace_x = x;
627 rmonitor_interlace_y = y;
633 rmonitor_meter_x = mwindow->session->rmonitor_w - MeterPanel::get_meters_width(mwindow->edl->session->audio_channels, 1);
634 rmonitor_meter_y = 40;
635 rmonitor_meter_h = mwindow->session->rmonitor_h - 10 - rmonitor_meter_y;
639 rmonitor_meter_x = mwindow->session->rmonitor_w;
642 rmonitor_canvas_x = 0;
643 rmonitor_canvas_w = rmonitor_meter_x - rmonitor_canvas_x;
644 if(do_audio) rmonitor_canvas_w -= 10;
645 rmonitor_canvas_h = mwindow->session->rmonitor_h - rmonitor_canvas_y;
648 void Theme::get_recordgui_sizes(RecordGUI *gui, int w, int h)
650 recordgui_status_x = 10;
651 recordgui_status_y = 10;
652 recordgui_status_x2 = 150;
653 recordgui_batch_x = 310;
654 recordgui_batch_y = 10;
655 recordgui_batchcaption_x = recordgui_batch_x + 110;
658 recordgui_transport_x = recordgui_batch_x;
659 recordgui_transport_y = recordgui_batch_y + 150;
661 recordgui_buttons_x = recordgui_batch_x - 50;
662 recordgui_buttons_y = recordgui_transport_y + 40;
663 recordgui_options_x = recordgui_buttons_x;
664 recordgui_options_y = recordgui_buttons_y + 40;
666 recordgui_batches_x = 10;
667 recordgui_batches_y = 270;
668 recordgui_batches_w = w - 20;
669 recordgui_batches_h = h - recordgui_batches_y - 90;
670 recordgui_loadmode_x = w / 2 - loadmode_w / 2;
671 recordgui_loadmode_y = h - 85;
673 recordgui_controls_x = 10;
674 recordgui_controls_y = h - 40;
677 void Theme::get_batchrender_sizes(BatchRenderGUI *gui,
682 batchrender_x2 = 300;
683 batchrender_x3 = 400;
686 void Theme::get_plugindialog_sizes()
689 plugindialog_new_x = x;
690 plugindialog_new_y = y;
691 plugindialog_shared_x = mwindow->session->plugindialog_w / 3;
692 plugindialog_shared_y = y;
693 plugindialog_module_x = mwindow->session->plugindialog_w * 2 / 3;
694 plugindialog_module_y = y;
696 plugindialog_new_w = plugindialog_shared_x - plugindialog_new_x - 10;
697 plugindialog_new_h = mwindow->session->plugindialog_h - 110;
698 plugindialog_shared_w = plugindialog_module_x - plugindialog_shared_x - 10;
699 plugindialog_shared_h = mwindow->session->plugindialog_h - 110;
700 plugindialog_module_w = mwindow->session->plugindialog_w - plugindialog_module_x - 10;
701 plugindialog_module_h = mwindow->session->plugindialog_h - 110;
703 plugindialog_newattach_x = plugindialog_new_x + 20;
704 plugindialog_newattach_y = plugindialog_new_y + plugindialog_new_h + 10;
705 plugindialog_sharedattach_x = plugindialog_shared_x + 20;
706 plugindialog_sharedattach_y = plugindialog_shared_y + plugindialog_shared_h + 10;
707 plugindialog_moduleattach_x = plugindialog_module_x + 20;
708 plugindialog_moduleattach_y = plugindialog_module_y + plugindialog_module_h + 10;
711 void Theme::get_menueffect_sizes(int use_list)
715 menueffect_list_x = 10;
716 menueffect_list_y = 10;
717 menueffect_list_w = mwindow->session->menueffect_w - 400;
718 menueffect_list_h = mwindow->session->menueffect_h - 70;
722 menueffect_list_x = 0;
723 menueffect_list_y = 10;
724 menueffect_list_w = 0;
725 menueffect_list_h = 0;
728 menueffect_file_x = menueffect_list_x + menueffect_list_w + 10;
729 menueffect_file_y = 10;
731 menueffect_tools_x = menueffect_file_x;
732 menueffect_tools_y = menueffect_file_y + 20;
735 void Theme::get_preferences_sizes()
739 void Theme::draw_preferences_bg(PreferencesWindow *gui)
743 void Theme::get_new_sizes(NewWindow *gui)
747 void Theme::draw_new_bg(NewWindow *gui)
751 void Theme::draw_setformat_bg(SetFormatWindow *window)