#include "bctimer.h"
#include "clip.h"
#include "bccolors.h"
+#include "cache.h"
+#include "canvas.h"
#include "cplayback.h"
#include "cursors.h"
#include "cwindowgui.h"
#include "pluginset.h"
#include "plugintoggles.h"
#include "preferences.h"
+#include "renderengine.h"
#include "resourcepixmap.h"
#include "resourcethread.h"
#include "swindow.h"
#include "transportque.h"
#include "vframe.h"
#include "vpatchgui.inc"
+#include "vrender.h"
#include "zoombar.h"
#include <string.h>
int64_t &x, int64_t &y, int64_t &w, int64_t &h)
{
int transition_w = 30, transition_h = 30;
-
- if( edit->track->show_titles() )
- y += mwindow->theme->get_image("title_bg_data")->get_h();
- if( edit->track->show_assets() )
- y += resource_h() / 2;
+ int has_titles = edit->track->show_titles();
+ int has_assets = edit->track->show_assets();
+ double title_bg_h = mwindow->theme->get_image("title_bg_data")->get_h();
+ double asset_h = resource_h();
+ double ys = has_assets ? asset_h : has_titles ? title_bg_h : 0;
+ double dy = has_titles ?
+ ( has_assets ? title_bg_h + asset_h/2 : title_bg_h/2 ) :
+ ( has_assets ? asset_h/2 : 0) ;
+ double title_h = mwindow->theme->title_h;
+ if( dy < title_h / 2 ) { ys = title_h; dy = ys / 2; }
+ y += dy;
x -= transition_w / 2;
y -= transition_h / 2;
for(Edit *edit = track->edits->first; edit; edit = edit->next) {
if(!edit->transition) continue;
edit_dimensions(edit, x, y, w, h);
- int strip_x = x, strip_y = y;
- if( track->show_titles() )
- strip_y += mwindow->theme->get_image("title_bg_data")->get_h();
+ int strip_x = x, edit_y = y;
get_transition_coords(edit, x, y, w, h);
+ int strip_y = y - mwindow->theme->get_image("plugin_bg_data")->get_h();
+ if( track->show_assets() && track->show_titles() )
+ edit_y += mwindow->theme->get_image("title_bg_data")->get_h();
+ if( strip_y < edit_y ) strip_y = edit_y;
+
int strip_w = Units::round(edit->track->from_units(edit->transition->length) *
mwindow->edl->session->sample_rate / mwindow->edl->local_session->zoom_sample);
if( MWindowGUI::visible(x, x + w, 0, get_w()) &&
- MWindowGUI::visible(y, y + h, 0, get_h()) )
- {
+ MWindowGUI::visible(y, y + h, 0, get_h()) ) {
PluginServer *server = mwindow->scan_plugindb(edit->transition->title,
track->data_type);
if( !server ) continue;
VFrame *picon = server->get_picon();
if( !picon ) continue;
- draw_vframe(picon, x, y, w, h, 0, 0, picon->get_w(), picon->get_h());
+ int picon_w = picon->get_w(), picon_h = picon->get_h();
+ int track_h = edit->track->vertical_span(mwindow->theme);
+ if( picon_h > track_h ) picon_h = track_h;
+ draw_vframe(picon, x, y, w, h, 0, 0, picon_w, picon_h);
}
if(MWindowGUI::visible(strip_x, strip_x + strip_w, 0, get_w()) &&
- MWindowGUI::visible(strip_y, strip_y + h, 0, get_h()))
- {
+ MWindowGUI::visible(strip_y, strip_y + h, 0, get_h())) {
int x = strip_x, w = strip_w;
- if(x < 0)
- {
- w -= -x;
- x = 0;
- }
- if(w + x > get_w()) w -= (w + x) - get_w();
+ if( x < 0 ) { w -= -x; x = 0; }
+ if( w + x > get_w() ) w -= (w + x) - get_w();
draw_3segmenth( x, strip_y, w, strip_x, strip_w,
mwindow->theme->get_image("plugin_bg_data"), 0);
double &zoom_sample,
double &zoom_units)
{
+
view_start = (double)mwindow->edl->local_session->view_start[pane->number] *
mwindow->edl->local_session->zoom_sample /
mwindow->edl->session->sample_rate;
mwindow->edl->local_session->zoom_sample /
mwindow->edl->session->sample_rate;
unit_end = track->to_doubleunits(view_end);
- yscale = resource_h();
- center_pixel = track->y_pixel
+
+ int y = track->y_pixel
- mwindow->edl->local_session->track_start[pane->number];
- if( track->show_assets() )
- center_pixel += yscale / 2;
- if( track->show_titles() )
- center_pixel += mwindow->theme->get_image("title_bg_data")->get_h();
- zoom_sample = mwindow->edl->local_session->zoom_sample;
+ int has_titles = track->show_titles();
+ int has_assets = track->show_assets();
+ double title_bg_h = mwindow->theme->get_image("title_bg_data")->get_h();
+ double asset_h = resource_h();
+ double title_h = mwindow->theme->title_h;
+ double ys = has_assets ? asset_h : has_titles ? title_bg_h : 0;
+ double dy = has_titles ?
+ ( has_assets ? title_bg_h + asset_h/2 : title_bg_h/2) :
+ ( has_assets ? asset_h/2 : 0) ;
+ if( dy < title_h/2 ) { ys = title_h; dy = ys / 2; }
+ yscale = ys;
+ center_pixel = y + dy;
+ zoom_sample = mwindow->edl->local_session->zoom_sample;
zoom_units = track->to_doubleunits(zoom_sample / mwindow->edl->session->sample_rate);
}
{
mwindow->session->drag_position = new_position;
gui->mainclock->update(new_position);
-
-
timebar_position = new_position;
gui->update_timebar(0);
-// Que the CWindow. Doesn't do anything if selectionstart and selection end
-// aren't changed.
-// mwindow->cwindow->update(1, 0, 0);
+
+ EDL *edl = new EDL;
+ edl->create_objects();
+ edl->copy_all(mwindow->edl);
+ MainSession *session = mwindow->session;
+ int edit_mode = mwindow->edl->session->edit_handle_mode[session->drag_button];
+ edl->modify_edithandles(session->drag_start,
+ session->drag_position,
+ session->drag_handle,
+ edit_mode,
+ edl->session->labels_follow_edits,
+ edl->session->plugins_follow_edits,
+ edl->session->autos_follow_edits);
+ double position = edit_mode != MOVE_NO_EDITS &&
+ ( session->drag_handle || edit_mode == MOVE_ONE_EDIT ) ?
+ session->drag_position : session->drag_start;
+ Track *track = session->drag_handle_track();
+ int64_t pos = track->to_units(position, 0);
+ render_handle_frame(edl, pos, shift_down() ? 0 :
+ session->drag_handle ? 1 : 2);
+ edl->remove_user();
+ }
+}
+
+int TrackCanvas::render_handle_frame(EDL *edl, int64_t pos, int mode)
+{
+ int result = 0;
+ int64_t left = pos-1;
+ if( left < 0 ) left = 0;
+ switch( mode ) {
+ case 0: {
+ VFrame vlt(edl->get_w(), edl->get_h(), edl->session->color_model);
+ VFrame vrt(edl->get_w(), edl->get_h(), edl->session->color_model);
+ TransportCommand command;
+ command.command = CURRENT_FRAME;
+ command.get_edl()->copy_all((EDL *)edl);
+ command.change_type = CHANGE_ALL;
+ command.realtime = 0;
+ Preferences *preferences = mwindow->preferences;
+ RenderEngine *render_engine = new RenderEngine(0, preferences, 0, 0);
+ CICache *video_cache = new CICache(preferences);
+ render_engine->set_vcache(video_cache);
+ render_engine->arm_command(&command);
+ int64_t left = pos-1;
+ if( left < 0 ) left = 0;
+ VRender *vrender = render_engine->vrender;
+ result = vrender &&
+ !vrender->process_buffer(&vlt, left, 0) &&
+ !vrender->process_buffer(&vrt, pos , 0) ? 0 : 1;
+ delete render_engine;
+ delete video_cache;
+ mwindow->cwindow->gui->lock_window("TrackCanvas::render_handle_frame 0");
+ Canvas *canvas = mwindow->cwindow->gui->canvas;
+ canvas->lock_canvas("TrackCanvas::render_handle_frame 1");
+ int w = canvas->w, h = canvas->h, w2 = w/2, h2 = h/2;
+ int lx = 0, ly = h2/2, rx = w2, ry = h2/2;
+ BC_WindowBase *window = canvas->get_canvas();
+ window->set_color(BLACK);
+ window->clear_box(0,0, window->get_w(),window->get_h());
+ window->draw_vframe(&vlt, lx,ly, w2,h2, 0,0,vlt.get_w(),vlt.get_h());
+ window->draw_vframe(&vrt, rx,ry, w2,h2, 0,0,vrt.get_w(),vrt.get_h());
+ window->flash(1);
+ canvas->unlock_canvas();
+ mwindow->cwindow->gui->unlock_window();
+ break; }
+ case 1:
+ case 2: {
+ Track *track = mwindow->session->drag_handle_track();
+ double position = track->from_units(mode == 1 ? left : pos);
+ if( position < 0 ) position = 0;
+ edl->local_session->set_selectionstart(position);
+ edl->local_session->set_selectionend(position);
+ PlaybackEngine *playback_engine = mwindow->cwindow->playback_engine;
+ if( playback_engine->is_playing_back )
+ playback_engine->stop_playback(1);
+ mwindow->cwindow->playback_engine->refresh_frame(CHANGE_EDL, edl, 0);
+ break; }
}
+ return result;
}
int TrackCanvas::update_drag_edit()
int result = 0;
for( Track *track=mwindow->edl->tracks->first; track && !result; track=track->next) {
- if( !track->show_assets() ) continue;
-
for( Edit *edit=track->edits->first; edit && !result; edit=edit->next ) {
int64_t edit_x, edit_y, edit_w, edit_h;
edit_dimensions(edit, edit_x, edit_y, edit_w, edit_h);
if( cursor_x < edit_x + HANDLE_W ) {
edit_result = edit;
handle_result = 0;
- if( cursor_y >= edit_y+edit_h - HANDLE_W ) {
+ if( cursor_y >= edit_y+edit_h - HANDLE_W &&
+ track->show_assets() ) {
new_cursor = DOWNLEFT_RESIZE;
if( button_press == LEFT_BUTTON )
result = -1;
else if( cursor_x >= edit_x + edit_w - HANDLE_W ) {
edit_result = edit;
handle_result = 1;
- if( cursor_y >= edit_y+edit_h - HANDLE_W ) {
+ if( cursor_y >= edit_y+edit_h - HANDLE_W &&
+ track->show_assets() ) {
new_cursor = DOWNRIGHT_RESIZE;
if( button_press == LEFT_BUTTON )
result = -1;
update_overlay = 1;
}
}
- else if( result < 0) {
+ else if( result < 0 ) {
mwindow->undo->update_undo_before();
if( !shift_down() ) {
if( handle_result == 0 )
int result = 0;
for(Track *track = mwindow->edl->tracks->first; track && !result; track = track->next) {
- if( !track->show_assets() ) continue;
-
for(Edit *edit = track->edits->first; edit && !result; edit = edit->next) {
int64_t edit_x, edit_y, edit_w, edit_h;
edit_dimensions(edit, edit_x, edit_y, edit_w, edit_h);