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