4 * Copyright (C) 1997-2011 Adam Williams <broadcast at earthling dot net>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 #include "awindowgui.h"
23 #include "bcsignals.h"
26 #include "cwindowgui.h"
29 #include "edlsession.h"
30 #include "keyframegui.h"
32 #include "levelwindowgui.h"
34 #include "localsession.h"
36 #include "mainsession.h"
38 #include "meterpanel.h"
39 #include "mwindowgui.h"
41 #include "overlayframe.h"
43 #include "playtransport.h"
44 //#include "presetsgui.h"
45 #include "recordgui.h"
46 #include "recordmonitor.h"
47 #include "resourcepixmap.h"
48 #include "statusbar.h"
52 #include "trackcanvas.h"
54 #include "vwindowgui.h"
62 new VFrame(default_data.get_w(), default_data.get_h(), BC_RGBA8888)
67 window_border = xS(10);
68 widget_border = xS(5);
70 theme_title = _(DEFAULT_THEME);
72 mtransport_margin = 0;
74 control_pixels = xS(50);
75 stack_button_w = xS(32);
76 timebar_cursor_color = RED;
78 BC_WindowBase::get_resources()->bg_color = BLOND;
79 BC_WindowBase::get_resources()->button_up = 0xffc000;
80 BC_WindowBase::get_resources()->button_highlighted = 0xffe000;
81 BC_WindowBase::get_resources()->recursive_resizing = 0;
83 zero_crossing_color = 0xc03545;
84 graph_active_color = GRAPH_ACTIVE_COLOR;
85 graph_inactive_color = GRAPH_INACTIVE_COLOR;
86 graph_grid_color = GRAPH_GRID_COLOR;
87 graph_bg_color = GRAPH_BG_COLOR;
88 graph_border1_color = GRAPH_BORDER1_COLOR;
89 graph_border2_color = GRAPH_BORDER2_COLOR;
91 inout_highlight_color = GREEN;
98 clock_bg_color = BLACK;
99 clock_fg_color = GREEN;
100 assetedit_color = YELLOW;
101 const char *cp = getenv("BC_USE_COMMERCIALS");
102 use_commercials = !cp ? 0 : atoi(cp);
104 preferences_category_overlap = 0;
106 loadmode_w = xS(350);
109 #include "data/about_bg_png.h"
110 about_bg = new VFramePng(about_bg_png);
113 drag_pane_color = WHITE;
115 appendasset_data = 0;
117 asset_append_data = 0;
119 asset_index_data = 0;
121 asset_project_data = 0;
124 camerakeyframe_data = 0;
128 channel_position_data = 0;
129 delete_all_indexes_data = 0;
133 deleteproject_data = 0;
138 edithandlein_data = 0;
139 edithandleout_data = 0;
144 mask_mode_toggle = 0;
151 maskkeyframe_data = 0;
152 modekeyframe_data = 0;
162 pankeyframe_data = 0;
166 presentation_data = 0;
167 presentation_loop = 0;
168 presentation_stop = 0;
169 projectorkeyframe_data = 0;
170 redrawindex_data = 0;
179 statusbar_cancel_data = 0;
180 timebar_view_data = 0;
182 tumblepatch_data = 0;
185 vtimebar_bg_data = 0;
189 // Need to delete everything here
194 aspect_ratios.remove_all_objects();
195 frame_rates.remove_all_objects();
196 frame_sizes.remove_all_objects();
197 sample_rates.remove_all_objects();
198 zoom_values.remove_all_objects();
203 void Theme::flush_images()
207 void Theme::initialize()
209 message_normal = BLACK;
212 // Force to use local data for images
213 extern unsigned char _binary_theme_data_start[];
214 set_data(_binary_theme_data_start);
216 // Set images which weren't set by subclass
217 new_image("mode_normal", "mode_normal.png");
218 new_image("mode_add", "mode_add.png");
219 new_image("mode_subtract", "mode_subtract.png");
220 new_image("mode_multiply", "mode_multiply.png");
221 new_image("mode_divide", "mode_divide.png");
222 new_image("mode_replace", "mode_replace.png");
223 new_image("mode_max", "mode_max.png");
224 new_image("mode_min", "mode_min.png");
225 new_image("mode_darken", "mode_darken.png");
226 new_image("mode_lighten", "mode_lighten.png");
227 new_image("mode_dst", "mode_dst.png");
228 new_image("mode_dstatop", "mode_dstatop.png");
229 new_image("mode_dstin", "mode_dstin.png");
230 new_image("mode_dstout", "mode_dstout.png");
231 new_image("mode_dstover", "mode_dstover.png");
232 new_image("mode_src", "mode_src.png");
233 new_image("mode_srcatop", "mode_srcatop.png");
234 new_image("mode_srcin", "mode_srcin.png");
235 new_image("mode_srcout", "mode_srcout.png");
236 new_image("mode_srcover", "mode_srcover.png");
237 new_image("mode_and", "mode_and.png");
238 new_image("mode_or", "mode_or.png");
239 new_image("mode_xor", "mode_xor.png");
240 new_image("mode_overlay", "mode_overlay.png");
241 new_image("mode_screen", "mode_screen.png");
242 new_image("mode_burn", "mode_burn.png");
243 new_image("mode_dodge", "mode_dodge.png");
244 new_image("mode_hardlight", "mode_hardlight.png");
245 new_image("mode_softlight", "mode_softlight.png");
246 new_image("mode_difference", "mode_difference.png");
248 new_image_set("mode_popup", 3, "mode_up.png", "mode_hi.png", "mode_dn.png");
250 // Images all themes have
251 new_image("mwindow_icon", "heroine_icon.png");
252 new_image("vwindow_icon", "heroine_icon.png");
253 new_image("cwindow_icon", "heroine_icon.png");
254 new_image("awindow_icon", "heroine_icon.png");
255 new_image("record_icon", "heroine_icon.png");
256 new_image("clip_icon", "clip_icon.png");
257 new_image_set("mixpatch_data", 5, "mixpatch_up.png", "mixpatch_hi.png",
258 "mixpatch_checked.png", "mixpatch_dn.png", "mixpatch_checkedhi.png");
261 new_image("aeffect_icon", "aeffect_icon.png");
262 new_image("veffect_icon", "veffect_icon.png");
263 new_image("atransition_icon", "atransition_icon.png");
264 new_image("vtransition_icon", "atransition_icon.png");
272 void Theme::build_menus()
274 aspect_ratios.append(new BC_ListBoxItem("3:2"));
275 aspect_ratios.append(new BC_ListBoxItem("4:3"));
276 aspect_ratios.append(new BC_ListBoxItem("16:9"));
277 aspect_ratios.append(new BC_ListBoxItem("16:10"));
278 aspect_ratios.append(new BC_ListBoxItem("2.10:1"));
279 aspect_ratios.append(new BC_ListBoxItem("2.20:1"));
280 aspect_ratios.append(new BC_ListBoxItem("2.25:1"));
281 aspect_ratios.append(new BC_ListBoxItem("2.30:1"));
282 aspect_ratios.append(new BC_ListBoxItem("2.35:1"));
283 aspect_ratios.append(new BC_ListBoxItem("2.66:1"));
285 frame_sizes.append(new BC_ListBoxItem("128x96 "));
286 frame_sizes.append(new BC_ListBoxItem("160x120 "));
287 frame_sizes.append(new BC_ListBoxItem("240x160 HQVGA"));
288 frame_sizes.append(new BC_ListBoxItem("320x240 "));
289 frame_sizes.append(new BC_ListBoxItem("352x288 "));
290 frame_sizes.append(new BC_ListBoxItem("360x240 "));
291 frame_sizes.append(new BC_ListBoxItem("384x288 CIF"));
292 frame_sizes.append(new BC_ListBoxItem("400x300 qSVGA"));
293 frame_sizes.append(new BC_ListBoxItem("640x360 nHD"));
294 frame_sizes.append(new BC_ListBoxItem("640x400 "));
295 frame_sizes.append(new BC_ListBoxItem("640x480 VGA"));
296 frame_sizes.append(new BC_ListBoxItem("720x480 NTSC"));
297 frame_sizes.append(new BC_ListBoxItem("720x576 PAL"));
298 frame_sizes.append(new BC_ListBoxItem("768x432 "));
299 frame_sizes.append(new BC_ListBoxItem("800x450 "));
300 frame_sizes.append(new BC_ListBoxItem("800x600 SVGA"));
301 frame_sizes.append(new BC_ListBoxItem("896x504 "));
302 frame_sizes.append(new BC_ListBoxItem("960x540 qHD"));
303 frame_sizes.append(new BC_ListBoxItem("1024x576 "));
304 frame_sizes.append(new BC_ListBoxItem("1024x768 XGA"));
305 frame_sizes.append(new BC_ListBoxItem("1152x648 "));
306 frame_sizes.append(new BC_ListBoxItem("1152x768 "));
307 frame_sizes.append(new BC_ListBoxItem("1152x864 XGA+"));
308 frame_sizes.append(new BC_ListBoxItem("1280x720 HD"));
309 frame_sizes.append(new BC_ListBoxItem("1280x800 "));
310 frame_sizes.append(new BC_ListBoxItem("1280x1024 SXGA"));
311 frame_sizes.append(new BC_ListBoxItem("1366x768 WXGA"));
312 frame_sizes.append(new BC_ListBoxItem("1440x900 WXGA+"));
313 frame_sizes.append(new BC_ListBoxItem("1440x1080 HDV"));
314 frame_sizes.append(new BC_ListBoxItem("1600x900 HD+"));
315 frame_sizes.append(new BC_ListBoxItem("1600x1200 UXGA"));
316 frame_sizes.append(new BC_ListBoxItem("1920x1080 Full HD"));
317 frame_sizes.append(new BC_ListBoxItem("1920x1280 FHD+"));
318 frame_sizes.append(new BC_ListBoxItem("2048x1080 DCI 2K"));
319 frame_sizes.append(new BC_ListBoxItem("2048x1152 "));
320 frame_sizes.append(new BC_ListBoxItem("2048x1536 QXGA"));
321 frame_sizes.append(new BC_ListBoxItem("2160x1440 "));
322 frame_sizes.append(new BC_ListBoxItem("2304x1296 "));
323 frame_sizes.append(new BC_ListBoxItem("2560x1080 UW-FHD"));
324 frame_sizes.append(new BC_ListBoxItem("2560x1440 WQHD"));
325 frame_sizes.append(new BC_ListBoxItem("2880x1620 "));
326 frame_sizes.append(new BC_ListBoxItem("3200x1800 WQXGA+"));
327 frame_sizes.append(new BC_ListBoxItem("3440x1440 Ultra-Wide QHD"));
328 frame_sizes.append(new BC_ListBoxItem("3520x1980 "));
329 frame_sizes.append(new BC_ListBoxItem("3840x1600 UW4K"));
330 frame_sizes.append(new BC_ListBoxItem("3840x2160 4K UHD"));
331 frame_sizes.append(new BC_ListBoxItem("4096x2160 DCI 4K"));
332 frame_sizes.append(new BC_ListBoxItem("4096x2304 Full 4K UHD"));
333 frame_sizes.append(new BC_ListBoxItem("4480x2520 "));
334 frame_sizes.append(new BC_ListBoxItem("5120x2880 5K UHD"));
335 frame_sizes.append(new BC_ListBoxItem("5760x3240 "));
336 frame_sizes.append(new BC_ListBoxItem("6400x3600 "));
337 frame_sizes.append(new BC_ListBoxItem("7040x3960 "));
338 frame_sizes.append(new BC_ListBoxItem("7680x4320 8K UHD"));
340 sample_rates.append(new BC_ListBoxItem("8000"));
341 sample_rates.append(new BC_ListBoxItem("11025"));
342 sample_rates.append(new BC_ListBoxItem("16000"));
343 sample_rates.append(new BC_ListBoxItem("22050"));
344 sample_rates.append(new BC_ListBoxItem("32000"));
345 sample_rates.append(new BC_ListBoxItem("44100"));
346 sample_rates.append(new BC_ListBoxItem("48000"));
347 sample_rates.append(new BC_ListBoxItem("88000"));
348 sample_rates.append(new BC_ListBoxItem("96000"));
349 sample_rates.append(new BC_ListBoxItem("176400"));
350 sample_rates.append(new BC_ListBoxItem("192000"));
352 frame_rates.append(new BC_ListBoxItem("0.25"));
353 frame_rates.append(new BC_ListBoxItem("1"));
354 frame_rates.append(new BC_ListBoxItem("5"));
355 frame_rates.append(new BC_ListBoxItem("10"));
356 frame_rates.append(new BC_ListBoxItem("12"));
357 frame_rates.append(new BC_ListBoxItem("15"));
358 frame_rates.append(new BC_ListBoxItem("23.976"));
359 frame_rates.append(new BC_ListBoxItem("24"));
360 frame_rates.append(new BC_ListBoxItem("25"));
361 frame_rates.append(new BC_ListBoxItem("29.97"));
362 frame_rates.append(new BC_ListBoxItem("30"));
363 frame_rates.append(new BC_ListBoxItem("50"));
364 frame_rates.append(new BC_ListBoxItem("59.94"));
365 frame_rates.append(new BC_ListBoxItem("60"));
366 frame_rates.append(new BC_ListBoxItem("72"));
367 frame_rates.append(new BC_ListBoxItem("85"));
368 frame_rates.append(new BC_ListBoxItem("90"));
369 frame_rates.append(new BC_ListBoxItem("100"));
370 frame_rates.append(new BC_ListBoxItem("120"));
371 frame_rates.append(new BC_ListBoxItem("144"));
372 frame_rates.append(new BC_ListBoxItem("240"));
373 frame_rates.append(new BC_ListBoxItem("1000"));
375 char string[BCTEXTLEN];
376 for(int i = 1; i < 17; i++)
378 sprintf(string, "%d", (int)pow(2, i));
379 zoom_values.append(new BC_ListBoxItem(string));
384 void Theme::overlay(VFrame *dst, VFrame *src, int in_x1, int in_x2)
388 unsigned char **in_rows;
389 unsigned char **out_rows;
393 w = MIN(src->get_w(), dst->get_w());
394 h = MIN(dst->get_h(), src->get_h());
401 h = MIN(dst->get_h(), src->get_h());
403 in_rows = src->get_rows();
404 out_rows = dst->get_rows();
406 switch(src->get_color_model())
409 switch(dst->get_color_model())
412 for(int i = 0; i < h; i++)
414 unsigned char *in_row = in_rows[i] + in_x1 * 4;
415 unsigned char *out_row = out_rows[i];
416 for(int j = 0; j < w; j++)
418 int opacity = in_row[3];
419 int transparency = out_row[3] * (0xff - opacity) / 0xff;
420 out_row[0] = (in_row[0] * opacity + out_row[0] * transparency) / 0xff;
421 out_row[1] = (in_row[1] * opacity + out_row[1] * transparency) / 0xff;
422 out_row[2] = (in_row[2] * opacity + out_row[2] * transparency) / 0xff;
423 out_row[3] = MAX(in_row[3], out_row[3]);
430 for(int i = 0; i < h; i++)
432 unsigned char *in_row = in_rows[i] + in_x1 * 4;
433 unsigned char *out_row = out_rows[i];
434 for(int j = 0; j < w; j++)
436 int opacity = in_row[3];
437 int transparency = 0xff - opacity;
438 out_row[0] = (in_row[0] * opacity + out_row[0] * transparency) / 0xff;
439 out_row[1] = (in_row[1] * opacity + out_row[1] * transparency) / 0xff;
440 out_row[2] = (in_row[2] * opacity + out_row[2] * transparency) / 0xff;
451 void Theme::build_transport(char *title,
452 unsigned char *png_overlay,
456 if(!png_overlay) return;
457 VFramePng default_data(png_overlay);
459 data[0] = NEW_VFRAME;
460 data[1] = NEW_VFRAME;
461 data[2] = NEW_VFRAME;
462 data[0]->clear_frame();
463 data[1]->clear_frame();
464 data[2]->clear_frame();
466 for(int i = 0; i < 3; i++)
470 if(!bg_data[i]) break;
476 in_x2 = default_data.get_w();
480 in_x1 = (int)(bg_data[i]->get_w() * 0.33);
481 in_x2 = in_x1 + default_data.get_w();
485 in_x1 = bg_data[i]->get_w() - default_data.get_w();
486 in_x2 = in_x1 + default_data.get_w();
490 overlay(data[i], bg_data[i], in_x1, in_x2);
491 overlay(data[i], &default_data);
494 new_image_set_images(title, 3, data[0], data[1], data[2]);
505 void Theme::build_patches(VFrame** &data,
506 unsigned char *png_overlay,
510 if(!png_overlay || !bg_data) return;
511 VFramePng default_data(png_overlay);
512 data = new VFrame*[5];
513 data[0] = NEW_VFRAME;
514 data[1] = NEW_VFRAME;
515 data[2] = NEW_VFRAME;
516 data[3] = NEW_VFRAME;
517 data[4] = NEW_VFRAME;
519 for(int i = 0; i < 5; i++)
529 in_x2 = default_data.get_w();
533 in_x1 = (int)(bg_data[i]->get_w() * 0.33);
534 in_x2 = in_x1 + default_data.get_w();
538 in_x1 = bg_data[i]->get_w() - default_data.get_w();
539 in_x2 = in_x1 + default_data.get_w();
557 void Theme::build_button(VFrame** &data,
558 unsigned char *png_overlay,
563 if(!png_overlay) return;
564 VFramePng default_data(png_overlay);
566 if(!up_vframe || !hi_vframe || !dn_vframe) return;
567 data = new VFrame*[3];
568 data[0] = NEW_VFRAME;
569 data[1] = NEW_VFRAME;
570 data[2] = NEW_VFRAME;
571 data[0]->copy_from(up_vframe);
572 data[1]->copy_from(hi_vframe);
573 data[2]->copy_from(dn_vframe);
574 for(int i = 0; i < 3; i++)
579 void Theme::build_button(VFrame** &data,
580 unsigned char *png_overlay,
586 if(!png_overlay) return;
587 VFramePng default_data(png_overlay);
589 if(!up_vframe || !hi_vframe || !dn_vframe) return;
590 data = new VFrame*[4];
591 data[0] = NEW_VFRAME;
592 data[1] = NEW_VFRAME;
593 data[2] = NEW_VFRAME;
594 data[3] = NEW_VFRAME;
595 data[0]->copy_from(up_vframe);
596 data[1]->copy_from(hi_vframe);
597 data[2]->copy_from(dn_vframe);
598 data[2]->copy_from(at_vframe);
599 for(int i = 0; i < 4; i++)
604 void Theme::build_toggle(VFrame** &data,
605 unsigned char *png_overlay,
608 VFrame *checked_vframe,
610 VFrame *checkedhi_vframe)
617 !checkedhi_vframe) return;
618 VFramePng default_data(png_overlay);
619 data = new VFrame*[5];
620 data[0] = NEW_VFRAME;
621 data[1] = NEW_VFRAME;
622 data[2] = NEW_VFRAME;
623 data[3] = NEW_VFRAME;
624 data[4] = NEW_VFRAME;
625 data[0]->copy_from(up_vframe);
626 data[1]->copy_from(hi_vframe);
627 data[2]->copy_from(checked_vframe);
628 data[3]->copy_from(dn_vframe);
629 data[4]->copy_from(checkedhi_vframe);
630 for(int i = 0; i < 5; i++)
636 void Theme::get_mwindow_sizes(MWindowGUI *gui, int w, int h)
639 mbuttons_y = gui->menu_h() + yS(1);
640 mbuttons_w = w - (ffmpeg_toggle[0]->get_w()+xS(2) +
641 proxy_p_toggle[0]->get_w()+xS(2) +
643 mbuttons_h = get_image("mbutton_bg")->get_h();
644 mclock_x = window_border - xS(5);
645 mclock_y = mbuttons_y-1 + mbuttons_h;
646 mclock_w = get_image("clock_bg")->get_w() - xS(20);
647 mclock_h = get_image("clock_bg")->get_h();
648 mtimebar_x = get_image("patchbay_bg")->get_w();
649 mtimebar_y = mbuttons_y - 1 + mbuttons_h;
650 mtimebar_w = w - mtimebar_x;
651 mtimebar_h = get_image("timebar_bg")->get_h();
654 mzoom_y = h - get_image("statusbar")->get_h();
657 mstatus_y = mzoom_y + mzoom_h;
659 mstatus_h = h - mstatus_y;
660 mstatus_message_x = xS(10);
661 mstatus_message_y = yS(5);
662 mstatus_progress_x = mstatus_w - statusbar_cancel_data[0]->get_w() - xS(240);
663 mstatus_progress_y = mstatus_h - BC_WindowBase::get_resources()->progress_images[0]->get_h() - yS(3);
664 mstatus_progress_w = xS(230);
665 mstatus_cancel_x = mstatus_w - statusbar_cancel_data[0]->get_w();
666 mstatus_cancel_y = mstatus_h - statusbar_cancel_data[0]->get_h();
668 mcanvas_y = mbuttons_y-1 + mbuttons_h;
670 mcanvas_h = mzoom_y - mtimebar_y;
671 control_pixels = (mcanvas_w * control_pixels) / 1000;
673 patchbay_y = mcanvas_y + mclock_h;
674 patchbay_w = get_image("patchbay_bg")->get_w();
675 patchbay_h = mcanvas_h - mclock_h;
676 pane_w = get_image_set("xpane")[0]->get_w();
677 pane_h = get_image_set("ypane")[0]->get_h();
678 pane_x = mcanvas_x + mcanvas_w;
679 pane_y = mcanvas_y + mcanvas_h;
681 mhscroll_y = mcanvas_y + mcanvas_h - BC_ScrollBar::get_span(SCROLL_HORIZ);
682 mhscroll_w = w - BC_ScrollBar::get_span(SCROLL_VERT);
683 mvscroll_x = mcanvas_x + mcanvas_w;
684 mvscroll_y = mcanvas_y;
685 mvscroll_h = mcanvas_h;
688 void Theme::get_pane_sizes(MWindowGUI *gui,
689 int *view_x, int *view_y, int *view_w, int *view_h,
690 int number, int x, int y, int w, int h)
698 if(number == TOP_LEFT_PANE ||
699 number == BOTTOM_LEFT_PANE)
701 *view_x += patchbay_w;
702 *view_w -= patchbay_w;
706 if(number == TOP_LEFT_PANE ||
707 number == TOP_RIGHT_PANE)
709 *view_y += mtimebar_h;
710 *view_h -= mtimebar_h;
714 if(number == BOTTOM_LEFT_PANE ||
715 number == BOTTOM_RIGHT_PANE ||
716 gui->horizontal_panes() ||
717 gui->total_panes() == 1)
719 *view_h -= BC_ScrollBar::get_span(SCROLL_HORIZ);
723 if(number == TOP_RIGHT_PANE ||
724 number == BOTTOM_RIGHT_PANE ||
725 gui->vertical_panes() ||
726 gui->total_panes() == 1)
728 *view_w -= BC_ScrollBar::get_span(SCROLL_VERT);
732 void Theme::draw_mwindow_bg(MWindowGUI *gui)
737 void Theme::get_cwindow_sizes(CWindowGUI *gui, int cwindow_controls)
739 int total_buttons = !use_commercials ? 16 : 17;
740 int edit_w = EditPanel::calculate_w(mwindow, 1, total_buttons);
741 int transport_w = PlayTransport::get_transport_width(mwindow) + toggle_margin;
742 int zoom_w = ZoomPanel::calculate_w(czoom_w);
743 int status_w = get_image("cwindow_active")->get_w();
744 // Space between buttons & status icon
745 int division_w = xS(24);
752 if(mwindow->edl->session->cwindow_meter)
754 cmeter_x = mwindow->session->cwindow_w -
755 MeterPanel::get_meters_width(this,
756 mwindow->edl->session->audio_channels,
757 mwindow->edl->session->cwindow_meter);
761 cmeter_x = mwindow->session->cwindow_w;
765 int buttons_h = get_image("rewind")->get_h() + widget_border;
766 int panel_y = mwindow->session->cwindow_h - buttons_h + yS(4);
767 ctransport_x = widget_border;
768 if( ctransport_x + transport_w + widget_border +
769 edit_w + widget_border + zoom_w + widget_border +
770 division_w + status_w > cmeter_x ) {
771 ctransport_y = panel_y;
772 czoom_x = ctransport_x + transport_w + widget_border;
775 cstatus_y = panel_y - yS(2);
776 int edit_h = EditPanel::calculate_h(mwindow) + widget_border;
777 buttons_h += edit_h; panel_y -= edit_h;
778 cedit_x = widget_border;
782 ctransport_x = widget_border;
783 ctransport_y = panel_y;
784 cedit_x = ctransport_x + transport_w + widget_border;
786 czoom_x = cedit_x + edit_w + widget_border;
788 cstatus_x = czoom_x + zoom_w + division_w;
791 buttons_h += ctimebar_h;
793 ccomposite_x = xS(0);
794 ccomposite_y = yS(5);
795 ccomposite_w = get_image("cpanel_bg")->get_w();
796 ccomposite_h = mwindow->session->cwindow_h - buttons_h;
798 ccanvas_x = ccomposite_x + ccomposite_w;
800 ccanvas_h = ccomposite_h;
802 ccanvas_w = cmeter_x - ccanvas_x - widget_border;
809 ccomposite_x = -get_image("cpanel_bg")->get_w();
811 ccomposite_w = get_image("cpanel_bg")->get_w();
812 ccomposite_h = mwindow->session->cwindow_h - get_image("cbuttons_left")->get_h();
815 cedit_y = mwindow->session->cwindow_h + yS(17);
816 ctransport_x = xS(10);
817 ctransport_y = cedit_y + yS(40);
820 ccanvas_w = mwindow->session->cwindow_w;
821 ccanvas_h = mwindow->session->cwindow_h;
822 cmeter_x = mwindow->session->cwindow_w;
823 cstatus_x = mwindow->session->cwindow_w;
824 cstatus_y = mwindow->session->cwindow_h;
825 czoom_x = mwindow->session->cwindow_w;
826 czoom_y = mwindow->session->cwindow_h;
833 cmeter_y = widget_border;
834 cmeter_h = mwindow->session->cwindow_h - cmeter_y - widget_border;
836 // ctimebar_x = ccanvas_x;
837 // ctimebar_y = ccanvas_y + ccanvas_h;
838 // ctimebar_w = ccanvas_w;
840 ctimebar_y = ccanvas_y + ccanvas_h;
841 ctimebar_w = mwindow->session->cwindow_w;
842 if(mwindow->edl->session->cwindow_meter)
844 ctimebar_w = cmeter_x - widget_border;
854 void Theme::draw_awindow_bg(AWindowGUI *gui)
856 gui->clear_box(0, 0, mwindow->session->awindow_w, mwindow->session->awindow_h);
860 void Theme::draw_vwindow_bg(VWindowGUI *gui)
864 // mwindow->session->vwindow_w,
865 // mwindow->session->vwindow_h);
867 // gui->draw_3segmenth(vtimebar_x,
876 void Theme::draw_cwindow_bg(CWindowGUI *gui)
878 gui->clear_box(0, 0, mwindow->session->cwindow_w, mwindow->session->cwindow_h);
882 void Theme::draw_lwindow_bg(LevelWindowGUI *gui)
884 gui->clear_box(0, 0, mwindow->session->lwindow_w, mwindow->session->lwindow_h);
889 void Theme::draw_rmonitor_bg(RecordMonitorGUI *gui)
891 gui->clear_box(0, 0, mwindow->session->rmonitor_w, mwindow->session->rmonitor_h);
896 void Theme::draw_rwindow_bg(RecordGUI *gui)
898 gui->clear_box(0, 0, mwindow->session->rwindow_w, mwindow->session->rwindow_h);
902 void Theme::draw_resource_bg(TrackCanvas *canvas, ResourcePixmap *pixmap,
903 int color, Edit *edit, int edit_x, int edit_w,
904 int pixmap_x, int x1, int y1, int x2, int y2)
907 int data_h = edit->track->data_h;
909 case 1024: image = get_image("resource1024"); break;
910 case 512: image = get_image("resource512"); break;
911 case 256: image = get_image("resource256"); break;
912 case 128: image = get_image("resource128"); break;
913 case 64: image = get_image("resource64"); break;
916 image = get_image("resource32");
918 VFrame *frame = image;
919 int bg_color = canvas->get_bg_color();
921 int alpha = (~color >> 24) & 0xff;
922 frame = pixmap->change_picon_alpha(image, alpha);
923 canvas->set_bg_color(color & 0xffffff);
925 canvas->draw_3segmenth(x1, y1, x2 - x1,
926 edit_x - pixmap_x, edit_w, frame, pixmap);
927 if( frame != image ) {
929 canvas->set_bg_color(bg_color);
934 void Theme::get_vwindow_sizes(VWindowGUI *gui)
936 int edit_w = EditPanel::calculate_w(mwindow, 0, 12);
937 int transport_w = PlayTransport::get_transport_width(mwindow) + toggle_margin;
938 // Space between buttons & time
939 int division_w = xS(30);
942 int vtime_border = xS(15);
944 vmeter_y = widget_border;
945 vmeter_h = mwindow->session->vwindow_h - cmeter_y - widget_border;
947 if(mwindow->edl->session->vwindow_meter)
949 vmeter_x = mwindow->session->vwindow_w -
950 MeterPanel::get_meters_width(this,
951 mwindow->edl->session->audio_channels,
952 mwindow->edl->session->vwindow_meter);
956 vmeter_x = mwindow->session->vwindow_w;
961 vcanvas_w = vmeter_x - vcanvas_x - widget_border;
963 int buttons_h = get_image("rewind")->get_h() + widget_border;
964 int panel_y = mwindow->session->vwindow_h - buttons_h + yS(4);
965 vtransport_x = widget_border;
966 if( vtransport_x + transport_w + widget_border +
967 edit_w + widget_border + vtime_w + xS(40) + widget_border > vmeter_x ) {
968 vtransport_y = panel_y;
969 vzoom_x = vtransport_x + transport_w + widget_border;
971 vdivision_x = xS(320);
972 vtime_x = vdivision_x;
974 int edit_h = EditPanel::calculate_h(mwindow) + widget_border;
975 buttons_h += edit_h; panel_y -= edit_h;
976 vedit_x = widget_border;
980 vtransport_x = widget_border;
981 vtransport_y = panel_y;
982 vedit_x = vtransport_x + transport_w + widget_border;
984 vdivision_x = vedit_x + edit_w + division_w;
985 vtime_x = vdivision_x + vtime_border;
988 buttons_h += vtimebar_h;
990 // vtimebar_x = vcanvas_x;
991 // vtimebar_y = vcanvas_y + vcanvas_h;
992 // vtimebar_w = vcanvas_w;
994 vcanvas_h = mwindow->session->vwindow_h - buttons_h;
996 vtimebar_y = vcanvas_y + vcanvas_h;
997 vtimebar_w = vmeter_x - widget_border;
1001 void Theme::get_awindow_sizes(AWindowGUI *gui)
1006 // afolders_y = deletedisk_data[0]->get_h();
1008 afolders_w = mwindow->session->afolders_w;
1009 afolders_h = mwindow->session->awindow_h - afolders_y;
1010 adivider_x = afolders_x + afolders_w;
1013 adivider_h = afolders_h;
1014 alist_x = afolders_x + afolders_w + xS(5);
1015 alist_y = afolders_y;
1016 alist_w = mwindow->session->awindow_w - alist_x;
1017 alist_h = afolders_h;
1020 void Theme::get_rmonitor_sizes(int do_audio,
1033 rmonitor_canvas_y = yS(30);
1034 rmonitor_tx_x = xS(10);
1039 rmonitor_canvas_y = 0;
1048 rmonitor_channel_x = x;
1049 rmonitor_channel_y = yS(5);
1051 rmonitor_canvas_y = yS(35);
1057 rmonitor_interlace_x = x;
1058 rmonitor_interlace_y = y;
1066 rmonitor_meter_x = mwindow->session->rmonitor_w -
1067 MeterPanel::get_meters_width(this, audio_channels, 1);
1068 rmonitor_meter_w = mwindow->session->rmonitor_w;
1072 rmonitor_meter_x = widget_border;
1073 rmonitor_meter_w = mwindow->session->rmonitor_w - widget_border * 2;
1076 rmonitor_meter_y = yS(40);
1077 rmonitor_meter_h = mwindow->session->rmonitor_h - yS(10) - rmonitor_meter_y;
1081 rmonitor_meter_x = mwindow->session->rmonitor_w;
1084 rmonitor_canvas_x = 0;
1085 rmonitor_canvas_w = rmonitor_meter_x - rmonitor_canvas_x;
1086 if(do_audio) rmonitor_canvas_w -= xS(10);
1087 rmonitor_canvas_h = mwindow->session->rmonitor_h - rmonitor_canvas_y;
1089 if(!do_video && do_audio)
1091 rmonitor_meter_y -= yS(30);
1092 rmonitor_meter_h += yS(30);
1097 void Theme::get_recordgui_sizes(RecordGUI *gui, int w, int h)
1101 void Theme::get_batchrender_sizes(BatchRenderGUI *gui,
1105 batchrender_x1 = xS(10);
1106 batchrender_x2 = xS(300);
1107 batchrender_x3 = xS(400);
1110 void Theme::get_plugindialog_sizes()
1112 int xs10 = xS(10), ys10 = yS(10);
1113 int xs20 = xS(20), ys100 = yS(100);
1114 int x = xs10, y = yS(30);
1115 plugindialog_new_x = x;
1116 plugindialog_new_y = y;
1117 plugindialog_shared_x = mwindow->session->plugindialog_w / 3;
1118 plugindialog_shared_y = y;
1119 plugindialog_module_x = mwindow->session->plugindialog_w * 2 / 3;
1120 plugindialog_module_y = y;
1122 plugindialog_new_w = plugindialog_shared_x - plugindialog_new_x - xs10;
1123 plugindialog_new_h = mwindow->session->plugindialog_h - ys100;
1124 plugindialog_shared_w = plugindialog_module_x - plugindialog_shared_x - xs10;
1125 plugindialog_shared_h = mwindow->session->plugindialog_h - ys100;
1126 plugindialog_module_w = mwindow->session->plugindialog_w - plugindialog_module_x - xs10;
1127 plugindialog_module_h = mwindow->session->plugindialog_h - ys100;
1129 plugindialog_newattach_x = plugindialog_new_x + xs20;
1130 plugindialog_newattach_y = plugindialog_new_y + plugindialog_new_h + ys10;
1131 plugindialog_sharedattach_x = plugindialog_shared_x + xs20;
1132 plugindialog_sharedattach_y = plugindialog_shared_y + plugindialog_shared_h + ys10;
1133 plugindialog_moduleattach_x = plugindialog_module_x + xs20;
1134 plugindialog_moduleattach_y = plugindialog_module_y + plugindialog_module_h + ys10;
1137 // void Theme::get_presetdialog_sizes(PresetsWindow *gui)
1139 // int x = window_border;
1140 // int y = window_border + BC_Title::calculate_h(gui, "P") + widget_border;
1142 // presets_list_x = x;
1143 // presets_list_y = y;
1144 // presets_list_w = mwindow->session->presetdialog_w / 2;
1145 // presets_list_h = mwindow->session->presetdialog_h -
1146 // BC_OKButton::calculate_h() -
1150 // presets_text_x = presets_list_x + presets_list_w + widget_border;
1151 // presets_text_y = y;
1152 // presets_text_w = mwindow->session->presetdialog_w - presets_text_x - window_border;
1153 // y += BC_TextBox::calculate_h(gui,
1156 // 1) + widget_border;
1158 // presets_delete_x = presets_text_x;
1159 // presets_delete_y = y;
1160 // y += BC_GenericButton::calculate_h() + widget_border;
1162 // presets_save_x = presets_text_x;
1163 // presets_save_y = y;
1164 // y += BC_GenericButton::calculate_h() + widget_border;
1166 // presets_apply_x = presets_text_x;
1167 // presets_apply_y = y;
1168 // y += BC_GenericButton::calculate_h();
1171 void Theme::get_keyframedialog_sizes(KeyFrameWindow *gui)
1173 int x = window_border;
1174 int y = window_border +
1175 BC_Title::calculate_h(gui, "P", LARGEFONT) +
1180 #ifdef EDIT_KEYFRAME
1181 presets_list_w = mwindow->session->keyframedialog_w / 2 -
1185 presets_list_w = mwindow->session->keyframedialog_w -
1189 presets_list_h = mwindow->session->keyframedialog_h -
1190 BC_OKButton::calculate_h() -
1194 BC_Title::calculate_h(gui, "P") -
1196 BC_TextBox::calculate_h(gui,
1201 (BC_GenericButton::calculate_h() + widget_border) * 3 -
1203 y += presets_list_h + widget_border + widget_border + BC_Title::calculate_h(gui, "P");
1206 presets_text_w = presets_list_w;
1207 y += BC_TextBox::calculate_h(gui,
1212 presets_delete_x = presets_text_x;
1213 presets_delete_y = y;
1214 y += BC_GenericButton::calculate_h() + widget_border;
1216 presets_save_x = presets_text_x;
1218 y += BC_GenericButton::calculate_h() + widget_border;
1220 presets_apply_x = presets_text_x;
1221 presets_apply_y = y;
1222 y += BC_GenericButton::calculate_h();
1224 #ifdef EDIT_KEYFRAME
1225 x = mwindow->session->keyframedialog_w / 2 + widget_border;
1227 BC_Title::calculate_h(gui, "P", LARGEFONT) +
1230 keyframe_list_x = x;
1231 keyframe_list_y = y;
1232 keyframe_list_w = mwindow->session->keyframedialog_w / 2 -
1235 keyframe_list_h = mwindow->session->keyframedialog_h -
1239 BC_Title::calculate_h(gui, "P") -
1241 BC_TextBox::calculate_h(gui,
1246 BC_Title::calculate_h(gui, "P") -
1248 BC_OKButton::calculate_h() -
1250 // keyframe_text_x = keyframe_list_x + keyframe_list_w + widget_border;
1251 // keyframe_text_y = y;
1252 // keyframe_text_w = mwindow->session->keyframedialog_w - keyframe_text_x - window_border;
1253 // y += BC_TextBox::calculate_h(gui,
1256 // 1) + widget_border;
1259 y += keyframe_list_h + BC_Title::calculate_h(gui, "P") + widget_border + widget_border;
1260 keyframe_value_x = keyframe_list_x;
1261 keyframe_value_y = y;
1262 keyframe_value_w = keyframe_list_w;
1263 y += BC_TextBox::calculate_h(gui,
1268 keyframe_all_x = keyframe_value_x;
1276 void Theme::get_menueffect_sizes(int use_list)
1280 menueffect_list_x = xS(10);
1281 menueffect_list_y = yS(10);
1282 menueffect_list_w = mwindow->session->menueffect_w - xS(400);
1283 menueffect_list_h = mwindow->session->menueffect_h -
1285 BC_OKButton::calculate_h() - yS(10);
1289 menueffect_list_x = 0;
1290 menueffect_list_y = yS(10);
1291 menueffect_list_w = 0;
1292 menueffect_list_h = 0;
1295 menueffect_file_x = menueffect_list_x + menueffect_list_w + xS(10);
1296 menueffect_file_y = yS(10);
1298 menueffect_tools_x = menueffect_file_x;
1299 menueffect_tools_y = menueffect_file_y + yS(20);
1302 void Theme::get_preferences_sizes()
1306 void Theme::draw_preferences_bg(PreferencesWindow *gui)
1310 void Theme::get_new_sizes(NewWindow *gui)
1314 void Theme::draw_new_bg(NewWindow *gui)
1318 void Theme::draw_setformat_bg(SetFormatWindow *window)
1323 int Theme::get_color_title_bg()
1325 VFrame *title_bg = get_image("title_bg_data");
1326 int tw = title_bg->get_w(), th = title_bg->get_h();
1327 int colormodel = title_bg->get_color_model();
1328 int bpp = BC_CModels::calculate_pixelsize(colormodel);
1329 uint8_t **rows = title_bg->get_rows();
1330 int cx = tw / 2, cy = th / 2;
1331 uint8_t *bp = rows[cy] + cx * bpp;
1332 int br = bp[0], bg = bp[1], bb = bp[2];
1333 int color = (br<<16) | (bg<<8) | (bb<<0);