r665: Merged the official release 2.0.
[cinelerra_cv.git] / cinelerra / theme.C
blobffc58329b0d4f3850b9e474948aaf6b0a9427996
1 #include "awindowgui.h"
2 #include "clip.h"
3 #include "colors.h"
4 #include "cwindowgui.h"
5 #include "edl.h"
6 #include "edlsession.h"
7 #include "language.h"
8 #include "levelwindowgui.h"
9 #include "loadmode.h"
10 #include "localsession.h"
11 #include "mainmenu.h"
12 #include "mainsession.h"
13 #include "mbuttons.h"
14 #include "meterpanel.h"
15 #include "mwindowgui.h"
16 #include "mwindow.h"
17 #include "overlayframe.h"
18 #include "patchbay.h"
19 #include "playtransport.h"
20 #include "recordgui.h"
21 #include "recordmonitor.h"
22 #include "resourcepixmap.h"
23 #include "statusbar.h"
24 #include "theme.h"
25 #include "timebar.h"
26 #include "trackcanvas.h"
27 #include "vframe.h"
28 #include "vwindowgui.h"
29 #include "zoombar.h"
32 #include <errno.h>
33 #include <string.h>
39 Theme::Theme()
40  : BC_Theme()
42         this->mwindow = 0;
43         theme_title = DEFAULT_THEME;
44         data_buffer = 0;
45         contents_buffer = 0;
46         last_image = 0;
47         mtransport_margin = 0;
48         toggle_margin = 0;
50         BC_WindowBase::get_resources()->bg_color = BLOND;
51         BC_WindowBase::get_resources()->button_up = 0xffc000;
52         BC_WindowBase::get_resources()->button_highlighted = 0xffe000;
53         BC_WindowBase::get_resources()->recursive_resizing = 0;
54         audio_color = BLACK;
55         fade_h = 22;
56         meter_h = 17;
57         mode_h = 30;
58         pan_h = 32;
59         pan_x = 50;
60         play_h = 22;
61         title_h = 22;
64         loadmode_w = 350;
66 #include "data/about_png.h"
67         about_bg = new VFrame(about_png);
71         
77 // Need to delete everything here
78 Theme::~Theme()
80         flush_images(); 
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;
93         data_buffer = 0;
94         contents_buffer = 0;
95         contents.remove_all();
98 void Theme::initialize()
100         message_normal = BLACK;
101         message_error = RED;
103 // Force to use local data for images
104         extern unsigned char _binary_theme_data_start[];
105         set_data(_binary_theme_data_start);
107 // Set images which weren't set by subclass
108         new_image("mode_add", "mode_add.png");
109         new_image("mode_divide", "mode_divide.png");
110         new_image("mode_multiply", "mode_multiply.png");
111         new_image("mode_normal", "mode_normal.png");
112         new_image("mode_replace", "mode_replace.png");
113         new_image("mode_subtract", "mode_subtract.png");
119 void Theme::build_menus()
123         aspect_ratios.append(new BC_ListBoxItem("3:2"));
124         aspect_ratios.append(new BC_ListBoxItem("4:3"));
125         aspect_ratios.append(new BC_ListBoxItem("16:9"));
126         aspect_ratios.append(new BC_ListBoxItem("2.10:1"));
127         aspect_ratios.append(new BC_ListBoxItem("2.20:1"));
128         aspect_ratios.append(new BC_ListBoxItem("2.25:1"));
129         aspect_ratios.append(new BC_ListBoxItem("2.30:1"));
130         aspect_ratios.append(new BC_ListBoxItem("2.35:1"));
131         aspect_ratios.append(new BC_ListBoxItem("2.66:1"));
132         frame_sizes.append(new BC_ListBoxItem("160x120"));
133         frame_sizes.append(new BC_ListBoxItem("240x180"));
134         frame_sizes.append(new BC_ListBoxItem("320x240"));
135         frame_sizes.append(new BC_ListBoxItem("360x240"));
136         frame_sizes.append(new BC_ListBoxItem("400x300"));
137         frame_sizes.append(new BC_ListBoxItem("512x384"));
138         frame_sizes.append(new BC_ListBoxItem("640x480"));
139         frame_sizes.append(new BC_ListBoxItem("720x480"));
140         frame_sizes.append(new BC_ListBoxItem("720x576"));
141         frame_sizes.append(new BC_ListBoxItem("1280x720"));
142         frame_sizes.append(new BC_ListBoxItem("960x1080"));
143         frame_sizes.append(new BC_ListBoxItem("1920x1080"));
144         frame_sizes.append(new BC_ListBoxItem("1920x1088"));
145         sample_rates.append(new BC_ListBoxItem("8000"));
146         sample_rates.append(new BC_ListBoxItem("16000"));
147         sample_rates.append(new BC_ListBoxItem("22050"));
148         sample_rates.append(new BC_ListBoxItem("32000"));
149         sample_rates.append(new BC_ListBoxItem("44100"));
150         sample_rates.append(new BC_ListBoxItem("48000"));
151         sample_rates.append(new BC_ListBoxItem("96000"));
152         sample_rates.append(new BC_ListBoxItem("192000"));
153         frame_rates.append(new BC_ListBoxItem("1"));
154         frame_rates.append(new BC_ListBoxItem("5"));
155         frame_rates.append(new BC_ListBoxItem("10"));
156         frame_rates.append(new BC_ListBoxItem("12"));
157         frame_rates.append(new BC_ListBoxItem("15"));
158         frame_rates.append(new BC_ListBoxItem("23.97"));
159         frame_rates.append(new BC_ListBoxItem("24"));
160         frame_rates.append(new BC_ListBoxItem("25"));
161         frame_rates.append(new BC_ListBoxItem("29.97"));
162         frame_rates.append(new BC_ListBoxItem("30"));
163         frame_rates.append(new BC_ListBoxItem("50"));
164         frame_rates.append(new BC_ListBoxItem("59.94"));
165         frame_rates.append(new BC_ListBoxItem("60"));
166         char string[BCTEXTLEN];
167         for(int i = 1; i < 17; i++)
168         {
169                 sprintf(string, "%d", (int)pow(2, i));
170                 zoom_values.append(new BC_ListBoxItem(string));
171         }
175 void Theme::overlay(VFrame *dst, VFrame *src, int in_x1, int in_x2)
177         int w;
178         int h;
179         unsigned char **in_rows;
180         unsigned char **out_rows;
182         if(in_x1 < 0)
183         {
184                 w = MIN(src->get_w(), dst->get_w());
185                 h = MIN(dst->get_h(), src->get_h());
186                 in_x1 = 0;
187                 in_x2 = w;
188         }
189         else
190         {
191                 w = in_x2 - in_x1;
192                 h = MIN(dst->get_h(), src->get_h());
193         }
194         in_rows = src->get_rows();
195         out_rows = dst->get_rows();
197         switch(src->get_color_model())
198         {
199                 case BC_RGBA8888:
200                         switch(dst->get_color_model())
201                         {
202                                 case BC_RGBA8888:
203                                         for(int i = 0; i < h; i++)
204                                         {
205                                                 unsigned char *in_row = in_rows[i] + in_x1 * 4;
206                                                 unsigned char *out_row = out_rows[i];
207                                                 for(int j = 0; j < w; j++)
208                                                 {
209                                                         int opacity = in_row[3];
210                                                         int transparency = 0xff - opacity;
211                                                         out_row[0] = (in_row[0] * opacity + out_row[0] * transparency) / 0xff;
212                                                         out_row[1] = (in_row[1] * opacity + out_row[1] * transparency) / 0xff;
213                                                         out_row[2] = (in_row[2] * opacity + out_row[2] * transparency) / 0xff;
214                                                         out_row[3] = MAX(in_row[3], out_row[3]);
215                                                         out_row += 4;
216                                                         in_row += 4;
217                                                 }
218                                         }
219                                         break;
220                                 case BC_RGB888:
221                                         for(int i = 0; i < h; i++)
222                                         {
223                                                 unsigned char *in_row = in_rows[i] + in_x1 * 4;
224                                                 unsigned char *out_row = out_rows[i];
225                                                 for(int j = 0; j < w; j++)
226                                                 {
227                                                         int opacity = in_row[3];
228                                                         int transparency = 0xff - opacity;
229                                                         out_row[0] = (in_row[0] * opacity + out_row[0] * transparency) / 0xff;
230                                                         out_row[1] = (in_row[1] * opacity + out_row[1] * transparency) / 0xff;
231                                                         out_row[2] = (in_row[2] * opacity + out_row[2] * transparency) / 0xff;
232                                                         out_row += 3;
233                                                         in_row += 4;
234                                                 }
235                                         }
236                                         break;
237                         }
238                         break;
239         }
242 void Theme::build_transport(char *title,
243         unsigned char *png_overlay,
244         VFrame **bg_data,
245         int third)
247         if(!png_overlay) return;
248         VFrame default_data(png_overlay);
249         VFrame *data[3];
250         data[0] = new VFrame(0, default_data.get_w(), default_data.get_h(), BC_RGBA8888);
251         data[1] = new VFrame(0, default_data.get_w(), default_data.get_h(), BC_RGBA8888);
252         data[2] = new VFrame(0, default_data.get_w(), default_data.get_h(), BC_RGBA8888);
253         data[0]->clear_frame();
254         data[1]->clear_frame();
255         data[2]->clear_frame();
257         for(int i = 0; i < 3; i++)
258         {
259                 int in_x1;
260                 int in_x2;
261                 if(!bg_data[i]) break;
263                 switch(third)
264                 {
265                         case 0:
266                                 in_x1 = 0;
267                                 in_x2 = default_data.get_w();
268                                 break;
270                         case 1:
271                                 in_x1 = (int)(bg_data[i]->get_w() * 0.33);
272                                 in_x2 = in_x1 + default_data.get_w();
273                                 break;
275                         case 2:
276                                 in_x1 = bg_data[i]->get_w() - default_data.get_w();
277                                 in_x2 = in_x1 + default_data.get_w();
278                                 break;
279                 }
281                 overlay(data[i], 
282                         bg_data[i],
283                         in_x1,
284                         in_x2);
285                 overlay(data[i], 
286                         &default_data);
287         }
289         new_image_set_images(title, 3, data[0], data[1], data[2]);
300 void Theme::build_patches(VFrame** &data,
301         unsigned char *png_overlay,
302         VFrame **bg_data,
303         int region)
305         if(!png_overlay || !bg_data) return;
306         VFrame default_data(png_overlay);
307         data = new VFrame*[5];
308         data[0] = new VFrame(0, default_data.get_w(), default_data.get_h(), BC_RGBA8888);
309         data[1] = new VFrame(0, default_data.get_w(), default_data.get_h(), BC_RGBA8888);
310         data[2] = new VFrame(0, default_data.get_w(), default_data.get_h(), BC_RGBA8888);
311         data[3] = new VFrame(0, default_data.get_w(), default_data.get_h(), BC_RGBA8888);
312         data[4] = new VFrame(0, default_data.get_w(), default_data.get_h(), BC_RGBA8888);
314         for(int i = 0; i < 5; i++)
315         {
316                 int in_x1;
317                 int in_x2;
319                 switch(region)
320                 {
321                         case 0:
322                                 in_x1 = 0;
323                                 in_x2 = default_data.get_w();
324                                 break;
326                         case 1:
327                                 in_x1 = (int)(bg_data[i]->get_w() * 0.33);
328                                 in_x2 = in_x1 + default_data.get_w();
329                                 break;
331                         case 2:
332                                 in_x1 = bg_data[i]->get_w() - default_data.get_w();
333                                 in_x2 = in_x1 + default_data.get_w();
334                                 break;
335                 }
337                 overlay(data[i], 
338                         bg_data[i]);
339                 overlay(data[i], 
340                         &default_data);
341         }
351 void Theme::build_button(VFrame** &data,
352         unsigned char *png_overlay,
353         VFrame *up_vframe,
354         VFrame *hi_vframe,
355         VFrame *dn_vframe)
357         if(!png_overlay) return;
358         VFrame default_data(png_overlay);
360         if(!up_vframe || !hi_vframe || !dn_vframe) return;
361         data = new VFrame*[3];
362         data[0] = new VFrame(0, default_data.get_w(), default_data.get_h(), BC_RGBA8888);
363         data[1] = new VFrame(0, default_data.get_w(), default_data.get_h(), BC_RGBA8888);
364         data[2] = new VFrame(0, default_data.get_w(), default_data.get_h(), BC_RGBA8888);
365         data[0]->copy_from(up_vframe);
366         data[1]->copy_from(hi_vframe);
367         data[2]->copy_from(dn_vframe);
368         for(int i = 0; i < 3; i++)
369                 overlay(data[i], 
370                         &default_data);
373 void Theme::build_toggle(VFrame** &data,
374         unsigned char *png_overlay,
375         VFrame *up_vframe,
376         VFrame *hi_vframe,
377         VFrame *checked_vframe,
378         VFrame *dn_vframe,
379         VFrame *checkedhi_vframe)
381         if(!png_overlay || 
382                 !up_vframe || 
383                 !hi_vframe || 
384                 !checked_vframe || 
385                 !dn_vframe || 
386                 !checkedhi_vframe) return;
387         VFrame default_data(png_overlay);
388         data = new VFrame*[5];
389         data[0] = new VFrame(0, default_data.get_w(), default_data.get_h(), BC_RGBA8888);
390         data[1] = new VFrame(0, default_data.get_w(), default_data.get_h(), BC_RGBA8888);
391         data[2] = new VFrame(0, default_data.get_w(), default_data.get_h(), BC_RGBA8888);
392         data[3] = new VFrame(0, default_data.get_w(), default_data.get_h(), BC_RGBA8888);
393         data[4] = new VFrame(0, default_data.get_w(), default_data.get_h(), BC_RGBA8888);
394         data[0]->copy_from(up_vframe);
395         data[1]->copy_from(hi_vframe);
396         data[2]->copy_from(checked_vframe);
397         data[3]->copy_from(dn_vframe);
398         data[4]->copy_from(checkedhi_vframe);
399         for(int i = 0; i < 5; i++)
400                 overlay(data[i], 
401                         &default_data);
404 #define TIMEBAR_HEIGHT 10
405 #define PATCHBAY_W 145
406 #define STATUS_H 20
407 #define ZOOM_H 30
409 void Theme::get_mwindow_sizes(MWindowGUI *gui, int w, int h)
413 void Theme::draw_mwindow_bg(MWindowGUI *gui)
420 void Theme::draw_awindow_bg(AWindowGUI *gui)
422         gui->clear_box(0, 0, mwindow->session->awindow_w, mwindow->session->awindow_h);
423         gui->flash();
426 void Theme::draw_vwindow_bg(VWindowGUI *gui)
428 //      gui->clear_box(0, 
429 //              0, 
430 //              mwindow->session->vwindow_w, 
431 //              mwindow->session->vwindow_h);
432 // // Timebar
433 //      gui->draw_3segmenth(vtimebar_x, 
434 //              vtimebar_y, 
435 //              vtimebar_w, 
436 //              vtimebar_bg_data,
437 //              0);
438 //      gui->flash();
442 void Theme::draw_cwindow_bg(CWindowGUI *gui)
444         gui->clear_box(0, 0, mwindow->session->cwindow_w, mwindow->session->cwindow_h);
445         gui->flash();
448 void Theme::draw_lwindow_bg(LevelWindowGUI *gui)
450         gui->clear_box(0, 0, mwindow->session->lwindow_w, mwindow->session->lwindow_h);
451         gui->flash();
455 void Theme::draw_rmonitor_bg(RecordMonitorGUI *gui)
457         gui->clear_box(0, 0, mwindow->session->rmonitor_w, mwindow->session->rmonitor_h);
458         gui->flash();
462 void Theme::draw_rwindow_bg(RecordGUI *gui)
464         gui->clear_box(0, 0, mwindow->session->rwindow_w, mwindow->session->rwindow_h);
468 void Theme::draw_resource_bg(TrackCanvas *canvas,
469         ResourcePixmap *pixmap, 
470         int edit_x,
471         int edit_w,
472         int pixmap_x,
473         int x1, 
474         int y1, 
475         int x2,
476         int y2)
478         VFrame *image;
480         switch(mwindow->edl->local_session->zoom_track)
481         {
482                 case 1024: image = get_image("resource1024");  break;
483                 case 512: image = get_image("resource512");  break;
484                 case 256: image = get_image("resource256");  break;
485                 case 128: image = get_image("resource128");  break;
486                 case 64:  image = get_image("resource64");   break;
487                 default:
488                 case 32:  image = get_image("resource32");   break;
489         }
491         canvas->draw_3segmenth(x1, 
492                 y1, 
493                 x2 - x1, 
494                 edit_x - pixmap_x,
495                 edit_w,
496                 image,
497                 pixmap);
500 void Theme::get_vwindow_sizes(VWindowGUI *gui)
504 void Theme::get_cwindow_sizes(CWindowGUI *gui, int cwindow_controls)
508 void Theme::get_awindow_sizes(AWindowGUI *gui)
510         abuttons_x = 0; 
511         abuttons_y = 0;
512         afolders_x = 0;
513 //      afolders_y = deletedisk_data[0]->get_h();
514         afolders_y = 0;
515         afolders_w = mwindow->session->afolders_w;
516         afolders_h = mwindow->session->awindow_h - afolders_y;
517         adivider_x = afolders_x + afolders_w;
518         adivider_y = 0;
519         adivider_w = 5;
520         adivider_h = afolders_h;
521         alist_x = afolders_x + afolders_w + 5;
522         alist_y = afolders_y;
523         alist_w = mwindow->session->awindow_w - alist_x;
524         alist_h = afolders_h;
527 void Theme::get_rmonitor_sizes(int do_audio, 
528         int do_video,
529         int do_channel,
530         int do_interlace,
531         int do_avc,
532         int audio_channels)
534         int x = 10;
535         int y = 3;
538         if(do_avc)
539         {
540                 rmonitor_canvas_y = 30;
541                 rmonitor_tx_x = 10;
542                 rmonitor_tx_y = 0;
543         }
544         else
545         {
546                 rmonitor_canvas_y = 0;
547                 rmonitor_tx_x = 0;
548                 rmonitor_tx_y = 0;
549         }
552         if(do_channel)
553         {
554                 y = 5;
555                 rmonitor_channel_x = x;
556                 rmonitor_channel_y = 5;
557                 x += 235;
558                 rmonitor_canvas_y = 35;
559         }
561         if(do_interlace)
562         {
563                 y = 4;
564                 rmonitor_interlace_x = x;
565                 rmonitor_interlace_y = y;
566         }
569         if(do_audio)
570         {
571                 rmonitor_meter_x = mwindow->session->rmonitor_w - MeterPanel::get_meters_width(audio_channels, 1);
572                 rmonitor_meter_y = 40;
573                 rmonitor_meter_h = mwindow->session->rmonitor_h - 10 - rmonitor_meter_y;
574         }
575         else
576         {
577                 rmonitor_meter_x = mwindow->session->rmonitor_w;
578         }
580         rmonitor_canvas_x = 0;
581         rmonitor_canvas_w = rmonitor_meter_x - rmonitor_canvas_x;
582         if(do_audio) rmonitor_canvas_w -= 10;
583         rmonitor_canvas_h = mwindow->session->rmonitor_h - rmonitor_canvas_y;
586 void Theme::get_recordgui_sizes(RecordGUI *gui, int w, int h)
590 void Theme::get_batchrender_sizes(BatchRenderGUI *gui,
591         int w, 
592         int h)
594         batchrender_x1 = 5;
595         batchrender_x2 = 300;
596         batchrender_x3 = 400;
599 void Theme::get_plugindialog_sizes()
601         int x = 10, y = 30;
602         plugindialog_new_x = x;
603         plugindialog_new_y = y;
604         plugindialog_shared_x = mwindow->session->plugindialog_w / 3;
605         plugindialog_shared_y = y;
606         plugindialog_module_x = mwindow->session->plugindialog_w * 2 / 3;
607         plugindialog_module_y = y;
609         plugindialog_new_w = plugindialog_shared_x - plugindialog_new_x - 10;
610         plugindialog_new_h = mwindow->session->plugindialog_h - 110;
611         plugindialog_shared_w = plugindialog_module_x - plugindialog_shared_x - 10;
612         plugindialog_shared_h = mwindow->session->plugindialog_h - 110;
613         plugindialog_module_w = mwindow->session->plugindialog_w - plugindialog_module_x - 10;
614         plugindialog_module_h = mwindow->session->plugindialog_h - 110;
616         plugindialog_newattach_x = plugindialog_new_x + 20;
617         plugindialog_newattach_y = plugindialog_new_y + plugindialog_new_h + 10;
618         plugindialog_sharedattach_x = plugindialog_shared_x + 20;
619         plugindialog_sharedattach_y = plugindialog_shared_y + plugindialog_shared_h + 10;
620         plugindialog_moduleattach_x = plugindialog_module_x + 20;
621         plugindialog_moduleattach_y = plugindialog_module_y + plugindialog_module_h + 10;
624 void Theme::get_menueffect_sizes(int use_list)
626         if(use_list)
627         {
628                 menueffect_list_x = 10;
629                 menueffect_list_y = 10;
630                 menueffect_list_w = mwindow->session->menueffect_w - 400;
631                 menueffect_list_h = mwindow->session->menueffect_h - 
632                         menueffect_list_y -
633                         BC_OKButton::calculate_h() - 10;
634         }
635         else
636         {
637                 menueffect_list_x = 0;
638                 menueffect_list_y = 10;
639                 menueffect_list_w = 0;
640                 menueffect_list_h = 0;
641         }
643         menueffect_file_x = menueffect_list_x + menueffect_list_w + 10;
644         menueffect_file_y = 10;
646         menueffect_tools_x = menueffect_file_x;
647         menueffect_tools_y = menueffect_file_y + 20;
650 void Theme::get_preferences_sizes()
654 void Theme::draw_preferences_bg(PreferencesWindow *gui)
658 void Theme::get_new_sizes(NewWindow *gui)
662 void Theme::draw_new_bg(NewWindow *gui)
666 void Theme::draw_setformat_bg(SetFormatWindow *window)