00001 #include "awindowgui.h"
00002 #include "clip.h"
00003 #include "colors.h"
00004 #include "cwindowgui.h"
00005 #include "edl.h"
00006 #include "edlsession.h"
00007 #include "language.h"
00008 #include "levelwindowgui.h"
00009 #include "loadmode.h"
00010 #include "localsession.h"
00011 #include "mainmenu.h"
00012 #include "mainsession.h"
00013 #include "mbuttons.h"
00014 #include "meterpanel.h"
00015 #include "mwindowgui.h"
00016 #include "mwindow.h"
00017 #include "overlayframe.h"
00018 #include "patchbay.h"
00019 #include "playtransport.h"
00020 #include "recordgui.h"
00021 #include "recordmonitor.h"
00022 #include "resourcepixmap.h"
00023 #include "statusbar.h"
00024 #include "theme.h"
00025 #include "timebar.h"
00026 #include "trackcanvas.h"
00027 #include "vframe.h"
00028 #include "vwindowgui.h"
00029 #include "zoombar.h"
00030
00031
00032 #include <errno.h>
00033 #include <string.h>
00034
00035
00036
00037
00038
00039 Theme::Theme()
00040 : BC_Theme()
00041 {
00042 this->mwindow = 0;
00043 theme_title = DEFAULT_THEME;
00044 data_buffer = 0;
00045 contents_buffer = 0;
00046 last_image = 0;
00047 mtransport_margin = 0;
00048 toggle_margin = 0;
00049
00050 BC_WindowBase::get_resources()->bg_color = BLOND;
00051 BC_WindowBase::get_resources()->button_up = 0xffc000;
00052 BC_WindowBase::get_resources()->button_highlighted = 0xffe000;
00053 BC_WindowBase::get_resources()->recursive_resizing = 0;
00054 audio_color = BLACK;
00055 fade_h = 22;
00056 meter_h = 17;
00057 mode_h = 30;
00058 pan_h = 32;
00059 pan_x = 50;
00060 play_h = 22;
00061 title_h = 22;
00062
00063
00064 loadmode_w = 350;
00065
00066 #include "data/about_png.h"
00067 about_bg = new VFrame(about_png);
00068
00069
00070
00071
00072
00073
00074 }
00075
00076
00077
00078 Theme::~Theme()
00079 {
00080 flush_images();
00081
00082 aspect_ratios.remove_all_objects();
00083 frame_rates.remove_all_objects();
00084 frame_sizes.remove_all_objects();
00085 sample_rates.remove_all_objects();
00086 zoom_values.remove_all_objects();
00087 }
00088
00089 void Theme::flush_images()
00090 {
00091 if(data_buffer) delete [] data_buffer;
00092 if(contents_buffer) delete [] contents_buffer;
00093 data_buffer = 0;
00094 contents_buffer = 0;
00095 contents.remove_all();
00096 }
00097
00098 void Theme::initialize()
00099 {
00100 message_normal = BLACK;
00101 message_error = RED;
00102
00103
00104 extern unsigned char _binary_theme_data_start[];
00105 set_data(_binary_theme_data_start);
00106
00107
00108 new_image("mode_add", "mode_add.png");
00109 new_image("mode_divide", "mode_divide.png");
00110 new_image("mode_multiply", "mode_multiply.png");
00111 new_image("mode_normal", "mode_normal.png");
00112 new_image("mode_replace", "mode_replace.png");
00113 new_image("mode_subtract", "mode_subtract.png");
00114 }
00115
00116
00117
00118
00119 void Theme::build_menus()
00120 {
00121
00122
00123 aspect_ratios.append(new BC_ListBoxItem("3:2"));
00124 aspect_ratios.append(new BC_ListBoxItem("4:3"));
00125 aspect_ratios.append(new BC_ListBoxItem("16:9"));
00126 aspect_ratios.append(new BC_ListBoxItem("2.10:1"));
00127 aspect_ratios.append(new BC_ListBoxItem("2.20:1"));
00128 aspect_ratios.append(new BC_ListBoxItem("2.25:1"));
00129 aspect_ratios.append(new BC_ListBoxItem("2.30:1"));
00130 aspect_ratios.append(new BC_ListBoxItem("2.35:1"));
00131 aspect_ratios.append(new BC_ListBoxItem("2.66:1"));
00132 frame_sizes.append(new BC_ListBoxItem("160x120"));
00133 frame_sizes.append(new BC_ListBoxItem("240x180"));
00134 frame_sizes.append(new BC_ListBoxItem("320x240"));
00135 frame_sizes.append(new BC_ListBoxItem("360x240"));
00136 frame_sizes.append(new BC_ListBoxItem("400x300"));
00137 frame_sizes.append(new BC_ListBoxItem("512x384"));
00138 frame_sizes.append(new BC_ListBoxItem("640x480"));
00139 frame_sizes.append(new BC_ListBoxItem("720x480"));
00140 frame_sizes.append(new BC_ListBoxItem("720x576"));
00141 frame_sizes.append(new BC_ListBoxItem("1280x720"));
00142 frame_sizes.append(new BC_ListBoxItem("960x1080"));
00143 frame_sizes.append(new BC_ListBoxItem("1920x1080"));
00144 frame_sizes.append(new BC_ListBoxItem("1920x1088"));
00145 sample_rates.append(new BC_ListBoxItem("8000"));
00146 sample_rates.append(new BC_ListBoxItem("16000"));
00147 sample_rates.append(new BC_ListBoxItem("22050"));
00148 sample_rates.append(new BC_ListBoxItem("32000"));
00149 sample_rates.append(new BC_ListBoxItem("44100"));
00150 sample_rates.append(new BC_ListBoxItem("48000"));
00151 sample_rates.append(new BC_ListBoxItem("96000"));
00152 sample_rates.append(new BC_ListBoxItem("192000"));
00153 frame_rates.append(new BC_ListBoxItem("1"));
00154 frame_rates.append(new BC_ListBoxItem("5"));
00155 frame_rates.append(new BC_ListBoxItem("10"));
00156 frame_rates.append(new BC_ListBoxItem("12"));
00157 frame_rates.append(new BC_ListBoxItem("15"));
00158 frame_rates.append(new BC_ListBoxItem("23.97"));
00159 frame_rates.append(new BC_ListBoxItem("24"));
00160 frame_rates.append(new BC_ListBoxItem("25"));
00161 frame_rates.append(new BC_ListBoxItem("29.97"));
00162 frame_rates.append(new BC_ListBoxItem("30"));
00163 frame_rates.append(new BC_ListBoxItem("50"));
00164 frame_rates.append(new BC_ListBoxItem("59.94"));
00165 frame_rates.append(new BC_ListBoxItem("60"));
00166 char string[BCTEXTLEN];
00167 for(int i = 1; i < 17; i++)
00168 {
00169 sprintf(string, "%d", (int)pow(2, i));
00170 zoom_values.append(new BC_ListBoxItem(string));
00171 }
00172 }
00173
00174
00175 void Theme::overlay(VFrame *dst, VFrame *src, int in_x1, int in_x2)
00176 {
00177 int w;
00178 int h;
00179 unsigned char **in_rows;
00180 unsigned char **out_rows;
00181
00182 if(in_x1 < 0)
00183 {
00184 w = MIN(src->get_w(), dst->get_w());
00185 h = MIN(dst->get_h(), src->get_h());
00186 in_x1 = 0;
00187 in_x2 = w;
00188 }
00189 else
00190 {
00191 w = in_x2 - in_x1;
00192 h = MIN(dst->get_h(), src->get_h());
00193 }
00194 in_rows = src->get_rows();
00195 out_rows = dst->get_rows();
00196
00197 switch(src->get_color_model())
00198 {
00199 case BC_RGBA8888:
00200 switch(dst->get_color_model())
00201 {
00202 case BC_RGBA8888:
00203 for(int i = 0; i < h; i++)
00204 {
00205 unsigned char *in_row = in_rows[i] + in_x1 * 4;
00206 unsigned char *out_row = out_rows[i];
00207 for(int j = 0; j < w; j++)
00208 {
00209 int opacity = in_row[3];
00210 int transparency = 0xff - opacity;
00211 out_row[0] = (in_row[0] * opacity + out_row[0] * transparency) / 0xff;
00212 out_row[1] = (in_row[1] * opacity + out_row[1] * transparency) / 0xff;
00213 out_row[2] = (in_row[2] * opacity + out_row[2] * transparency) / 0xff;
00214 out_row[3] = MAX(in_row[3], out_row[3]);
00215 out_row += 4;
00216 in_row += 4;
00217 }
00218 }
00219 break;
00220 case BC_RGB888:
00221 for(int i = 0; i < h; i++)
00222 {
00223 unsigned char *in_row = in_rows[i] + in_x1 * 4;
00224 unsigned char *out_row = out_rows[i];
00225 for(int j = 0; j < w; j++)
00226 {
00227 int opacity = in_row[3];
00228 int transparency = 0xff - opacity;
00229 out_row[0] = (in_row[0] * opacity + out_row[0] * transparency) / 0xff;
00230 out_row[1] = (in_row[1] * opacity + out_row[1] * transparency) / 0xff;
00231 out_row[2] = (in_row[2] * opacity + out_row[2] * transparency) / 0xff;
00232 out_row += 3;
00233 in_row += 4;
00234 }
00235 }
00236 break;
00237 }
00238 break;
00239 }
00240 }
00241
00242 void Theme::build_transport(char *title,
00243 unsigned char *png_overlay,
00244 VFrame **bg_data,
00245 int third)
00246 {
00247 if(!png_overlay) return;
00248 VFrame default_data(png_overlay);
00249 VFrame *data[3];
00250 data[0] = new VFrame(0, default_data.get_w(), default_data.get_h(), BC_RGBA8888);
00251 data[1] = new VFrame(0, default_data.get_w(), default_data.get_h(), BC_RGBA8888);
00252 data[2] = new VFrame(0, default_data.get_w(), default_data.get_h(), BC_RGBA8888);
00253 data[0]->clear_frame();
00254 data[1]->clear_frame();
00255 data[2]->clear_frame();
00256
00257 for(int i = 0; i < 3; i++)
00258 {
00259 int in_x1;
00260 int in_x2;
00261 if(!bg_data[i]) break;
00262
00263 switch(third)
00264 {
00265 case 0:
00266 in_x1 = 0;
00267 in_x2 = default_data.get_w();
00268 break;
00269
00270 case 1:
00271 in_x1 = (int)(bg_data[i]->get_w() * 0.33);
00272 in_x2 = in_x1 + default_data.get_w();
00273 break;
00274
00275 case 2:
00276 in_x1 = bg_data[i]->get_w() - default_data.get_w();
00277 in_x2 = in_x1 + default_data.get_w();
00278 break;
00279 }
00280
00281 overlay(data[i],
00282 bg_data[i],
00283 in_x1,
00284 in_x2);
00285 overlay(data[i],
00286 &default_data);
00287 }
00288
00289 new_image_set_images(title, 3, data[0], data[1], data[2]);
00290 }
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300 void Theme::build_patches(VFrame** &data,
00301 unsigned char *png_overlay,
00302 VFrame **bg_data,
00303 int region)
00304 {
00305 if(!png_overlay || !bg_data) return;
00306 VFrame default_data(png_overlay);
00307 data = new VFrame*[5];
00308 data[0] = new VFrame(0, default_data.get_w(), default_data.get_h(), BC_RGBA8888);
00309 data[1] = new VFrame(0, default_data.get_w(), default_data.get_h(), BC_RGBA8888);
00310 data[2] = new VFrame(0, default_data.get_w(), default_data.get_h(), BC_RGBA8888);
00311 data[3] = new VFrame(0, default_data.get_w(), default_data.get_h(), BC_RGBA8888);
00312 data[4] = new VFrame(0, default_data.get_w(), default_data.get_h(), BC_RGBA8888);
00313
00314 for(int i = 0; i < 5; i++)
00315 {
00316 int in_x1;
00317 int in_x2;
00318
00319 switch(region)
00320 {
00321 case 0:
00322 in_x1 = 0;
00323 in_x2 = default_data.get_w();
00324 break;
00325
00326 case 1:
00327 in_x1 = (int)(bg_data[i]->get_w() * 0.33);
00328 in_x2 = in_x1 + default_data.get_w();
00329 break;
00330
00331 case 2:
00332 in_x1 = bg_data[i]->get_w() - default_data.get_w();
00333 in_x2 = in_x1 + default_data.get_w();
00334 break;
00335 }
00336
00337 overlay(data[i],
00338 bg_data[i]);
00339 overlay(data[i],
00340 &default_data);
00341 }
00342 }
00343
00344
00345
00346
00347
00348
00349
00350
00351 void Theme::build_button(VFrame** &data,
00352 unsigned char *png_overlay,
00353 VFrame *up_vframe,
00354 VFrame *hi_vframe,
00355 VFrame *dn_vframe)
00356 {
00357 if(!png_overlay) return;
00358 VFrame default_data(png_overlay);
00359
00360 if(!up_vframe || !hi_vframe || !dn_vframe) return;
00361 data = new VFrame*[3];
00362 data[0] = new VFrame(0, default_data.get_w(), default_data.get_h(), BC_RGBA8888);
00363 data[1] = new VFrame(0, default_data.get_w(), default_data.get_h(), BC_RGBA8888);
00364 data[2] = new VFrame(0, default_data.get_w(), default_data.get_h(), BC_RGBA8888);
00365 data[0]->copy_from(up_vframe);
00366 data[1]->copy_from(hi_vframe);
00367 data[2]->copy_from(dn_vframe);
00368 for(int i = 0; i < 3; i++)
00369 overlay(data[i],
00370 &default_data);
00371 }
00372
00373 void Theme::build_toggle(VFrame** &data,
00374 unsigned char *png_overlay,
00375 VFrame *up_vframe,
00376 VFrame *hi_vframe,
00377 VFrame *checked_vframe,
00378 VFrame *dn_vframe,
00379 VFrame *checkedhi_vframe)
00380 {
00381 if(!png_overlay ||
00382 !up_vframe ||
00383 !hi_vframe ||
00384 !checked_vframe ||
00385 !dn_vframe ||
00386 !checkedhi_vframe) return;
00387 VFrame default_data(png_overlay);
00388 data = new VFrame*[5];
00389 data[0] = new VFrame(0, default_data.get_w(), default_data.get_h(), BC_RGBA8888);
00390 data[1] = new VFrame(0, default_data.get_w(), default_data.get_h(), BC_RGBA8888);
00391 data[2] = new VFrame(0, default_data.get_w(), default_data.get_h(), BC_RGBA8888);
00392 data[3] = new VFrame(0, default_data.get_w(), default_data.get_h(), BC_RGBA8888);
00393 data[4] = new VFrame(0, default_data.get_w(), default_data.get_h(), BC_RGBA8888);
00394 data[0]->copy_from(up_vframe);
00395 data[1]->copy_from(hi_vframe);
00396 data[2]->copy_from(checked_vframe);
00397 data[3]->copy_from(dn_vframe);
00398 data[4]->copy_from(checkedhi_vframe);
00399 for(int i = 0; i < 5; i++)
00400 overlay(data[i],
00401 &default_data);
00402 }
00403
00404 #define TIMEBAR_HEIGHT 10
00405 #define PATCHBAY_W 145
00406 #define STATUS_H 20
00407 #define ZOOM_H 30
00408
00409 void Theme::get_mwindow_sizes(MWindowGUI *gui, int w, int h)
00410 {
00411 }
00412
00413 void Theme::draw_mwindow_bg(MWindowGUI *gui)
00414 {
00415 }
00416
00417
00418
00419
00420 void Theme::draw_awindow_bg(AWindowGUI *gui)
00421 {
00422 gui->clear_box(0, 0, mwindow->session->awindow_w, mwindow->session->awindow_h);
00423 gui->flash();
00424 }
00425
00426 void Theme::draw_vwindow_bg(VWindowGUI *gui)
00427 {
00428
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438
00439 }
00440
00441
00442 void Theme::draw_cwindow_bg(CWindowGUI *gui)
00443 {
00444 gui->clear_box(0, 0, mwindow->session->cwindow_w, mwindow->session->cwindow_h);
00445 gui->flash();
00446 }
00447
00448 void Theme::draw_lwindow_bg(LevelWindowGUI *gui)
00449 {
00450 gui->clear_box(0, 0, mwindow->session->lwindow_w, mwindow->session->lwindow_h);
00451 gui->flash();
00452 }
00453
00454
00455 void Theme::draw_rmonitor_bg(RecordMonitorGUI *gui)
00456 {
00457 gui->clear_box(0, 0, mwindow->session->rmonitor_w, mwindow->session->rmonitor_h);
00458 gui->flash();
00459 }
00460
00461
00462 void Theme::draw_rwindow_bg(RecordGUI *gui)
00463 {
00464 gui->clear_box(0, 0, mwindow->session->rwindow_w, mwindow->session->rwindow_h);
00465 }
00466
00467
00468 void Theme::draw_resource_bg(TrackCanvas *canvas,
00469 ResourcePixmap *pixmap,
00470 int edit_x,
00471 int edit_w,
00472 int pixmap_x,
00473 int x1,
00474 int y1,
00475 int x2,
00476 int y2)
00477 {
00478 VFrame *image;
00479
00480 switch(mwindow->edl->local_session->zoom_track)
00481 {
00482 case 1024: image = get_image("resource1024"); break;
00483 case 512: image = get_image("resource512"); break;
00484 case 256: image = get_image("resource256"); break;
00485 case 128: image = get_image("resource128"); break;
00486 case 64: image = get_image("resource64"); break;
00487 default:
00488 case 32: image = get_image("resource32"); break;
00489 }
00490
00491 canvas->draw_3segmenth(x1,
00492 y1,
00493 x2 - x1,
00494 edit_x - pixmap_x,
00495 edit_w,
00496 image,
00497 pixmap);
00498 }
00499
00500 void Theme::get_vwindow_sizes(VWindowGUI *gui)
00501 {
00502 }
00503
00504 void Theme::get_cwindow_sizes(CWindowGUI *gui, int cwindow_controls)
00505 {
00506 }
00507
00508 void Theme::get_awindow_sizes(AWindowGUI *gui)
00509 {
00510 abuttons_x = 0;
00511 abuttons_y = 0;
00512 afolders_x = 0;
00513
00514 afolders_y = 0;
00515 afolders_w = mwindow->session->afolders_w;
00516 afolders_h = mwindow->session->awindow_h - afolders_y;
00517 adivider_x = afolders_x + afolders_w;
00518 adivider_y = 0;
00519 adivider_w = 5;
00520 adivider_h = afolders_h;
00521 alist_x = afolders_x + afolders_w + 5;
00522 alist_y = afolders_y;
00523 alist_w = mwindow->session->awindow_w - alist_x;
00524 alist_h = afolders_h;
00525 }
00526
00527 void Theme::get_rmonitor_sizes(int do_audio,
00528 int do_video,
00529 int do_channel,
00530 int do_interlace,
00531 int do_avc,
00532 int audio_channels)
00533 {
00534 int x = 10;
00535 int y = 3;
00536
00537
00538 if(do_avc)
00539 {
00540 rmonitor_canvas_y = 30;
00541 rmonitor_tx_x = 10;
00542 rmonitor_tx_y = 0;
00543 }
00544 else
00545 {
00546 rmonitor_canvas_y = 0;
00547 rmonitor_tx_x = 0;
00548 rmonitor_tx_y = 0;
00549 }
00550
00551
00552 if(do_channel)
00553 {
00554 y = 5;
00555 rmonitor_channel_x = x;
00556 rmonitor_channel_y = 5;
00557 x += 235;
00558 rmonitor_canvas_y = 35;
00559 }
00560
00561 if(do_interlace)
00562 {
00563 y = 4;
00564 rmonitor_interlace_x = x;
00565 rmonitor_interlace_y = y;
00566 }
00567
00568
00569 if(do_audio)
00570 {
00571 rmonitor_meter_x = mwindow->session->rmonitor_w - MeterPanel::get_meters_width(audio_channels, 1);
00572 rmonitor_meter_y = 40;
00573 rmonitor_meter_h = mwindow->session->rmonitor_h - 10 - rmonitor_meter_y;
00574 }
00575 else
00576 {
00577 rmonitor_meter_x = mwindow->session->rmonitor_w;
00578 }
00579
00580 rmonitor_canvas_x = 0;
00581 rmonitor_canvas_w = rmonitor_meter_x - rmonitor_canvas_x;
00582 if(do_audio) rmonitor_canvas_w -= 10;
00583 rmonitor_canvas_h = mwindow->session->rmonitor_h - rmonitor_canvas_y;
00584 }
00585
00586 void Theme::get_recordgui_sizes(RecordGUI *gui, int w, int h)
00587 {
00588 }
00589
00590 void Theme::get_batchrender_sizes(BatchRenderGUI *gui,
00591 int w,
00592 int h)
00593 {
00594 batchrender_x1 = 5;
00595 batchrender_x2 = 300;
00596 batchrender_x3 = 400;
00597 }
00598
00599 void Theme::get_plugindialog_sizes()
00600 {
00601 int x = 10, y = 30;
00602 plugindialog_new_x = x;
00603 plugindialog_new_y = y;
00604 plugindialog_shared_x = mwindow->session->plugindialog_w / 3;
00605 plugindialog_shared_y = y;
00606 plugindialog_module_x = mwindow->session->plugindialog_w * 2 / 3;
00607 plugindialog_module_y = y;
00608
00609 plugindialog_new_w = plugindialog_shared_x - plugindialog_new_x - 10;
00610 plugindialog_new_h = mwindow->session->plugindialog_h - 110;
00611 plugindialog_shared_w = plugindialog_module_x - plugindialog_shared_x - 10;
00612 plugindialog_shared_h = mwindow->session->plugindialog_h - 110;
00613 plugindialog_module_w = mwindow->session->plugindialog_w - plugindialog_module_x - 10;
00614 plugindialog_module_h = mwindow->session->plugindialog_h - 110;
00615
00616 plugindialog_newattach_x = plugindialog_new_x + 20;
00617 plugindialog_newattach_y = plugindialog_new_y + plugindialog_new_h + 10;
00618 plugindialog_sharedattach_x = plugindialog_shared_x + 20;
00619 plugindialog_sharedattach_y = plugindialog_shared_y + plugindialog_shared_h + 10;
00620 plugindialog_moduleattach_x = plugindialog_module_x + 20;
00621 plugindialog_moduleattach_y = plugindialog_module_y + plugindialog_module_h + 10;
00622 }
00623
00624 void Theme::get_menueffect_sizes(int use_list)
00625 {
00626 if(use_list)
00627 {
00628 menueffect_list_x = 10;
00629 menueffect_list_y = 10;
00630 menueffect_list_w = mwindow->session->menueffect_w - 400;
00631 menueffect_list_h = mwindow->session->menueffect_h -
00632 menueffect_list_y -
00633 BC_OKButton::calculate_h() - 10;
00634 }
00635 else
00636 {
00637 menueffect_list_x = 0;
00638 menueffect_list_y = 10;
00639 menueffect_list_w = 0;
00640 menueffect_list_h = 0;
00641 }
00642
00643 menueffect_file_x = menueffect_list_x + menueffect_list_w + 10;
00644 menueffect_file_y = 10;
00645
00646 menueffect_tools_x = menueffect_file_x;
00647 menueffect_tools_y = menueffect_file_y + 20;
00648 }
00649
00650 void Theme::get_preferences_sizes()
00651 {
00652 }
00653
00654 void Theme::draw_preferences_bg(PreferencesWindow *gui)
00655 {
00656 }
00657
00658 void Theme::get_new_sizes(NewWindow *gui)
00659 {
00660 }
00661
00662 void Theme::draw_new_bg(NewWindow *gui)
00663 {
00664 }
00665
00666 void Theme::draw_setformat_bg(SetFormatWindow *window)
00667 {
00668 }
00669
00670
00671
00672
00673
00674
00675