X-Git-Url: https://git.cinelerra-gg.org/git/?p=goodguy%2Fcinelerra.git;a=blobdiff_plain;f=cinelerra-5.1%2Fguicast%2Fvicon.C;h=e0b4d1b8f7eb1b57e210b894a97d287262601761;hp=9535aa9ab21af7bc5c0ec115d16f3ebe0076d107;hb=refs%2Fheads%2Fmaster;hpb=8c74789f8c257afa7c356156049eaf9047991a0b diff --git a/cinelerra-5.1/guicast/vicon.C b/cinelerra-5.1/guicast/vicon.C index 9535aa9a..e0b4d1b8 100644 --- a/cinelerra-5.1/guicast/vicon.C +++ b/cinelerra-5.1/guicast/vicon.C @@ -1,3 +1,24 @@ +/* + * CINELERRA + * Copyright (C) 2016-2020 William Morrow + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published + * by the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA + */ + + #include "vicon.h" #include "bctimer.h" @@ -35,8 +56,7 @@ void VIcon:: add_image(VFrame *frm, int ww, int hh, int vcmdl) { VIFrame *vifrm = new VIFrame(ww, hh, vcmdl); - VFrame *img = *vifrm; - img->transfer_from(frm); + vifrm->vfrm->transfer_from(frm); images.append(vifrm); } @@ -209,7 +229,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); @@ -220,9 +240,12 @@ ViewPopup *VIconThread::new_view_window() wdw->get_root_coordinates(vx, vy, &rx, &ry); 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); - ViewPopup *vwin = new ViewPopup(this, rx, ry, view_w, view_h); - wdw->set_active_subwindow(vwin); - return vwin; + 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; } @@ -262,8 +285,7 @@ void VIconThread::set_view_popup(VIcon *vicon) { if( viewing == vicon && !this->vicon ) return; this->vicon = vicon; - if( interrupted ) - update_view(0); + if( interrupted ) update_view(vicon ? 1 : 0); } @@ -277,9 +299,10 @@ 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->draw_vframe(viewing->frame()); + VFrame *vfrm; + if( (viewing=vicon) != 0 && (vfrm=viewing->frame()) != 0 ) { + view_win = new_view_window(0); + view_win->draw_vframe(vfrm); view_win->flash(0); view_win->show_window(); if( do_audio ) vicon->start_audio(); @@ -290,12 +313,16 @@ update_view(int do_audio) int VIconThread::zoom_scale(int dir) { + VFrame *vfrm; + if( !viewing || !view_win || !(vfrm=viewing->frame()) ) 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; - stop_viewing(); + new_view_window(view_win); + view_win->draw_vframe(vfrm); + view_win->flash(1); return 1; } @@ -323,13 +350,14 @@ draw(VIcon *vicon) int draw_img = visible(vicon, x, y); int draw_win = view_win && viewing == vicon ? 1 : 0; if( !draw_img && !draw_win ) return 0; - if( !vicon->frame() ) return 0; + VFrame *vfrm = vicon->frame(); + if( !vfrm ) return 0; if( draw_img ) { vicon->draw_vframe(this, wdw, x, y); img_dirty = 1; } if( draw_win ) { - view_win->draw_vframe(vicon->frame()); + view_win->draw_vframe(vfrm); win_dirty = 1; } return 1; @@ -376,10 +404,10 @@ run() seq_no = 0; now = 0; while( !interrupted ) { if( viewing != vicon ) - update_view(); + update_view(1); if( !solo ) { VIcon *next = low_vicon(); - while( next && next->age < draw_flash ) { + while( !interrupted && next && next->age < draw_flash ) { if( show_vicon(next) ) break; add_vicon(next); next = low_vicon(); @@ -410,7 +438,7 @@ run() draw_flash = seq_no * 1000. / refresh_rate; } if( viewing != vicon ) - update_view(); + update_view(1); drawing_stopped(); interrupted = -1; wdw->unlock_window(); @@ -429,10 +457,11 @@ void VIcon::dump(const char *dir) { mkdir(dir,0777); for( int i=0; ivfrm; + if( !vfrm ) continue; char fn[1024]; sprintf(fn,"%s/img%05d.png",dir,i); printf("\r%s",fn); - VFrame *img = *images[i]; - img->write_png(fn); + vfrm->write_png(fn); } printf("\n"); }