add edit clear submenu/clear hard_edges, fix tessy gl segv, mask toolgui layout,...
authorGood Guy <good1.2guy@gmail.com>
Sun, 23 Jun 2019 02:30:35 +0000 (20:30 -0600)
committerGood Guy <good1.2guy@gmail.com>
Sun, 23 Jun 2019 02:30:35 +0000 (20:30 -0600)
39 files changed:
cinelerra-5.1/cinelerra/cwindowgui.C
cinelerra-5.1/cinelerra/cwindowgui.h
cinelerra-5.1/cinelerra/cwindowtool.C
cinelerra-5.1/cinelerra/cwindowtool.h
cinelerra-5.1/cinelerra/cwindowtool.inc
cinelerra-5.1/cinelerra/edl.C
cinelerra-5.1/cinelerra/edl.h
cinelerra-5.1/cinelerra/mainmenu.C
cinelerra-5.1/cinelerra/mainmenu.h
cinelerra-5.1/cinelerra/mainmenu.inc
cinelerra-5.1/cinelerra/mwindow.h
cinelerra-5.1/cinelerra/mwindowedit.C
cinelerra-5.1/cinelerra/playback3d.C
cinelerra-5.1/cinelerra/tracks.h
cinelerra-5.1/cinelerra/tracksedit.C
cinelerra-5.1/guicast/bctitle.C
cinelerra-5.1/guicast/bctitle.h
cinelerra-5.1/plugins/theme_blond/blondtheme.C
cinelerra-5.1/plugins/theme_blond/data/cwindow_focus.png [new file with mode: 0644]
cinelerra-5.1/plugins/theme_blond_cv/blondcvtheme.C
cinelerra-5.1/plugins/theme_blond_cv/data/cwindow_focus.png [new file with mode: 0644]
cinelerra-5.1/plugins/theme_blue/bluetheme.C
cinelerra-5.1/plugins/theme_blue/data/cwindow_focus.png [new file with mode: 0644]
cinelerra-5.1/plugins/theme_blue_dot/bluedottheme.C
cinelerra-5.1/plugins/theme_blue_dot/data/cwindow_focus.png [new file with mode: 0644]
cinelerra-5.1/plugins/theme_bright/brighttheme.C
cinelerra-5.1/plugins/theme_bright/data/cwindow_focus.png [new file with mode: 0644]
cinelerra-5.1/plugins/theme_cakewalk/cakewalk.C
cinelerra-5.1/plugins/theme_cakewalk/data/cwindow_focus.png [new file with mode: 0644]
cinelerra-5.1/plugins/theme_hulk/data/cwindow_focus.png [new file with mode: 0644]
cinelerra-5.1/plugins/theme_hulk/hulktheme.C
cinelerra-5.1/plugins/theme_neophyte/data/cwindow_focus.png [new file with mode: 0644]
cinelerra-5.1/plugins/theme_neophyte/neophyte.C
cinelerra-5.1/plugins/theme_pinklady/data/cwindow_focus.png [new file with mode: 0644]
cinelerra-5.1/plugins/theme_pinklady/pinkladytheme.C
cinelerra-5.1/plugins/theme_suv/data/cwindow_focus.png [new file with mode: 0644]
cinelerra-5.1/plugins/theme_suv/suv.C
cinelerra-5.1/plugins/theme_unflat/data/cwindow_focus.png [new file with mode: 0644]
cinelerra-5.1/plugins/theme_unflat/unflattheme.C

index af778e5..1825191 100644 (file)
@@ -129,6 +129,7 @@ CWindowGUI::~CWindowGUI()
        delete zoom_panel;
        delete active;
        delete inactive;
+       delete focus_frame;
        delete orig_mask_keyframe;
 }
 
@@ -139,6 +140,7 @@ void CWindowGUI::create_objects()
 
        active = new BC_Pixmap(this, mwindow->theme->get_image("cwindow_active"));
        inactive = new BC_Pixmap(this, mwindow->theme->get_image("cwindow_inactive"));
+       focus_frame = new VFramePng(mwindow->theme->get_image_data("cwindow_focus.png"));
 
        mwindow->theme->get_cwindow_sizes(this, mwindow->session->cwindow_controls);
        mwindow->theme->draw_cwindow_bg(this);
@@ -1798,12 +1800,39 @@ int CWindowCanvas::do_mask(int &redraw, int &rerender,
                        output_to_canvas(mwindow->edl, 0, fx, fy);
                        float r = bmax(cvs_win->get_w(), cvs_win->get_h());
                        float d = 0.005*r;
+#if 1
+                       int fw = 2*d+3, fh = fw;
+                       VFrame focus(fw,fh, BC_RGBA8888);
+                       focus.transfer_from(gui->focus_frame);
+                       fx -= fw/2.f;  fy -= fh/2.f;
+                       BC_Pixmap focus_pixmap(cvs_win, &focus, PIXMAP_ALPHA);
+                       cvs_win->draw_pixmap(&focus_pixmap,fx,fy);
+#else
                        cvs_win->set_line_width((int)(0.0025*r) + 1);
                        cvs_win->set_color(BLUE);
                        cvs_win->draw_line(fx-d,fy-d, fx+d, fy+d);
                        cvs_win->draw_line(fx-d,fy+d, fx+d, fy-d);
                        cvs_win->set_line_width(0);
                        cvs_win->set_color(WHITE);
+#endif
+               }
+               if( draw && mask_gui && mask_gui->center_mark && points.size() ) {
+                       float cx = 0, cy = 0;
+                       int n = points.size();
+                       for( int i=0; i<n; ++i ) {
+                               MaskPoint *point = points.get(i);
+                               cx += point->x;  cy += point->y;
+                       }
+                       cx /= n;  cy /= n;
+                       output_to_canvas(mwindow->edl, 0, cx, cy);
+                       float r = bmax(cvs_win->get_w(), cvs_win->get_h());
+                       float d = 0.003*r;
+                       cvs_win->set_line_width((int)(0.002*r) + 1);
+                       cvs_win->set_color(ORANGE);
+                       cvs_win->draw_line(cx-d,cy, cx+d, cy);
+                       cvs_win->draw_line(cx,cy-d, cx, cy+d);
+                       cvs_win->set_line_width(0);
+                       cvs_win->set_color(WHITE);
                }
 //printf("CWindowCanvas::do_mask 1\n");
        }
@@ -2122,6 +2151,8 @@ int CWindowCanvas::do_mask(int &redraw, int &rerender,
                                        point->control_x2 = !rotate ? px*scale : px*ct + py*st;
                                        point->control_y2 = !rotate ? py*scale : py*ct - px*st;
                                }
+                               rerender = 1;
+                               redraw = 1;
                                break; }
                        }
 
index 83b9243..f2ae71c 100644 (file)
@@ -101,6 +101,7 @@ public:
        CTimeBar *timebar;
        BC_Pixmap *active;
        BC_Pixmap *inactive;
+       VFrame *focus_frame;
 //     MainClock *clock;
 
 
index 65cb610..d3d0b49 100644 (file)
@@ -1482,6 +1482,18 @@ int CWindowProjectorBottom::handle_event()
 }
 
 
+CWindowMaskTrack::CWindowMaskTrack(MWindow *mwindow, CWindowMaskGUI *gui,
+               int x, int y, const char *text)
+ : BC_Title(x, y, text, MEDIUMFONT, get_resources()->button_highlighted)
+{
+       this->mwindow = mwindow;
+       this->gui = gui;
+}
+
+CWindowMaskTrack::~CWindowMaskTrack()
+{
+}
+
 CWindowMaskName::CWindowMaskName(MWindow *mwindow, CWindowMaskGUI *gui,
                int x, int y, const char *text)
  : BC_PopupTextBox(gui, 0, text, x, y, 100, 160)
@@ -1787,7 +1799,7 @@ CWindowMaskFocus::CWindowMaskFocus(MWindow *mwindow, CWindowToolGUI *gui, int x,
 {
        this->mwindow = mwindow;
        this->gui = gui;
-       set_tooltip("Center for rotate/scale");
+       set_tooltip(_("Center for rotate/scale"));
 }
 
 CWindowMaskFocus::~CWindowMaskFocus()
@@ -1802,6 +1814,26 @@ int CWindowMaskFocus::handle_event()
        return 1;
 }
 
+CWindowMaskDrawCenter::CWindowMaskDrawCenter(MWindow *mwindow, CWindowToolGUI *gui, int x, int y)
+ : BC_CheckBox(x, y, ((CWindowMaskGUI*)gui)->center_mark, _("Center Mark"))
+{
+       this->mwindow = mwindow;
+       this->gui = gui;
+       set_tooltip(_("show center of mask points"));
+}
+
+CWindowMaskDrawCenter::~CWindowMaskDrawCenter()
+{
+}
+
+int CWindowMaskDrawCenter::handle_event()
+{
+       ((CWindowMaskGUI*)gui)->center_mark = get_value();
+       gui->update();
+       gui->update_preview();
+       return 1;
+}
+
 CWindowMaskDrawMarkers::CWindowMaskDrawMarkers(MWindow *mwindow, CWindowToolGUI *gui, int x, int y)
  : BC_CheckBox(x, y, ((CWindowMaskGUI*)gui)->markers, _("Markers"))
 {
@@ -2220,7 +2252,7 @@ int CWindowMaskGangFeather::handle_event()
 
 CWindowMaskGUI::CWindowMaskGUI(MWindow *mwindow, CWindowTool *thread)
  : CWindowToolGUI(mwindow, thread,
-       _(PROGRAM_NAME ": Mask"), 360, 500)
+       _(PROGRAM_NAME ": Mask"), 360, 620)
 {
        this->mwindow = mwindow;
        this->thread = thread;
@@ -2228,6 +2260,7 @@ CWindowMaskGUI::CWindowMaskGUI(MWindow *mwindow, CWindowTool *thread)
        fade = 0;
        feather = 0;
        focused = 0;
+       center_mark = 0;
        markers = 1;
        boundary = 1;
 }
@@ -2251,9 +2284,16 @@ void CWindowMaskGUI::create_objects()
        //      keyframe = (MaskAuto*)mwindow->cwindow->calculate_affected_auto(track->automation->autos[AUTOMATION_MASK], 0);
 
        lock_window("CWindowMaskGUI::create_objects");
+       BC_TitleBar *title_bar;
+       add_subwindow(title_bar = new BC_TitleBar(x, y, get_w()-2*x, 20, 10, _("Masks on Track")));
+       y += title_bar->get_h() + margin;
+       int x1 = x + 70;
+       add_subwindow(mask_track = new CWindowMaskTrack(mwindow, this, x1, y, ""));
+       y += mask_track->get_h() + margin;
+       add_subwindow(title_bar = new BC_TitleBar(x, y, get_w()-2*x, 20, 10, _("Masks")));
+       y += title_bar->get_h() + margin;
        BC_Title *title;
        add_subwindow(title = new BC_Title(x, y, _("Mask:")));
-       int x1 = x + 70;
        name = new CWindowMaskName(mwindow, this, x1, y, "");
        name->create_objects();
        add_subwindow(clr_mask = new CWindowMaskClrMask(mwindow, this, clr_x, y));
@@ -2279,7 +2319,9 @@ void CWindowMaskGUI::create_objects()
                mask_blabels[i] = new BC_Title(x2+tx, y, text);
                add_subwindow(mask_blabels[i]);
        }
-       y += bh + 2*margin;
+       y += mask_blabels[0]->get_h() + 2*margin;
+       add_subwindow(title_bar = new BC_TitleBar(x, y, get_w()-2*x, 20, 10, _("Fade & Feather")));
+       y += title_bar->get_h() + margin;
 
        add_subwindow(title = new BC_Title(x, y, _("Fade:")));
        fade = new CWindowMaskFade(mwindow, this, x1, y);
@@ -2296,7 +2338,9 @@ void CWindowMaskGUI::create_objects()
        feather_slider = new CWindowMaskFeatherSlider(mwindow, this, x2, y, w2, 0);
        add_subwindow(feather_slider);
        add_subwindow(gang_feather = new CWindowMaskGangFeather(mwindow, this, clr_x, y));
-       y += feather->get_h() + 3*margin;
+       y += feather->get_h() + 2*margin;
+       add_subwindow(title_bar = new BC_TitleBar(x, y, get_w()-2*x, 20, 10, _("Mask Points")));
+       y += title_bar->get_h() + margin;
 
        add_subwindow(title = new BC_Title(x, y, _("Point:")));
        active_point = new CWindowMaskAffectedPoint(mwindow, this, x1, y);
@@ -2312,10 +2356,9 @@ void CWindowMaskGUI::create_objects()
        this->y = new CWindowCoord(this, x1, y, (float)0.0);
        this->y->create_objects();
        add_subwindow(draw_boundary = new CWindowMaskDrawBoundary(mwindow, this, del_x, y));
-       y += this->y->get_h() + margin;
-       BC_Bar *bar;
-       add_subwindow(bar = new BC_Bar(x, y, get_w()-2*x));
-       y += bar->get_h() + margin;
+       y += this->y->get_h() + 2*margin;
+       add_subwindow(title_bar = new BC_TitleBar(x, y, get_w()-2*x, 20, 10, _("Pivot Point")));
+       y += title_bar->get_h() + margin;
 
        add_subwindow(title = new BC_Title(x, y, "X:"));
        focus_x = new CWindowCoord(this, x1, y, (float)0.0);
@@ -2325,7 +2368,11 @@ void CWindowMaskGUI::create_objects()
        add_subwindow(title = new BC_Title(x, y, "Y:"));
        focus_y = new CWindowCoord(this, x1, y, (float)0.0);
        focus_y->create_objects();
-       y += focus_x->get_h() + margin;
+       add_subwindow(draw_center = new CWindowMaskDrawCenter(mwindow, this, del_x, y));
+       y += focus_x->get_h() + 2*margin;
+       BC_Bar *bar;
+       add_subwindow(bar = new BC_Bar(x, y, get_w()-2*x));
+       y += bar->get_h() + margin;
        add_subwindow(this->apply_before_plugins = new CWindowMaskBeforePlugins(this, 10, y));
        y += this->apply_before_plugins->get_h();
        add_subwindow(this->disable_opengl_masking = new CWindowDisableOpenGLMasking(this, 10, y));
@@ -2391,6 +2438,7 @@ void CWindowMaskGUI::update()
 //printf("CWindowMaskGUI::update 1\n");
        get_keyframe(track, autos, keyframe, mask, point, 0);
 
+       mask_track->update(!track ? "" : track->title);
        name->update_items(keyframe);
        const char *text = "";
        int sz = !keyframe ? 0 : keyframe->masks.size();
index e6922e4..dcdfa16 100644 (file)
@@ -128,6 +128,16 @@ public:
        CWindowCoord *x1, *y1, *width, *height;
 };
 
+class CWindowMaskTrack : public BC_Title
+{
+public:
+       CWindowMaskTrack(MWindow *mwindow, CWindowMaskGUI *gui,
+                       int x, int y, const char *text);
+       ~CWindowMaskTrack();
+       MWindow *mwindow;
+       CWindowMaskGUI *gui;
+};
+
 class CWindowMaskItems : public ArrayList<BC_ListBoxItem*>
 {
 public:
@@ -260,6 +270,17 @@ public:
        CWindowToolGUI *gui;
 };
 
+class CWindowMaskDrawCenter : public BC_CheckBox
+{
+public:
+       CWindowMaskDrawCenter(MWindow *mwindow, CWindowToolGUI *gui,
+                       int x, int y);
+       ~CWindowMaskDrawCenter();
+       int handle_event();
+       MWindow *mwindow;
+       CWindowToolGUI *gui;
+};
+
 class CWindowMaskDrawMarkers : public BC_CheckBox
 {
 public:
@@ -365,6 +386,7 @@ public:
                SubMask* &mask, MaskPoint* &point, int create_it);
        void update_preview();
 
+       CWindowMaskTrack *mask_track;
        CWindowMaskName *name;
        CWindowMaskButton *mask_buttons[SUBMASKS];
        CWindowMaskThumbler *mask_thumbler;
@@ -379,6 +401,8 @@ public:
        CWindowCoord *x, *y;
        CWindowMaskFocus *focus;
        int focused;
+       CWindowMaskDrawCenter *draw_center;
+       int center_mark;
        CWindowMaskDrawMarkers *draw_markers;
        int markers;
        CWindowMaskDrawBoundary *draw_boundary;
index 2a8ed55..9d8118d 100644 (file)
@@ -28,6 +28,7 @@ class CWindowCurveToggle;
 class CWindowCoord;
 class CWindowCropOK;
 class CWindowCropGUI;
+class CWindowMaskTrack;
 class CWindowMaskItems;
 class CWindowMaskName;
 class CWindowMaskDelMask;
@@ -39,6 +40,7 @@ class CWindowMaskFadeSlider;
 class CWindowMaskGangFader;
 class CWindowMaskAffectedPoint;
 class CWindowMaskFocus;
+class CWindowMaskDrawCenter;
 class CWindowMaskDrawMarkers;
 class CWindowMaskDrawBoundary;
 class CWindowMaskDelPoint;
index cc2e84f..640092d 100644 (file)
@@ -802,6 +802,11 @@ int EDL::clear(double start, double end,
        return 0;
 }
 
+int EDL::clear_hard_edges(double start, double end)
+{
+       return tracks->clear_hard_edges(start, end);
+}
+
 static int dead_edit_cmp(Edit**ap, Edit**bp)
 {
        Edit *a = *ap, *b = *bp;
index e8dadce..b1c4fd3 100644 (file)
@@ -211,7 +211,7 @@ public:
                int clear_labels,
                int clear_plugins,
                int edit_autos);
-       void deglitch(double position);
+       int clear_hard_edges(double start, double end);
 // Insert the asset at a point in the EDL
        void insert_asset(Asset *asset,
                EDL *nested_edl,
index bc12bed..52cfe6e 100644 (file)
@@ -148,9 +148,9 @@ void MainMenu::create_objects()
        editmenu->add_item(new Cut(mwindow));
        editmenu->add_item(new Copy(mwindow));
        editmenu->add_item(new Paste(mwindow));
-       editmenu->add_item(new Clear(mwindow));
        editmenu->add_item(new PasteSilence(mwindow));
-       editmenu->add_item(new MuteSelection(mwindow));
+       editmenu->add_item(clear_menu = new EditClearMenu(mwindow));
+       clear_menu->create_objects();
        editmenu->add_item(new TrimSelection(mwindow));
        editmenu->add_item(new SelectAll(mwindow));
        editmenu->add_item(new BC_MenuItem("-"));
@@ -161,7 +161,6 @@ void MainMenu::create_objects()
        editmenu->add_item(new MenuTransitionLength(mwindow));
        editmenu->add_item(new DetachTransitions(mwindow));
        editmenu->add_item(new BC_MenuItem("-"));
-       editmenu->add_item(new ClearLabels(mwindow));
        editmenu->add_item(new CutCommercials(mwindow));
        editmenu->add_item(new PasteSubttl(mwindow));
 
@@ -956,6 +955,34 @@ int Paste::handle_event()
        return 1;
 }
 
+EditClearSubMenu::EditClearSubMenu(BC_MenuItem *menu_item)
+ : BC_SubMenu()
+{
+       this->menu_item = menu_item;
+}
+EditClearSubMenu::~EditClearSubMenu()
+{
+}
+
+EditClearMenu::EditClearMenu(MWindow *mwindow)
+ : BC_MenuItem(_("Clear..."))
+{
+       this->mwindow = mwindow;
+       this->clear_sub_menu = 0;
+}
+EditClearMenu::~EditClearMenu()
+{
+}
+
+void EditClearMenu::create_objects()
+{
+       add_submenu(clear_sub_menu = new EditClearSubMenu(this));
+       clear_sub_menu->add_item(new Clear(mwindow));
+       clear_sub_menu->add_item(new MuteSelection(mwindow));
+       clear_sub_menu->add_item(new ClearHardEdges(mwindow));
+       clear_sub_menu->add_item(new ClearLabels(mwindow));
+};
+
 Clear::Clear(MWindow *mwindow)
  : BC_MenuItem(_("Clear"), _("Del"), DELETE)
 {
@@ -999,6 +1026,17 @@ int SelectAll::handle_event()
        return 1;
 }
 
+ClearHardEdges::ClearHardEdges(MWindow *mwindow) : BC_MenuItem(_("Clear Hard Edges"))
+{
+       this->mwindow = mwindow;
+}
+
+int ClearHardEdges::handle_event()
+{
+       mwindow->clear_hard_edges();
+       return 1;
+}
+
 ClearLabels::ClearLabels(MWindow *mwindow) : BC_MenuItem(_("Clear labels"))
 {
        this->mwindow = mwindow;
index 482cce3..ccb9d25 100644 (file)
@@ -91,6 +91,7 @@ public:
        MenuVEffectItem *veffect[TOTAL_EFFECTS];
        Quit *quit_program;              // affected by save
        MainDumpsMenu *dump_menu;
+       EditClearMenu *clear_menu;
        Undo *undo;
        Redo *redo;
        int total_aeffects;
@@ -237,6 +238,26 @@ public:
        MWindow *mwindow;
 };
 
+class EditClearSubMenu : public BC_SubMenu
+{
+public:
+       EditClearSubMenu(BC_MenuItem *menu_item);
+       ~EditClearSubMenu();
+
+       BC_MenuItem *menu_item;
+};
+
+class EditClearMenu : public BC_MenuItem
+{
+public:
+       EditClearMenu(MWindow *mwindow);
+       ~EditClearMenu();
+       void create_objects();
+
+       MWindow *mwindow;
+       EditClearSubMenu *clear_sub_menu;
+};
+
 class Clear : public BC_MenuItem
 {
 public:
@@ -377,6 +398,14 @@ public:
        MWindow *mwindow;
 };
 
+class ClearHardEdges : public BC_MenuItem
+{
+public:
+       ClearHardEdges(MWindow *mwindow);
+       int handle_event();
+       MWindow *mwindow;
+};
+
 class ClearLabels : public BC_MenuItem
 {
 public:
index f541463..e145397 100644 (file)
@@ -37,6 +37,8 @@ class Redo;
 class Cut;
 class Copy;
 class Paste;
+class EditClearSubMenu;
+class EditClearMenu;
 class Clear;
 class CutKeyframes;
 class CopyKeyframes;
@@ -53,6 +55,7 @@ class PasteDefaultKeyframe;
 class ClearDefaultKeyframe;
 class PasteSilence;
 class SelectAll;
+class ClearHardEdges;
 class ClearLabels;
 class CutCommercials;
 class DetachTransitions;
@@ -61,6 +64,7 @@ class TrimSelection;
 class MixerItems;
 class MixerViewer;
 class TileMixers;
+class AlignMixers;
 class AddAudioTrack;
 class DeleteAudioTrack;
 class DefaultATransition;
index 3256ace..11d393c 100644 (file)
@@ -348,6 +348,8 @@ public:
        void clear(int clear_handle);
        void clear_labels();
        int clear_labels(double start, double end);
+       void clear_hard_edges();
+       int clear_hard_edges(double start, double end);
        void concatenate_tracks();
        int copy_flags(int copy_flags=COPY_CLIPBOARD);
        void copy();
index 6be47c5..d3e5218 100644 (file)
@@ -403,10 +403,37 @@ void MWindow::clear_labels()
 
 int MWindow::clear_labels(double start, double end)
 {
+       if( start == end ) {
+               start = 0;
+               end = edl->tracks->total_length();
+       }
        edl->labels->clear(start, end, 0);
        return 0;
 }
 
+void MWindow::clear_hard_edges()
+{
+       undo_before();
+       clear_hard_edges(edl->local_session->get_selectionstart(),
+               edl->local_session->get_selectionend());
+       edl->optimize();
+       save_backup();
+       undo_after(_("clear hard edges"), LOAD_EDITS);
+       restart_brender();
+       gui->update(1, NORMAL_DRAW, 0, 0, 1, 0, 0);
+       cwindow->refresh_frame(CHANGE_EDL);
+}
+
+int MWindow::clear_hard_edges(double start, double end)
+{
+       if( start == end ) {
+               start = 0;
+               end = edl->tracks->total_length();
+       }
+       edl->clear_hard_edges(start, end);
+       return 0;
+}
+
 void MWindow::concatenate_tracks()
 {
        undo_before();
index 9b4aea7..1c7ddc7 100644 (file)
@@ -1224,10 +1224,12 @@ static void combineData(GLdouble coords[3],
        vertex[1] = coords[1];
        vertex[2] = coords[2];
        for( int i=3; i<6; ++i ) {
-               vertex[i] = weight[0] * vertex_data[0][i] +
-                       weight[1] * vertex_data[1][i] +
-                       weight[2] * vertex_data[2][i] +
-                       weight[3] * vertex_data[3][i];
+               GLdouble v = 0;
+               for( int k=0; k<4; ++k ) {
+                       if( !weight[k] || !vertex_data[k] ) continue;
+                       v += weight[k] * vertex_data[k][i];
+               }
+               vertex[i] = v;
        }
        *outData = vertex;
 }
index b7cd63a..da86714 100644 (file)
@@ -58,6 +58,7 @@ public:
 // Construct a list of all the recordable edits which start on position
        void clear_selected_edits();
        void select_affected_edits(double position, Track *start_track, int sense);
+       int clear_hard_edges(double start, double end);
        void get_selected_edits(ArrayList<Edit*> *drag_edits);
        int next_group_id();
        int new_group(int id);
index 9cc095b..183f35f 100644 (file)
@@ -120,6 +120,24 @@ void Tracks::clear_transitions(double start, double end)
        }
 }
 
+int Tracks::clear_hard_edges(double start, double end)
+{
+       for( Track *track=first; track; track=track->next ) {
+               if( !track->record ) continue;
+               int64_t start_units = track->to_units(start, 0);
+               int64_t end_units = track->to_units(end, 0);
+
+               for( Edit *edit=track->edits->first; edit; edit=edit->next ) {
+                       if( edit->startproject < start_units ) continue;
+                       if( edit->startproject >= end_units ) continue;
+                       edit->hard_left = 0;
+                       if( !edit->previous ) continue;
+                       edit->previous->hard_right = 0;
+               }
+       }
+       return 0;
+}
+
 void Tracks::shuffle_edits(double start, double end)
 {
 // This doesn't affect automation or effects
index 3716e3b..57d1e09 100644 (file)
@@ -21,7 +21,8 @@
 
 #include "bcresources.h"
 #include "bctitle.h"
-#include "bcresources.h"
+#include "bcpixmap.h"
+#include "vframe.h"
 #include <string.h>
 #include <unistd.h>
 
@@ -112,8 +113,6 @@ char* BC_Title::get_text()
 
 int BC_Title::draw(int flush)
 {
-       int i, j, x, y;
-
 // Fix background for block fonts.
 // This should eventually be included in a BC_WindowBase::is_blocked_font()
 
@@ -130,30 +129,21 @@ int BC_Title::draw(int flush)
 
        set_font(font);
        BC_WindowBase::set_color(color);
-       int text_len = strlen(text);
-       j = 0;  x = 0;  y = get_text_ascent(font);
-       for(i = 0; i <= text_len; i++)
-       {
-               if(text[i] == '\n' || text[i] == 0)
-               {
-                       if(centered)
-                       {
-                               draw_center_text(get_w() / 2,
-                                       y,
-                                       &text[j],
-                                       i - j);
-                               j = i + 1;
-                       }
-                       else
-                       {
-                               draw_text(x,
-                                       y,
-                                       &text[j],
-                                       i - j);
-                               j = i + 1;
-                       }
-                       y += get_text_height(font);
-               }
+       return draw(flush, 0, 0);
+}
+
+int BC_Title::draw(int flush, int x, int y)
+{
+       y += get_text_ascent(font);
+       int len = strlen(text);
+       for( int i=0,j=0; i<=len; ++i ) {
+               if( text[i] && text[i] != '\n' ) continue;
+               if( centered )
+                       draw_center_text(get_w()/2, y, &text[j], i - j);
+               else
+                       draw_text(x, y, &text[j], i - j);
+               j = i + 1;
+               y += get_text_height(font);
        }
        set_font(MEDIUMFONT);    // reset
        flash(flush);
@@ -206,3 +196,53 @@ void BC_Title::get_size(BC_WindowBase *gui, int font, const char *text, int fixe
        w += 5;
        if(fixed_w > 0) w = fixed_w;
 }
+
+
+BC_TitleBar::BC_TitleBar(int x, int y, int w, int offset, int margin,
+               const char *text, int font, int color, VFrame *data)
+: BC_Title(x, y, text, font, color, 0, w)
+{
+       this->offset = offset;
+       this->margin = margin;
+       this->data = data;
+       image = 0;
+}
+
+BC_TitleBar::~BC_TitleBar()
+{
+       delete image;
+}
+
+void BC_TitleBar::set_image(VFrame *data)
+{
+       delete image;
+       image = new BC_Pixmap(get_parent_window(), data, PIXMAP_ALPHA);
+}
+
+int BC_TitleBar::initialize()
+{
+       if(data)
+               set_image(data);
+       else
+               set_image(get_resources()->bar_data);
+       BC_Title::initialize();
+       draw(0);
+       return 0;
+}
+
+int BC_TitleBar::draw(int flush)
+{
+       int w = get_w(), h = get_h(), h2 = h/2;
+       draw_top_background(get_parent_window(), 0, 0,w, h);
+       draw_3segmenth(0,h2, offset, 0, offset, image);
+       int tx = offset + margin, tw, th;
+       set_font(font);
+       BC_WindowBase::set_color(color);
+       BC_Title::draw(flush, tx, 0);
+       get_size(get_parent_window(), font, text, 0, tw, th);
+       tx += tw + margin;
+       draw_3segmenth(tx,h2, w-tx, tx,w-tx, image);
+       flash(flush);
+       return 0;
+}
+
index adb59f2..3c492c3 100644 (file)
 #include "bccolors.h"
 #include "fonts.h"
 
+class BC_TitleBar;
+
 class BC_Title : public BC_SubWindow
 {
+       friend class BC_TitleBar;
 public:
        BC_Title(int x,
                int y,
@@ -49,8 +52,10 @@ public:
        char* get_text();
 
 private:
-       int draw(int flush);
+       int draw(int flush, int x, int y);
+       virtual int draw(int flush);
        static void get_size(BC_WindowBase *gui, int font, const char *text, int fixed_w, int &w, int &h);
+       BC_WindowBase *get_parent_window() { return parent_window; }
 
        char text[BCTEXTLEN];
        int color;
@@ -60,4 +65,22 @@ private:
        int fixed_w;
 };
 
+class BC_TitleBar : public BC_Title
+{
+public:
+       BC_TitleBar(int x, int y, int w, int offset, int margin,
+               const char *text, int font = MEDIUMFONT,
+               int color = -1, VFrame *data = 0);
+       virtual ~BC_TitleBar();
+
+       int initialize();
+       void set_image(VFrame *data);
+
+       int w, offset, margin;
+       VFrame *data;
+       BC_Pixmap *image;
+private:
+       int draw(int flush);
+};
+
 #endif
index 37e2c39..10f4285 100644 (file)
@@ -513,6 +513,7 @@ void BlondTheme::initialize()
        new_image("cbuttons_left", "cbuttons_left.png");
        new_image("cbuttons_right", "cbuttons_right.png");
        new_image("cmeter_bg", "cmeter_bg.png");
+       new_image("cwindow_focus", "cwindow_focus.png");
 
 // VWindow
        new_image("vbuttons_left", "vbuttons_left.png");
diff --git a/cinelerra-5.1/plugins/theme_blond/data/cwindow_focus.png b/cinelerra-5.1/plugins/theme_blond/data/cwindow_focus.png
new file mode 100644 (file)
index 0000000..8fe07fc
Binary files /dev/null and b/cinelerra-5.1/plugins/theme_blond/data/cwindow_focus.png differ
index 6ab7a9e..46c12e6 100644 (file)
@@ -471,6 +471,7 @@ void BlondCVTheme::initialize()
        cbuttons_left = new_image("cbuttons_left.png");
        cbuttons_right = new_image("cbuttons_right.png");
        cmeter_bg = new_image("cmeter_bg.png");
+       new_image("cwindow_focus", "cwindow_focus.png");
 
        ctimebar_x = ccanvas_x;
        ctimebar_y = ccanvas_y + ccanvas_h;
diff --git a/cinelerra-5.1/plugins/theme_blond_cv/data/cwindow_focus.png b/cinelerra-5.1/plugins/theme_blond_cv/data/cwindow_focus.png
new file mode 100644 (file)
index 0000000..8fe07fc
Binary files /dev/null and b/cinelerra-5.1/plugins/theme_blond_cv/data/cwindow_focus.png differ
index ea43e59..0fa46e8 100644 (file)
@@ -513,6 +513,7 @@ void BlueDotTheme::initialize()
        new_image("cbuttons_left", "cbuttons_left.png");
        new_image("cbuttons_right", "cbuttons_right.png");
        new_image("cmeter_bg", "cmeter_bg.png");
+       new_image("cwindow_focus", "cwindow_focus.png");
 
 // VWindow
        new_image("vbuttons_left", "vbuttons_left.png");
diff --git a/cinelerra-5.1/plugins/theme_blue/data/cwindow_focus.png b/cinelerra-5.1/plugins/theme_blue/data/cwindow_focus.png
new file mode 100644 (file)
index 0000000..8fe07fc
Binary files /dev/null and b/cinelerra-5.1/plugins/theme_blue/data/cwindow_focus.png differ
index e55d920..49508a9 100644 (file)
@@ -548,6 +548,7 @@ void BlueDotTheme::initialize()
        new_image("cbuttons_left", "cbuttons_left.png");
        new_image("cbuttons_right", "cbuttons_right.png");
        new_image("cmeter_bg", "cmeter_bg.png");
+       new_image("cwindow_focus", "cwindow_focus.png");
        new_image("vbuttons_left", "vbuttons_left.png");
        new_image("vbuttons_right", "vbuttons_right.png");
        timebar_view_data = new_image("timebar_view.png");
diff --git a/cinelerra-5.1/plugins/theme_blue_dot/data/cwindow_focus.png b/cinelerra-5.1/plugins/theme_blue_dot/data/cwindow_focus.png
new file mode 100644 (file)
index 0000000..8fe07fc
Binary files /dev/null and b/cinelerra-5.1/plugins/theme_blue_dot/data/cwindow_focus.png differ
index cd3acc9..3c7f56d 100644 (file)
@@ -519,6 +519,7 @@ void BrightTheme::initialize()
        new_image("cbuttons_left", "cbuttons_left.png");
        new_image("cbuttons_right", "cbuttons_right.png");
        new_image("cmeter_bg", "cmeter_bg.png");
+       new_image("cwindow_focus", "cwindow_focus.png");
 
 // VWindow
        new_image("vbuttons_left", "vbuttons_left.png");
diff --git a/cinelerra-5.1/plugins/theme_bright/data/cwindow_focus.png b/cinelerra-5.1/plugins/theme_bright/data/cwindow_focus.png
new file mode 100644 (file)
index 0000000..8fe07fc
Binary files /dev/null and b/cinelerra-5.1/plugins/theme_bright/data/cwindow_focus.png differ
index b4170ef..97620ca 100644 (file)
@@ -515,6 +515,7 @@ void CAKEWALKTHEME::initialize()
  new_image("cbuttons_left", "cbuttons_left.png");
  new_image("cbuttons_right", "cbuttons_right.png");
  new_image("cmeter_bg", "cmeter_bg.png");
+ new_image("cwindow_focus", "cwindow_focus.png");
  new_image("vbuttons_left", "vbuttons_left.png");
  new_image("vbuttons_right", "vbuttons_right.png");
  new_image("vclock", "vclock.png");
diff --git a/cinelerra-5.1/plugins/theme_cakewalk/data/cwindow_focus.png b/cinelerra-5.1/plugins/theme_cakewalk/data/cwindow_focus.png
new file mode 100644 (file)
index 0000000..8fe07fc
Binary files /dev/null and b/cinelerra-5.1/plugins/theme_cakewalk/data/cwindow_focus.png differ
diff --git a/cinelerra-5.1/plugins/theme_hulk/data/cwindow_focus.png b/cinelerra-5.1/plugins/theme_hulk/data/cwindow_focus.png
new file mode 100644 (file)
index 0000000..8fe07fc
Binary files /dev/null and b/cinelerra-5.1/plugins/theme_hulk/data/cwindow_focus.png differ
index 8222d6d..ca79819 100644 (file)
@@ -514,6 +514,7 @@ void HULKTHEME::initialize()
        new_image("cbuttons_left", "cbuttons_left.png");
        new_image("cbuttons_right", "cbuttons_right.png");
        new_image("cmeter_bg", "cmeter_bg.png");
+       new_image("cwindow_focus", "cwindow_focus.png");
 
 // VWindow
        new_image("vbuttons_left", "vbuttons_left.png");
diff --git a/cinelerra-5.1/plugins/theme_neophyte/data/cwindow_focus.png b/cinelerra-5.1/plugins/theme_neophyte/data/cwindow_focus.png
new file mode 100644 (file)
index 0000000..8fe07fc
Binary files /dev/null and b/cinelerra-5.1/plugins/theme_neophyte/data/cwindow_focus.png differ
index 3d34c83..24fec36 100644 (file)
@@ -650,6 +650,7 @@ void NEOPHYTETHEME::initialize()
        new_image("cbuttons_left", "cbuttons_left.png");
        new_image("cbuttons_right", "cbuttons_right.png");
        new_image("cmeter_bg", "cmeter_bg.png");
+       new_image("cwindow_focus", "cwindow_focus.png");
        
        // VWindow
        /* The red position indicator is currently only 5 px high.
diff --git a/cinelerra-5.1/plugins/theme_pinklady/data/cwindow_focus.png b/cinelerra-5.1/plugins/theme_pinklady/data/cwindow_focus.png
new file mode 100644 (file)
index 0000000..8fe07fc
Binary files /dev/null and b/cinelerra-5.1/plugins/theme_pinklady/data/cwindow_focus.png differ
index 5001762..0dce66d 100644 (file)
@@ -499,6 +499,7 @@ void PINKLADY::initialize()
        new_image("cbuttons_left", "cbuttons_left.png");
        new_image("cbuttons_right", "cbuttons_right.png");
        new_image("cmeter_bg", "cmeter_bg.png");
+       new_image("cwindow_focus", "cwindow_focus.png");
 
 // VWindow
        new_image("vbuttons_left", "vbuttons_left.png");
diff --git a/cinelerra-5.1/plugins/theme_suv/data/cwindow_focus.png b/cinelerra-5.1/plugins/theme_suv/data/cwindow_focus.png
new file mode 100644 (file)
index 0000000..8fe07fc
Binary files /dev/null and b/cinelerra-5.1/plugins/theme_suv/data/cwindow_focus.png differ
index 40ad35c..4fae7db 100644 (file)
@@ -500,6 +500,7 @@ void SUV::initialize()
        new_image("cbuttons_left", "cbuttons_left.png");
        new_image("cbuttons_right", "cbuttons_right.png");
        new_image("cmeter_bg", "cmeter_bg.png");
+       new_image("cwindow_focus", "cwindow_focus.png");
 
 // VWindow
        new_image("vbuttons_left", "vbuttons_left.png");
diff --git a/cinelerra-5.1/plugins/theme_unflat/data/cwindow_focus.png b/cinelerra-5.1/plugins/theme_unflat/data/cwindow_focus.png
new file mode 100644 (file)
index 0000000..8fe07fc
Binary files /dev/null and b/cinelerra-5.1/plugins/theme_unflat/data/cwindow_focus.png differ
index 55a3dd0..fa449a4 100644 (file)
@@ -508,6 +508,7 @@ void UNFLATTHEME::initialize()
        new_image("cbuttons_left", "cbuttons_left.png");
        new_image("cbuttons_right", "cbuttons_right.png");
        new_image("cmeter_bg", "cmeter_bg.png");
+       new_image("cwindow_focus", "cwindow_focus.png");
 
 // VWindow
        new_image("vbuttons_left", "vbuttons_left.png");