int AssetEdit::window_height()
{
int h = 128 + 64;
- if( indexable->have_audio() )
- h += 180;
+ if( indexable->have_audio() ) h += 200;
if( indexable->have_video() ) {
- h += 200;
+ h += 210;
if( indexable->is_asset ) {
Asset *asset = (Asset *)indexable;
if( asset->format == FILE_MPEG ||
- asset->format == FILE_FFMPEG ) {
- h += 40;
- }
+ asset->format == FILE_FFMPEG ) h += 42;
}
}
return h;
mwindow->preferences->plugin_dir, PLUGIN_FILE);
remove(index_path);
char png_path[BCTEXTLEN];
- if( plugin->get_theme_png_path(png_path, mwindow->preferences->theme) )
+ if( plugin->get_plugin_png_path(png_path, mwindow->preferences->plugin_icons) )
remove(png_path);
- if( plugin->get_theme_png_path(png_path, "picon") )
+ if( plugin->get_plugin_png_path(png_path, DEFAULT_PICON) )
remove(png_path);
delete plugin; plugin = 0;
awindow->gui->async_update_assets();
AWindowFolders::AWindowFolders(MWindow *mwindow, AWindowGUI *gui, int x, int y, int w, int h)
- : BC_ListBox(x,
- y,
- w,
- h,
+ : BC_ListBox(x, y, w, h,
mwindow->edl->session->folderlist_format == ASSETS_ICONS ?
LISTBOX_ICONS : LISTBOX_TEXT,
- &gui->folders, // Each column has an ArrayList of BC_ListBoxItems.
- 0, // Titles for columns. Set to 0 for no titles
+ &gui->folders, // Each column has an ArrayList of BC_ListBoxItems.
+ 0, // Titles for columns. Set to 0 for no titles
0, // width of each column
- 1, // Total columns.
- 0, // Pixel of top of window.
- 0, // If this listbox is a popup window
- LISTBOX_SINGLE, // Select one item or multiple items
- ICON_TOP, // Position of icon relative to text of each item
- 1) // Allow drags
+ 1, // Total columns.
+ 0, // Pixel of top of window.
+ 0, // If this listbox is a popup window
+ LISTBOX_SINGLE, // Select one item or multiple items
+ ICON_TOP, // Position of icon relative to text of each item
+ 1) // Allow drags
{
this->mwindow = mwindow;
this->gui = gui;
(mwindow->edl->session->assetlist_format == ASSETS_ICONS && gui->allow_iconlisting ) ?
LISTBOX_ICONS : LISTBOX_TEXT,
&gui->assets, // Each column has an ArrayList of BC_ListBoxItems.
- gui->asset_titles, // Titles for columns. Set to 0 for no titles
- mwindow->edl->session->asset_columns, // width of each column
- 1, // Total columns.
- 0, // Pixel of top of window.
- 0, // If this listbox is a popup window
- LISTBOX_MULTIPLE, // Select one item or multiple items
- ICON_TOP, // Position of icon relative to text of each item
- 1) // Allow drag
+ gui->asset_titles,// Titles for columns. Set to 0 for no titles
+ mwindow->edl->session->asset_columns, // width of each column
+ 1, // Total columns.
+ 0, // Pixel of top of window.
+ 0, // If this listbox is a popup window
+ LISTBOX_MULTIPLE, // Select one item or multiple items
+ ICON_TOP, // Position of icon relative to text of each item
+ 1) // Allow drag
{
this->mwindow = mwindow;
this->gui = gui;
set_drag_scroll(0);
+ set_scroll_stretch(1, 1);
}
AWindowAssets::~AWindowAssets()
double EditPanel::get_position()
{
EDL *edl = mwindow->edl;
- return !edl ? 0 :
- edl->local_session->get_selectionstart(1) +
- edl->session->get_frame_offset() / edl->session->frame_rate;
+ return !edl ? 0 : edl->local_session->get_selectionstart(1);
}
void EditPanel::set_position(double position)
EDL *edl = mwindow->edl;
if( !edl ) return;
if( position != get_position() ) {
- position -= edl->session->get_frame_offset() / edl->session->frame_rate;
if( position < 0 ) position = 0;
edl->local_session->set_selectionstart(position);
edl->local_session->set_selectionend(position);
show_titles = 1;
test_playback_edits = 1;
time_format = TIME_HMSF;
- for(int i = 0; i < 4; i++)
- timecode_offset[i] = 0;
nudge_format = 1;
tool_window = 0;
for(int i = 0; i < MAXCHANNELS; i++) {
show_titles = defaults->get("SHOW_TITLES", 1);
// test_playback_edits = defaults->get("TEST_PLAYBACK_EDITS", 1);
time_format = defaults->get("TIME_FORMAT", TIME_HMSF);
- for(int i = 0; i < 4; i++) {
- sprintf(string, "TIMECODE_OFFSET_%d", i);
- timecode_offset[i] = defaults->get(string, 0);
- }
nudge_format = defaults->get("NUDGE_FORMAT", 1);
tool_window = defaults->get("TOOL_WINDOW", 0);
vconfig_in->load_defaults(defaults);
defaults->update("SHOW_TITLES", show_titles);
// defaults->update("TEST_PLAYBACK_EDITS", test_playback_edits);
defaults->update("TIME_FORMAT", time_format);
- for(int i = 0; i < 4; i++) {
- sprintf(string, "TIMECODE_OFFSET_%d", i);
- defaults->update(string, timecode_offset[i]);
- }
defaults->update("NUDGE_FORMAT", nudge_format);
defaults->update("TOOL_WINDOW", tool_window);
vconfig_in->save_defaults(defaults);
show_titles = file->tag.get_property("SHOW_TITLES", 1);
// test_playback_edits = file->tag.get_property("TEST_PLAYBACK_EDITS", test_playback_edits);
time_format = file->tag.get_property("TIME_FORMAT", time_format);
- for(int i = 0; i < 4; i++) {
- sprintf(string, "TIMECODE_OFFSET_%d", i);
- timecode_offset[i] = file->tag.get_property(string, timecode_offset[i]);
- }
nudge_format = file->tag.get_property("NUDGE_FORMAT", nudge_format);
tool_window = file->tag.get_property("TOOL_WINDOW", tool_window);
vwindow_meter = file->tag.get_property("VWINDOW_METER", vwindow_meter);
file->tag.set_property("SHOW_TITLES", show_titles);
file->tag.set_property("TEST_PLAYBACK_EDITS", test_playback_edits);
file->tag.set_property("TIME_FORMAT", time_format);
- for(int i = 0; i < 4; i++) {
- sprintf(string, "TIMECODE_OFFSET_%d", i);
- file->tag.set_property(string, timecode_offset[i]);
- }
file->tag.set_property("NUDGE_FORMAT", nudge_format);
file->tag.set_property("TOOL_WINDOW", tool_window);
file->tag.set_property("VWINDOW_METER", vwindow_meter);
show_titles = session->show_titles;
test_playback_edits = session->test_playback_edits;
time_format = session->time_format;
- for(int i = 0; i < 4; i++) {
- timecode_offset[i] = session->timecode_offset[i];
- }
nudge_format = session->nudge_format;
tool_window = session->tool_window;
for(int i = 0; i < MAXCHANNELS; i++) {
return 0;
}
-int64_t EDLSession::get_frame_offset()
-{
- return int64_t((timecode_offset[3] * 3600 + timecode_offset[2] * 60 +
- timecode_offset[1]) * frame_rate + timecode_offset[0]);
-}
-
void EDLSession::dump()
{
printf("EDLSession::dump\n");
void equivalent_output(EDLSession *session, double *result);
void dump();
-// calculates the frame offset for programme timecode
- int64_t get_frame_offset();
-
// Audio
int achannel_positions[MAXCHANNELS];
// AWindow format
#include "deleteallindexes.h"
#include "edl.h"
#include "edlsession.h"
+#include "file.h"
+#include "filesystem.h"
#include "language.h"
#include "mwindow.h"
#include "preferences.h"
void InterfacePrefs::create_objects()
{
- int x, y;
BC_Resources *resources = BC_WindowBase::get_resources();
int margin = mwindow->theme->widget_border;
char string[BCTEXTLEN];
- x = mwindow->theme->preferencesoptions_x;
- y = mwindow->theme->preferencesoptions_y;
+ int x0 = mwindow->theme->preferencesoptions_x;
+ int y0 = mwindow->theme->preferencesoptions_y;
+ int x = x0, y = y0;
add_subwindow(new BC_Title(x, y, _("Time Format"), LARGEFONT,
resources->text_default));
pwindow->thread->edl->session->time_format == TIME_FRAMES,
x, y));
y += 20;
- int x0 = x;
add_subwindow(feet = new TimeFormatFeet(pwindow, this,
pwindow->thread->edl->session->time_format == TIME_FEET_FRAMES,
- x0, y));
- x0 += feet->get_w() + 15;
+ x, y));
+ x += feet->get_w() + 15;
BC_Title *title;
- add_subwindow(title = new BC_Title(x0, y, _("Frames per foot:")));
- x0 += title->get_w() + margin;
+ add_subwindow(title = new BC_Title(x, y, _("Frames per foot:")));
+ x += title->get_w() + margin;
sprintf(string, "%0.2f", pwindow->thread->edl->session->frames_per_foot);
add_subwindow(new TimeFormatFeetSetting(pwindow,
- x0, y - 5, string));
+ x, y - 5, string));
+ x = x0;
y += 20;
add_subwindow(seconds = new TimeFormatSeconds(pwindow, this,
pwindow->thread->edl->session->time_format == TIME_SECONDS,
y1 = y + 5;
y += 35;
add_subwindow(title = new BC_Title(x, y, _("Keyframe reticle:")));
- x1 = x + title->get_w() + 10;
+ x1 = x + 100;
keyframe_reticle = new KeyframeReticle(x1, y, &pwindow->thread->preferences->keyframe_reticle);
add_subwindow(keyframe_reticle);
keyframe_reticle->create_objects();
add_subwindow(new BC_Title(x, y, _("Button 1:")));
ViewBehaviourText *text;
- add_subwindow(text = new ViewBehaviourText(80, y - 5,
+ add_subwindow(text = new ViewBehaviourText(x1, y - 5,
behavior_to_text(pwindow->thread->edl->session->edit_handle_mode[0]),
pwindow,
&(pwindow->thread->edl->session->edit_handle_mode[0])));
text->create_objects();
y += 30;
add_subwindow(new BC_Title(x, y, _("Button 2:")));
- add_subwindow(text = new ViewBehaviourText(80,
+ add_subwindow(text = new ViewBehaviourText(x1,
y - 5,
behavior_to_text(pwindow->thread->edl->session->edit_handle_mode[1]),
pwindow,
text->create_objects();
y += 30;
add_subwindow(new BC_Title(x, y, _("Button 3:")));
- add_subwindow(text = new ViewBehaviourText(80,
+ add_subwindow(text = new ViewBehaviourText(x1,
y - 5,
behavior_to_text(pwindow->thread->edl->session->edit_handle_mode[2]),
pwindow,
text->create_objects();
y += 40;
- x1 = x;
+
add_subwindow(title = new BC_Title(x, y + 5, _("Min DB for meter:")));
x += title->get_w() + 10;
sprintf(string, "%d", pwindow->thread->edl->session->min_meter_db);
sprintf(string, "%d", pwindow->thread->edl->session->max_meter_db);
add_subwindow(max_db = new MeterMaxDB(pwindow, string, x, y));
- x = x1;
+ x = x0;
y += 30;
ViewTheme *theme;
add_subwindow(new BC_Title(x, y, _("Theme:")));
- x += 60;
+ x += 100;
add_subwindow(theme = new ViewTheme(x, 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));
+ plugin_icons->create_objects();
}
const char* InterfacePrefs::behavior_to_text(int mode)
void ViewTheme::create_objects()
{
ArrayList<PluginServer*> themes;
- MWindow::search_plugindb(0,
- 0,
- 0,
- 0,
- 1,
- themes);
-
- for(int i = 0; i < themes.total; i++)
- {
+ MWindow::search_plugindb(0, 0, 0, 0, 1, themes);
+
+ for(int i = 0; i < themes.total; i++) {
add_item(new ViewThemeItem(this, themes.values[i]->title));
}
}
return 1;
}
+ViewThemeItem::ViewThemeItem(ViewTheme *popup, const char *text)
+ : BC_MenuItem(text)
+{
+ this->popup = popup;
+}
+
+int ViewThemeItem::handle_event()
+{
+ popup->set_text(get_text());
+ strcpy(popup->pwindow->thread->preferences->theme, get_text());
+ popup->handle_event();
+ return 1;
+}
+
+ViewPluginIcons::ViewPluginIcons(int x, int y, PreferencesWindow *pwindow)
+ : BC_PopupMenu(x, y, 200, pwindow->thread->preferences->plugin_icons, 1)
+{
+ this->pwindow = pwindow;
+}
+ViewPluginIcons::~ViewPluginIcons()
+{
+}
+void ViewPluginIcons::create_objects()
+{
+ add_item(new ViewPluginIconItem(this, DEFAULT_PICON));
+ FileSystem fs;
+ const char *plugin_path = File::get_plugin_path();
+ fs.update(plugin_path);
+ if( fs.update(plugin_path) ) return;
+ for( int i=0; i<fs.dir_list.total; ++i ) {
+ char *fs_path = fs.dir_list[i]->path;
+ if( !fs.is_dir(fs_path) ) continue;
+ char *cp = strrchr(fs_path,'/');
+ cp = !cp ? fs_path : cp+1;
+ if( strncmp("picon_", cp, 6) ) continue;
+ cp += 6;
+ add_item(new ViewPluginIconItem(this, cp));
+ }
+}
+int ViewPluginIcons::handle_event()
+{
+ return 1;
+}
-ViewThemeItem::ViewThemeItem(ViewTheme *popup, char *text)
+ViewPluginIconItem::ViewPluginIconItem(ViewPluginIcons *popup, const char *text)
: BC_MenuItem(text)
{
this->popup = popup;
}
-int ViewThemeItem::handle_event()
+int ViewPluginIconItem::handle_event()
{
popup->set_text(get_text());
- strcpy(popup->pwindow->thread->preferences->theme, get_text());
+ strcpy(popup->pwindow->thread->preferences->plugin_icons, get_text());
popup->handle_event();
return 1;
}
+
ViewThumbnails::ViewThumbnails(int x,
int y,
PreferencesWindow *pwindow)
class ViewBehaviourText;
class ViewBehaviourItem;
class ViewTheme;
-class ViewThumbnails;
class ViewThemeItem;
+class ViewPluginIcons;
+class ViewPluginIconItem;
+class ViewThumbnails;
class UseTipWindow;
class UseWarnIndecies;
class UseWarnVersion;
PreferencesWindow *pwindow;
};
-class ViewThumbnails : public BC_CheckBox
+class ViewThemeItem : public BC_MenuItem
{
public:
- ViewThumbnails(int x, int y, PreferencesWindow *pwindow);
+ ViewThemeItem(ViewTheme *popup, const char *text);
+ int handle_event();
+ ViewTheme *popup;
+};
+
+class ViewPluginIcons : public BC_PopupMenu
+{
+public:
+ ViewPluginIcons(int x, int y, PreferencesWindow *pwindow);
+ ~ViewPluginIcons();
+
+ void create_objects();
int handle_event();
+
PreferencesWindow *pwindow;
};
-class ViewThemeItem : public BC_MenuItem
+class ViewPluginIconItem : public BC_MenuItem
{
public:
- ViewThemeItem(ViewTheme *popup, char *text);
+ ViewPluginIconItem(ViewPluginIcons *popup, const char *text);
int handle_event();
- ViewTheme *popup;
+ ViewPluginIcons *popup;
+};
+
+class ViewThumbnails : public BC_CheckBox
+{
+public:
+ ViewThumbnails(int x, int y, PreferencesWindow *pwindow);
+ int handle_event();
+ PreferencesWindow *pwindow;
};
class UseTipWindow : public BC_CheckBox
#define PROGRAM_NAME "Cinelerra"
#define DEFAULT_THEME "S.U.V."
+#define DEFAULT_PICON "picon"
#define CONFIG_FILE "Cinelerra_rc"
#define PRESETS_FILE "Cinelerra_presets"
#define PICTURE_FILE "Cinelerra_picture"
if(debug) printf("MWindowGUI::create_objects %d\n", __LINE__);
add_subwindow(mainclock = new MainClock(mwindow,
- mwindow->theme->mclock_x,
- mwindow->theme->mclock_y,
+ mwindow->theme->mclock_x, mwindow->theme->mclock_y,
mwindow->theme->mclock_w));
- mainclock->set_position_offset( (double)
- (mwindow->edl->session->get_frame_offset() /
- mwindow->edl->session->frame_rate));
if(debug) printf("MWindowGUI::create_objects %d\n", __LINE__);
mainclock->update(0);
if(!pwindow->thread->edl->session->interpolate_raw)
white_balance_raw->disable();
-
-SET_TRACE
-// y += 30;
-// add_subwindow(new PlaybackDeblock(pwindow, 10, y));
-
- x2 = x;
- x += 370;
- title1 = new BC_Title(x, y, _("Timecode offset:"), MEDIUMFONT);
- add_subwindow(title1); x += title1->get_w();
- for( int i=3;;) {
- sprintf(string, "%d", pwindow->thread->edl->session->timecode_offset[i]);
- TimecodeOffset *tcofs = new TimecodeOffset(x, y, pwindow, this, string, i);
- add_subwindow(tcofs); x += tcofs->get_w();
- if( --i < 0 ) break;
- title1 = new BC_Title(x, y, ":", MEDIUMFONT);
- add_subwindow(title1); x += title1->get_w();
- }
-
- x = x2;
y += white_balance_raw->get_h() + 5;
add_subwindow(vdevice_title = new BC_Title(x, y, _("Video Driver:")));
video_device = new VDevicePrefs(x + vdevice_title->get_w() + 10, y,
pwindow, this, playback_config->vconfig, 0, MODEPLAY);
video_device->initialize(0);
-SET_TRACE
-
}
return 1;
}
-TimecodeOffset::TimecodeOffset(int x, int y, PreferencesWindow *pwindow,
- PlaybackPrefs *playback, char *text, int unit)
- : BC_TextBox(x, y, 30, 1, text)
-{
- this->pwindow = pwindow;
- this->playback = playback;
- this->unit = unit;
-}
-
-int TimecodeOffset::handle_event()
-{
- pwindow->thread->edl->session->timecode_offset[unit] = atol(get_text());
- return 1;
-}
-
class PlaybackSoftwareTimer;
class PlaybackRealTime;
class PlaybackMap51_2;
-class TimecodeOffset;
class VideoAsynchronous;
class VideoEveryFrame;
class PlaybackDeblock;
PlaybackPrefs *playback;
};
-class TimecodeOffset : public BC_TextBox
-{
- public:
- TimecodeOffset(int x, int y, PreferencesWindow *pwindow,
- PlaybackPrefs *playback, char *text, int unit);
- int handle_event();
- int unit;
- PlaybackPrefs *playback;
- PreferencesWindow *pwindow;
-};
-
class PlaybackSubtitle : public BC_CheckBox
{
public:
}
-int PluginServer::get_theme_png_path(char *png_path, const char *theme_dir)
-{
- char *bp = strrchr(path, '/');
- if( !bp ) bp = path; else ++bp;
- char *sp = strrchr(bp,'.');
- if( !sp ) sp = bp + strlen(bp);
- char *cp = png_path, *dp = bp;
- cp += sprintf(cp,"%s/%s/", mwindow->preferences->plugin_dir, theme_dir);
- while( dp < sp ) *cp++ = *dp++;
- strcpy(cp, ".png");
+int PluginServer::get_plugin_png_path(char *png_path, const char *plugin_icons)
+{
+ char *pp = png_path, *ep = pp + BCTEXTLEN-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);
+ if( pp < ep ) *pp++ = '/';
+ char *cp = strrchr(path, '/');
+ cp = !cp ? path : cp+1;
+ char *sp = strrchr(cp, '.');
+ if( !sp ) sp = cp+strlen(cp);
+ while( pp < ep && cp < sp ) *pp++ = *cp++;
+ pp += snprintf(pp, ep-pp, ".png");
+ *pp = 0;
struct stat st;
if( stat(png_path, &st) ) return 0;
if( !S_ISREG(st.st_mode) ) return 0;
return st.st_size;
}
-int PluginServer::get_theme_png_path(char *png_path, Theme *theme)
-{
- char *bp = strrchr(theme->path, '/');
- if( !bp ) bp = theme->path; else ++bp;
- char *sp = strrchr(bp,'.');
- if( !sp || ( strcmp(sp, ".plugin") && strcmp(sp,".so") ) ) return 0;
- char theme_dir[BCTEXTLEN], *cp = theme_dir;
- while( bp < sp ) *cp++ = *bp++;
- *cp = 0;
- return get_theme_png_path(png_path, theme_dir);
-}
-
int PluginServer::get_plugin_png_path(char *png_path)
{
- int len = get_theme_png_path(png_path, mwindow->theme);
- if( !len )
- len = get_theme_png_path(png_path, "picon");
+ int len = get_plugin_png_path(png_path, mwindow->preferences->plugin_icons);
+ if( !len ) len = get_plugin_png_path(png_path, DEFAULT_PICON);
return len;
}
EDL *edl, Plugin *plugin);
// close the plugin
int close_plugin();
- int get_theme_png_path(char *png_path, const char *theme_dir);
- int get_theme_png_path(char *png_path, Theme *theme);
+ int get_plugin_png_path(char *png_path, const char *plugin_icons);
int get_plugin_png_path(char *png_path);
void dump(FILE *fp=stdout);
// Release any objects which are required after playback stops.
trap_sigsegv = 1;
trap_sigintr = 1;
theme[0] = 0;
+ plugin_icons[0] = 0;
use_renderfarm = 0;
force_uniprocessor = 0;
renderfarm_port = DEAMON_PORT;
use_thumbnails = that->use_thumbnails;
keyframe_reticle = that->keyframe_reticle;
strcpy(theme, that->theme);
+ strcpy(plugin_icons, that->plugin_icons);
use_tipwindow = that->use_tipwindow;
scan_commercials = that->scan_commercials;
strcpy(theme, DEFAULT_THEME);
defaults->get("THEME", theme);
+ strcpy(plugin_icons, DEFAULT_PICON);
+ defaults->get("PLUGIN_ICONS", plugin_icons);
for(int i = 0; i < MAXCHANNELS; i++)
{
defaults->update("KEYFRAME_RETICLE", keyframe_reticle);
defaults->update("TRAP_SIGSEGV", trap_sigsegv);
defaults->update("TRAP_SIGINTR", trap_sigintr);
-// defaults->update("GLOBAL_PLUGIN_DIR", global_plugin_dir);
defaults->update("THEME", theme);
+ defaults->update("PLUGIN_ICONS", plugin_icons);
for(int i = 0; i < MAXCHANNELS; i++)
int trap_sigintr;
// Title of theme
char theme[BCTEXTLEN];
+// plugin icon set
+ char plugin_icons[BCTEXTLEN];
double render_preroll;
int brender_preroll;
int force_uniprocessor;
#define WIDTH 770
-#define HEIGHT 720
+#define HEIGHT 740
PreferencesMenuitem::PreferencesMenuitem(MWindow *mwindow)
if( strcmp(preferences->theme, mwindow->preferences->theme) != 0 )
mwindow->restart_status = -1; // reload, need new bcresources
+ if( strcmp(preferences->plugin_icons, mwindow->preferences->plugin_icons) != 0 )
+ mwindow->restart_status = -1;
mwindow->edl->copy_session(edl, 1);
mwindow->preferences->copy_from(preferences);
mwindow->gui->ffmpeg_toggle->set_tooltip(ffmpeg_early_probe ?
FFMPEG_EARLY_TIP : FFMPEG_LATE_TIP);
mwindow->gui->mainshbtns->load(mwindow->preferences);
- double tc_position =
- mwindow->edl->session->get_frame_offset() / mwindow->edl->session->frame_rate;
- mwindow->gui->mainclock->set_position_offset(tc_position);
//edl->session->recording_format->dump();
//mwindow->edl->session->recording_format->dump();
audio_cache = 0;
video_cache = 0;
- if(playback_engine && playback_engine->mwindow)
- mwindow = playback_engine->mwindow;
- else
- mwindow = 0;
- show_tc = 0;
-
+ mwindow = !playback_engine ? 0 : playback_engine->mwindow;
input_lock = new Condition(1, "RenderEngine::input_lock");
start_lock = new Condition(1, "RenderEngine::start_lock");
// Lock out interrupts before and after renderengine is active
Mutex *interrupt_lock;
-// Show the timecode on the video
- int show_tc;
-
int done;
int is_nested;
// If nested, the devices are owned by someone else
add_subwindow(script_title = new BC_Title(x1, y, _("Script Text:")));
y += script_title->get_h() + pad;
int rows = (ok_y - y - BC_Title::calculate_h(this,_("Line Text:")) -
- 4*pad) / text_rowsz - 3;
+ 4*pad) / text_rowsz - 4;
int w1 = get_w() - x1 - pad;
script_entry = new ScriptEntry(this, x1, y, w1, rows, blank_line);
script_entry->create_objects();
y += script_entry->get_h() + pad;
add_subwindow(line_title = new BC_Title(x1, y, _("Line Text:")));
y += line_title->get_h() + pad;
- line_entry = new ScriptEntry(this, x1, y, w1, 3);
+ line_entry = new ScriptEntry(this, x1, y, w1, 4);
line_entry->create_objects();
ok = new SWindowOK(this, ok_x, ok_y);
add_subwindow(ok);
script_title->reposition_window(x, y);
y += script_title->get_h() + pad;
w1 = w - x - pad;
- int rows = (ok_y - y - line_title->get_h() - 4*pad) / text_rowsz - 3;
+ int rows = (ok_y - y - line_title->get_h() - 4*pad) / text_rowsz - 4;
script_entry->reposition_window(x, y, w1, rows);
y += script_entry->get_h() + 2*pad;
line_title->reposition_window(x, y);
y += line_title->get_h() + pad;
- line_entry->reposition_window(x, y, w1, 3);
+ line_entry->reposition_window(x, y, w1, 4);
return 0;
}
}
ScriptScroll::ScriptScroll(SWindowGUI *gui, int x, int y, int w)
- : BC_ScrollBar(x, y, SCROLL_HORIZ, w, 0, 0, 0)
+ : BC_ScrollBar(x, y, SCROLL_HORIZ + SCROLL_STRETCH, w, 0, 0, 0)
{
this->sw_gui = gui;
}
script_entries->update(value);
sprintf(value,"%jd",script_text_lines);
script_texts->update(value);
- int hw = 2*script_scroll->get_h();
+ int hw = script_scroll->get_h();
script_scroll->update_length(script.size(), script_entry_no, hw, 0);
script_position->update(script_entry_no);
script_position->set_boundaries((int64_t)0, (int64_t)script.size()-1);
//printf("VirtualVNode::render_as_module\n");
//output_temp->dump_stacks();
- Edit *edit = 0;
- if(renderengine->show_tc)
- renderengine->vrender->insert_timecode(edit,
- start_position,
- output_temp);
-
return 0;
}
1,
use_cache,
use_asynchronous);
-/* Insert timecode */
- if(renderengine->show_tc)
- insert_timecode(playable_edit,
- input_position,
- video_out);
if(debug) printf("VRender::process_buffer %d\n", __LINE__);
}
}
-int VRender::insert_timecode(Edit* playable_edit,
- int64_t position,
- VFrame *output)
-{
-#if 0
- EDLSession *session = renderengine->edl->session;
- /* Create a vframe with TC and SRC timecode in white
- * with a black border */
- VFrame *input = new VFrame(0,
- output->get_w(), MIN(output->get_h(), 50),
- output->get_color_model(), output->get_bytes_per_line());
- char etc[12];
- char srctc[12];
- int src_position = 0;
-
-TRACE("VRender::insert_timecode 10")
-
- /* Edited TC */
- Units::totext(etc,
- (renderengine->vrender->current_position +
- session->get_frame_offset()) / session->frame_rate,
- session->time_format,
- session->sample_rate,
- session->frame_rate,
- session->frames_per_foot);
-
-TRACE("VRender::insert_timecode 20")
-
- if(playable_edit)
- {
-TRACE("VRender::insert_timecode 30")
- src_position = renderengine->vrender->current_position -
- playable_edit->startproject +
- playable_edit->startsource +
- playable_edit->asset->tcstart;
-TRACE("VRender::insert_timecode 40")
- Units::totext(srctc,
- src_position / playable_edit->asset->frame_rate,
- session->time_format,
- session->sample_rate,
- playable_edit->asset->frame_rate,
- session->frames_per_foot);
- }
- else
- {
-TRACE("VRender::insert_timecode 50")
- Units::totext(srctc,
- 0.0,
-// (renderengine->vrender->current_position - position) / session->frame_rate,
- session->time_format,
- session->sample_rate,
- session->frame_rate,
- session->frames_per_foot);
- }
-TRACE("VRender::insert_timecode 60")
-
-//printf("re position %i position %i\n",
-// renderengine->vrender->current_position, position);
-//printf("SRC %s TC %s\n", srctc, etc);
-
- /* Insert the timecode data onto the input frame */
-
- vrender->overlayer->overlay(output, input,
- input->x, input->y, input->width, input->height,
- output->x, output->y, output->width, output->height,
- 1, TRANSFER_REPLACE,
- renderengine->edl->session->interpolation_type);
- delete(input);
-UNTRACE
-#endif
- return 0;
-}
-
int VRender::get_colormodel(VEdit *playable_edit,
int use_vconsole, int use_brender)
{
double VWindowEditing::get_position()
{
EDL *edl = vwindow->get_edl();
- double position = !edl ? 0 : edl->local_session->get_selectionstart(1) +
- edl->session->get_frame_offset() / edl->session->frame_rate;
+ double position = !edl ? 0 : edl->local_session->get_selectionstart(1);
return position;
}
EDL *edl = vwindow->get_edl();
if( !edl ) return;
if( get_position() != position ) {
- position -= edl->session->get_frame_offset() / edl->session->frame_rate;
if( position < 0 ) position = 0;
edl->local_session->set_selectionstart(position);
edl->local_session->set_selectionend(position);
{
if(new_position != old_position)
{
- Units::totext(string,
- new_position,
+ Units::totext(string, new_position,
mwindow->edl->session->sample_rate,
mwindow->edl->session->time_format,
mwindow->edl->session->frame_rate,
int FromTextBox::update_position(double new_position)
{
- new_position += mwindow->edl->session->get_frame_offset() /
- mwindow->edl->session->frame_rate;;
Units::totext(string,
new_position,
mwindow->edl->session->time_format,
int ToTextBox::update_position(double new_position)
{
- new_position += mwindow->edl->session->get_frame_offset() /
- mwindow->edl->session->frame_rate;
- Units::totext(string,
- new_position,
+ Units::totext(string, new_position,
mwindow->edl->session->time_format,
mwindow->edl->session->sample_rate,
mwindow->edl->session->frame_rate,
// ====================================================== scrollbars
-
-BC_ListBoxYScroll::BC_ListBoxYScroll(BC_ListBox *listbox,
- int total_height,
- int view_height,
- int position)
- : BC_ScrollBar(listbox->get_yscroll_x(),
- listbox->get_yscroll_y(),
- SCROLL_VERT,
- listbox->get_yscroll_height(),
- total_height,
- position,
- view_height)
+BC_ListBoxYScroll::BC_ListBoxYScroll(BC_ListBox *listbox)
+ : BC_ScrollBar(listbox->get_yscroll_x(), listbox->get_yscroll_y(),
+ listbox->yscroll_orientation, listbox->get_yscroll_height(),
+ listbox->items_h, listbox->yposition, listbox->view_h)
{
this->listbox = listbox;
}
return 1;
}
-int BC_ListBoxYScroll::update_length(int64_t length, int64_t position, int64_t handlelength, int flush)
-{
- return BC_ScrollBar::update_length(length+handlelength/4, position, handlelength, flush);
-}
-
-
-
-
-
-
-BC_ListBoxXScroll::BC_ListBoxXScroll(BC_ListBox *listbox,
- int total_width,
- int view_width,
- int position)
- : BC_ScrollBar(listbox->get_xscroll_x(),
- listbox->get_xscroll_y(),
- SCROLL_HORIZ,
- listbox->get_xscroll_width(),
- total_width,
- position,
- view_width)
+BC_ListBoxXScroll::BC_ListBoxXScroll(BC_ListBox *listbox)
+ : BC_ScrollBar(listbox->get_xscroll_x(), listbox->get_xscroll_y(),
+ listbox->xscroll_orientation, listbox->get_xscroll_width(),
+ listbox->items_w, listbox->xposition, listbox->view_w)
{
this->listbox = listbox;
}
return 1;
}
-int BC_ListBoxXScroll::update_length(int64_t length, int64_t position, int64_t handlelength, int flush)
-{
- return BC_ScrollBar::update_length(length+handlelength/4, position, handlelength, flush);
-}
-
-
-
-
-
-
BC_ListBoxToggle::BC_ListBoxToggle(BC_ListBox *listbox,
BC_ListBoxItem *item,
new_value = 0;
need_xscroll = 0;
need_yscroll = 0;
+ xscroll_orientation = SCROLL_HORIZ;
+ yscroll_orientation = SCROLL_VERT;
bg_tile = 0;
bg_draw = 1;
drag_popup = 0;
}
+void BC_ListBox::set_scroll_stretch(int xv, int yv)
+{
+ if( xv >= 0 ) xscroll_orientation =
+ !xv ? SCROLL_HORIZ : SCROLL_HORIZ + SCROLL_STRETCH;
+ if( yv >= 0 ) yscroll_orientation =
+ !yv ? SCROLL_VERT : SCROLL_VERT + SCROLL_STRETCH;
+}
int BC_ListBox::get_yscroll_x()
{
{
if(!xscrollbar)
{
- destination->add_subwindow(xscrollbar =
- new BC_ListBoxXScroll(this,
- w_needed,
- view_w,
- xposition));
+ xscrollbar = new BC_ListBoxXScroll(this);
+ destination->add_subwindow(xscrollbar);
xscrollbar->show_window(0);
xscrollbar->bound_to = this;
}
{
if(!yscrollbar)
{
- destination->add_subwindow(yscrollbar =
- new BC_ListBoxYScroll(this,
- h_needed,
- view_h,
- yposition));
+ yscrollbar = new BC_ListBoxYScroll(this);
+ destination->add_subwindow(yscrollbar);
yscrollbar->show_window(0);
yscrollbar->bound_to = this;
}
#define BCPOPUPLISTBOX_W 25
#define BCPOPUPLISTBOX_H 25
+class BC_ListBoxYScroll;
+class BC_ListBoxXScroll;
+class BC_ListBoxToggle;
+class BC_ListBox;
#define MIN_COLUMN_WIDTH 10
class BC_ListBoxYScroll : public BC_ScrollBar
{
+ BC_ListBox *listbox;
public:
- BC_ListBoxYScroll(BC_ListBox *listbox,
- int total_height,
- int view_height,
- int position);
+ BC_ListBoxYScroll(BC_ListBox *listbox);
~BC_ListBoxYScroll();
int handle_event();
- int update_length(int64_t length, int64_t position, int64_t handlelength, int flush);
-private:
- BC_ListBox *listbox;
};
class BC_ListBoxXScroll : public BC_ScrollBar
{
+ BC_ListBox *listbox;
public:
- BC_ListBoxXScroll(BC_ListBox *listbox,
- int total_width,
- int view_width,
- int position);
+ BC_ListBoxXScroll(BC_ListBox *listbox);
~BC_ListBoxXScroll();
int handle_event();
- int update_length(int64_t length, int64_t position, int64_t handlelength, int flush);
-private:
- BC_ListBox *listbox;
};
class BC_ListBoxToggle
{
public:
- BC_ListBoxToggle(BC_ListBox *listbox,
- BC_ListBoxItem *item,
- int x,
- int y);
+ BC_ListBoxToggle(BC_ListBox *listbox, BC_ListBoxItem *item, int x, int y);
int cursor_motion_event(int *redraw_toggles);
int cursor_leave_event(int *redraw_toggles);
class BC_ListBox : public BC_SubWindow
{
+ friend class BC_ListBoxYScroll;
+ friend class BC_ListBoxXScroll;
+ friend class BC_ListBoxToggle;
public:
- BC_ListBox(int x,
- int y,
- int w,
- int h,
+ BC_ListBox(int x, int y, int w, int h,
int display_format, // Display text list or icons
ArrayList<BC_ListBoxItem*> *data = 0, // Each column has an ArrayList of BC_ListBoxItems.
const char **column_titles = 0, // Titles for columns. Set to 0 for no titles
// change the contents
int update(ArrayList<BC_ListBoxItem*> *data,
- const char **column_titles,
- int *column_widths,
- int columns,
- int xposition = 0,
- int yposition = 0,
- int highlighted_number = -1, // Flat index of item cursor is over
- int recalc_positions = 0, // set all autoplace flags to 1
- int draw = 1);
+ const char **column_titles, int *column_widths, int columns,
+ int xposition = 0, int yposition = 0,
+ int highlighted_number = -1, // Flat index of item cursor is over
+ int recalc_positions = 0, // set all autoplace flags to 1
+ int draw = 1);
void center_selection();
void update_format(int display_format, int redraw);
int get_format();
int get_xscroll_x();
int get_xscroll_y();
int get_xscroll_width();
+ void set_scroll_stretch(int xv, int yv);
int get_column_offset(int column);
int get_column_width(int column, int clamp_right = 0);
int get_title_h();
int get_first_visible() { return first_in_view; }
int get_last_visible() { return last_in_view; }
-
enum
{
SORT_ASCENDING,
// In BCLISTBOX_SELECT mode determines the value to set items to
int new_value;
int need_xscroll, need_yscroll;
+ int xscroll_orientation, yscroll_orientation;
// Move items during drag operation of text items.
int process_drag;
int allow_drag;
#include <string.h>
-BC_ScrollBar::BC_ScrollBar(int x,
- int y,
- int orientation,
- int pixels,
- int64_t length,
- int64_t position,
- int64_t handlelength,
+BC_ScrollBar::BC_ScrollBar(int x, int y, int orientation, int pixels,
+ int64_t length, int64_t position, int64_t handlelength,
VFrame **data)
: BC_SubWindow(x, y, 0, 0, -1)
{
this->handlelength = handlelength;
this->selection_status = 0;
this->highlight_status = 0;
+ this->stretch = orientation & SCROLL_STRETCH ? 1 : 0;
+ orientation &= ~SCROLL_STRETCH;
this->orientation = orientation;
this->pixels = pixels;
- if(data)
- this->data = data;
- else
- if(orientation == SCROLL_HORIZ)
- this->data = BC_WindowBase::get_resources()->hscroll_data;
- else
- this->data = BC_WindowBase::get_resources()->vscroll_data;
+ if( !data ) data = orientation == SCROLL_HORIZ ?
+ BC_WindowBase::get_resources()->hscroll_data :
+ BC_WindowBase::get_resources()->vscroll_data ;
+ this->data = data;
handle_pixel = 0;
handle_pixels = 0;
calculate_dimensions(w, h);
}
-
-
void BC_ScrollBar::calculate_dimensions(int &w, int &h)
{
switch(orientation)
int BC_ScrollBar::update_length(int64_t length, int64_t position, int64_t handlelength, int flush)
{
+ if( stretch ) length += handlelength/4;
this->length = length;
this->position = position;
this->handlelength = handlelength;
#include "bcsubwindow.h"
// Orientations
-#define SCROLL_HORIZ 0
-#define SCROLL_VERT 1
+#define SCROLL_HORIZ 0
+#define SCROLL_VERT 1
+#define SCROLL_STRETCH 2
// Selection identifiers
#define SCROLL_HANDLE 1
class BC_ScrollBar : public BC_SubWindow
{
public:
- BC_ScrollBar(int x,
- int y,
- int orientation,
- int pixels,
- int64_t length,
- int64_t position,
- int64_t handlelength,
- VFrame **data = 0);
+ BC_ScrollBar(int x, int y, int orientation, int pixels, int64_t length,
+ int64_t position, int64_t handlelength, VFrame **data = 0);
virtual ~BC_ScrollBar();
friend class BC_ListBox;
int get_span();
static int get_span(int orientation);
int get_arrow_pixels();
-
private:
void calculate_dimensions(int &w, int &h);
int activate();
int64_t length, position, handlelength; // handle position and size
int selection_status, highlight_status;
- int orientation, pixels;
+ int orientation, pixels, stretch;
int handle_pixel, handle_pixels;
int min_pixel, max_pixel;
int64_t repeat_count;
int xpos = get_x_pos();
if( xpos != xscroll->get_value() )
xscroll->update_value(xpos);
- int xlength = text_width + view_w/4;
- if( xlength != xscroll->get_length() ||
+ if( text_width != xscroll->get_length() ||
view_w != xscroll->get_handlelength() )
- xscroll->update_length(xlength, xpos, view_w, 0);
+ xscroll->update_length(text_width, xpos, view_w, 0);
}
if( yscroll ) {
yscroll->reposition_window(x + w - yscroll->get_span(), y, text->get_h());
}
BC_ScrollTextBoxXScroll::BC_ScrollTextBoxXScroll(BC_ScrollTextBox *gui)
- : BC_ScrollBar(gui->x, gui->y + gui->text->get_h(), SCROLL_HORIZ, gui->text->get_w(),
- gui->text->get_text_width(MEDIUMFONT, gui->get_wtext()), 0, gui->w)
+ : BC_ScrollBar(gui->x, gui->y + gui->text->get_h(), SCROLL_HORIZ + SCROLL_STRETCH,
+ gui->text->get_w(), gui->text->get_text_width(MEDIUMFONT, gui->get_wtext()),
+ 0, gui->w)
{
this->gui = gui;
}
}
BC_ScrollTextBoxYScroll::BC_ScrollTextBoxYScroll(BC_ScrollTextBox *gui)
- : BC_ScrollBar(gui->x + gui->text->get_w(), gui->y, SCROLL_VERT, gui->text->get_h(),
- gui->text->get_text_rows(), 0, gui->rows)
+ : BC_ScrollBar(gui->x + gui->text->get_w(), gui->y, SCROLL_VERT,
+ gui->text->get_h(), gui->text->get_text_rows(), 0, gui->rows)
{
this->gui = gui;
}
return 0;
}
-const char* FileItem::get_path()
-{
- return path;
-}
-
-const char* FileItem::get_name()
-{
- return name;
-}
-
-int FileItem::get_is_dir()
-{
- return is_dir;
-}
-
FileSystem::FileSystem()
return 0;
}
-void FileSystem::alphabetize()
-{
- sort_table(&dir_list);
-}
-
-int FileSystem::is_root_dir(char *path)
-{
- if(!strcmp(current_dir, "/")) return 1;
- return 0;
-}
-
int FileSystem::test_filter(FileItem *file)
{
char *filter1 = 0, *filter2 = filter, *subfilter1, *subfilter2;
new_file = new FileItem;
char full_path[BCTEXTLEN], name_only[BCTEXTLEN];
sprintf(full_path, "%s", current_dir);
- if(!is_root_dir(current_dir)) strcat(full_path, "/");
+ add_end_slash(full_path);
strcat(full_path, new_filename->d_name);
strcpy(name_only, new_filename->d_name);
new_file->set_path(full_path);
int FileSystem::parse_directories(char *new_dir)
{
//printf("FileSystem::parse_directories 1 %s\n", new_dir);
- if(new_dir[0] != '/')
- {
-// extend path completely
+ if( *new_dir != '/' ) { // expand to abs path
char string[BCTEXTLEN];
-//printf("FileSystem::parse_directories 2 %s\n", current_dir);
- if(!strlen(current_dir))
- {
-// no current directory
- strcpy(string, new_dir);
- }
- else
- {
- snprintf(string, sizeof(string),
- is_root_dir(current_dir) ||
- current_dir[strlen(current_dir)-1] == '/' ?
-// current directory is root or already has ending /
- "%s%s" : "%s/%s",
- current_dir, new_dir);
- }
-
-//printf("FileSystem::parse_directories 3 %s %s\n", new_dir, string);
+ strcpy(string, current_dir);
+ add_end_slash(string);
+ strcat(string, new_dir);
strcpy(new_dir, string);
-//printf("FileSystem::parse_directories 4\n");
}
return 0;
}
return 0;
}
-char* FileSystem::get_current_dir()
-{
- return current_dir;
-}
-
-int FileSystem::total_files()
-{
- return dir_list.total;
-}
-
-
-FileItem* FileSystem::get_entry(int entry)
-{
- return dir_list.values[entry];
-}
-
// collapse ".", "..", "//" eg. x/./..//y = y
char *FileSystem::basepath(const char *path)
int set_path(char *path);
int set_name(char *name);
int reset();
- const char* get_path();
- const char* get_name();
- int get_is_dir();
+
+ const char *get_path() { return path; }
+ const char *get_name() { return name; }
+ int get_is_dir() { return is_dir; }
char *path;
char *name;
int set_current_dir(const char *new_dir);
int move_up();
- char *get_current_dir();
// Syntax of filter is
// single filter without [].
// multiple filters enclosed in [].
static void set_date(const char *path, int64_t value); // set the date of the file
static int64_t get_size(char *filename); // Get the number of bytes in the file.
int add_end_slash(char *new_dir);
- int total_files();
- FileItem* get_entry(int entry);
- int number_of(FileItem *item);
int parse_tildas(char *new_dir); // expand tildas
int parse_directories(char *new_dir); // add directories
int parse_dots(char *new_dir); // move up directory tree after expanding tildas
static char *basepath(const char *path); // collapse ".", "..", "//" elements
-// Alphabetize all the directories and files. By default
-// directories come first.
- void alphabetize();
-
// Array of files and directories in the directory pointed to by current_dir.
// Directories are first.
ArrayList<FileItem*> dir_list;
+ char *get_current_dir() { return current_dir; }
+ FileItem* get_entry(int entry) { return dir_list.values[entry]; }
+ int total_files() { return dir_list.total; }
+ void alphabetize() { sort_table(&dir_list); }
// Sorting order and sorting field. These are identical in BC_ListBox.
enum
// Combine the directories and files into the master list, directories first.
int combine(ArrayList<FileItem*> *dir_list, ArrayList<FileItem*> *file_list);
-// Return whether or not the string is the root directory.
- int is_root_dir(char *path);
// Whether or not the file passes the current filter.
int test_filter(FileItem *file);
int reset_parameters();
-Join Mailing List at cinelerra-cv.org.
-Testers/programmers/translators needed.
-Use root, to capture crashes in /tmp/cin*.dmp file.
+Join Mailing List at cinelerra-cv.org.
+Use root, to capture crashes in /tmp/cin*.dmp file.
For usage help, refer to the following:
- https://cinelerra-cv.org/docs/cinelerra_cv_manual_en.html
- https://cinelerra-cv.org/five/Features5.pdf
- http://beccatoria.dreamwidth.org/144288.html#cutid2
- http://g-raffa.eu/Cinelerra/HOWTO/basics.html
-May 2017 Release/Changes of note:
- Title plugin allows for 3071 characters now.
- Horizontal scrollbar added to Title plugin.
- Number of chars. used/remaining show in Titler.
- Faststart option added for Mp4/ffmpeg format.
- Probe Order preference added for flexibility.
- Dcraw program updated to latest Coffin version.
- NOTE: to use raw mode, must enable CR2 probe.
- Equalizer plugin lock problem fixed + others.
- Gif files now correctly handled by ffmpeg.
- Zoom bar in compositor handles any size.
-April 2017 Release/Changes of note:
- Upgraded FFMPEG to 3.3 + other 3rd party libraries.
- Blue Banana plugin improvements - End Mask +.
- New OGG option file / Ubuntu 17 build added.
- Fixed Background Rendering / added G HotKey.
- Aspect Ratio when not 1 to 1, is now correct.
-March 2017 Release/Changes of note:
- Title plugin major changes to include:
- ColorPicker added, fast Font selection,
- Stroker for fonts added, BC_FONT_PATH.
- 32-bit Debian build now available.
- New Quicktime options for v308/v410/16mmto264.
- Added C_/D_ for ambiguous translations.
- Fixed Fade/curve not copying correctly backward.
-February 2017 Release/Changes of note:
- Title plugin major changes to include:
- Drag with 9 different handles, Background
- video, individual character attributes of
- Color, Size, Font, Underline, Bold, Italic,
- Caps, Blink, Alpha, Nudge, Sup(erscript,
- subscript), and PNG inclusion + Rt. Click.
- Text focus policy choice preference added.
- Bluray creation allowing for non-root usage.
-January 2017 Release/Changes of note:
- Motion51 plugin added with easier usage.
- Unicode characters can be put into textbox.
- Smooth Lines create near-perfect circles/curves.
- Bluray creation improved to cover more area.
- H265 options file added for mp4 rendering.
+ https://cinelerra-cv.org/docs/cinelerra_cv_manual_en.html
+ https://cinelerra-cv.org/five/Features5.pdf
+ http://beccatoria.dreamwidth.org/144288.html#cutid2
+ http://g-raffa.eu/Cinelerra/HOWTO/basics.html
+.
+Cinfinity icons selected in Preferences (Creative Common
+ By https://creativecommons.org/licenses/by/3.0/)
+.
+July 2017 New Features of note:
+ Cinfinity icons added along with a Preferences choice.
+ Perspective plugin improvements with more versatility.
+ Info on plugins with a short description added.
+ Copy/Paste within and across instances enhancements.
+ Ffmpeg seek changes for ffmpeg non-stream type files.
+June 2017 New Features of note:
+ CriKey does edgedetect, chroma key, and interpolation.
+ Faststart option added for Mp4 and QT ffmpeg format.
+.
+January to May 2017 New Features of note:
+ Probe Order preference added for flexibility.
+ Dcraw program updated to latest Coffin version.
+ Zoom bar in compositor handles any size.
+ Upgraded FFMPEG to 3.3 + other 3rd party libraries.
+ Blue Banana plugin improvements - End Mask +.
+ Title plugin major changes to include:
+ ColorPicker added, fast Font selection,
+ Stroker for fonts added, BC_FONT_PATH.
+ Drag with 9 different handles, Background
+ video, individual character attributes of
+ Color, Size, Font, Underline, Bold, Italic,
+ Caps, Blink, Alpha, Nudge, Sup(erscript,
+ subscript), and PNG inclusion + Rt. Click.
+ Now handles 3071 characters and a count provided.
+ Added C_/D_ for ambiguous translations.
+ Bluray creation allowing for non-root usage.
+ Motion51 plugin added with easier usage.
+ Unicode characters can be put into textbox.
+ Smooth Lines create near-perfect circles/curves.
+ Bluray creation improved to cover more area.
PLUGIN_DIR := $(BINDIR)/plugins
OUTPUT_DIR = $(PLUGIN_DIR)/$($(PLUGIN))
-PLUGIN_PNGS = $(wildcard $(foreach t,$(themes),$(t).png)) picon.png
+PLUGIN_PNGS = $(wildcard picon*.png)
OUTPUT_PNGS = $(foreach png,$(PLUGIN_PNGS), $(PLUGIN_DIR)/$(basename $(png))/$(PLUGIN).png)
OUTPUT = $(OUTPUT_DIR)/$(PLUGIN).plugin
OUTPUT_G = $(OBJDIR)/$(PLUGIN).debuginfo