X-Git-Url: https://git.cinelerra-gg.org/git/?p=goodguy%2Fcinelerra.git;a=blobdiff_plain;f=cinelerra-5.1%2Fguicast%2Fvicon.C;h=5ebec4852dd3904d1bf6c18b2e1373f6619a5ea0;hp=89b8eb244eab558c659d1c2f3bf0b27a51caf607;hb=6c5258a9791775f706e55c280da75ed6f6ef1720;hpb=8a2d79c16c6793d7d3483e9a74205569228ca0cc diff --git a/cinelerra-5.1/guicast/vicon.C b/cinelerra-5.1/guicast/vicon.C index 89b8eb24..5ebec485 100644 --- a/cinelerra-5.1/guicast/vicon.C +++ b/cinelerra-5.1/guicast/vicon.C @@ -87,6 +87,7 @@ VIcon *VIconThread::low_vicon() void VIconThread::remove_vicon(int i) { + if( t_heap[i] == solo ) solo = 0; int sz = t_heap.size(); for( int k; (k=2*(i+1)) < sz; i=k ) { if( t_heap[k]->age > t_heap[k-1]->age ) --k; @@ -108,12 +109,16 @@ VIconThread(BC_WindowBase *wdw, int vw, int vh, int view_w, int view_h) this->wdw = wdw; this->vw = vw; this->vh = vh; this->view_w = view_w; this->view_h = view_h; - this->view_win = 0; this->vicon = 0; this->viewing = 0; + this->view_win = 0; this->vicon = 0; + this->viewing = 0; this->solo = 0; this->draw_x0 = 0; this->draw_x1 = wdw->get_w(); this->draw_y0 = 0; this->draw_y1 = wdw->get_h(); draw_lock = new Condition(0, "VIconThread::draw_lock", 1); timer = new Timer(); this->refresh_rate = VICON_RATE; + this->draw_flash = 0; + this->seq_no = 0; + this->now = 0; done = 0; interrupted = -1; stop_age = 0; @@ -204,7 +209,7 @@ ViewPopup::~ViewPopup() vt->wdw->set_active_subwindow(0); } -ViewPopup *VIconThread::new_view_window() +ViewPopup *VIconThread::new_view_window(ViewPopup *vpopup) { BC_WindowBase *parent = wdw->get_parent(); XineramaScreenInfo *info = parent->get_xinerama_info(-1); @@ -213,21 +218,14 @@ ViewPopup *VIconThread::new_view_window() int vx = viewing->get_vx(), rx = 0; int vy = viewing->get_vy(), ry = 0; wdw->get_root_coordinates(vx, vy, &rx, &ry); - rx += (rx >= cx ? -view_w : viewing->w); - ry += (ry >= cy ? -view_h : viewing->h); - ViewPopup *vwin = new ViewPopup(this, rx, ry, view_w, view_h); - wdw->set_active_subwindow(vwin); - return vwin; -} - -int ViewPopup::zoom_scale(int dir) -{ - int view_h = vt->view_h + dir*vt->view_h/10 + dir; - bclamp(view_h, 16,512); - vt->view_h = view_h; - vt->view_w = view_h * vt->vw/vt->vh; - vt->stop_viewing(); - return 1; + rx += (rx >= cx ? -view_w+viewing->w/4 : viewing->w-viewing->w/4); + ry += (ry >= cy ? -view_h+viewing->h/4 : viewing->h-viewing->h/4); + if( vpopup ) + vpopup->reposition_window(rx, ry, view_w, view_h); + else + vpopup = new ViewPopup(this, rx, ry, view_w, view_h); + wdw->set_active_subwindow(vpopup); + return vpopup; } @@ -265,7 +263,10 @@ void ViewPopup::draw_vframe(VFrame *frame) void VIconThread::set_view_popup(VIcon *vicon) { + if( viewing == vicon && !this->vicon ) return; this->vicon = vicon; + if( interrupted ) update_view(vicon ? 1 : 0); + } void VIconThread::close_view_popup() @@ -274,21 +275,35 @@ void VIconThread::close_view_popup() } int VIconThread:: -update_view() +update_view(int do_audio) { if( viewing ) viewing->stop_audio(); delete view_win; view_win = 0; if( (viewing=vicon) != 0 ) { - view_win = new_view_window(); + view_win = new_view_window(0); view_win->draw_vframe(viewing->frame()); view_win->flash(0); view_win->show_window(); - vicon->start_audio(); + if( do_audio ) vicon->start_audio(); } wdw->set_active_subwindow(view_win); return 1; } +int VIconThread::zoom_scale(int dir) +{ + if( !viewing || !view_win ) return 0; + int view_h = this->view_h; + view_h += dir*view_h/10 + dir; + bclamp(view_h, 16,512); + this->view_h = view_h; + this->view_w = view_h * vw/vh; + new_view_window(view_win); + view_win->draw_vframe(viewing->frame()); + view_win->flash(1); + return 1; +} + void VIconThread:: draw_images() @@ -333,6 +348,26 @@ void VIconThread::hide_vicons(int v) } } +int VIconThread::show_vicon(VIcon *next) +{ + now = timer->get_difference(); + if( now >= draw_flash ) return 1; + draw(next); + if( !next->seq_no ) { + next->cycle_start = now; + if( next->playing_audio > 0 ) + next->start_audio(); + } + int64_t ref_no = (now - next->cycle_start) / 1000. * refresh_rate; + int count = ref_no - next->seq_no; + if( count < 1 ) count = 1; + ref_no = next->seq_no + count; + next->age = next->cycle_start + 1000. * ref_no / refresh_rate; + if( !next->set_seq_no(ref_no) ) + next->age = now + 1000.; + return 0; +} + void VIconThread:: run() { @@ -342,35 +377,25 @@ run() wdw->lock_window("BC_WindowBase::run 1"); drawing_started(); reset_images(); - int64_t seq_no = 0, now = 0; - int64_t draw_flash = 1000 / refresh_rate; + draw_flash = 1000 / refresh_rate; + seq_no = 0; now = 0; while( !interrupted ) { if( viewing != vicon ) - update_view(); - VIcon *next = low_vicon(); - while( next && next->age < draw_flash ) { - now = timer->get_difference(); - if( now >= draw_flash ) break; - draw(next); - if( !next->seq_no ) { - next->cycle_start = now; - if( next->playing_audio > 0 ) - next->start_audio(); + update_view(1); + if( !solo ) { + VIcon *next = low_vicon(); + while( next && next->age < draw_flash ) { + if( show_vicon(next) ) break; + add_vicon(next); + next = low_vicon(); } - int64_t ref_no = (now - next->cycle_start) / 1000. * refresh_rate; - int count = ref_no - next->seq_no; - if( count < 1 ) count = 1; - ref_no = next->seq_no + count; - next->age = next->cycle_start + 1000. * ref_no / refresh_rate; - if( !next->set_seq_no(ref_no) ) - next->age = now + 1000.; + if( !next ) break; add_vicon(next); - next = low_vicon(); + if( draw_flash < now+1 ) + draw_flash = now+1; } - if( !next ) break; - add_vicon(next); - if( draw_flash < now+1 ) - draw_flash = now+1; + else + show_vicon(solo); wdw->unlock_window(); while( !interrupted ) { now = timer->get_difference(); @@ -390,7 +415,7 @@ run() draw_flash = seq_no * 1000. / refresh_rate; } if( viewing != vicon ) - update_view(); + update_view(1); drawing_stopped(); interrupted = -1; wdw->unlock_window();