From b78e8ac7987fbf35a4ba60534c4a3d2b290562b9 Mon Sep 17 00:00:00 2001 From: Good Guy Date: Tue, 25 Jul 2017 18:35:46 -0600 Subject: [PATCH] picon dirs, new cinfinity picons, plugin info, rework text drawing, show msg, compressor fix --- cinelerra-5.1/Makefile.am | 1 + cinelerra-5.1/cinelerra/awindowgui.C | 148 +++++++++--------- cinelerra-5.1/cinelerra/awindowgui.h | 34 ++-- cinelerra-5.1/cinelerra/interfaceprefs.C | 9 +- cinelerra-5.1/cinelerra/mwindow.C | 1 + cinelerra-5.1/cinelerra/mwindowgui.C | 9 +- cinelerra-5.1/cinelerra/mwindowgui.h | 5 +- cinelerra-5.1/cinelerra/render.C | 3 +- cinelerra-5.1/cinelerra/statusbar.C | 15 +- cinelerra-5.1/cinelerra/statusbar.h | 5 +- cinelerra-5.1/guicast/bcpopupmenu.C | 3 +- cinelerra-5.1/guicast/bctextbox.C | 2 +- cinelerra-5.1/guicast/bcwindowbase.h | 3 +- cinelerra-5.1/guicast/bcwindowdraw.C | 131 +++++----------- cinelerra-5.1/info/plugins.txt | 38 ++++- cinelerra-5.1/picon_cinfinity/ff_audio.png | Bin 0 -> 4466 bytes cinelerra-5.1/picon_cinfinity/ff_video.png | Bin 0 -> 4480 bytes cinelerra-5.1/picon_cinfinity/lad_picon.png | Bin 0 -> 3455 bytes cinelerra-5.1/plugins/compressor/compressor.C | 1 + 19 files changed, 201 insertions(+), 207 deletions(-) create mode 100644 cinelerra-5.1/picon_cinfinity/ff_audio.png create mode 100644 cinelerra-5.1/picon_cinfinity/ff_video.png create mode 100644 cinelerra-5.1/picon_cinfinity/lad_picon.png diff --git a/cinelerra-5.1/Makefile.am b/cinelerra-5.1/Makefile.am index 7e001030..a6426923 100644 --- a/cinelerra-5.1/Makefile.am +++ b/cinelerra-5.1/Makefile.am @@ -36,6 +36,7 @@ binstall: install-recursive > "bin/applications/$(WANT_CIN).desktop" cp -a image/cin.svg "bin/pixmaps/$(WANT_CIN)".svg cp -a image/cin.xpm "bin/pixmaps/$(WANT_CIN)".xpm + for d in picon*; do cp -a $$d/. bin/plugins/$$d/.; done cp -a db/utils/new_db "bin/cin_db" buninstall: diff --git a/cinelerra-5.1/cinelerra/awindowgui.C b/cinelerra-5.1/cinelerra/awindowgui.C index 272bfea8..13e7164d 100644 --- a/cinelerra-5.1/cinelerra/awindowgui.C +++ b/cinelerra-5.1/cinelerra/awindowgui.C @@ -163,13 +163,14 @@ AssetPicon::AssetPicon(MWindow *mwindow, } AssetPicon::AssetPicon(MWindow *mwindow, - AWindowGUI *gui, int folder) + AWindowGUI *gui, int folder, int persist) : BC_ListBoxItem(_(AWindowGUI::folder_names[folder]), gui->folder_icon) { reset(); foldernum = folder; this->mwindow = mwindow; this->gui = gui; + persistent = persist; } AssetPicon::AssetPicon(MWindow *mwindow, @@ -464,22 +465,19 @@ AWindowGUI::~AWindowGUI() displayed_assets[1].remove_all_objects(); delete vicon_thread; - delete file_icon; - delete audio_icon; - delete video_icon; - delete folder_icon; - delete clip_icon; - delete label_icon; - delete atransition_icon; - delete vtransition_icon; - delete aeffect_icon; - delete ladspa_icon; - delete ladspa_vframe; - delete ff_aud_icon; - delete ff_aud_vframe; - delete ff_vid_icon; - delete ff_vid_vframe; - delete veffect_icon; + delete file_icon; delete file_res; + delete audio_icon; delete audio_res; + delete video_icon; delete video_res; + delete folder_icon; delete folder_res; + delete clip_icon; delete clip_res; + delete label_icon; delete label_res; + delete atransition_icon; delete atrans_res; + delete vtransition_icon; delete vtrans_res; + delete aeffect_icon; delete aeffect_res; + delete veffect_icon; delete veffect_res; + delete ladspa_icon; delete ladspa_res; + delete ff_aud_icon; delete ff_aud_res; + delete ff_vid_icon; delete ff_vid_res; delete newfolder_thread; delete asset_menu; delete clip_menu; @@ -489,7 +487,7 @@ AWindowGUI::~AWindowGUI() delete cliplist_menu; delete labellist_menu; delete folderlist_menu; - if( temp_picon ) delete temp_picon; + delete temp_picon; delete remove_plugin; } @@ -510,10 +508,48 @@ bool AWindowGUI::protected_pixmap(BC_Pixmap *icon) icon == ff_vid_icon; } -void AWindowGUI::create_objects() +VFrame *AWindowGUI::get_picon(const char *name, const char *plugin_icons) +{ + char png_path[BCTEXTLEN]; + char *pp = png_path, *ep = pp + sizeof(png_path)-1; + pp += snprintf(pp, ep-pp, "%s/picon", File::get_plugin_path()); + if( strcmp(DEFAULT_PICON, plugin_icons) ) + pp += snprintf(pp, ep-pp, "_%s", plugin_icons); + pp += snprintf(pp, ep-pp, "/%s.png", name); + return VFramePng::vframe_png(png_path,0,0); +} + +VFrame *AWindowGUI::get_picon(const char *name) { - AssetPicon *picon; + VFrame *vframe = get_picon(name, mwindow->preferences->plugin_icons); + if( !vframe ) vframe = get_picon(name, DEFAULT_PICON); + return vframe; +} +VFrame *AWindowGUI::resource_icon(VFrame *&vfrm, BC_Pixmap *&icon, const char *fn, int idx) +{ + VFrame *ret = vfrm = get_picon(fn); + if( !ret ) vfrm = BC_WindowBase::get_resources()->type_to_icon[idx]; + icon = new BC_Pixmap(this, vfrm, PIXMAP_ALPHA); + return ret; +} +VFrame *AWindowGUI::theme_icon(VFrame *&vfrm, BC_Pixmap *&icon, const char *fn) +{ + VFrame *ret = vfrm = get_picon(fn); + if( !ret ) vfrm = mwindow->theme->get_image(fn); + icon = new BC_Pixmap(this, vfrm, PIXMAP_ALPHA); + return ret; +} +VFrame *AWindowGUI::plugin_icon(VFrame *&vfrm, BC_Pixmap *&icon, const char *fn, unsigned char *png) +{ + VFrame *ret = vfrm = get_picon(fn); + if( !ret ) vfrm = new VFramePng(png); + icon = new BC_Pixmap(this, vfrm, PIXMAP_ALPHA); + return vfrm; +} + +void AWindowGUI::create_objects() +{ lock_window("AWindowGUI::create_objects"); SET_TRACE //printf("AWindowGUI::create_objects 1\n"); @@ -521,64 +557,34 @@ SET_TRACE asset_titles[1] = _("Comments"); SET_TRACE - set_icon(mwindow->theme->get_image("awindow_icon")); - file_icon = new BC_Pixmap(this, - BC_WindowBase::get_resources()->type_to_icon[ICON_UNKNOWN], - PIXMAP_ALPHA); - - folder_icon = new BC_Pixmap(this, - BC_WindowBase::get_resources()->type_to_icon[ICON_FOLDER], - PIXMAP_ALPHA); - - audio_icon = new BC_Pixmap(this, - BC_WindowBase::get_resources()->type_to_icon[ICON_SOUND], - PIXMAP_ALPHA); - video_icon = new BC_Pixmap(this, - BC_WindowBase::get_resources()->type_to_icon[ICON_FILM], - PIXMAP_ALPHA); + file_res = resource_icon(file_vframe, file_icon, "film_icon", ICON_UNKNOWN); + folder_res = resource_icon(folder_vframe, folder_icon, "folder_icon", ICON_FOLDER); + audio_res = resource_icon(audio_vframe, audio_icon, "audio_icon", ICON_SOUND); + video_res = resource_icon(video_vframe, video_icon, "video_icon", ICON_FILM); + label_res = resource_icon(label_vframe, label_icon, "label_icon", ICON_LABEL); - label_icon = new BC_Pixmap(this, - BC_WindowBase::get_resources()->type_to_icon[ICON_LABEL], - PIXMAP_ALPHA); - -SET_TRACE + clip_res = theme_icon(clip_vframe, clip_icon, "clip_icon"); + atrans_res = theme_icon(atransition_vframe, atransition_icon, "atransition_icon"); + vtrans_res = theme_icon(vtransition_vframe, vtransition_icon, "vtransition_icon"); + aeffect_res = theme_icon(aeffect_vframe, aeffect_icon, "aeffect_icon"); + veffect_res = theme_icon(veffect_vframe, veffect_icon, "veffect_icon"); - clip_vframe = mwindow->theme->get_image("clip_icon"); - clip_icon = new BC_Pixmap(this, clip_vframe, PIXMAP_ALPHA); - atransition_vframe = mwindow->theme->get_image("atransition_icon"); - atransition_icon = new BC_Pixmap(this, atransition_vframe, PIXMAP_ALPHA); - vtransition_vframe = mwindow->theme->get_image("vtransition_icon"); - vtransition_icon = new BC_Pixmap(this, vtransition_vframe, PIXMAP_ALPHA); - aeffect_vframe = mwindow->theme->get_image("aeffect_icon"); - aeffect_icon = new BC_Pixmap(this, aeffect_vframe, PIXMAP_ALPHA); - ladspa_vframe = new VFramePng(lad_picon_png); - ladspa_icon = new BC_Pixmap(this, ladspa_vframe, PIXMAP_ALPHA); - ff_aud_vframe = new VFramePng(ff_audio_png); - ff_aud_icon = new BC_Pixmap(this, ff_aud_vframe, PIXMAP_ALPHA); - ff_vid_vframe = new VFramePng(ff_video_png); - ff_vid_icon = new BC_Pixmap(this, ff_vid_vframe, PIXMAP_ALPHA); - veffect_vframe = mwindow->theme->get_image("veffect_icon"); - veffect_icon = new BC_Pixmap(this, veffect_vframe, PIXMAP_ALPHA); + ladspa_res = plugin_icon(ladspa_vframe, ladspa_icon, "lad_picon", lad_picon_png); + ff_aud_res = plugin_icon(ff_aud_vframe, ff_aud_icon, "ff_audio", ff_audio_png); + ff_vid_res = plugin_icon(ff_vid_vframe, ff_vid_icon, "ff_video", ff_video_png); SET_TRACE // Mandatory folders - folders.append(picon = new AssetPicon(mwindow, this, AW_AEFFECT_FOLDER)); - picon->persistent = 1; - folders.append(picon = new AssetPicon(mwindow, this, AW_VEFFECT_FOLDER)); - picon->persistent = 1; - folders.append(picon = new AssetPicon(mwindow, this, AW_ATRANSITION_FOLDER)); - picon->persistent = 1; - folders.append(picon = new AssetPicon(mwindow, this, AW_VTRANSITION_FOLDER)); - picon->persistent = 1; - folders.append(picon = new AssetPicon(mwindow, this, AW_LABEL_FOLDER)); - picon->persistent = 1; - folders.append(picon = new AssetPicon(mwindow, this, AW_CLIP_FOLDER)); - picon->persistent = 1; - folders.append(picon = new AssetPicon(mwindow, this, AW_MEDIA_FOLDER)); - picon->persistent = 1; + folders.append(new AssetPicon(mwindow, this, AW_AEFFECT_FOLDER, 1)); + folders.append(new AssetPicon(mwindow, this, AW_VEFFECT_FOLDER, 1)); + folders.append(new AssetPicon(mwindow, this, AW_ATRANSITION_FOLDER, 1)); + folders.append(new AssetPicon(mwindow, this, AW_VTRANSITION_FOLDER, 1)); + folders.append(new AssetPicon(mwindow, this, AW_LABEL_FOLDER, 1)); + folders.append(new AssetPicon(mwindow, this, AW_CLIP_FOLDER, 1)); + folders.append(new AssetPicon(mwindow, this, AW_MEDIA_FOLDER, 1)); create_label_folder(); SET_TRACE @@ -947,7 +953,7 @@ void AWindowGUI::update_folder_list() if( !exists ) { int aw_folder = folder_number(folder); AssetPicon *picon = aw_folder >= 0 ? - new AssetPicon(mwindow, this, aw_folder) : + new AssetPicon(mwindow, this, aw_folder, 0) : new AssetPicon(mwindow, this, folder, AW_USER_FOLDER); picon->create_objects(); folders.append(picon); diff --git a/cinelerra-5.1/cinelerra/awindowgui.h b/cinelerra-5.1/cinelerra/awindowgui.h index 165e201f..62e86597 100644 --- a/cinelerra-5.1/cinelerra/awindowgui.h +++ b/cinelerra-5.1/cinelerra/awindowgui.h @@ -50,7 +50,7 @@ public: AssetPicon(MWindow *mwindow, AWindowGUI *gui, EDL *edl); AssetPicon(MWindow *mwindow, AWindowGUI *gui, PluginServer *plugin); AssetPicon(MWindow *mwindow, AWindowGUI *gui, Label *plugin); - AssetPicon(MWindow *mwindow, AWindowGUI *gui, int folder); + AssetPicon(MWindow *mwindow, AWindowGUI *gui, int folder, int persist); AssetPicon(MWindow *mwindow, AWindowGUI *gui, const char *folder_name, int folder_num); virtual ~AssetPicon(); @@ -167,6 +167,12 @@ public: void stop_vicon_drawing(); void update_picon(Indexable *indexable); + VFrame *get_picon(const char *name, const char *plugin_icons); + VFrame *get_picon(const char *name); + VFrame *resource_icon(VFrame *&vfrm, BC_Pixmap *&icon, const char *fn, int idx); + VFrame *theme_icon(VFrame *&vfrm, BC_Pixmap *&icon, const char *fn); + VFrame *plugin_icon(VFrame *&vfrm, BC_Pixmap *&icon, const char *fn, unsigned char *png); + MWindow *mwindow; AWindow *awindow; @@ -193,19 +199,19 @@ public: BC_Hash *defaults; // Persistent icons - BC_Pixmap *folder_icon; - BC_Pixmap *file_icon; - BC_Pixmap *audio_icon; - BC_Pixmap *video_icon; - BC_Pixmap *label_icon; - BC_Pixmap *clip_icon; VFrame *clip_vframe; - BC_Pixmap *atransition_icon; VFrame *atransition_vframe; - BC_Pixmap *vtransition_icon; VFrame *vtransition_vframe; - BC_Pixmap *aeffect_icon; VFrame *aeffect_vframe; - BC_Pixmap *ladspa_icon; VFrame *ladspa_vframe; - BC_Pixmap *ff_aud_icon; VFrame *ff_aud_vframe; - BC_Pixmap *ff_vid_icon; VFrame *ff_vid_vframe; - BC_Pixmap *veffect_icon; VFrame *veffect_vframe; + BC_Pixmap *folder_icon; VFrame *folder_res, *folder_vframe; + BC_Pixmap *file_icon; VFrame *file_res, *file_vframe; + BC_Pixmap *audio_icon; VFrame *audio_res, *audio_vframe; + BC_Pixmap *video_icon; VFrame *video_res, *video_vframe; + BC_Pixmap *label_icon; VFrame *label_res, *label_vframe; + BC_Pixmap *clip_icon; VFrame *clip_res, *clip_vframe; + BC_Pixmap *atransition_icon; VFrame *atrans_res, *atransition_vframe; + BC_Pixmap *vtransition_icon; VFrame *vtrans_res, *vtransition_vframe; + BC_Pixmap *aeffect_icon; VFrame *aeffect_res, *aeffect_vframe; + BC_Pixmap *veffect_icon; VFrame *veffect_res, *veffect_vframe; + BC_Pixmap *ladspa_icon; VFrame *ladspa_res, *ladspa_vframe; + BC_Pixmap *ff_aud_icon; VFrame *ff_aud_res, *ff_aud_vframe; + BC_Pixmap *ff_vid_icon; VFrame *ff_vid_res, *ff_vid_vframe; NewFolderThread *newfolder_thread; // Popup menus diff --git a/cinelerra-5.1/cinelerra/interfaceprefs.C b/cinelerra-5.1/cinelerra/interfaceprefs.C index c4771fc2..2b825013 100644 --- a/cinelerra-5.1/cinelerra/interfaceprefs.C +++ b/cinelerra-5.1/cinelerra/interfaceprefs.C @@ -202,7 +202,7 @@ void InterfacePrefs::create_objects() y1 = y + 5; y += 35; add_subwindow(title = new BC_Title(x, y, _("Keyframe reticle:"))); - x1 = x + 100; + x1 = x + 140; keyframe_reticle = new KeyframeReticle(x1, y, &pwindow->thread->preferences->keyframe_reticle); add_subwindow(keyframe_reticle); keyframe_reticle->create_objects(); @@ -244,6 +244,7 @@ void InterfacePrefs::create_objects() y += 25; add_subwindow(new BC_Title(x, y, _("Button 1:"))); + x1 = x + 100; ViewBehaviourText *text; add_subwindow(text = new ViewBehaviourText(x1, y - 5, behavior_to_text(pwindow->thread->edl->session->edit_handle_mode[0]), @@ -284,16 +285,14 @@ void InterfacePrefs::create_objects() y += 30; ViewTheme *theme; add_subwindow(new BC_Title(x, y, _("Theme:"))); - x += 100; - add_subwindow(theme = new ViewTheme(x, y, pwindow)); + add_subwindow(theme = new ViewTheme(x1, y, pwindow)); theme->create_objects(); x = x0; y += theme->get_h() + 5; ViewPluginIcons *plugin_icons; add_subwindow(new BC_Title(x, y, _("Plugin Icons:"))); - x += 100; - add_subwindow(plugin_icons = new ViewPluginIcons(x, y, pwindow)); + add_subwindow(plugin_icons = new ViewPluginIcons(x1, y, pwindow)); plugin_icons->create_objects(); } diff --git a/cinelerra-5.1/cinelerra/mwindow.C b/cinelerra-5.1/cinelerra/mwindow.C index 107ef166..ce48f124 100644 --- a/cinelerra-5.1/cinelerra/mwindow.C +++ b/cinelerra-5.1/cinelerra/mwindow.C @@ -1529,6 +1529,7 @@ SET_TRACE case FILE_NOT_FOUND: sprintf(string, _("Failed to open %s"), new_asset->path); gui->show_message(string, theme->message_error); + gui->update_default_message(); break; // Unknown format diff --git a/cinelerra-5.1/cinelerra/mwindowgui.C b/cinelerra-5.1/cinelerra/mwindowgui.C index 41882647..7587d46d 100644 --- a/cinelerra-5.1/cinelerra/mwindowgui.C +++ b/cinelerra-5.1/cinelerra/mwindowgui.C @@ -916,16 +916,19 @@ int MWindowGUI::visible(int64_t x1, int64_t x2, int64_t view_x1, int64_t view_x2 void MWindowGUI::show_message(const char *message, int color) { - statusbar->set_message(message, color); + statusbar->show_message(message, color); } -void MWindowGUI::set_default_message(const char *message) + +void MWindowGUI::update_default_message() { - statusbar->set_default_message(message); + statusbar->update_default_message(); } + void MWindowGUI::reset_default_message() { statusbar->reset_default_message(); } + void MWindowGUI::default_message() { statusbar->default_message(); diff --git a/cinelerra-5.1/cinelerra/mwindowgui.h b/cinelerra-5.1/cinelerra/mwindowgui.h index de21ee81..2d5fd10c 100644 --- a/cinelerra-5.1/cinelerra/mwindowgui.h +++ b/cinelerra-5.1/cinelerra/mwindowgui.h @@ -142,11 +142,10 @@ public: int menu_w(); int menu_h(); // Draw on the status bar only. - void show_message(const char *message, int color = -1); - void set_default_message(const char *message); + void show_message(const char *message, int color=-1); + void update_default_message(); void reset_default_message(); void default_message(); -// Pop up a box if the statusbar is taken and show an error. void show_error(char *message, int color = BLACK); int repeat_event(int64_t duration); // Entry point for drag events in all windows diff --git a/cinelerra-5.1/cinelerra/render.C b/cinelerra-5.1/cinelerra/render.C index be49dabb..34b5c7dc 100644 --- a/cinelerra-5.1/cinelerra/render.C +++ b/cinelerra-5.1/cinelerra/render.C @@ -495,7 +495,8 @@ void Render::stop_progress() sprintf(string2, _("Rendering took %s"), string); mwindow->gui->lock_window(""); - mwindow->gui->set_default_message(string2); + mwindow->gui->show_message(string2); + mwindow->gui->update_default_message(); mwindow->gui->stop_hourglass(); mwindow->gui->unlock_window(); } diff --git a/cinelerra-5.1/cinelerra/statusbar.C b/cinelerra-5.1/cinelerra/statusbar.C index 02b92d05..b7e97138 100644 --- a/cinelerra-5.1/cinelerra/statusbar.C +++ b/cinelerra-5.1/cinelerra/statusbar.C @@ -103,24 +103,25 @@ void StatusBar::resize_event() flash(0); } -void StatusBar::set_message(const char *text, int color) +void StatusBar::show_message(const char *text, int color) { if( color < 0 ) color = mwindow->theme->message_normal; status_text->set_color(color); status_text->update(text); } -void StatusBar::set_default_message(const char *text) +void StatusBar::reset_default_message() { - strcpy(default_msg, text); - default_message(); + status_color = -1; + strcpy(default_msg, _("Welcome to cinelerra")); } -void StatusBar::reset_default_message() +void StatusBar::update_default_message() { - set_default_message(_("Welcome to cinelerra")); + status_color = status_text->get_color(); + strcpy(default_msg, status_text->get_text()); } void StatusBar::default_message() { - set_message(default_msg, mwindow->theme->message_normal); + show_message(default_msg, status_color); } StatusBarCancel::StatusBarCancel(MWindow *mwindow, int x, int y) diff --git a/cinelerra-5.1/cinelerra/statusbar.h b/cinelerra-5.1/cinelerra/statusbar.h index 726a08c2..eac56594 100644 --- a/cinelerra-5.1/cinelerra/statusbar.h +++ b/cinelerra-5.1/cinelerra/statusbar.h @@ -34,8 +34,8 @@ public: StatusBar(MWindow *mwindow, MWindowGUI *gui); ~StatusBar(); - void set_message(const char *text, int color=-1); - void set_default_message(const char *text); + void show_message(const char *text, int color=-1); + void update_default_message(); void reset_default_message(); void default_message(); @@ -47,6 +47,7 @@ public: BC_ProgressBar *main_progress; StatusBarCancel *main_progress_cancel; BC_Title *status_text; + int status_color; char default_msg[BCTEXTLEN]; }; diff --git a/cinelerra-5.1/guicast/bcpopupmenu.C b/cinelerra-5.1/guicast/bcpopupmenu.C index 9d8e2c22..8421a6bf 100644 --- a/cinelerra-5.1/guicast/bcpopupmenu.C +++ b/cinelerra-5.1/guicast/bcpopupmenu.C @@ -291,6 +291,7 @@ int BC_PopupMenu::activate_menu() { if( !get_button_down() || !BC_WindowBase::get_resources()->popupmenu_btnup ) return menu_activate(); + top_level->active_popup_menu = this; pending = 1; return 0; } @@ -328,7 +329,7 @@ int BC_PopupMenu::menu_activate() popup_down = 1; if(use_title) draw_title(1); } - return 0; + return 1; } int BC_PopupMenu::deactivate_menu() diff --git a/cinelerra-5.1/guicast/bctextbox.C b/cinelerra-5.1/guicast/bctextbox.C index 2536cf7a..d377a448 100644 --- a/cinelerra-5.1/guicast/bctextbox.C +++ b/cinelerra-5.1/guicast/bctextbox.C @@ -697,7 +697,7 @@ void BC_TextBox::draw(int flush) int len = row_end - row_begin; if( len > 0 ) { set_color(enabled ? resources->text_default : DMGREY); - draw_wtext(text_x, k + text_ascent, wtext_row, len, 0); + draw_single_text(1, font, text_x, k + text_ascent, wtext_row, len); } // Get ibeam location diff --git a/cinelerra-5.1/guicast/bcwindowbase.h b/cinelerra-5.1/guicast/bcwindowbase.h index 0bcad162..5532ae49 100644 --- a/cinelerra-5.1/guicast/bcwindowbase.h +++ b/cinelerra-5.1/guicast/bcwindowbase.h @@ -397,7 +397,8 @@ public: BC_Pixmap *pixmap = 0, int is_utf8 = 0); void draw_xft_text(int x, int y, const wchar_t *text, int length, BC_Pixmap *pixmap); - void draw_wtext(int x, int y, const wchar_t *text, int length = -1, BC_Pixmap *pixmap = 0); + int draw_single_text(int draw, int font, + int x, int y, const wchar_t *text, int length = -1, BC_Pixmap *pixmap = 0); // truncate the text to a ... version that fits in the width, using the current_font void truncate_text(char *result, const char *text, int w); void draw_center_text(int x, int y, const char *text, int length = -1); diff --git a/cinelerra-5.1/guicast/bcwindowdraw.C b/cinelerra-5.1/guicast/bcwindowdraw.C index c5d904ea..cd28636f 100644 --- a/cinelerra-5.1/guicast/bcwindowdraw.C +++ b/cinelerra-5.1/guicast/bcwindowdraw.C @@ -232,15 +232,16 @@ void BC_WindowBase::draw_xft_text(int x, int y, { int dy = -1; const wchar_t *wsp = text, *wep = wsp + length; + int font = top_level->current_font; while( wsp < wep ) { const wchar_t *wcp = wsp; while( wcp < wep && *wcp != '\n' ) ++wcp; int len = wcp - wsp; if( len > 0 ) - draw_wtext(x, y, wsp, len, pixmap); + draw_single_text(1, font, x, y, wsp, len, pixmap); if( wcp >= wep ) break; if( dy < 0 ) - dy = get_text_height(top_level->current_font); + dy = get_text_height(font); y += dy; wsp = wcp + 1; } @@ -281,6 +282,12 @@ void BC_WindowBase::xft_draw_string(XftColor *xft_color, XftFont *xft_font, } int BC_WindowBase::get_single_text_width(int font, const wchar_t *text, int length) +{ + return draw_single_text(0, font, 0,0, text, length); +} + +int BC_WindowBase::draw_single_text(int draw, int font, + int x, int y, const wchar_t *text, int length, BC_Pixmap *pixmap) { if( length < 0 ) length = wcslen(text); @@ -293,10 +300,31 @@ int BC_WindowBase::get_single_text_width(int font, const wchar_t *text, int leng xp->byte1 = (unsigned char) (text[i] >> 8); xp->byte2 = (unsigned char) (text[i] & 0xff); } + if( draw ) { + XDrawString16(top_level->display, + pixmap ? pixmap->opaque_pixmap : this->pixmap->opaque_pixmap, + top_level->gc, x, y, xtext, length); + } return XTextWidth16(get_font_struct(font), xtext, length); } - int x = 0; + #ifdef HAVE_XFT + XftColor xft_color; + if( draw ) { + XRenderColor color; + color.red = (top_level->current_color & 0xff0000) >> 16; + color.red |= color.red << 8; + color.green = (top_level->current_color & 0xff00) >> 8; + color.green |= color.green << 8; + color.blue = (top_level->current_color & 0xff); + color.blue |= color.blue << 8; + color.alpha = 0xffff; + + XftColorAllocValue(top_level->display, top_level->vis, top_level->cmap, + &color, &xft_color); + } + + int x0 = x; XftFont *basefont = top_level->get_xft_struct(font); XftFont *curfont = 0, *altfont = 0; const wchar_t *up = text, *ubp = up, *uep = ubp + length; @@ -327,6 +355,10 @@ int BC_WindowBase::get_single_text_width(int font, const wchar_t *text, int leng xft_font = basefont; if( xft_font != curfont ) { if( curfont && up > ubp ) { + if( draw ) { + xft_draw_string(&xft_color, curfont, x, y, + (const FcChar32*)ubp, up-ubp, pixmap); + } XGlyphInfo extents; XftTextExtents32(top_level->display, curfont, (const FcChar32*)ubp, up-ubp, &extents); @@ -338,105 +370,22 @@ int BC_WindowBase::get_single_text_width(int font, const wchar_t *text, int leng } if( curfont && up > ubp ) { + if( draw ) { + xft_draw_string(&xft_color, curfont, x, y, + (const FcChar32*)ubp, up-ubp, pixmap); + } XGlyphInfo extents; XftTextExtents32(top_level->display, curfont, (const FcChar32*)ubp, up-ubp, &extents); x += extents.xOff; } - if( altfont ) - XftFontClose(top_level->display, altfont); -#endif - return x; -} - -void BC_WindowBase::draw_wtext(int x, int y, - const wchar_t *text, int length, BC_Pixmap *pixmap) -{ - if( length < 0 ) - length = wcslen(text); - if( !length ) return; - - int font = top_level->current_font; - if( !get_resources()->use_xft ) { - if( !get_font_struct(font) ) return; - XChar2b xtext[length], *xp = xtext; - for( int i=0; ibyte1 = (unsigned char) (text[i] >> 8); - xp->byte2 = (unsigned char) (text[i] & 0xff); - } - XDrawString16(top_level->display, - pixmap ? pixmap->opaque_pixmap : this->pixmap->opaque_pixmap, - top_level->gc, x, y, xtext, length); - return; - } - -#ifdef HAVE_XFT - XRenderColor color; - color.red = (top_level->current_color & 0xff0000) >> 16; - color.red |= color.red << 8; - color.green = (top_level->current_color & 0xff00) >> 8; - color.green |= color.green << 8; - color.blue = (top_level->current_color & 0xff); - color.blue |= color.blue << 8; - color.alpha = 0xffff; - - XftColor xft_color; - XftColorAllocValue(top_level->display, top_level->vis, top_level->cmap, - &color, &xft_color); - - XftFont *basefont = top_level->get_xft_struct(font); - XftFont *curfont = 0, *altfont = 0; - const wchar_t *up = text, *ubp = up, *uep = ubp + length; - - while( up < uep ) { - XftFont *xft_font = 0; - if( XftCharExists(top_level->display, basefont, *up) ) - xft_font = basefont; - else if( altfont ) { - if( XftCharExists(top_level->display, altfont, *up)) - xft_font = altfont; - else { - XftFontClose(top_level->display, altfont); - altfont = 0; - } - } - if( !xft_font ) { - FcPattern *pattern = BC_Resources::find_similar_font(*up, basefont->pattern); - if( pattern != 0 ) { - double psize = 0; - FcPatternGetDouble(basefont->pattern, FC_PIXEL_SIZE, 0, &psize); - FcPatternAddDouble(pattern, FC_PIXEL_SIZE, psize); - FcPatternDel(pattern, FC_SCALABLE); - xft_font = altfont = XftFontOpenPattern(top_level->display, pattern); - } - } - if( !xft_font ) - xft_font = basefont; - if( xft_font != curfont ) { - if( curfont && up > ubp ) { - xft_draw_string(&xft_color, curfont, x, y, - (const FcChar32*)ubp, up-ubp, pixmap); - XGlyphInfo extents; - XftTextExtents32(top_level->display, curfont, - (const FcChar32*)ubp, up-ubp, &extents); - x += extents.xOff; - } - ubp = up; curfont = xft_font; - } - ++up; - } - - if( curfont && up > ubp ) { - xft_draw_string(&xft_color, curfont, x, y, - (const FcChar32*)ubp, up-ubp, pixmap); - } - if( altfont ) XftFontClose(top_level->display, altfont); XftColorFree(top_level->display, top_level->vis, top_level->cmap, &xft_color); #endif + return x - x0; } void BC_WindowBase::truncate_text(char *result, const char *text, int w) diff --git a/cinelerra-5.1/info/plugins.txt b/cinelerra-5.1/info/plugins.txt index edc32cec..94c0e689 100644 --- a/cinelerra-5.1/info/plugins.txt +++ b/cinelerra-5.1/info/plugins.txt @@ -419,7 +419,8 @@ F_volume: Change input volume. #4 x 4 pole allpass: #Artificial latency: #Audio Divider (Suboctave Generator): -#AudioScope: +AudioScope: Convert input audio to video output representing the + audio power spectrum. Shows you the sound wave. #Auto phaser: #Barry's Satan Maximiser: #Bode frequency shifter: @@ -430,7 +431,9 @@ F_volume: Change input volume. #Comb delay line, cubic spline interpolation: #Comb delay line, linear interpolation: #Comb delay line, noninterpolating: -#Compressor: +Compressor: Lessen the dynamic range between the loudest and quietest + parts of an audio signal by boosting the quieter signals + and attenuating the louder signals. #Constant Signal Generator: #Crossfade: #Crossfade (4 outs): @@ -442,10 +445,10 @@ F_volume: Change input volume. #DJ flanger: #Decimator: #Declipper: -#Delay audio: +Delay audio: Delay the audio by some number of seconds. #Delayorama: -#Denoise: -#DenoiseFFT: +Denoise: Reduce audio background noise. +DenoiseFFT: Noise removal from audio using FFT editing. #Despike: #Diode Processor: #Dyson compressor: @@ -453,7 +456,7 @@ F_volume: Change input volume. #EQ Parametric: Echo: Add echo - reflection of sound - for effect. . Level represents the volume adjustment - . Atten is attenuation meaning a reduction in reflection + . Atten is attenuation meaning reduction in reflection . Offset is the lag in the attenuated echo signal EchoCancel: Removes echoes from audio to improve the quality. Recommended to just set the Mode to On for simplicity. @@ -515,7 +518,9 @@ Pitch shift: Uses FFT to try to change the pitch without #Remove Gaps: #ResampleRT: #Retro Flanger: -#Reverb: +Reverb: Reflections of sound to add depth and fullness. + Simulates creation of a large number of reflections + which build up and then decay. #Reverse Delay (5s max): Reverse audio: Play the audio backwards. #Ringmod with LFO: @@ -552,3 +557,22 @@ Reverse audio: Play the audio backwards. #VyNil (Vinyl Effect): #Wave Terrain Oscillator: #z-1: +# +# Transitions - Audio and Video +# +Crossfade: Creates a smooth transition from one audio source + edit to another. The crossfade has the first + source fade out while the second fades in. +BandSlide: Bands slide across video and you see the image slide. +BandWipe: Bands wipe across the video and you see the mask slides. +Dissolve: A soft dissolve transition between two video segments, + The left segment turns more transparent while at the + same time the right segment materializes into place. +Flash: The video flashes when transitioning between segments. +IrisSquare: Video switches segments via a small rectangular view + that gradually grows to full size. +Shape Wipe: Wipe a specific shape across the video. Available + shapes are: circle, clock, heart, tile2x2h, tile2x2v. +Slide: Image slides into view - can set: Left/Right/In/Out. +Wipe: Wipe the image across screen starting left or right. +Zoom: Zoom out video at X/Y magnification for some seconds. diff --git a/cinelerra-5.1/picon_cinfinity/ff_audio.png b/cinelerra-5.1/picon_cinfinity/ff_audio.png new file mode 100644 index 0000000000000000000000000000000000000000..60dde317936224d7b0587ffd88c7725cde97f1a6 GIT binary patch literal 4466 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 Ef?67$tN;K2 literal 0 HcmV?d00001 diff --git a/cinelerra-5.1/picon_cinfinity/ff_video.png b/cinelerra-5.1/picon_cinfinity/ff_video.png new file mode 100644 index 0000000000000000000000000000000000000000..a26b8e9786598a65647c9ad0a25ea13c0a579139 GIT binary patch literal 4480 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 S{V1aV000017U}`zjzbUt000McNliru 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 = plugin; current_operation = NONE; + current_point = 0; } int CompressorCanvas::button_press_event() -- 2.26.2