BandConfig::BandConfig()
{
- freq = 0;
- solo = 0;
- bypass = 0;
-// readahead_len = 1.0;
- attack_len = 1.0;
- release_len = 1.0;
+ reset();
}
BandConfig::~BandConfig()
xml->tag.set_property("SOLO", solo);
xml->tag.set_property("ATTACK_LEN", attack_len);
xml->tag.set_property("RELEASE_LEN", release_len);
+ xml->tag.set_property("MKUP_GAIN", mkup_gain);
}
xml->append_tag();
xml->append_newline();
for( int i = 0; i < levels.total; i++ ) {
xml->tag.set_title("LEVEL");
- xml->tag.set_property("X", levels.values[i].x);
- xml->tag.set_property("Y", levels.values[i].y);
+ xml->tag.set_property("X", levels[i].x);
+ xml->tag.set_property("Y", levels[i].y);
xml->append_tag();
xml->append_newline();
}
solo = xml->tag.get_property("SOLO", solo);
attack_len = xml->tag.get_property("ATTACK_LEN", attack_len);
release_len = xml->tag.get_property("RELEASE_LEN", release_len);
+ mkup_gain = xml->tag.get_property("MKUP_GAIN", mkup_gain);
}
levels.remove_all();
{
levels.remove_all();
for( int i = 0; i < src->levels.total; i++ ) {
- levels.append(src->levels.values[i]);
+ levels.append(src->levels[i]);
}
// readahead_len = src->readahead_len;
freq = src->freq;
solo = src->solo;
bypass = src->bypass;
+ mkup_gain = src->mkup_gain;
}
int BandConfig::equiv(BandConfig *src)
solo != src->solo ||
bypass != src->bypass ||
freq != src->freq ||
+ mkup_gain != src->mkup_gain ||
// !EQUIV(readahead_len, src->readahead_len) ||
!EQUIV(attack_len, src->attack_len) ||
!EQUIV(release_len, src->release_len) ) {
}
for( int i = 0; i < levels.total && i < src->levels.total; i++ ) {
- compressor_point_t *this_level = &levels.values[i];
- compressor_point_t *that_level = &src->levels.values[i];
+ compressor_point_t *this_level = &levels[i];
+ compressor_point_t *that_level = &src->levels[i];
if( !EQUIV(this_level->x, that_level->x) ||
!EQUIV(this_level->y, that_level->y) ) {
return 0;
void BandConfig::boundaries(CompressorConfigBase *base)
{
for( int i = 0; i < levels.size(); i++ ) {
- compressor_point_t *level = &levels.values[i];
+ compressor_point_t *level = &levels[i];
if( level->x < base->min_db ) level->x = base->min_db;
if( level->y < base->min_db ) level->y = base->min_db;
if( level->x > base->max_db ) level->x = base->max_db;
}
}
+void BandConfig::reset()
+{
+ freq = 0;
+ solo = 0;
+ bypass = 0;
+// readahead_len = 1.0;
+ attack_len = 1.0;
+ release_len = 1.0;
+ mkup_gain = 0.0;
+ levels.remove_all();
+}
+
CompressorConfigBase::CompressorConfigBase(int total_bands)
{
min_value = DB::fromdb(min_db) + 0.001;
// min_x = min_db; max_x = 0;
// min_y = min_db; max_y = 0;
- smoothing_only = 0;
- trigger = 0;
- input = CompressorConfigBase::TRIGGER;
- for( int i=0; i<total_bands; ++i ) {
- bands[i].freq = Freq::tofreq((i+1) * TOTALFREQS / total_bands);
- }
- current_band = 0;
+ reset_base();
}
delete [] bands;
}
+void CompressorConfigBase::reset_base()
+{
+ input = CompressorConfigBase::TRIGGER;
+ trigger = 0;
+ smoothing_only = 0;
+ for( int i=0; i<total_bands; ++i )
+ bands[i].freq = Freq::tofreq((i+1) * TOTALFREQS / total_bands);
+ current_band = 0;
+}
+
+void CompressorConfigBase::reset_bands()
+{
+ for( int i=0; i<total_bands; ++i )
+ bands[i].reset();
+}
+
+
void CompressorConfigBase::boundaries()
{
for( int i=0; i<total_bands; ++i ) {
int sz = levels.size();
if( !sz ) return 1.;
if( i >= sz ) i = sz-1;
- return levels.values[i].y;
+ return levels[i].y;
}
double CompressorConfigBase::get_x(int band, int i)
int sz = levels.size();
if( !sz ) return 0.;
if( i >= sz ) i = sz-1;
- return levels.values[i].x;
+ return levels[i].x;
}
double CompressorConfigBase::calculate_db(int band, double x)
if( !sz ) return x;
compressor_point_t &point0 = levels[0];
double px0 = point0.x, py0 = point0.y, dx0 = x - px0;
-// the only point. Use slope from min_db
- if( sz == 1 )
- return py0 + dx0 * (py0 - min_db) / (px0 - min_db);
// before 1st point, use 1:1 gain
double ret = py0 + dx0;
+ if( sz > 1 ) {
// find point <= x
- int k = sz;
- while( --k >= 0 && levels[k].x > x );
- if( k >= 0 ) {
- compressor_point_t &curr = levels[k];
- double cx = curr.x, cy = curr.y, dx = x - cx;
+ int k = sz;
+ while( --k >= 0 && levels[k].x > x );
+ if( k >= 0 ) {
+ compressor_point_t &curr = levels[k];
+ double cx = curr.x, cy = curr.y, dx = x - cx;
// between 2 points. Use slope between 2 points
// the last point. Use slope of last 2 points
- if( k >= sz-1 ) --k;
- compressor_point_t &prev = levels[k+0];
- compressor_point_t &next = levels[k+1];
- double px = prev.x, py = prev.y;
- double nx = next.x, ny = next.y;
- ret = cy + dx * (ny - py) / (nx - px);
+ if( k >= sz-1 ) --k;
+ compressor_point_t &prev = levels[k+0];
+ compressor_point_t &next = levels[k+1];
+ double px = prev.x, py = prev.y;
+ double nx = next.x, ny = next.y;
+ ret = cy + dx * (ny - py) / (nx - px);
+ }
}
+ else
+// the only point. Use slope from min_db
+ ret = py0 + dx0 * (py0 - min_db) / (px0 - min_db);
+ ret += bands[band].mkup_gain;
return ret;
}
// draw the points
if( band == config->current_band ) {
ArrayList<compressor_point_t> &levels = config->bands[band].levels;
+ double mkup_gain = config->bands[band].mkup_gain;
for( int i = 0; i < levels.size(); i++ ) {
double x_db = config->get_x(band, i);
- double y_db = config->get_y(band, i);
-
+ double y_db = config->get_y(band, i) + mkup_gain;
int x = db_to_x(x_db);
int y = db_to_y(y_db);
int CompressorCanvasBase::button_press_event()
{
// Check existing points
- if( is_event_win() &&
- cursor_inside() ) {
+ if( is_event_win() && cursor_inside() ) {
if( get_buttonpress() == 3 ) {
menu->activate_menu();
return 1;
}
+ int x = get_cursor_x(), y = get_cursor_y();
int band = config->current_band;
ArrayList<compressor_point_t> &levels = config->bands[band].levels;
+ double mkup_gain = config->bands[band].mkup_gain;
for( int i=0; i<levels.size(); ++i ) {
double x_db = config->get_x(config->current_band, i);
- double y_db = config->get_y(config->current_band, i);
+ double y_db = config->get_y(config->current_band, i) + mkup_gain;
- int x = db_to_x(x_db);
- int y = db_to_y(y_db);
+ int px = db_to_x(x_db);
+ int py = db_to_y(y_db);
- if( get_cursor_x() <= x + POINT_W / 2 && get_cursor_x() >= x - POINT_W / 2 &&
- get_cursor_y() <= y + POINT_W / 2 && get_cursor_y() >= y - POINT_W / 2 ) {
+ if( x <= px + POINT_W / 2 && x >= px - POINT_W / 2 &&
+ y <= py + POINT_W / 2 && y >= py - POINT_W / 2 ) {
current_operation = DRAG;
current_point = i;
return 1;
}
}
- if( get_cursor_x() >= graph_x &&
- get_cursor_x() < graph_x + graph_w &&
- get_cursor_y() >= graph_y &&
- get_cursor_y() < graph_y + graph_h ) {
+ if( x >= graph_x && x < graph_x + graph_w &&
+ y >= graph_y && y < graph_y + graph_h ) {
// Create new point
- double x_db = x_to_db(get_cursor_x());
- double y_db = y_to_db(get_cursor_y());
+ double x_db = x_to_db(x);
+ double y_db = y_to_db(y) + mkup_gain;
current_point = config->set_point(config->current_band, x_db, y_db);
current_operation = DRAG;
{
int band = config->current_band;
ArrayList<compressor_point_t> &levels = config->bands[band].levels;
+ double mkup_gain = config->bands[band].mkup_gain;
+ int x = get_cursor_x(), y = get_cursor_y();
if( current_operation == DRAG ) {
- int x = get_cursor_x();
- int y = get_cursor_y();
double x_db = x_to_db(x);
- double y_db = y_to_db(y);
+ double y_db = y_to_db(y) - mkup_gain;
if( shift_down() ) {
const int grid_precision = 6;
- x_db = config->max_db + (double)(grid_precision * (int)((x_db - config->max_db) / grid_precision - 0.5));
- y_db = config->max_db + (double)(grid_precision * (int)((y_db - config->max_db) / grid_precision - 0.5));
+ x_db = config->max_db + (double)(grid_precision *
+ (int)((x_db - config->max_db) / grid_precision - 0.5));
+ y_db = config->max_db + (double)(grid_precision *
+ (int)((y_db - config->max_db) / grid_precision - 0.5));
}
for( int i = 0; i < levels.size(); i++ ) {
double x_db = config->get_x(config->current_band, i);
- double y_db = config->get_y(config->current_band, i);
+ double y_db = config->get_y(config->current_band, i) + mkup_gain;
+ int px = db_to_x(x_db);
+ int py = db_to_y(y_db);
- int x = db_to_x(x_db);
- int y = db_to_y(y_db);
-
- if( get_cursor_x() <= x + POINT_W / 2 && get_cursor_x() >= x - POINT_W / 2 &&
- get_cursor_y() <= y + POINT_W / 2 && get_cursor_y() >= y - POINT_W / 2 ) {
+ if( x <= px + POINT_W / 2 && x >= px - POINT_W / 2 &&
+ y <= py + POINT_W / 2 && y >= py - POINT_W / 2 ) {
new_cursor = UPRIGHT_ARROW_CURSOR;
break;
}
}
// out of active area
- if( get_cursor_x() >= graph_x + graph_w ||
- get_cursor_y() < graph_y ) {
+ if( x >= graph_x + graph_w || y < graph_y ) {
new_cursor = ARROW_CURSOR;
}
-
if( new_cursor != get_cursor() ) {
set_cursor(new_cursor, 0, 1);
}
slope_samples = 0;
slope_current_sample = 0;
peak_samples = 0;
- slope_value2 = 1.0;
slope_value1 = 1.0;
- slope_samples = 0;
- slope_current_sample = 0;
- current_value = 1.0;
+ slope_value2 = 1.0;
+ current_value = 0.5;
gui_frame_samples = 2048;
gui_max_gain = 1.0;
gui_frame_counter = 0;
slope_current_sample /
slope_samples;
- if( config->smoothing_only ) {
- for( int j = 0; j < channels; j++ ) {
- output_buffer[j]->get_data()[i] = current_value * 2 - 1;
- }
- }
- else {
- double gain = 1.0;
-
- if( band_config->bypass ) {
- gain = 1.0;
- }
- else {
+ double gain = 1.0;
+ if( !config->smoothing_only ) {
+ if( !band_config->bypass )
gain = config->calculate_gain(band, current_value);
- }
-
// update the GUI frames
if( fabs(gain - 1.0) > fabs(gui_max_gain - 1.0) ) {
gui_max_gain = gain;
}
-//if( !EQUIV(gain, 1.0) ) printf("CompressorEngine::process %d gain=%f\n", __LINE__, gain);
-
// calculate the input level to draw. Should it be the trigger or a channel?
GET_TRIGGER(input_buffer[channel]->get_data(), i);
if( sample > gui_max_level ) {
gui_max_level = sample;
}
-
gui_frame_counter++;
if( gui_frame_counter > gui_frame_samples ) {
//if( !EQUIV(gui_frame_max, 1.0) ) printf("CompressorEngine::process %d offset=%d gui_frame_max=%f\n", __LINE__, i, gui_frame_max);
gui_max_level = 0.0;
gui_frame_counter = 0;
}
-
- for( int j = 0; j < channels; j++ ) {
- output_buffer[j]->get_data()[i] = input_buffer[j]->get_data()[i] * gain;
- }
+ }
+ else {
+ gain = current_value > 0.01 ? 0.5 / current_value : 50.;
+ }
+ for( int j = 0; j < channels; j++ ) {
+ output_buffer[j]->get_data()[i] = input_buffer[j]->get_data()[i] * gain;
}
}
}
void boundaries(CompressorConfigBase *base);
void save_data(FileXML *xml, int number, int do_multiband);
void read_data(FileXML *xml, int do_multiband);
+ void reset();
ArrayList<compressor_point_t> levels;
int solo;
// double readahead_len;
double attack_len;
double release_len;
+ double mkup_gain;
// upper frequency in Hz
int freq;
virtual int equivalent(CompressorConfigBase &that);
void boundaries();
+ void reset_base();
+ void reset_bands();
void remove_point(int band, int number);
int set_point(int band, double x, double y);
double calculate_db(int band, double x);
CompressorCanvasBase *canvas;
};
-#define GRAPH_BG_COLOR 0x559977
-#define GRAPH_BORDER1_COLOR 0xeeaa44
-#define GRAPH_BORDER2_COLOR 0xeeaaff
-#define GRAPH_GRID_COLOR 0xeeffcc
-#define GRAPH_ACTIVE_COLOR 0x99cc77
-#define GRAPH_INACTIVE_COLOR 0x666688
-
#endif
{
mwindow->gui->set_playing_back(0);
Tracking::stop_playback();
+ mwindow->stop_plugin_guis();
mwindow->edl->local_session->set_playback_end(get_tracking_position());
return 0;
}
if(do_keyframe_guis) update_keyframe_guis();
}
+void MWindow::stop_plugin_guis()
+{
+// Send new configuration to plugin GUI's
+ plugin_gui_lock->lock("MWindow::stop_plugin_guis");
+
+ for( int i=0; i<plugin_guis->size(); ++i ) {
+ PluginServer *ptr = plugin_guis->get(i);
+ if( edl->tracks->plugin_exists(ptr->plugin) ) {
+ ptr->render_stop();
+ }
+ }
+ plugin_gui_lock->unlock();
+}
+
int MWindow::plugin_gui_open(Plugin *plugin)
{
int gui_id = plugin->gui_id;
// Returns 1 if a GUI for the plugin is open so OpenGL routines can determine if
// they can run.
int plugin_gui_open(Plugin *plugin);
+ void stop_plugin_guis();
void show_keyframe_gui(Plugin *plugin);
void hide_keyframe_guis();
void PluginAClient::begin_process_buffer()
{
- frame_buffer.destroy();
+ client_frames.destroy();
}
void PluginAClient::end_process_buffer()
{
- if( !frame_buffer.first ) return;
- server->render_gui_frames(&frame_buffer);
+ if( !client_frames.first ) return;
+ server->render_gui_frames(&client_frames);
}
PluginClientFrame* PluginClient::get_gui_frame(double pos, int dir)
{
- return frame_buffer.get_gui_frame(pos, dir);
+ return client_frames.get_gui_frame(pos, dir);
}
PluginClientFrame* PluginClient::next_gui_frame()
{
- return frame_buffer.first;
+ return client_frames.first;
}
{
}
-int PluginClient::pending_gui_frames()
+int PluginClient::pending_gui_frame()
{
- PluginClientFrame *frame = frame_buffer.first;
+ PluginClientFrame *frame = client_frames.first;
if( !frame ) return 0;
double tracking_position = get_tracking_position();
int direction = get_tracking_direction();
return ret;
}
+int PluginClient::pending_gui_frames()
+{
+ PluginClientFrame *frame = client_frames.first;
+ if( !frame ) return 0;
+ double tracking_position = get_tracking_position();
+ int direction = get_tracking_direction();
+ int count = 0;
+ while( frame && !(direction == PLAY_REVERSE ?
+ frame->position < tracking_position :
+ frame->position > tracking_position) ) {
+ ++count; frame=frame->next;
+ }
+ return count;
+}
+
void PluginClient::add_gui_frame(PluginClientFrame *frame)
{
- frame_buffer.add_gui_frame(frame);
+ client_frames.add_gui_frame(frame);
+}
+int PluginClient::get_gui_frames()
+{
+ return client_frames.total();
}
double PluginClient::get_tracking_position()
void PluginClient::send_render_gui()
{
- server->send_render_gui(&frame_buffer);
+ server->send_render_gui(&client_frames);
}
void PluginClient::send_render_gui(void *data)
BC_WindowBase *window = thread->get_window();
if( !window ) return;
window->lock_window("PluginClient::plugin_reset_gui_frames");
- frame_buffer.reset();
+ client_frames.reset();
window->unlock_window();
}
BC_WindowBase *window = thread->get_window();
if( !window ) return;
window->lock_window("PluginClient::render_gui");
- while( frame_buffer.count > MAX_FRAME_BUFFER )
+ while( client_frames.count > MAX_FRAME_BUFFER )
delete get_gui_frame(0, 0);
-// append client frames to gui frame_buffer, consumes frames
- frame_buffer.concatenate(frames);
- frame_buffer.sort_position(get_tracking_direction());
+// append client frames to gui client_frames, consumes frames
+ client_frames.concatenate(frames);
+ client_frames.sort_position(get_tracking_direction());
update_timer->update();
window->unlock_window();
}
// Base class inherited by all the different types of plugins.
-#define MAX_FRAME_BUFFER 1024
+#define MAX_FRAME_BUFFER 8192
class PluginClient;
// GUI updating wrappers for realtime plugins
// Append frame to queue for next send_frame_buffer
void add_gui_frame(PluginClientFrame *frame);
+ int get_gui_frames();
virtual void render_gui(void *data);
virtual void render_gui(void *data, int size);
void reset_plugin_gui_frames();
void plugin_reset_gui_frames();
void plugin_render_gui_frames(PluginClientFrames *frames);
- int get_gui_frames();
+// first frame ready
+ int pending_gui_frame();
// Called by client to get the total number of frames to draw in update_gui
int pending_gui_frames();
// pop frames until buffer passes position=pos(-1 or seconds) in direction=dir(-1,0,1)
PluginClientThread *thread;
// Frames for updating GUI
- PluginClientFrames frame_buffer;
+ PluginClientFrames client_frames;
// Time of last GUI update
Timer *update_timer;
// Called by MWindow to cause GUI to display
void render_gui(void *data);
void render_gui(void *data, int size);
-// PluginClientFrames queuing to gui frame_buffer
+// PluginClientFrames queuing to gui client_frames
void send_reset_gui_frames();
void reset_gui_frames();
void render_gui_frames(PluginClientFrames *frames);
add_subwindow(title = new BC_Title(x, y, text));
int x1 = x + title->get_w() + xS(10);
int tw = get_w() - x1 - xS(20);
- truncate_text(text, track->title, tw);
- add_subwindow(new BC_Title(x1, y, text));
+ char *track_title = get_truncated_text(MEDIUMFONT, track->title, tw);
+ add_subwindow(new BC_Title(x1, y, track_title));
+ delete [] track_title;
y += title->get_h() + 5;
sprintf(text, _("Edit %d:"), track->edits->number_of(edit)+1);
add_subwindow(title = new BC_Title(x, y, text));
- char edit_title[BCTEXTLEN];
- edit->get_title(edit_title);
- truncate_text(text, edit_title, tw);
- add_subwindow(new BC_Title(x1, y, text));
+ edit->get_title(text);
+ char *edit_title = get_truncated_text(MEDIUMFONT, text, tw);
+ add_subwindow(new BC_Title(x1, y, edit_title));
+ delete [] edit_title;
y += title->get_h() + 5;
EDLSession *session = mwindow->edl->session;
--- /dev/null
+flac flac
+# Flac is a lossless audio codec with good compression
+# and relatively low CPU load. Flac is suitable for
+# permanent archiving of audio.
+# Compression: 0-8 (fast-high), where 5 is used as standard.
+#compression_level 8
--- /dev/null
+matroska pcm_s24le
+# Lossless PCM (pcm_s24le) in Matroska container.
+# If onlyaudio is exported, the extension should
+# be "mka".
+# ffmpeg --help encoder=pcm_s24le
--- /dev/null
+wav pcm_s24le
+# PCM (pcm_s24le) in RIFF WAVE.
+# ffmpeg --help muxer=wav
+# Use RF64 header rather than RIFF for large files:
+rf64 1
--- /dev/null
+wav pcm_s32le
+# PCM (pcm_s32le) in RIFF WAVE.
+# ffmpeg --help muxer=wav
+# Use RF64 header rather than RIFF for large files:
+rf64 1
--- /dev/null
+matroska ffv1
+# FFV1 works lossless and is suitable for the
+# permanent archiving of videos. Flac is often
+# used as audio codec for this purpose.
+# ffmpeg --help encoder=ffv1
+#threads=8
+context=1
+slices=30
--- /dev/null
+matroska ffvhuff
+# FFvHuff is a further development of HuffYUV.
+# Lossless, fast and smaller file sizes than
+# HuffYUV. Lossless PCM is ideally suited as
+# an audio codec.
+# ffmpeg --help encoder=ffvhuff
remove();
}
void remove_block(int i, int n) {
- if( i >= total ) return;
- for( n+=i; n<total; ) values[i++] = values[n++];
+ if( i >= total || !n ) return;
+ for( n+=i; n<total; ++i,++n ) values[i] = values[n];
total = i;
}
void remove_object_block(int i, int n) {
- if( i >= total ) return;
- for( n+=i; n<total; ) { del_value(i); values[i++] = values[n++]; }
- for( n=i; n<total; ++n ) del_value(n);
+ if( i >= total || !n ) return;
+ for( int j=i,k=n; --k>=0 && j<total; ++j ) del_value(j);
+ for( n+=i; n<total; ++i,++n ) values[i] = values[n];
total = i;
}
void remove(TYPE value) {
gui->pixmap->draw_vframe(vicon, icon_x, icon_y);
else if( item->icon )
gui->pixmap->draw_pixmap(item->icon, icon_x, icon_y);
- char item_text[BCTEXTLEN];
- if( display_format == LISTBOX_ICONS_PACKED )
- gui->truncate_text(item_text, item->text, text_w);
- else
- strcpy(item_text, item->text);
+ char *item_text = display_format == LISTBOX_ICONS_PACKED ?
+ get_truncated_text(MEDIUMFONT, item->text, text_w) :
+ cstrdup(item->text);
gui->draw_text(text_x, text_y + get_baseline(item), item_text);
+ delete [] item_text;
}
else
item->set_in_view(0);
int available_w = get_w() - calculate_w(margin, 0, use_title);
if( !icon ) {
- char truncated[BCTEXTLEN];
- truncate_text(truncated, text, available_w);
+ char *truncated = get_truncated_text(MEDIUMFONT, text, available_w);
set_font(MEDIUMFONT);
BC_WindowBase::draw_center_text(
dx + available_w/2 + margin + offset,
(int)((float)get_h()/2 + get_text_ascent(MEDIUMFONT)/2 - 2) + offset,
truncated);
+ delete [] truncated;
}
if( icon ) {
return h * rowh;
}
+// truncate the text with ... & return a new string
+char *BC_WindowBase::get_truncated_text(int font, const char *text, int max_w)
+{
+ char *result = cstrdup(text);
+ int text_w = get_text_width(font, text);
+ int ci = -1, len = strlen(text);
+ if( text_w > max_w ) {
+// get center of string
+ int cx = text_w/2, best = INT_MAX;
+ for( int i=1; i<=len; ++i ) {
+ int cw = get_text_width(font, text, i);
+ if( abs(cw-cx) < abs(best-cx) ) {
+ best = cw; ci = i;
+ }
+ }
+ }
+ if( ci > 0 && ci < len-1 ) {
+// insert ... in the center
+ result[ci-1] = result[ci] = result[ci+1] = '.';
+
+ while( ci-2>=0 && ci+2<(int)strlen(result) &&
+ get_text_width(font, result) > max_w ) {
+// take away a character from the longer side
+ int left_w = get_text_width(font, result, ci-2);
+ int right_w = get_text_width(font, result + ci+3);
+ int i = left_w > right_w ? --ci-1 : ci+2;
+ while( (result[i]=result[i+1])!=0 ) ++i;
+ }
+ }
+
+ return result;
+}
+
BC_Bitmap* BC_WindowBase::new_bitmap(int w, int h, int color_model)
{
if(color_model < 0) color_model = top_level->get_color_model();
int get_text_height(int font, const char *text = 0);
int get_text_width(int font, const char *text, int length = -1);
int get_text_width(int font, const wchar_t *text, int length = -1);
+// truncate the text with ... & return a new string
+ char *get_truncated_text(int font, const char *text, int max_w);
BC_Clipboard* get_clipboard();
void set_dragging(int value);
int set_w(int w);
int length, BC_Pixmap *pixmap);
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);
void draw_line(int x1, int y1, int x2, int y2, BC_Pixmap *pixmap = 0);
void draw_polygon(ArrayList<int> *x, ArrayList<int> *y, BC_Pixmap *pixmap = 0);
return x - x0;
}
-void BC_WindowBase::truncate_text(char *result, const char *text, int w)
-{
- int new_w = get_text_width(current_font, text);
-
- if( new_w > w ) {
- const char* separator = "...";
- int separator_w = get_text_width(current_font, separator);
-// can't fit
- if( separator_w >= w ) {
- strcpy(result, separator);
- return;
- }
-
- int text_len = strlen(text);
-// widen middle gap until it fits
- for( int i=text_len/2; i>0; --i ) {
- strncpy(result, text, i);
- result[i] = 0;
- strcat(result, separator);
- strncat(result, text + text_len - i, i);
- result[i + strlen(separator) + i] = 0;
- new_w = get_text_width(current_font, result);
-//printf("BC_WindowBase::truncate_text %d %d %d %s\n", __LINE__, new_w, w, result);
- if(new_w < w) return;
- }
-
-// Didn't fit
- strcpy(result, separator);
- return;
- }
-
- strcpy(result, text);
-}
-
void BC_WindowBase::draw_center_text(int x, int y, const char *text, int length)
{
if(length < 0) length = strlen(text);
cdripper \
chorus \
compressor \
+ compressormulti \
dcoffset \
delayaudio \
denoise \
CLAMP(x, 0, get_w() - 1);
CLAMP(y, 0, get_h() - 1);
- ((AudioScopeWindow*)plugin->thread->window)->calculate_probe(
- x,
- y,
- 1);
+ ((AudioScopeWindow*)plugin->thread->window)->calculate_probe(x, y, 1);
//printf("AudioScopeCanvas::calculate_point %d %d\n", __LINE__, Freq::tofreq(freq_index));
}
AudioScopeWindow::AudioScopeWindow(AudioScope *plugin)
- : PluginClientWindow(plugin,
- plugin->w,
- plugin->h,
- xS(320),
- yS(320),
- 1)
+ : PluginClientWindow(plugin, plugin->w, plugin->h, xS(320), yS(320), 1)
{
- this->plugin = plugin;
+ this->plugin = plugin;
+ probe_x = -1;
+ probe_y = -1;
}
AudioScopeWindow::~AudioScopeWindow()
//printf("AudioScope::update_gui %d %d\n", __LINE__, total_frames);
-
+// expire old history frames
+ int new_frames = frame_history.size() + total_frames;
+ int expired = new_frames - config.history_size;
+ if( expired > 0 )
+ frame_history.remove_object_block(0, expired);
// Shift frames into history
for(int frame = 0; frame < total_frames; frame++)
- {
- if(frame_history.size() >= config.history_size)
- frame_history.remove_object_number(0);
-
- frame_history.append(frame_buffer.get(0));
- frame_buffer.remove_number(0);
- }
-
-// Reduce history size
- while(frame_history.size() > config.history_size)
- frame_history.remove_object_number(0);
+ frame_history.append(frame_buffer.get(frame));
+ frame_buffer.remove_block(0, total_frames);
// Point probe data at history
current_frame = frame_history.get(frame_history.size() - 1);
while( levels.size() < nbands ) levels.append();
for( int i=0; i<band_config->levels.total; ++i ) {
- levels.values[i].x = DB::fromdb(band_config->levels.values[i].x);
- levels.values[i].y = DB::fromdb(band_config->levels.values[i].y);
+ levels[i].x = DB::fromdb(band_config->levels[i].x);
+ levels[i].y = DB::fromdb(band_config->levels[i].y);
}
// min_x = DB::fromdb(config.min_db);
// min_y = DB::fromdb(config.min_db);
int CompressorConfig::equivalent(CompressorConfig &that)
{
return CompressorConfigBase::equivalent(that);
- return 1;
}
void CompressorConfig::interpolate(CompressorConfig &prev,
x_text->create_objects();
y += x_text->get_h() + margin;
- add_subwindow(clear = new CompressorClear(plugin, x, y));
+ add_subwindow(clear = new CompressorClear(plugin, this, x, y));
+ y += clear->get_h() + margin;
+
+ add_subwindow(title = new BC_Title(x, y, "Gain:"));
+ y += title->get_h() + margin;
+ BandConfig *band_config = &plugin->config.bands[0];
+ add_subwindow(mkup_gain = new CompressorMkupGain(plugin, this, x, y,
+ &band_config->mkup_gain, -10., 10.));
+ y += mkup_gain->get_h() + margin;
+
+ add_subwindow(reset = new CompressorReset(plugin, this, x, y));
+// y += reset->get_h() + margin;
+
x = xS(10);
y = get_h() - yS(40);
void CompressorWindow::update()
{
update_textboxes();
+ BandConfig *band_config = &plugin->config.bands[0];
+ mkup_gain->update(band_config->mkup_gain);
canvas->update();
}
release->update((float)band_config->release_len);
smooth->update(plugin->config.smoothing_only);
if( canvas->current_operation == CompressorCanvas::DRAG ) {
- x_text->update((float)band_config->levels.values[canvas->current_point].x);
- y_text->update((float)band_config->levels.values[canvas->current_point].y);
+ x_text->update((float)band_config->levels[canvas->current_point].x);
+ y_text->update((float)band_config->levels[canvas->current_point].y);
}
}
plugin->config.min_db, plugin->config.max_db, x, y, xS(100))
{
this->plugin = plugin;
+ this->window = window;
set_increment(0.1);
set_precision(2);
}
BandConfig *band_config = &plugin->config.bands[0];
int current_point = ((CompressorWindow*)plugin->thread->window)->canvas->current_point;
if( current_point < band_config->levels.total ) {
- band_config->levels.values[current_point].x = atof(get_text());
- ((CompressorWindow*)plugin->thread->window)->canvas->update();
+ band_config->levels[current_point].x = atof(get_text());
+ window->canvas->update();
plugin->send_configure_change();
}
return 1;
plugin->config.min_db, plugin->config.max_db, x, y, xS(100))
{
this->plugin = plugin;
+ this->window = window;
set_increment(0.1);
set_precision(2);
}
BandConfig *band_config = &plugin->config.bands[0];
int current_point = ((CompressorWindow*)plugin->thread->window)->canvas->current_point;
if( current_point < band_config->levels.total ) {
- band_config->levels.values[current_point].y = atof(get_text());
- ((CompressorWindow*)plugin->thread->window)->canvas->update();
+ band_config->levels[current_point].y = atof(get_text());
+ window->canvas->update();
plugin->send_configure_change();
}
return 1;
return CompressorConfig::TRIGGER;
}
-CompressorClear::CompressorClear(CompressorEffect *plugin, int x, int y)
+CompressorClear::CompressorClear(CompressorEffect *plugin,
+ CompressorWindow *window, int x, int y)
: BC_GenericButton(x, y, _("Clear"))
{
this->plugin = plugin;
+ this->window = window;
}
int CompressorClear::handle_event()
{
BandConfig *band_config = &plugin->config.bands[0];
- band_config->levels.remove_all();
+ band_config->reset();
//plugin->config.dump();
- ((CompressorWindow*)plugin->thread->window)->update();
+ window->update();
+ plugin->send_configure_change();
+ return 1;
+}
+
+CompressorReset::CompressorReset(CompressorEffect *plugin,
+ CompressorWindow *window, int x, int y)
+ : BC_GenericButton(x, y, _("Reset"))
+{
+ this->plugin = plugin;
+ this->window = window;
+}
+
+int CompressorReset::handle_event()
+{
+ plugin->config.reset_bands();
+ plugin->config.reset_base();
+//plugin->config.dump();
+ window->update();
plugin->send_configure_change();
return 1;
}
+
+CompressorMkupGain::CompressorMkupGain(CompressorEffect *plugin,
+ CompressorWindow *window, int x, int y,
+ double *output, double min, double max)
+ : BC_FPot(x, y, *output, min, max)
+{
+ this->plugin = plugin;
+ this->window = window;
+ this->output = output;
+ set_precision(0.01);
+}
+
+int CompressorMkupGain::handle_event()
+{
+ *output = get_value();
+ plugin->send_configure_change();
+ window->canvas->update();
+ return 1;
+}
+
+
CompressorSmooth::CompressorSmooth(CompressorEffect *plugin, int x, int y)
: BC_CheckBox(x, y, plugin->config.smoothing_only, _("Smooth only"))
{
class CompressorClear : public BC_GenericButton
{
public:
- CompressorClear(CompressorEffect *plugin, int x, int y);
+ CompressorClear(CompressorEffect *plugin, CompressorWindow *window,
+ int x, int y);
+ int handle_event();
+ CompressorEffect *plugin;
+ CompressorWindow *window;
+};
+
+class CompressorReset : public BC_GenericButton
+{
+public:
+ CompressorReset(CompressorEffect *plugin,
+ CompressorWindow *window, int x, int y);
+ int handle_event();
+ CompressorEffect *plugin;
+ CompressorWindow *window;
+};
+
+class CompressorMkupGain : public BC_FPot
+{
+public:
+ CompressorMkupGain(CompressorEffect *plugin, CompressorWindow *window,
+ int x, int y, double *output, double min, double max);
int handle_event();
+ CompressorWindow *window;
CompressorEffect *plugin;
+ double *output;
};
class CompressorX : public BC_TumbleTextBox
int x, int y);
int handle_event();
CompressorEffect *plugin;
+ CompressorWindow *window;
};
class CompressorY : public BC_TumbleTextBox
int x, int y);
int handle_event();
CompressorEffect *plugin;
+ CompressorWindow *window;
};
class CompressorTrigger : public BC_TumbleTextBox
CompressorLookAhead *readahead;
CompressorAttack *attack;
CompressorClear *clear;
+ CompressorReset *reset;
+ CompressorMkupGain *mkup_gain;
CompressorX *x_text;
CompressorY *y_text;
CompressorTrigger *trigger;
void ComprMultiEffect::dump_frames()
{
printf("tracking %f, direction %d\n", get_tracking_position(), get_tracking_direction());
- CompressorClientFrame *cfp = (CompressorClientFrame *)frame_buffer.first;
+ CompressorClientFrame *cfp = (CompressorClientFrame *)client_frames.first;
for( int n=0; cfp; cfp=(CompressorClientFrame *)cfp->next,++n ) {
switch( cfp->type ) {
case GAIN_COMPRESSORFRAME: {
//printf("ComprMultiEffect::update_gui %d %d %d\n", __LINE__, reconfigured, total_frames);
if( reconfigured )
window->update();
- if( pending_gui_frames() )
+ if( pending_gui_frame() )
window->update_eqcanvas();
window->unlock_window();
}
}
}
-
+#if 0
void BandState::process_readbehind(int size,
int reaction_samples, int decay_samples, int trigger)
{
}
}
}
-
+#endif
ComprMultiFFT::ComprMultiFFT(ComprMultiEffect *plugin, int channel)
{
void reconfigure();
// calculate the envelope for only this band
void calculate_envelope();
- void process_readbehind(int size,
- int reaction_samples, int decay_samples, int trigger);
- void process_readahead(int size, int preview_samples,
- int reaction_samples, int decay_samples, int trigger);
+// void process_readbehind(int size,
+// int reaction_samples, int decay_samples, int trigger);
+// void process_readahead(int size, int preview_samples,
+// int reaction_samples, int decay_samples, int trigger);
void allocate_filtered(int new_size);
// bandpass filter for this band
int control_margin = xS(150);
int canvas_y2 = get_h() * 2 / 3;
BC_Title *title;
- BandConfig *band_config = &plugin->config.bands[plugin->config.current_band];
- BandConfig *prev_band = 0;
- if( plugin->config.current_band > 0 ) {
- prev_band = &plugin->config.bands[plugin->config.current_band - 1];
- }
-
add_subwindow(title = new BC_Title(x, y, "In:"));
int y2 = y + title->get_h() + margin;
EDL *edl = plugin->get_edl();
x_text->create_objects();
y += x_text->get_h() + margin;
- add_subwindow(clear = new ComprMultiClear(plugin, x, y));
+ add_subwindow(clear = new ComprMultiClear(plugin, this, x, y));
y += clear->get_h() + margin;
- add_subwindow(title = new BC_Title(x, y, _("Freq range:")));
- y += title->get_h();
+ add_subwindow(title = new BC_Title(x, y, _("Gain:")));
+
+ int x2 = get_w() - (margin + BC_Pot::calculate_w()) * 2;
+ int x3 = get_w() - (margin + BC_Pot::calculate_w());
+ add_subwindow(title = new BC_Title(x2, y, _("Freq range:")));
+ y += title->get_h() + margin;
+ add_subwindow(mkup_gain = new ComprMultiMkupGain(plugin, this, x, y,
+ &plugin->config.bands[plugin->config.current_band].mkup_gain,
+ -10., 10.));
// the previous high frequency
- int *ptr = 0;
- if( prev_band ) {
- ptr = &prev_band->freq;
- }
-
- add_subwindow(freq1 = new ComprMultiQPot(this,
- plugin,
- get_w() - (margin + BC_Pot::calculate_w()) * 2,
- y,
- ptr));
-
+ add_subwindow(freq1 = new ComprMultiQPot(this, plugin, x2, y,
+ plugin->config.current_band == 0 ? 0 :
+ &plugin->config.bands[plugin->config.current_band-1].freq));
// the current high frequency
- ptr = &band_config->freq;
- if( plugin->config.current_band == TOTAL_BANDS - 1 ) {
- ptr = 0;
- }
-
- add_subwindow(freq2 = new ComprMultiQPot(this,
- plugin,
- get_w() - margin - BC_Pot::calculate_w(),
- y,
- ptr));
+ add_subwindow(freq2 = new ComprMultiQPot(this, plugin, x3, y,
+ plugin->config.current_band!=TOTAL_BANDS-1 ? 0 :
+ &plugin->config.bands[plugin->config.current_band].freq));
y += freq1->get_h() + margin;
BC_Bar *bar;
add_subwindow(title = new BC_Title(x, y, _("Trigger Type:")));
y += title->get_h();
- add_subwindow(input = new ComprMultiInput(plugin, x, y));
+ add_subwindow(input = new ComprMultiInput(plugin, this, x, y));
input->create_objects();
y += input->get_h() + margin;
- add_subwindow(title = new BC_Title(x, y, _("Trigger:")));
+ add_subwindow(title = new BC_Title(x, y, _("Channel:")));
y += title->get_h();
trigger = new ComprMultiTrigger(plugin, this, x, y);
add_subwindow(title = new BC_Title(x, y, _("Window size:")));
y += title->get_h();
- add_subwindow(size = new ComprMultiSize(this,
- plugin,
- x,
- y));
+ add_subwindow(size = new ComprMultiSize(this, plugin, x, y));
size->create_objects();
size->update(plugin->config.window_size);
y += size->get_h() + margin;
+ add_subwindow(reset = new ComprMultiReset(plugin, this, x, y));
+
canvas->create_objects();
update_eqcanvas();
show_window();
// called when the user selects a different band
void ComprMultiWindow::update()
{
- BandConfig *band_config = &plugin->config.bands[plugin->config.current_band];
-
- for( int i = 0; i < TOTAL_BANDS; i++ ) {
- if( plugin->config.current_band == i ) {
- band[i]->update(1);
- }
- else {
- band[i]->update(0);
- }
- }
+ int curr_band = plugin->config.current_band;
+ for( int i = 0; i < TOTAL_BANDS; i++ )
+ band[i]->update(curr_band == i);
- int *ptr = 0;
- if( plugin->config.current_band > 0 ) {
- ptr = &plugin->config.bands[plugin->config.current_band - 1].freq;
- }
- else {
- ptr = 0;
- }
-
- freq1->output = ptr;
- if( ptr ) {
- freq1->update(*ptr);
+ int *ptr1 = !curr_band ? 0 :
+ &plugin->config.bands[curr_band-1].freq;
+ freq1->output = ptr1;
+ if( ptr1 ) {
+ freq1->update(*ptr1);
freq1->enable();
}
else {
}
// top band edits the penultimate band
- if( plugin->config.current_band < TOTAL_BANDS - 1 ) {
- ptr = &band_config->freq;
- }
- else {
- ptr = 0;
- }
-
- freq2->output = ptr;
- if( ptr ) {
- freq2->update(*ptr);
+ int *ptr2 = curr_band == TOTAL_BANDS-1 ? 0 :
+ &plugin->config.bands[curr_band].freq;
+ freq2->output = ptr2;
+ if( ptr2 ) {
+ freq2->update(*ptr2);
freq2->enable();
}
else {
}
q->update(plugin->config.q);
+ BandConfig *band_config = &plugin->config.bands[curr_band];
+ double *ptr3 = &band_config->mkup_gain;
+ mkup_gain->output = ptr3;
+ mkup_gain->update(*ptr3);
solo->update(band_config->solo);
bypass->update(band_config->bypass);
size->update(plugin->config.window_size);
return 1;
}
-
void ComprMultiSize::create_objects()
{
add_item(new BC_MenuItem("2048"));
add_item(new BC_MenuItem("262144"));
}
-
void ComprMultiSize::update(int size)
{
char string[BCTEXTLEN];
}
+ComprMultiMkupGain::ComprMultiMkupGain(ComprMultiEffect *plugin,
+ ComprMultiWindow *window, int x, int y,
+ double *output, double min, double max)
+ : BC_FPot(x, y, *output, min, max)
+{
+ this->window = window;
+ this->plugin = plugin;
+ this->output = output;
+ set_precision(0.01);
+}
+
+int ComprMultiMkupGain::handle_event()
+{
+ *output = get_value();
+ plugin->send_configure_change();
+ window->canvas->update();
+ return 1;
+}
+
+
ComprMultiCanvas::ComprMultiCanvas(ComprMultiEffect *plugin,
ComprMultiWindow *window, int x, int y, int w, int h)
: CompressorCanvasBase(&plugin->config, plugin, window, x, y, w, h)
ComprMultiReaction::ComprMultiReaction(ComprMultiEffect *plugin,
- ComprMultiWindow *window, int x, int y)
+ ComprMultiWindow *window, int x, int y)
: BC_TumbleTextBox(window,
(float)plugin->config.bands[plugin->config.current_band].attack_len,
(float)MIN_ATTACK, (float)MAX_ATTACK, x, y, xS(100))
ComprMultiDecay::ComprMultiDecay(ComprMultiEffect *plugin,
- ComprMultiWindow *window, int x, int y)
+ ComprMultiWindow *window, int x, int y)
: BC_TumbleTextBox(window,
(float)plugin->config.bands[plugin->config.current_band].release_len,
(float)MIN_DECAY, (float)MAX_DECAY, x, y, xS(100))
ComprMultiX::ComprMultiX(ComprMultiEffect *plugin,
- ComprMultiWindow *window, int x, int y)
+ ComprMultiWindow *window, int x, int y)
: BC_TumbleTextBox(window, (float)0.0,
plugin->config.min_db, plugin->config.max_db, x, y, xS(100))
{
this->plugin = plugin;
+ this->window = window;
set_increment(0.1);
set_precision(2);
}
{
BandConfig *band_config = &plugin->config.bands[plugin->config.current_band];
- int current_point = ((ComprMultiWindow*)plugin->thread->window)->canvas->current_point;
+ int current_point = window->canvas->current_point;
if( current_point < band_config->levels.total ) {
band_config->levels.values[current_point].x = atof(get_text());
- ((ComprMultiWindow*)plugin->thread->window)->canvas->update();
+ window->canvas->update();
plugin->send_configure_change();
}
return 1;
ComprMultiY::ComprMultiY(ComprMultiEffect *plugin,
- ComprMultiWindow *window,
- int x,
- int y)
+ ComprMultiWindow *window, int x, int y)
: BC_TumbleTextBox(window, (float)0.0,
plugin->config.min_db, plugin->config.max_db, x, y, xS(100))
{
this->plugin = plugin;
+ this->window = window;
set_increment(0.1);
set_precision(2);
}
{
BandConfig *band_config = &plugin->config.bands[plugin->config.current_band];
- int current_point = ((ComprMultiWindow*)plugin->thread->window)->canvas->current_point;
+ int current_point = window->canvas->current_point;
if( current_point < band_config->levels.total ) {
band_config->levels.values[current_point].y = atof(get_text());
- ((ComprMultiWindow*)plugin->thread->window)->canvas->update();
+ window->canvas->update();
plugin->send_configure_change();
}
return 1;
ComprMultiTrigger::ComprMultiTrigger(ComprMultiEffect *plugin,
- ComprMultiWindow *window,
- int x,
- int y)
+ ComprMultiWindow *window, int x, int y)
: BC_TumbleTextBox(window, (int)plugin->config.trigger,
MIN_TRIGGER, MAX_TRIGGER, x, y, xS(100))
{
}
-ComprMultiInput::ComprMultiInput(ComprMultiEffect *plugin, int x, int y)
+ComprMultiInput::ComprMultiInput(ComprMultiEffect *plugin,
+ ComprMultiWindow *window, int x, int y)
: BC_PopupMenu(x, y, xS(100),
ComprMultiInput::value_to_text(plugin->config.input), 1)
{
this->plugin = plugin;
+ this->window = window;
}
int ComprMultiInput::handle_event()
{
plugin->config.input = text_to_value(get_text());
- ((ComprMultiWindow*)plugin->thread->window)->update();
+ window->update();
plugin->send_configure_change();
return 1;
}
}
-ComprMultiClear::ComprMultiClear(ComprMultiEffect *plugin, int x, int y)
+ComprMultiClear::ComprMultiClear(ComprMultiEffect *plugin,
+ ComprMultiWindow *window, int x, int y)
: BC_GenericButton(x, y, _("Clear"))
{
this->plugin = plugin;
+ this->window = window;
}
int ComprMultiClear::handle_event()
{
BandConfig *band_config = &plugin->config.bands[plugin->config.current_band];
-
+ band_config->mkup_gain = 0.0;
band_config->levels.remove_all();
//plugin->config.dump();
- ((ComprMultiWindow*)plugin->thread->window)->update();
+ window->update();
+ plugin->send_configure_change();
+ return 1;
+}
+
+ComprMultiReset::ComprMultiReset(ComprMultiEffect *plugin,
+ ComprMultiWindow *window, int x, int y)
+ : BC_GenericButton(x, y, _("Reset"))
+{
+ this->plugin = plugin;
+ this->window = window;
+}
+
+int ComprMultiReset::handle_event()
+{
+ plugin->config.q = 1.0;
+ plugin->config.window_size = 4096;
+ plugin->config.reset_bands();
+ plugin->config.reset_base();
+//plugin->config.dump();
+ window->update();
plugin->send_configure_change();
return 1;
}
{
public:
ComprMultiReaction(ComprMultiEffect *plugin,
- ComprMultiWindow *window, int x, int y);
+ ComprMultiWindow *window, int x, int y);
int handle_event();
ComprMultiEffect *plugin;
};
class ComprMultiX : public BC_TumbleTextBox
{
public:
- ComprMultiX(ComprMultiEffect *plugin, ComprMultiWindow *window, int x, int y);
+ ComprMultiX(ComprMultiEffect *plugin,
+ ComprMultiWindow *window, int x, int y);
int handle_event();
ComprMultiEffect *plugin;
+ ComprMultiWindow *window;
};
class ComprMultiY : public BC_TumbleTextBox
{
public:
- ComprMultiY(ComprMultiEffect *plugin, ComprMultiWindow *window, int x, int y);
+ ComprMultiY(ComprMultiEffect *plugin,
+ ComprMultiWindow *window, int x, int y);
int handle_event();
ComprMultiEffect *plugin;
+ ComprMultiWindow *window;
};
class ComprMultiTrigger : public BC_TumbleTextBox
{
public:
- ComprMultiTrigger(ComprMultiEffect *plugin, ComprMultiWindow *window, int x, int y);
+ ComprMultiTrigger(ComprMultiEffect *plugin,
+ ComprMultiWindow *window, int x, int y);
int handle_event();
ComprMultiEffect *plugin;
};
class ComprMultiDecay : public BC_TumbleTextBox
{
public:
- ComprMultiDecay(ComprMultiEffect *plugin, ComprMultiWindow *window, int x, int y);
+ ComprMultiDecay(ComprMultiEffect *plugin,
+ ComprMultiWindow *window, int x, int y);
int handle_event();
ComprMultiEffect *plugin;
};
class ComprMultiClear : public BC_GenericButton
{
public:
- ComprMultiClear(ComprMultiEffect *plugin, int x, int y);
+ ComprMultiClear(ComprMultiEffect *plugin,
+ ComprMultiWindow *window, int x, int y);
+ int handle_event();
+ ComprMultiEffect *plugin;
+ ComprMultiWindow *window;
+};
+
+class ComprMultiReset : public BC_GenericButton
+{
+public:
+ ComprMultiReset(ComprMultiEffect *plugin,
+ ComprMultiWindow *window, int x, int y);
int handle_event();
ComprMultiEffect *plugin;
+ ComprMultiWindow *window;
};
class ComprMultiSmooth : public BC_CheckBox
class ComprMultiInput : public BC_PopupMenu
{
public:
- ComprMultiInput(ComprMultiEffect *plugin, int x, int y);
+ ComprMultiInput(ComprMultiEffect *plugin,
+ ComprMultiWindow *window, int x, int y);
void create_objects();
int handle_event();
static const char* value_to_text(int value);
static int text_to_value(char *text);
ComprMultiEffect *plugin;
+ ComprMultiWindow *window;
};
{
public:
ComprMultiSize(ComprMultiWindow *gui,
- ComprMultiEffect *plugin, int x, int y);
+ ComprMultiEffect *plugin, int x, int y);
int handle_event();
void create_objects(); // add initial items
void update(int size);
ComprMultiEffect *plugin;
};
+class ComprMultiMkupGain : public BC_FPot
+{
+public:
+ ComprMultiMkupGain(ComprMultiEffect *plugin, ComprMultiWindow *window,
+ int x, int y, double *output, double min, double max);
+ int handle_event();
+ ComprMultiWindow *window;
+ ComprMultiEffect *plugin;
+ double *output;
+};
+
class ComprMultiWindow : public PluginClientWindow
{
ComprMultiCanvas *canvas;
ComprMultiReaction *reaction;
ComprMultiClear *clear;
+ ComprMultiReset *reset;
ComprMultiX *x_text;
ComprMultiY *y_text;
ComprMultiTrigger *trigger;
ComprMultiQPot *freq1;
ComprMultiQPot *freq2;
ComprMultiFPot *q;
+ ComprMultiMkupGain *mkup_gain;
ComprMultiSize *size;
EQCanvas *eqcanvas;
}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
GraphicEQ::GraphicEQ(PluginServer *server)
: PluginAClient(server)
{
input.set_shared_input(keyframe->xbuf);
config.points.remove_all_objects();
- while(!result)
- {
- result = input.read_tag();
-
- if(!result)
- {
- if(input.tag.title_is("GRAPHICEQ"))
- {
- config.window_size = input.tag.get_property("WINDOW_SIZE", config.window_size);
- if(is_defaults())
- {
- w = input.tag.get_property("W", w);
- h = input.tag.get_property("H", h);
- }
- }
- else
- if(input.tag.title_is("POINT"))
- {
- GraphicPoint *point;
- config.points.append(point = new GraphicPoint);
- point->freq = input.tag.get_property("X", 0);
- point->value = input.tag.get_property("Y", 0.0);
+ while( !(result = input.read_tag()) ) {
+ if(input.tag.title_is("GRAPHICEQ")) {
+ config.window_size = input.tag.get_property("WINDOW_SIZE", config.window_size);
+ if(is_defaults()) {
+ w = input.tag.get_property("W", w);
+ h = input.tag.get_property("H", h);
}
}
+ else if(input.tag.title_is("POINT")) {
+ GraphicPoint *point;
+ config.points.append(point = new GraphicPoint);
+ point->freq = input.tag.get_property("X", 0);
+ point->value = input.tag.get_property("Y", 0.0);
+ }
}
-
// if(!active_point_exists()) active_point = -1;
}
output.append_tag();
output.append_newline();
- for(int i = 0; i < config.points.total; i++)
- {
+ for(int i = 0; i < config.points.total; i++) {
output.tag.set_title("POINT");
output.tag.set_property("X", config.points.values[i]->freq);
output.tag.set_property("Y", config.points.values[i]->value);
window->update_canvas();
window->update_textboxes();
}
- else if( pending_gui_frames() ) {
- window->update_canvas();
+ else if( pending_gui_frame() ) {
+ window->update_canvas();
}
window->unlock_window();
}
void GraphicEQ::reconfigure()
{
- if(fft && fft->window_size != config.window_size)
- {
+ if(fft && fft->window_size != config.window_size) {
delete fft;
fft = 0;
}
- if(!fft)
- {
+ if(!fft) {
fft = new GraphicFFT(this);
fft->initialize(config.window_size);
}
calculate_envelope(&config.points, envelope);
- for(int i = 0; i < config.window_size / 2; i++)
- {
+ for(int i = 0; i < config.window_size / 2; i++) {
if(envelope[i] < 0) envelope[i] = 0;
}
calculate_envelope();
window->update_gui();
}
- else if(pending_gui_frames()) {
+ else if( pending_gui_frame() ) {
window->update_canvas();
}
window->unlock_window();
ReverbWindow *window = (ReverbWindow *)thread->window;
if( !window ) return;
int reconfigured = load_configuration();
- int total_frames = pending_gui_frames();
- if( !reconfigured && !total_frames ) return;
+ int pending = pending_gui_frame();
+ if( !reconfigured && !pending ) return;
window->lock_window("Reverb::update_gui 1");
if( reconfigured )
window->update();
- if( total_frames )
+ if( pending )
window->update_canvas();
window->unlock_window();
}
include ../../plugin_defs
-OBJS = \
- $(OBJDIR)/spectrogram.o
+OBJS = $(OBJDIR)/spectrogram.o
PLUGIN = spectrogram
include ../../plugin_config
-
-
-
$(OBJDIR)/spectrogram.o: spectrogram.C
-
/*
* CINELERRA
- * Copyright (C) 1997-2011 Adam Williams <broadcast at earthling dot net>
+ * Copyright (C) 1997-2019 Adam Williams <broadcast at earthling dot net>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
SpectrogramFrame::SpectrogramFrame(int data_size)
+ : PluginClientFrame()
{
this->data_size = data_size;
data = new float[data_size];
- force = 0;
+// force = 0;
}
SpectrogramFrame::~SpectrogramFrame()
int SpectrogramMode::handle_event()
{
- if(plugin->config.mode != text_to_mode(get_text()))
- {
+ if( plugin->config.mode != text_to_mode(get_text()) ) {
SpectrogramWindow *window = (SpectrogramWindow*)plugin->thread->window;
window->probe_x = -1;
window->probe_y = -1;
const char* SpectrogramMode::mode_to_text(int mode)
{
- switch(mode)
+ switch( mode )
{
case VERTICAL:
return _("Vertical");
int SpectrogramMode::text_to_mode(const char *text)
{
- if(!strcmp(mode_to_text(VERTICAL), text)) return VERTICAL;
+ if( !strcmp(mode_to_text(VERTICAL), text) ) return VERTICAL;
return HORIZONTAL;
}
int SpectrogramWindowSizeTumbler::handle_up_event()
{
plugin->config.window_size *= 2;
- if(plugin->config.window_size > MAX_WINDOW)
+ if( plugin->config.window_size > MAX_WINDOW )
plugin->config.window_size = MAX_WINDOW;
char string[BCTEXTLEN];
sprintf(string, "%d", plugin->config.window_size);
int SpectrogramWindowSizeTumbler::handle_down_event()
{
plugin->config.window_size /= 2;
- if(plugin->config.window_size < MIN_WINDOW)
+ if( plugin->config.window_size < MIN_WINDOW )
plugin->config.window_size = MIN_WINDOW;
char string[BCTEXTLEN];
sprintf(string, "%d", plugin->config.window_size);
int SpectrogramCanvas::button_press_event()
{
- if(is_event_win() && cursor_inside())
- {
+ if( is_event_win() && cursor_inside() ) {
calculate_point();
current_operation = DRAG;
plugin->send_configure_change();
int SpectrogramCanvas::button_release_event()
{
- if(current_operation == DRAG)
- {
+ if( current_operation == DRAG ) {
current_operation = NONE;
return 1;
}
int SpectrogramCanvas::cursor_motion_event()
{
- if(current_operation == DRAG)
- {
+ if( current_operation == DRAG ) {
calculate_point();
}
return 0;
void SpectrogramCanvas::draw_overlay()
{
SpectrogramWindow *window = (SpectrogramWindow*)plugin->thread->window;
- if(window->probe_x >= 0 || window->probe_y >= 0)
- {
+ if( window->probe_x >= 0 || window->probe_y >= 0 ) {
set_color(GREEN);
set_inverse();
- if(plugin->config.mode == HORIZONTAL) draw_line(0, window->probe_y, get_w(), window->probe_y);
+ if( plugin->config.mode == HORIZONTAL ) draw_line(0, window->probe_y, get_w(), window->probe_y);
draw_line(window->probe_x, 0, window->probe_x, get_h());
set_opaque();
}
x += window_size->get_w();
add_subwindow(window_size_tumbler = new SpectrogramWindowSizeTumbler(plugin, x, y));
- for(int i = MIN_WINDOW; i <= MAX_WINDOW; i *= 2)
- {
+ for( int i = MIN_WINDOW; i <= MAX_WINDOW; i *= 2 ) {
sprintf(string, "%d", i);
window_size->add_item(new BC_MenuItem(string));
}
int y_diff = -canvas_h + canvas->get_h();
// Remove all columns which may be a different size.
- plugin->frame_buffer.remove_all_objects();
+// plugin->frame_buffer.remove_all_objects();
plugin->frame_history.remove_all_objects();
level_title->reposition_window(
void SpectrogramWindow::calculate_frequency(int x, int y, int do_overlay)
{
- if(x < 0 && y < 0) return;
+ if( x < 0 && y < 0 ) return;
// Clear previous overlay
- if(do_overlay) canvas->draw_overlay();
+ if( do_overlay ) canvas->draw_overlay();
// New probe position
probe_x = x;
// Convert to coordinates in frame history
int freq_pixel, time_pixel;
- if(plugin->config.mode == VERTICAL)
- {
+ if( plugin->config.mode == VERTICAL ) {
freq_pixel = get_w() - x;
time_pixel = 0;
}
- else
- {
+ else {
freq_pixel = y;
time_pixel = get_w() - x;
}
CLAMP(time_pixel, 0, plugin->frame_history.size() - 1);
- if(plugin->frame_history.size())
- {
+ if( plugin->frame_history.size() ) {
SpectrogramFrame *ptr = plugin->frame_history.get(
plugin->frame_history.size() - time_pixel - 1);
int pixels;
int freq_index;
- if(plugin->config.mode == VERTICAL)
- {
+ if( plugin->config.mode == VERTICAL ) {
pixels = canvas->get_w();
freq_index = (pixels - freq_pixel) * TOTALFREQS / pixels;
}
- else
- {
+ else {
pixels = canvas->get_h();
freq_index = (pixels - freq_pixel) * TOTALFREQS / pixels;
}
amplitude_title->update(string);
}
- if(do_overlay)
- {
+ if( do_overlay ) {
canvas->draw_overlay();
canvas->flash();
}
: PluginAClient(server)
{
reset();
- timer = new Timer;
w = xS(640);
h = yS(480);
}
Spectrogram::~Spectrogram()
{
delete fft;
- delete [] data;
delete audio_buffer;
delete [] freq_real;
delete [] freq_imag;
- delete timer;
- frame_buffer.remove_all_objects();
frame_history.remove_all_objects();
}
thread = 0;
fft = 0;
done = 0;
- data = 0;
audio_buffer = 0;
audio_buffer_start = -MAX_WINDOW * 2;
freq_real = 0;
freq_imag = 0;
allocated_data = 0;
- total_windows = 0;
- bzero(&header, sizeof(data_header_t));
}
int64_t start_position,
int sample_rate)
{
-// Pass through
- read_samples(buffer,
- 0,
- sample_rate,
- start_position,
- size);
+ int dir = get_direction() == PLAY_REVERSE ? -1 : 1;
+ double start_pos = (double)start_position / sample_rate;
+// Pass through
+ read_samples(buffer, 0, sample_rate, start_position, size);
load_configuration();
-
// Reset audio buffer
- if(window_size != config.window_size)
- {
+ if( window_size != config.window_size ) {
render_stop();
window_size = config.window_size;
}
-
-
-
-
- if(!fft)
- {
+ if( !fft )
fft = new FFT;
- }
-
- if(!data)
- {
- data = new unsigned char[sizeof(data_header_t)];
- allocated_data = 0;
- }
- if(!freq_real)
- {
+ if( !freq_real ) {
freq_real = new double[MAX_WINDOW];
freq_imag = new double[MAX_WINDOW];
}
- if(!audio_buffer)
- {
+ if( !audio_buffer )
audio_buffer = new Samples(MAX_WINDOW);
- }
-// Accumulate audio
+// Allocate more audio buffer
int needed = buffer_size + size;
- if(audio_buffer->get_allocated() < needed)
- {
+ if( audio_buffer->get_allocated() < needed ) {
Samples *new_samples = new Samples(needed);
memcpy(new_samples->get_data(),
audio_buffer->get_data(),
double *audio_samples = audio_buffer->get_data();
memcpy(audio_samples + buffer_size,
- buffer->get_data(),
- sizeof(double) * size);
+ buffer->get_data(), sizeof(double) * size);
buffer_size += size;
-
-//printf("Spectrogram::process_buffer %d %d\n", __LINE__, buffer_size);
-
// Append a windows to end of GUI buffer
- total_windows = 0;
- while(buffer_size >= window_size)
- {
+ while(buffer_size >= window_size) {
// Process FFT
fft->do_fft(window_size, // must be a power of 2
- 0, // 0 = forward FFT, 1 = inverse
- audio_samples, // array of input's real samples
- 0, // array of input's imag samples
- freq_real, // array of output's reals
- freq_imag);
+ 0, // 0 = forward FFT, 1 = inverse
+ audio_samples, // array of input's real samples
+ 0, // array of input's imag samples
+ freq_real, // array of output's reals
+ freq_imag);
// Get peak in waveform
double max = 0;
- for(int i = 0; i < window_size; i++)
- {
+ for( int i = 0; i < window_size; i++ ) {
double sample = fabs(audio_samples[i]);
- if(sample > max) max = sample;
+ if( sample > max ) max = sample;
}
-// Append to end of data buffer
- if(allocated_data < (total_windows + 1) * (HALF_WINDOW + 1))
- {
- int new_allocation = (total_windows + 1) * (HALF_WINDOW + 1);
- unsigned char *new_data = new unsigned char[sizeof(data_header_t) +
- sizeof(float) * new_allocation];
- data_header_t *new_header = (data_header_t*)new_data;
- data_header_t *old_header = (data_header_t*)data;
- memcpy(new_header->samples,
- old_header->samples,
- sizeof(float) * allocated_data);
- delete [] data;
- data = new_data;
- allocated_data = new_allocation;
- }
- data_header_t *header = (data_header_t*)data;
- float *sample_output = header->samples + total_windows * (HALF_WINDOW + 1);
-// 1st sample is maximum
- sample_output[0] = max;
- for(int i = 0; i < HALF_WINDOW; i++)
- {
- sample_output[i + 1] = sqrt(freq_real[i] * freq_real[i] +
- freq_imag[i] * freq_imag[i]);
-// sample_output[i + 1] = freq_real[i];
+// send to the GUI
+ SpectrogramFrame *frame = new SpectrogramFrame(HALF_WINDOW + 1);
+ double widx = get_gui_frames();
+ frame->position = start_pos + dir * window_size * widx / get_samplerate();
+ frame->data[0] = max;
+ for( int i = 0; i < HALF_WINDOW; i++ ) {
+ frame->data[i + 1] = hypot(freq_real[i], freq_imag[i]);
}
+ frame->window_size = window_size;
+ frame->sample_rate = sample_rate;
+ frame->level = DB::fromdb(config.level);
+ add_gui_frame(frame);
// Shift audio buffer out
memcpy(audio_samples,
audio_samples + window_size,
(buffer_size - window_size) * sizeof(double));
- total_windows++;
buffer_size -= window_size;
}
- data_header_t *header = (data_header_t*)data;
- header->window_size = window_size;
- header->sample_rate = sample_rate;
- header->total_windows = total_windows;
-// Linear output level
- header->level = DB::fromdb(config.level);
-
- send_render_gui(data,
- sizeof(data_header_t) +
- sizeof(float) * total_windows * (HALF_WINDOW + 1));
-
+ last_position = start_position + dir * size;
return 0;
}
{
buffer_size = 0;
audio_buffer_start = -MAX_WINDOW * 2;
- frame_buffer.remove_all_objects();
+// frame_buffer.remove_all_objects();
frame_history.remove_all_objects();
}
-
-
-
NEW_WINDOW_MACRO(Spectrogram, SpectrogramWindow)
void Spectrogram::update_gui()
{
- if(thread)
- {
- int result = load_configuration();
- SpectrogramWindow *window = (SpectrogramWindow*)thread->get_window();
- window->lock_window("Spectrogram::update_gui");
- if(result) window->update_gui();
-
-
-//printf("Spectrogram::update_gui %d\n", __LINE__);
-// Shift in accumulated canvas columns
- if(frame_buffer.size())
- {
- SpectrogramCanvas *canvas = (SpectrogramCanvas*)window->canvas;
- canvas->draw_overlay();
-// Z to draw in this iteration
- int total_frames = timer->get_difference() *
- header.sample_rate /
- header.window_size /
- 1000;
-
-//printf("Spectrogram::update_gui %d %d %ld\n", __LINE__, frame_buffer.size(), timer->get_difference());
- if(total_frames) timer->subtract(total_frames *
- header.window_size *
- 1000 /
- header.sample_rate);
-
-// Add forced column drawing
- for(int i = 0; i < frame_buffer.size(); i++)
- if(frame_buffer.get(i)->force) total_frames++;
- total_frames = MIN(frame_buffer.size(), total_frames);
-
-// Limit to canvas width
- if(config.mode == HORIZONTAL)
- total_frames = MIN(canvas->get_w(), total_frames);
-
-
-
- if(config.mode == HORIZONTAL)
- {
+ if( !thread ) return;
+ SpectrogramWindow *window = (SpectrogramWindow*)thread->get_window();
+ if( !window ) return;
+ int result = load_configuration();
+ int total_frames = pending_gui_frames();
+ if( !result && !total_frames ) return;
+
+ window->lock_window("Spectrogram::update_gui");
+ if( result ) // widgets
+ window->update_gui();
+ if( total_frames ) { // spectrogram
+ SpectrogramCanvas *canvas = (SpectrogramCanvas*)window->canvas;
+ canvas->draw_overlay();
+
+ if( config.mode == HORIZONTAL ) {
// Shift left
- int pixels = canvas->get_h();
- canvas->copy_area(total_frames * config.xzoom,
- 0,
- 0,
- 0,
- canvas->get_w() - total_frames * config.xzoom,
- canvas->get_h());
+ int pixels = canvas->get_h();
+ canvas->copy_area(total_frames * config.xzoom,
+ 0, 0, 0,
+ canvas->get_w() - total_frames * config.xzoom,
+ canvas->get_h());
// Draw new columns
- for(int frame = 0;
- frame < total_frames;
- frame++)
- {
- int x = canvas->get_w() - (total_frames - frame) * config.xzoom;
- SpectrogramFrame *ptr = frame_buffer.get(0);
-
- for(int i = 0; i < pixels; i++)
- {
- float db = ptr->data[
- MIN(i, ptr->data_size - 1)];
- float h, s, v;
- float r_out, g_out, b_out;
- int r, g, b;
-
+ for( int frame = 0; frame < total_frames; frame++ ) {
+ int x = canvas->get_w() - (total_frames - frame) * config.xzoom;
+ SpectrogramFrame *ptr = (SpectrogramFrame*)get_gui_frame(-1, 0);
+ fix_gui_frame(ptr);
+
+ for( int i = 0; i < pixels; i++ ) {
+ float db = ptr->data[MIN(i, ptr->data_size - 1)];
+ float h, s, v;
+ float r_out, g_out, b_out;
+ int r, g, b;
#define DIVISION1 0.0
#define DIVISION2 -20.0
#define DIVISION3 INFINITYGAIN
- if(db > DIVISION2)
- {
- h = 240 - (float)(db - DIVISION2) / (DIVISION1 - DIVISION2) *
- 240;
- CLAMP(h, 0, 240);
- s = 1.0;
- v = 1.0;
- HSV::hsv_to_rgb(r_out, g_out, b_out, h, s, v);
- r = (int)(r_out * 0xff);
- g = (int)(g_out * 0xff);
- b = (int)(b_out * 0xff);
- }
- else
- if(db > DIVISION3)
- {
- h = 0.0;
- s = 0.0;
- v = (float)(db - DIVISION3) / (DIVISION2 - DIVISION3);
- HSV::hsv_to_rgb(r_out, g_out, b_out, h, s, v);
- r = (int)(r_out * 0xff);
- g = (int)(g_out * 0xff);
- b = (int)(b_out * 0xff);
- }
- else
- {
- r = g = b = 0;
- }
-
- canvas->set_color((r << 16) |
- (g << 8) |
- (b));
- if(config.xzoom == 1)
- canvas->draw_pixel(x, i);
- else
- canvas->draw_line(x,
- i,
- x + config.xzoom,
- i);
+ if( db > DIVISION2 ) {
+ h = 240 - (float)(db - DIVISION2) / (DIVISION1 - DIVISION2) *
+ 240;
+ CLAMP(h, 0, 240);
+ s = 1.0;
+ v = 1.0;
+ HSV::hsv_to_rgb(r_out, g_out, b_out, h, s, v);
+ r = (int)(r_out * 0xff);
+ g = (int)(g_out * 0xff);
+ b = (int)(b_out * 0xff);
}
-
-// Push frames onto history
- for(int i = 0; i < config.xzoom; i++)
- {
- SpectrogramFrame *new_frame = new SpectrogramFrame(
- ptr->data_size);
- frame_history.append(new_frame);
- memcpy(new_frame->data, ptr->data, sizeof(float) * ptr->data_size);
+ else if( db > DIVISION3 ) {
+ h = 0.0;
+ s = 0.0;
+ v = (float)(db - DIVISION3) / (DIVISION2 - DIVISION3);
+ HSV::hsv_to_rgb(r_out, g_out, b_out, h, s, v);
+ r = (int)(r_out * 0xff);
+ g = (int)(g_out * 0xff);
+ b = (int)(b_out * 0xff);
+ }
+ else {
+ r = g = b = 0;
}
-// Clip history to canvas size
- while(frame_history.size() > canvas->get_w())
- frame_history.remove_object_number(0);
+ canvas->set_color((r << 16) | (g << 8) | (b));
+ if( config.xzoom == 1 )
+ canvas->draw_pixel(x, i);
+ else
+ canvas->draw_line(x, i, x + config.xzoom, i);
+ }
- frame_buffer.remove_object_number(0);
+// Copy a frame into history for each pixel
+ for( int i = 0; i < config.xzoom; i++ ) {
+ SpectrogramFrame *new_frame = new SpectrogramFrame(
+ ptr->data_size);
+ frame_history.append(new_frame);
+ memcpy(new_frame->data, ptr->data,
+ sizeof(float) * ptr->data_size);
}
+// Clip history to canvas size
+ while(frame_history.size() > canvas->get_w())
+ frame_history.remove_object_number(0);
+
+ delete ptr;
}
- else
+ }
+ else {
// mode == VERTICAL
- {
-// Shift frames into history
- for(int frame = 0; frame < total_frames; frame++)
- {
- if(frame_history.size() >= config.history_size)
- frame_history.remove_object_number(0);
-
- frame_history.append(frame_buffer.get(0));
- frame_buffer.remove_number(0);
- }
-
+// Shift frames into history buffer
+ for( int frame = 0; frame < total_frames; frame++ ) {
+ SpectrogramFrame *ptr = (SpectrogramFrame*)get_gui_frame(-1, 0);
+ fix_gui_frame(ptr);
+ frame_history.append(ptr);
+ }
// Reduce history size
- while(frame_history.size() > config.history_size)
- frame_history.remove_object_number(0);
+ while(frame_history.size() > config.history_size)
+ frame_history.remove_object_number(0);
// Draw frames from history
- canvas->clear_box(0, 0, canvas->get_w(), canvas->get_h());
- for(int frame = 0; frame < frame_history.size(); frame++)
- {
- SpectrogramFrame *ptr = frame_history.get(frame);
+ canvas->clear_box(0, 0, canvas->get_w(), canvas->get_h());
+ for( int frame = 0; frame < frame_history.size(); frame++ ) {
+ SpectrogramFrame *ptr = frame_history.get(frame);
//printf("%d %d\n", canvas->get_w(), ptr->data_size);
- int luma = (frame + 1) * 0x80 / frame_history.size();
- if(frame == frame_history.size() - 1)
- {
- canvas->set_color(WHITE);
- canvas->set_line_width(2);
- }
- else
- canvas->set_color((luma << 16) |
- (luma << 8) |
- luma);
-
-
- int x1 = 0;
- int y1 = 0;
- int w = canvas->get_w();
- int h = canvas->get_h();
- int number = 0;
+ int luma = (frame + 1) * 0x80 / frame_history.size();
+ if( frame == frame_history.size() - 1 ) {
+ canvas->set_color(WHITE);
+ canvas->set_line_width(2);
+ }
+ else
+ canvas->set_color((luma << 16) | (luma << 8) | luma);
+ int x1 = 0, y1 = 0;
+ int w = canvas->get_w();
+ int h = canvas->get_h();
+ int number = 0;
//printf("Spectrogram::update_gui %d ", __LINE__);
- for(int x2 = 0; x2 < w; x2++)
- {
- float db = ptr->data[
- MIN((w - x2), ptr->data_size - 1)];
-//if(x2 > w - 10) printf("%.02f ", ptr->data[x2]);
- int y2 = h-1 - (int)((db - INFINITYGAIN) /
- (0 - INFINITYGAIN) *
- h);
- CLAMP(y2, 0, h-1);
-
- if(number)
- {
- canvas->draw_line(x1, y1, x2, y2);
- }
- else
- {
- number++;
- }
-
- x1 = x2;
- y1 = y2;
+ for( int x2 = 0; x2 < w; x2++ ) {
+ float db = ptr->data[
+ MIN((w - x2), ptr->data_size - 1)];
+//if( x2 > w - 10 ) printf("%.02f ", ptr->data[x2]);
+ int y2 = h - 1 - (int)((db - INFINITYGAIN) /
+ (0 - INFINITYGAIN) *
+ h);
+ CLAMP(y2, 0, h - 1);
+
+ if( number ) {
+ canvas->draw_line(x1, y1, x2, y2);
}
-
- canvas->set_line_width(1);
-//printf("\n");
+ else {
+ number++;
+ }
+ x1 = x2;
+ y1 = y2;
}
+ canvas->set_line_width(1);
+//printf("\n");
}
-
-// Recompute probe level
- window->calculate_frequency(window->probe_x, window->probe_y, 0);
-
- canvas->draw_overlay();
- canvas->flash();
}
+// Recompute probe level
+ window->calculate_frequency(window->probe_x, window->probe_y, 0);
- while(frame_buffer.size() > MAX_COLUMNS)
- frame_buffer.remove_object_number(0);
-
- window->unlock_window();
+ canvas->draw_overlay();
+ canvas->flash();
}
+
+ window->unlock_window();
}
-void Spectrogram::render_gui(void *data, int size)
+
+// convert GUI frame to canvas dimensions & normalized DB
+void Spectrogram::fix_gui_frame(SpectrogramFrame *frame)
{
- if(thread)
- {
- thread->get_window()->lock_window("Spectrogram::render_gui");
- data_header_t *header = (data_header_t*)data;
- memcpy(&this->header, header, sizeof(data_header_t));
- BC_SubWindow *canvas = ((SpectrogramWindow*)thread->get_window())->canvas;
- int pixels = canvas->get_w();
- if(config.mode == HORIZONTAL) pixels = canvas->get_h();
-
-// Set all previous columns to draw immediately
- for(int i = 0; i < frame_buffer.size(); i++)
- frame_buffer.get(i)->force = 1;
-
-
- for(int current_window = 0;
- current_window < header->total_windows;
- current_window++)
- {
- float *frame = header->samples +
- current_window * (header->window_size / 2 + 1);
- float frame_max = *frame;
- frame++;
- int niquist = get_project_samplerate() / 2;
- int total_slots = header->window_size / 2;
- int max_slot = total_slots - 1;
-// int slot1 = total_slots - 1;
- SpectrogramFrame *ptr =
- new SpectrogramFrame(
- pixels);
+ int niquist = get_project_samplerate() / 2;
+ int total_slots = frame->window_size / 2;
+ int max_slot = total_slots - 1;
+ BC_SubWindow *canvas = ((SpectrogramWindow*)thread->get_window())->canvas;
+ int pixels = canvas->get_w();
+ if( config.mode == HORIZONTAL ) pixels = canvas->get_h();
+
+// allocate new frame
+ float *out_data = new float[pixels];
+ float *in_data = frame->data;
// Scale slots to pixels
- for(int i = 0; i < pixels; i++)
- {
+ for( int i = 0; i < pixels; i++ ) {
// Low frequency of row
- int freq_index1 = (int)((pixels - i) * TOTALFREQS / pixels);
+ int freq_index1 = (int)((pixels - i) * TOTALFREQS / pixels);
// High frequency of row
- int freq_index2 = (int)((pixels - i + 1) * TOTALFREQS / pixels);
- int freq1 = Freq::tofreq(freq_index1);
- int freq2 = Freq::tofreq(freq_index2);
- float slot1_f = (float)freq1 * max_slot / niquist;
- float slot2_f = (float)freq2 * max_slot / niquist;
- int slot1 = (int)(slot1_f);
- int slot2 = (int)(slot2_f);
- slot1 = MIN(slot1, max_slot);
- slot2 = MIN(slot2, max_slot);
- double sum = 0;
+ int freq_index2 = (int)((pixels - i + 1) * TOTALFREQS / pixels);
+ int freq1 = Freq::tofreq(freq_index1);
+ int freq2 = Freq::tofreq(freq_index2);
+ float slot1_f = (float)freq1 * max_slot / niquist;
+ float slot2_f = (float)freq2 * max_slot / niquist;
+ int slot1 = (int)(slot1_f);
+ int slot2 = (int)(slot2_f);
+ slot1 = MIN(slot1, max_slot);
+ slot2 = MIN(slot2, max_slot);
+ double sum = 0;
// Accumulate multiple slots in the same pixel
- if(slot2 > slot1 + 1)
- {
- for(int j = slot1; j <= slot2; j++)
- sum += frame[j];
+ if( slot2 > slot1 + 1 ) {
+ for( int j = slot1; j <= slot2; j++ )
+ sum += in_data[j];
- sum /= slot2 - slot1 + 1;
- }
- else
+ sum /= slot2 - slot1 + 1;
+ }
+ else {
// Blend 2 slots to create pixel
- {
- float weight = slot1_f - floor(slot1_f);
- int slot3 = MIN(slot1 + 1, max_slot);
- sum = frame[slot1] * (1.0 - weight) +
- frame[slot3] * weight;
- }
+ float weight = slot1_f - floor(slot1_f);
+ int slot3 = MIN(slot1 + 1, max_slot);
+ sum = in_data[slot1] * (1.0 - weight) +
+ in_data[slot3] * weight;
+ }
+
+ out_data[i] = sum;
+ }
- ptr->data[i] = sum;
-// slot1 = slot2;
- }
// Normalize
- if(config.normalize)
- {
+ if( config.normalize ) {
// Get the maximum level in the spectrogram
- float max = 0;
- for(int i = 0; i < pixels; i++)
- {
- if(ptr->data[i] > max) max = ptr->data[i];
- }
+ float max = 0;
+ for( int i = 0; i < pixels; i++ ) {
+ if( out_data[i] > max ) max = out_data[i];
+ }
// Scale all levels
- for(int i = 0; i < pixels; i++)
- {
- ptr->data[i] = header->level *
- ptr->data[i] /
- max;
- }
- }
- else
- {
+ for( int i = 0; i < pixels; i++ ) {
+ out_data[i] = frame->level *
+ out_data[i] /
+ max;
+ }
+ }
+ else {
// Get the maximum level in the spectrogram
- float max = 0;
- for(int i = 0; i < pixels; i++)
- {
- if(ptr->data[i] > max) max = ptr->data[i];
- }
+ float max = 0;
+ for( int i = 0; i < pixels; i++ ) {
+ if( out_data[i] > max ) max = out_data[i];
+ }
// Maximum level in spectrogram is the maximum waveform level
- for(int i = 0; i < pixels; i++)
- {
- ptr->data[i] = header->level *
- frame_max *
- ptr->data[i] /
- max;
- }
-
-
-// for(int i = 0; i < pixels; i++)
-// {
-// ptr->data[i] = header->level * ptr->data[i];
-// }
- }
+ float frame_max = in_data[0];
+ for( int i = 0; i < pixels; i++ ) {
+ out_data[i] = frame->level *
+ frame_max * out_data[i] / max;
+ }
+ }
// DB conversion
//printf("Spectrogram::render_gui %d ", __LINE__);
- for(int i = 0; i < pixels; i++)
- {
- ptr->data[i] = DB::todb(ptr->data[i]);
-//if(i > pixels - 10) printf("%.02f ", ptr->data[i]);
+ for( int i = 0; i < pixels; i++ ) {
+ out_data[i] = DB::todb(out_data[i]);
+//if( i > pixels - 10 ) printf("%.02f ", ptr->data[i]);
- }
-//printf("\n");
-
-
- frame_buffer.append(ptr);
- total_windows++;
- }
-
- timer->update();
- thread->get_window()->unlock_window();
}
+
+ delete [] in_data;
+ frame->data = out_data;
+ frame->data_size = pixels;
}
+
LOAD_CONFIGURATION_MACRO(Spectrogram, SpectrogramConfig)
void Spectrogram::read_data(KeyFrame *keyframe)
{
+//printf("Spectrogram::read_data %d this=%p\n", __LINE__, this);
FileXML input;
input.set_shared_input(keyframe->xbuf);
int result = 0;
- while(!result)
- {
- result = input.read_tag();
-
- if(!result)
- {
- if(input.tag.title_is("SPECTROGRAM"))
- {
- config.level = input.tag.get_property("LEVEL", config.level);
- config.normalize = input.tag.get_property("NORMALIZE", config.normalize);
- config.window_size = input.tag.get_property("WINDOW_SIZE", config.window_size);
- config.xzoom = input.tag.get_property("XZOOM", config.xzoom);
- config.mode = input.tag.get_property("MODE", config.mode);
- config.history_size = input.tag.get_property("HISTORY_SIZE", config.history_size);
- if(is_defaults())
- {
- w = input.tag.get_property("W", w);
- h = input.tag.get_property("H", h);
- }
+ while( !(result = input.read_tag()) ) {
+ if( input.tag.title_is("SPECTROGRAM") ) {
+ config.level = input.tag.get_property("LEVEL", config.level);
+ config.normalize = input.tag.get_property("NORMALIZE", config.normalize);
+ config.window_size = input.tag.get_property("WINDOW_SIZE", config.window_size);
+ config.xzoom = input.tag.get_property("XZOOM", config.xzoom);
+ config.mode = input.tag.get_property("MODE", config.mode);
+ config.history_size = input.tag.get_property("HISTORY_SIZE", config.history_size);
+ if( is_defaults() ) {
+ w = input.tag.get_property("W", w);
+ h = input.tag.get_property("H", h);
}
}
}
output.terminate_string();
}
-
-
-
-
int history_size;
};
-// Header for data buffer
-typedef struct
-{
- int window_size;
-// Total windows in this buffer
- int total_windows;
-// Samples per fragment
- int window_fragment;
-// Samplerate
- int sample_rate;
-// Linearized user level
- float level;
-// Nothing goes after this
-// 1st sample in each window is the max
- float samples[1];
-} data_header_t;
-
-class SpectrogramFrame
+class SpectrogramFrame : public PluginClientFrame
{
public:
SpectrogramFrame(int data_size);
~SpectrogramFrame();
- int data_size;
float *data;
-// Draw immediately
- int force;
+ int data_size;
+ int window_size;
+ int sample_rate;
+// Linearized user level
+ float level;
};
class Spectrogram : public PluginAClient
void read_data(KeyFrame *keyframe);
void save_data(KeyFrame *keyframe);
void update_gui();
- void render_gui(void *data, int size);
void render_stop();
+ void fix_gui_frame(SpectrogramFrame *frame);
void reset();
int done;
int need_reconfigure;
+ int64_t last_position;
FFT *fft;
// Data buffer for frequency & magnitude
- unsigned char *data;
+// unsigned char *data;
// Accumulate data for windowing
Samples *audio_buffer;
// Total samples in the buffer
// Temporaries for the FFT
double *freq_real;
double *freq_imag;
-// Total windows sent to current GUI
- int total_windows;
// Starting sample in audio_buffer.
int64_t audio_buffer_start;
// Total floats allocated in data buffer
int allocated_data;
// Accumulates canvas pixels until the next update_gui
- ArrayList<SpectrogramFrame*> frame_buffer;
-// History for vertical mode
+// ArrayList<SpectrogramFrame*> frame_buffer;
+// Layers for vertical mode
// Probing data for horizontal mode
ArrayList<SpectrogramFrame*> frame_history;
// Header from last data buffer
- data_header_t header;
+// data_header_t header;
// Time of last GUI update
- Timer *timer;
+// Timer *timer;
// Window dimensions
int w, h;
};
/*
* CINELERRA
* Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
- *
+ *
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
- *
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
+ *
*/
#ifndef BLACK_CHECKED_PNG_H
#define BLACK_CHECKED_PNG_H
-static unsigned char black_checked_png[] =
+static unsigned char black_checked_png[] =
{
- 0x00, 0x00, 0x00, 0xe2,
- 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
- 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x59, 0x08, 0x06, 0x00, 0x00, 0x00, 0xc2, 0x5a, 0x2f,
- 0x75, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00, 0x0b,
- 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4d, 0x45, 0x07, 0xd8,
- 0x07, 0x09, 0x11, 0x02, 0x20, 0xe9, 0x2d, 0x2c, 0x75, 0x00, 0x00, 0x00, 0x1d, 0x74, 0x45, 0x58,
- 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x00, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64,
- 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x54, 0x68, 0x65, 0x20, 0x47, 0x49, 0x4d, 0x50, 0xef, 0x64,
- 0x25, 0x6e, 0x00, 0x00, 0x00, 0x58, 0x49, 0x44, 0x41, 0x54, 0x68, 0xde, 0xed, 0xda, 0xd1, 0x09,
- 0x80, 0x30, 0x00, 0x43, 0xc1, 0xd4, 0xe9, 0x02, 0xce, 0x2b, 0x74, 0x3b, 0xfd, 0xea, 0x08, 0x45,
- 0x91, 0x7b, 0x0b, 0x1c, 0xf9, 0xcf, 0x68, 0x7b, 0x27, 0xc9, 0x39, 0x67, 0x76, 0x77, 0xb5, 0x49,
- 0x92, 0x23, 0x2f, 0x04, 0x85, 0x42, 0xa1, 0x50, 0x28, 0x14, 0x0a, 0x85, 0x42, 0xa1, 0x50, 0x28,
- 0x14, 0x0a, 0x85, 0x42, 0xa1, 0x50, 0x28, 0x14, 0x0a, 0x85, 0x42, 0xa1, 0x50, 0x28, 0x14, 0x0a,
- 0x85, 0x42, 0xa1, 0x50, 0xe8, 0xa7, 0xd0, 0xb1, 0x2e, 0x7c, 0xbf, 0x5f, 0xfa, 0x00, 0x3b, 0xd9,
- 0x07, 0x5f, 0x2e, 0x73, 0x08, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42,
+ 0x00, 0x00, 0x00, 0xe2,
+ 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
+ 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x59, 0x08, 0x06, 0x00, 0x00, 0x00, 0xc2, 0x5a, 0x2f,
+ 0x75, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00, 0x0b,
+ 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4d, 0x45, 0x07, 0xd8,
+ 0x07, 0x09, 0x11, 0x02, 0x20, 0xe9, 0x2d, 0x2c, 0x75, 0x00, 0x00, 0x00, 0x1d, 0x74, 0x45, 0x58,
+ 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x00, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64,
+ 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x54, 0x68, 0x65, 0x20, 0x47, 0x49, 0x4d, 0x50, 0xef, 0x64,
+ 0x25, 0x6e, 0x00, 0x00, 0x00, 0x58, 0x49, 0x44, 0x41, 0x54, 0x68, 0xde, 0xed, 0xda, 0xd1, 0x09,
+ 0x80, 0x30, 0x00, 0x43, 0xc1, 0xd4, 0xe9, 0x02, 0xce, 0x2b, 0x74, 0x3b, 0xfd, 0xea, 0x08, 0x45,
+ 0x91, 0x7b, 0x0b, 0x1c, 0xf9, 0xcf, 0x68, 0x7b, 0x27, 0xc9, 0x39, 0x67, 0x76, 0x77, 0xb5, 0x49,
+ 0x92, 0x23, 0x2f, 0x04, 0x85, 0x42, 0xa1, 0x50, 0x28, 0x14, 0x0a, 0x85, 0x42, 0xa1, 0x50, 0x28,
+ 0x14, 0x0a, 0x85, 0x42, 0xa1, 0x50, 0x28, 0x14, 0x0a, 0x85, 0x42, 0xa1, 0x50, 0x28, 0x14, 0x0a,
+ 0x85, 0x42, 0xa1, 0x50, 0xe8, 0xa7, 0xd0, 0xb1, 0x2e, 0x7c, 0xbf, 0x5f, 0xfa, 0x00, 0x3b, 0xd9,
+ 0x07, 0x5f, 0x2e, 0x73, 0x08, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42,
0x60, 0x82
};
/*
* CINELERRA
* Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
- *
+ *
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
- *
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
+ *
*/
#ifndef BLACK_CHECKEDHI_PNG_H
#define BLACK_CHECKEDHI_PNG_H
-static unsigned char black_checkedhi_png[] =
+static unsigned char black_checkedhi_png[] =
{
- 0x00, 0x00, 0x02, 0x4b,
- 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
- 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x59, 0x08, 0x06, 0x00, 0x00, 0x00, 0xc2, 0x5a, 0x2f,
- 0x75, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00, 0x0b,
- 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4d, 0x45, 0x07, 0xd8,
- 0x07, 0x09, 0x11, 0x04, 0x16, 0x70, 0xcd, 0x1e, 0x6a, 0x00, 0x00, 0x00, 0x1d, 0x74, 0x45, 0x58,
- 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x00, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64,
- 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x54, 0x68, 0x65, 0x20, 0x47, 0x49, 0x4d, 0x50, 0xef, 0x64,
- 0x25, 0x6e, 0x00, 0x00, 0x01, 0xc1, 0x49, 0x44, 0x41, 0x54, 0x68, 0xde, 0xed, 0x9a, 0x61, 0x6e,
- 0xc3, 0x20, 0x0c, 0x85, 0x9f, 0x49, 0x7a, 0xb7, 0x48, 0x3b, 0xef, 0xa4, 0x1e, 0xae, 0xc1, 0xfb,
- 0x13, 0x34, 0xe7, 0xd5, 0x04, 0xc8, 0x34, 0xa5, 0xad, 0x1c, 0x09, 0x41, 0x53, 0x8b, 0x2f, 0xcf,
- 0x18, 0xa7, 0xaa, 0x91, 0x65, 0x59, 0x14, 0x00, 0xbe, 0xee, 0x77, 0xfc, 0xf7, 0xf5, 0xbd, 0x2c,
- 0x00, 0x80, 0x84, 0x0b, 0xae, 0x4b, 0xa0, 0x73, 0xcb, 0x40, 0x4e, 0x4c, 0xaa, 0x67, 0xa1, 0xe2,
- 0x8c, 0xa5, 0x03, 0xa4, 0xc6, 0x4e, 0x47, 0xa0, 0x16, 0xc2, 0x63, 0xa9, 0x00, 0x95, 0xc6, 0x05,
- 0xae, 0x3d, 0x50, 0x86, 0x24, 0x02, 0x32, 0x58, 0x9d, 0x96, 0x49, 0xb5, 0xf6, 0x2a, 0x2d, 0xc0,
- 0xd2, 0x26, 0x73, 0x0f, 0x34, 0x59, 0xde, 0xc6, 0xab, 0x01, 0xe6, 0x03, 0x17, 0xcf, 0x1e, 0x4c,
- 0x08, 0x66, 0x5b, 0x72, 0x94, 0xe6, 0x0d, 0x28, 0x5b, 0x0f, 0x02, 0x33, 0xbc, 0xa9, 0x74, 0xda,
- 0x8c, 0x4a, 0xb3, 0xee, 0xb6, 0xee, 0x7c, 0x50, 0x00, 0x0d, 0xad, 0xa9, 0xdd, 0xc0, 0x16, 0x7a,
- 0xdb, 0x7a, 0xab, 0x96, 0x55, 0x7a, 0x6b, 0x8c, 0xde, 0x40, 0xaa, 0x29, 0xbd, 0x55, 0xa0, 0xa9,
- 0xe2, 0x6a, 0x8c, 0x06, 0x12, 0x9c, 0x40, 0x9a, 0xc8, 0xc5, 0x4a, 0x81, 0xb3, 0x1a, 0xfb, 0xa3,
- 0xfd, 0x3d, 0xc3, 0xd9, 0x93, 0xad, 0xa0, 0xb2, 0x50, 0x31, 0x91, 0x9b, 0x1a, 0xfb, 0xb9, 0x3b,
- 0x23, 0x79, 0xfb, 0x35, 0x51, 0x20, 0xf1, 0xf7, 0x38, 0x0b, 0x3d, 0x7a, 0x00, 0x39, 0xc8, 0x5a,
- 0x3d, 0xf9, 0x3a, 0xb5, 0x60, 0xad, 0x34, 0x28, 0x03, 0x0a, 0x2f, 0x7d, 0xb5, 0xbd, 0xe6, 0xfb,
- 0xb4, 0xe5, 0xf6, 0xb7, 0x51, 0x1a, 0xd0, 0x80, 0x06, 0x34, 0xa0, 0x01, 0x0d, 0x68, 0x40, 0x03,
- 0x1a, 0xd0, 0x80, 0x06, 0x34, 0xa0, 0x01, 0x0d, 0x68, 0x40, 0x03, 0x1a, 0xd0, 0x80, 0x06, 0x34,
- 0xa0, 0x01, 0xfd, 0x0c, 0xe8, 0xa9, 0x7f, 0xb6, 0x95, 0xfa, 0xf7, 0x77, 0x6f, 0xad, 0x02, 0xec,
- 0xd9, 0x8c, 0xa8, 0x9f, 0xcf, 0xb8, 0xb3, 0xb7, 0x1f, 0x86, 0xb2, 0xc2, 0x8c, 0x7d, 0x41, 0x4f,
- 0x9c, 0xfb, 0xbd, 0x8a, 0x67, 0x86, 0x78, 0x75, 0xd0, 0x8c, 0x7d, 0x89, 0x52, 0xf1, 0x5c, 0x3f,
- 0xcd, 0x04, 0xd6, 0x51, 0xa5, 0xb6, 0xd6, 0x6d, 0x81, 0x25, 0x00, 0x26, 0x63, 0xbb, 0x9a, 0x66,
- 0xed, 0x3d, 0x6f, 0x55, 0xa1, 0xac, 0x70, 0xc5, 0xbe, 0xf4, 0xcc, 0x8a, 0xad, 0xcd, 0x63, 0x1b,
- 0xb7, 0xdc, 0x5c, 0x5d, 0xd3, 0x8c, 0xdf, 0xc2, 0xba, 0x75, 0x79, 0xf9, 0xec, 0xd5, 0xc4, 0x1f,
- 0xa4, 0x5a, 0x47, 0xdd, 0x6b, 0x55, 0x00, 0xfb, 0x52, 0x74, 0xad, 0xfa, 0xcf, 0xc0, 0x2e, 0xa8,
- 0x92, 0x52, 0x7e, 0x08, 0xbb, 0xae, 0x47, 0xe7, 0x1c, 0x5a, 0x41, 0xd5, 0x0c, 0x24, 0x0b, 0xf5,
- 0x6a, 0xa4, 0x4a, 0x8a, 0x75, 0x54, 0x29, 0xf0, 0x7c, 0x3e, 0x21, 0xd3, 0x1a, 0xcb, 0x60, 0xe6,
- 0xd2, 0x91, 0x35, 0xe5, 0x9a, 0xb7, 0xa2, 0xff, 0x94, 0x0e, 0x1a, 0x09, 0xa2, 0x99, 0x91, 0x04,
- 0xfe, 0xb1, 0x1f, 0x1c, 0x4c, 0xae, 0x7f, 0xcd, 0xbd, 0xa3, 0x13, 0xc6, 0x2f, 0x07, 0x7b, 0x49,
- 0x39, 0xc2, 0xf7, 0xf1, 0x4a, 0x7f, 0x00, 0x2b, 0xce, 0xde, 0x4e, 0xbd, 0x3f, 0x51, 0x65, 0x00,
+ 0x00, 0x00, 0x02, 0x4b,
+ 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
+ 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x59, 0x08, 0x06, 0x00, 0x00, 0x00, 0xc2, 0x5a, 0x2f,
+ 0x75, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00, 0x0b,
+ 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4d, 0x45, 0x07, 0xd8,
+ 0x07, 0x09, 0x11, 0x04, 0x16, 0x70, 0xcd, 0x1e, 0x6a, 0x00, 0x00, 0x00, 0x1d, 0x74, 0x45, 0x58,
+ 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x00, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64,
+ 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x54, 0x68, 0x65, 0x20, 0x47, 0x49, 0x4d, 0x50, 0xef, 0x64,
+ 0x25, 0x6e, 0x00, 0x00, 0x01, 0xc1, 0x49, 0x44, 0x41, 0x54, 0x68, 0xde, 0xed, 0x9a, 0x61, 0x6e,
+ 0xc3, 0x20, 0x0c, 0x85, 0x9f, 0x49, 0x7a, 0xb7, 0x48, 0x3b, 0xef, 0xa4, 0x1e, 0xae, 0xc1, 0xfb,
+ 0x13, 0x34, 0xe7, 0xd5, 0x04, 0xc8, 0x34, 0xa5, 0xad, 0x1c, 0x09, 0x41, 0x53, 0x8b, 0x2f, 0xcf,
+ 0x18, 0xa7, 0xaa, 0x91, 0x65, 0x59, 0x14, 0x00, 0xbe, 0xee, 0x77, 0xfc, 0xf7, 0xf5, 0xbd, 0x2c,
+ 0x00, 0x80, 0x84, 0x0b, 0xae, 0x4b, 0xa0, 0x73, 0xcb, 0x40, 0x4e, 0x4c, 0xaa, 0x67, 0xa1, 0xe2,
+ 0x8c, 0xa5, 0x03, 0xa4, 0xc6, 0x4e, 0x47, 0xa0, 0x16, 0xc2, 0x63, 0xa9, 0x00, 0x95, 0xc6, 0x05,
+ 0xae, 0x3d, 0x50, 0x86, 0x24, 0x02, 0x32, 0x58, 0x9d, 0x96, 0x49, 0xb5, 0xf6, 0x2a, 0x2d, 0xc0,
+ 0xd2, 0x26, 0x73, 0x0f, 0x34, 0x59, 0xde, 0xc6, 0xab, 0x01, 0xe6, 0x03, 0x17, 0xcf, 0x1e, 0x4c,
+ 0x08, 0x66, 0x5b, 0x72, 0x94, 0xe6, 0x0d, 0x28, 0x5b, 0x0f, 0x02, 0x33, 0xbc, 0xa9, 0x74, 0xda,
+ 0x8c, 0x4a, 0xb3, 0xee, 0xb6, 0xee, 0x7c, 0x50, 0x00, 0x0d, 0xad, 0xa9, 0xdd, 0xc0, 0x16, 0x7a,
+ 0xdb, 0x7a, 0xab, 0x96, 0x55, 0x7a, 0x6b, 0x8c, 0xde, 0x40, 0xaa, 0x29, 0xbd, 0x55, 0xa0, 0xa9,
+ 0xe2, 0x6a, 0x8c, 0x06, 0x12, 0x9c, 0x40, 0x9a, 0xc8, 0xc5, 0x4a, 0x81, 0xb3, 0x1a, 0xfb, 0xa3,
+ 0xfd, 0x3d, 0xc3, 0xd9, 0x93, 0xad, 0xa0, 0xb2, 0x50, 0x31, 0x91, 0x9b, 0x1a, 0xfb, 0xb9, 0x3b,
+ 0x23, 0x79, 0xfb, 0x35, 0x51, 0x20, 0xf1, 0xf7, 0x38, 0x0b, 0x3d, 0x7a, 0x00, 0x39, 0xc8, 0x5a,
+ 0x3d, 0xf9, 0x3a, 0xb5, 0x60, 0xad, 0x34, 0x28, 0x03, 0x0a, 0x2f, 0x7d, 0xb5, 0xbd, 0xe6, 0xfb,
+ 0xb4, 0xe5, 0xf6, 0xb7, 0x51, 0x1a, 0xd0, 0x80, 0x06, 0x34, 0xa0, 0x01, 0x0d, 0x68, 0x40, 0x03,
+ 0x1a, 0xd0, 0x80, 0x06, 0x34, 0xa0, 0x01, 0x0d, 0x68, 0x40, 0x03, 0x1a, 0xd0, 0x80, 0x06, 0x34,
+ 0xa0, 0x01, 0xfd, 0x0c, 0xe8, 0xa9, 0x7f, 0xb6, 0x95, 0xfa, 0xf7, 0x77, 0x6f, 0xad, 0x02, 0xec,
+ 0xd9, 0x8c, 0xa8, 0x9f, 0xcf, 0xb8, 0xb3, 0xb7, 0x1f, 0x86, 0xb2, 0xc2, 0x8c, 0x7d, 0x41, 0x4f,
+ 0x9c, 0xfb, 0xbd, 0x8a, 0x67, 0x86, 0x78, 0x75, 0xd0, 0x8c, 0x7d, 0x89, 0x52, 0xf1, 0x5c, 0x3f,
+ 0xcd, 0x04, 0xd6, 0x51, 0xa5, 0xb6, 0xd6, 0x6d, 0x81, 0x25, 0x00, 0x26, 0x63, 0xbb, 0x9a, 0x66,
+ 0xed, 0x3d, 0x6f, 0x55, 0xa1, 0xac, 0x70, 0xc5, 0xbe, 0xf4, 0xcc, 0x8a, 0xad, 0xcd, 0x63, 0x1b,
+ 0xb7, 0xdc, 0x5c, 0x5d, 0xd3, 0x8c, 0xdf, 0xc2, 0xba, 0x75, 0x79, 0xf9, 0xec, 0xd5, 0xc4, 0x1f,
+ 0xa4, 0x5a, 0x47, 0xdd, 0x6b, 0x55, 0x00, 0xfb, 0x52, 0x74, 0xad, 0xfa, 0xcf, 0xc0, 0x2e, 0xa8,
+ 0x92, 0x52, 0x7e, 0x08, 0xbb, 0xae, 0x47, 0xe7, 0x1c, 0x5a, 0x41, 0xd5, 0x0c, 0x24, 0x0b, 0xf5,
+ 0x6a, 0xa4, 0x4a, 0x8a, 0x75, 0x54, 0x29, 0xf0, 0x7c, 0x3e, 0x21, 0xd3, 0x1a, 0xcb, 0x60, 0xe6,
+ 0xd2, 0x91, 0x35, 0xe5, 0x9a, 0xb7, 0xa2, 0xff, 0x94, 0x0e, 0x1a, 0x09, 0xa2, 0x99, 0x91, 0x04,
+ 0xfe, 0xb1, 0x1f, 0x1c, 0x4c, 0xae, 0x7f, 0xcd, 0xbd, 0xa3, 0x13, 0xc6, 0x2f, 0x07, 0x7b, 0x49,
+ 0x39, 0xc2, 0xf7, 0xf1, 0x4a, 0x7f, 0x00, 0x2b, 0xce, 0xde, 0x4e, 0xbd, 0x3f, 0x51, 0x65, 0x00,
0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82
};
/*
* CINELERRA
* Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
- *
+ *
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
- *
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
+ *
*/
#ifndef BLACK_DN_PNG_H
#define BLACK_DN_PNG_H
-static unsigned char black_dn_png[] =
+static unsigned char black_dn_png[] =
{
- 0x00, 0x00, 0x00, 0xe2,
- 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
- 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x59, 0x08, 0x06, 0x00, 0x00, 0x00, 0xc2, 0x5a, 0x2f,
- 0x75, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00, 0x0b,
- 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4d, 0x45, 0x07, 0xd7,
- 0x02, 0x0b, 0x07, 0x2b, 0x03, 0x84, 0x18, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x74, 0x45, 0x58,
- 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x00, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64,
- 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x54, 0x68, 0x65, 0x20, 0x47, 0x49, 0x4d, 0x50, 0xef, 0x64,
- 0x25, 0x6e, 0x00, 0x00, 0x00, 0x58, 0x49, 0x44, 0x41, 0x54, 0x68, 0xde, 0xed, 0xda, 0xb1, 0x11,
- 0x80, 0x30, 0x10, 0x03, 0xc1, 0xb7, 0x87, 0xe2, 0x54, 0xf2, 0x77, 0x67, 0x52, 0x28, 0xc0, 0x86,
- 0x60, 0x2f, 0x53, 0xb4, 0x0d, 0x68, 0x24, 0x59, 0x75, 0xb8, 0xeb, 0x39, 0xba, 0x7b, 0x3b, 0x98,
- 0xa4, 0x66, 0x7d, 0x10, 0x14, 0x0a, 0x85, 0x42, 0xa1, 0x50, 0x28, 0x14, 0x0a, 0x85, 0x42, 0xa1,
- 0x50, 0x28, 0x14, 0x0a, 0x85, 0x42, 0xa1, 0x50, 0x28, 0x14, 0x0a, 0x85, 0x42, 0xa1, 0x50, 0x28,
- 0x14, 0x0a, 0x85, 0x42, 0xa1, 0xbf, 0x42, 0x5f, 0x17, 0xbe, 0x24, 0x47, 0xd0, 0x1b, 0xfb, 0x92,
- 0x06, 0x65, 0x61, 0x5b, 0x43, 0x51, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42,
+ 0x00, 0x00, 0x00, 0xe2,
+ 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
+ 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x59, 0x08, 0x06, 0x00, 0x00, 0x00, 0xc2, 0x5a, 0x2f,
+ 0x75, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00, 0x0b,
+ 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4d, 0x45, 0x07, 0xd7,
+ 0x02, 0x0b, 0x07, 0x2b, 0x03, 0x84, 0x18, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x74, 0x45, 0x58,
+ 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x00, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64,
+ 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x54, 0x68, 0x65, 0x20, 0x47, 0x49, 0x4d, 0x50, 0xef, 0x64,
+ 0x25, 0x6e, 0x00, 0x00, 0x00, 0x58, 0x49, 0x44, 0x41, 0x54, 0x68, 0xde, 0xed, 0xda, 0xb1, 0x11,
+ 0x80, 0x30, 0x10, 0x03, 0xc1, 0xb7, 0x87, 0xe2, 0x54, 0xf2, 0x77, 0x67, 0x52, 0x28, 0xc0, 0x86,
+ 0x60, 0x2f, 0x53, 0xb4, 0x0d, 0x68, 0x24, 0x59, 0x75, 0xb8, 0xeb, 0x39, 0xba, 0x7b, 0x3b, 0x98,
+ 0xa4, 0x66, 0x7d, 0x10, 0x14, 0x0a, 0x85, 0x42, 0xa1, 0x50, 0x28, 0x14, 0x0a, 0x85, 0x42, 0xa1,
+ 0x50, 0x28, 0x14, 0x0a, 0x85, 0x42, 0xa1, 0x50, 0x28, 0x14, 0x0a, 0x85, 0x42, 0xa1, 0x50, 0x28,
+ 0x14, 0x0a, 0x85, 0x42, 0xa1, 0xbf, 0x42, 0x5f, 0x17, 0xbe, 0x24, 0x47, 0xd0, 0x1b, 0xfb, 0x92,
+ 0x06, 0x65, 0x61, 0x5b, 0x43, 0x51, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42,
0x60, 0x82
};
/*
* CINELERRA
* Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
- *
+ *
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
- *
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
+ *
*/
#ifndef BLACK_HI_PNG_H
#define BLACK_HI_PNG_H
-static unsigned char black_hi_png[] =
+static unsigned char black_hi_png[] =
{
- 0x00, 0x00, 0x02, 0x5f,
- 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
- 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x59, 0x08, 0x06, 0x00, 0x00, 0x00, 0xc2, 0x5a, 0x2f,
- 0x75, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00, 0x0b,
- 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4d, 0x45, 0x07, 0xd7,
- 0x02, 0x0b, 0x07, 0x2a, 0x2b, 0xa8, 0xb6, 0x71, 0xbb, 0x00, 0x00, 0x00, 0x1d, 0x74, 0x45, 0x58,
- 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x00, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64,
- 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x54, 0x68, 0x65, 0x20, 0x47, 0x49, 0x4d, 0x50, 0xef, 0x64,
- 0x25, 0x6e, 0x00, 0x00, 0x01, 0xd5, 0x49, 0x44, 0x41, 0x54, 0x68, 0xde, 0xed, 0x9a, 0x59, 0x6e,
- 0xc3, 0x30, 0x0c, 0x44, 0x47, 0x74, 0xef, 0x94, 0x2b, 0xe4, 0xe8, 0xbe, 0x94, 0xe5, 0x7e, 0x51,
- 0x60, 0x69, 0x6e, 0x71, 0xd1, 0x05, 0x2d, 0x09, 0x08, 0x0a, 0x1c, 0x29, 0x4f, 0x33, 0xb4, 0x93,
- 0x8f, 0xcc, 0x78, 0x3e, 0x9f, 0x27, 0x00, 0xec, 0xfb, 0x8e, 0x6d, 0xdb, 0x40, 0x44, 0x20, 0x22,
- 0x8c, 0x31, 0xd6, 0x2c, 0x07, 0x80, 0x35, 0x03, 0xc0, 0x79, 0x9e, 0x6b, 0x96, 0x63, 0xce, 0xb9,
- 0x66, 0x1e, 0x8f, 0xc7, 0x03, 0x00, 0xf0, 0xc6, 0x9b, 0x25, 0x70, 0xdb, 0xb6, 0x05, 0xd5, 0x60,
- 0xaf, 0x34, 0x70, 0x8c, 0xb1, 0x0e, 0xa4, 0x6b, 0x41, 0x25, 0x50, 0xce, 0x5a, 0xa9, 0x05, 0xd6,
- 0x2a, 0x89, 0x08, 0x73, 0x4e, 0x1c, 0xc7, 0x91, 0x43, 0x35, 0xd0, 0xb2, 0x3a, 0xb2, 0x57, 0x5a,
- 0x1a, 0x55, 0xaa, 0x54, 0x5b, 0x1c, 0x41, 0x59, 0xa1, 0xe5, 0x88, 0xb4, 0x7a, 0x41, 0x79, 0xa1,
- 0x04, 0xc9, 0xfe, 0x7a, 0x16, 0x6b, 0x6b, 0xad, 0x03, 0xf1, 0x41, 0x4c, 0xa8, 0xb4, 0x52, 0x5b,
- 0x5b, 0xb5, 0x77, 0xce, 0x09, 0x22, 0xfa, 0x70, 0x20, 0x76, 0xc0, 0x55, 0x6a, 0xa9, 0xad, 0x42,
- 0xbd, 0x1b, 0x2c, 0x54, 0xaa, 0x9f, 0x4d, 0xab, 0xa7, 0x9e, 0xbd, 0x7c, 0x5f, 0xc8, 0xeb, 0xde,
- 0x9e, 0x0b, 0x54, 0xab, 0xf6, 0x86, 0x57, 0xde, 0x97, 0x89, 0x0b, 0xcd, 0x80, 0xac, 0x44, 0x43,
- 0xc7, 0x18, 0xab, 0x67, 0xde, 0x01, 0xe5, 0x1e, 0xb2, 0x4e, 0xe9, 0x29, 0xa8, 0xcc, 0x9e, 0x72,
- 0x59, 0x54, 0xb1, 0xc8, 0x3b, 0x75, 0xc5, 0x1d, 0xab, 0x48, 0x2b, 0xc9, 0xaa, 0xaa, 0x30, 0x52,
- 0x4b, 0xd6, 0x07, 0x66, 0xf6, 0x78, 0xc0, 0xec, 0x26, 0x0b, 0xed, 0xfd, 0xea, 0x22, 0xcf, 0xbe,
- 0xc8, 0xda, 0xcf, 0xee, 0xf9, 0x1d, 0x4a, 0xff, 0x1f, 0xb4, 0xda, 0xbf, 0x3b, 0x7d, 0x6e, 0x7b,
- 0x1b, 0xda, 0xd0, 0x86, 0x36, 0xb4, 0xa1, 0x0d, 0x6d, 0x68, 0x43, 0x1b, 0xda, 0xd0, 0x86, 0x36,
- 0xb4, 0xa1, 0x0d, 0x6d, 0x68, 0x43, 0x1b, 0xda, 0xd0, 0x86, 0x36, 0xf4, 0xfb, 0xa0, 0xde, 0x5f,
- 0xcb, 0xfa, 0x7a, 0x75, 0x5d, 0xdb, 0xfb, 0x73, 0xd0, 0xa8, 0x17, 0x77, 0xfa, 0x67, 0xbd, 0x47,
- 0xd9, 0x02, 0xf9, 0xa7, 0xac, 0x5e, 0x67, 0x5d, 0x8f, 0x0e, 0x70, 0x81, 0x56, 0x16, 0x5b, 0xc0,
- 0xca, 0x3e, 0x7d, 0x18, 0x8a, 0x16, 0x59, 0xc3, 0x03, 0x47, 0xeb, 0x53, 0x7b, 0xb3, 0xbe, 0x65,
- 0x73, 0xa5, 0x3d, 0xa6, 0xbd, 0x15, 0x85, 0xd9, 0x75, 0x0d, 0x33, 0xc3, 0x15, 0x91, 0x45, 0x32,
- 0x36, 0x90, 0x85, 0x2b, 0x2a, 0x56, 0x5f, 0xa0, 0x1c, 0x8e, 0xd0, 0x19, 0x14, 0x19, 0x98, 0xc8,
- 0xc2, 0x15, 0x9c, 0x61, 0x29, 0x43, 0xad, 0x30, 0x04, 0x57, 0x35, 0xd1, 0xa1, 0x47, 0x08, 0x65,
- 0x95, 0x12, 0xca, 0x71, 0x02, 0x1d, 0x96, 0x88, 0xec, 0xd5, 0x40, 0x9e, 0x43, 0x7b, 0xb5, 0x9a,
- 0x6a, 0x4a, 0xc7, 0x53, 0xeb, 0x2a, 0xb5, 0x2c, 0xd5, 0x7d, 0x7e, 0x25, 0x8f, 0xc4, 0xe3, 0x38,
- 0x8e, 0xf5, 0xda, 0x84, 0x7a, 0xcf, 0x19, 0x5b, 0x5c, 0x4d, 0x5e, 0x31, 0x98, 0x81, 0x3c, 0xa7,
- 0x50, 0x8e, 0xf4, 0xdc, 0xcd, 0x98, 0xb1, 0xea, 0x97, 0x94, 0xca, 0xc7, 0xe6, 0x4e, 0x9a, 0xce,
- 0xea, 0xef, 0x05, 0xca, 0xf1, 0xba, 0x3f, 0xfb, 0x23, 0xfe, 0x0e, 0x85, 0xb6, 0xe5, 0x4d, 0xf2,
+ 0x00, 0x00, 0x02, 0x5f,
+ 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
+ 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x59, 0x08, 0x06, 0x00, 0x00, 0x00, 0xc2, 0x5a, 0x2f,
+ 0x75, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00, 0x0b,
+ 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4d, 0x45, 0x07, 0xd7,
+ 0x02, 0x0b, 0x07, 0x2a, 0x2b, 0xa8, 0xb6, 0x71, 0xbb, 0x00, 0x00, 0x00, 0x1d, 0x74, 0x45, 0x58,
+ 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x00, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64,
+ 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x54, 0x68, 0x65, 0x20, 0x47, 0x49, 0x4d, 0x50, 0xef, 0x64,
+ 0x25, 0x6e, 0x00, 0x00, 0x01, 0xd5, 0x49, 0x44, 0x41, 0x54, 0x68, 0xde, 0xed, 0x9a, 0x59, 0x6e,
+ 0xc3, 0x30, 0x0c, 0x44, 0x47, 0x74, 0xef, 0x94, 0x2b, 0xe4, 0xe8, 0xbe, 0x94, 0xe5, 0x7e, 0x51,
+ 0x60, 0x69, 0x6e, 0x71, 0xd1, 0x05, 0x2d, 0x09, 0x08, 0x0a, 0x1c, 0x29, 0x4f, 0x33, 0xb4, 0x93,
+ 0x8f, 0xcc, 0x78, 0x3e, 0x9f, 0x27, 0x00, 0xec, 0xfb, 0x8e, 0x6d, 0xdb, 0x40, 0x44, 0x20, 0x22,
+ 0x8c, 0x31, 0xd6, 0x2c, 0x07, 0x80, 0x35, 0x03, 0xc0, 0x79, 0x9e, 0x6b, 0x96, 0x63, 0xce, 0xb9,
+ 0x66, 0x1e, 0x8f, 0xc7, 0x03, 0x00, 0xf0, 0xc6, 0x9b, 0x25, 0x70, 0xdb, 0xb6, 0x05, 0xd5, 0x60,
+ 0xaf, 0x34, 0x70, 0x8c, 0xb1, 0x0e, 0xa4, 0x6b, 0x41, 0x25, 0x50, 0xce, 0x5a, 0xa9, 0x05, 0xd6,
+ 0x2a, 0x89, 0x08, 0x73, 0x4e, 0x1c, 0xc7, 0x91, 0x43, 0x35, 0xd0, 0xb2, 0x3a, 0xb2, 0x57, 0x5a,
+ 0x1a, 0x55, 0xaa, 0x54, 0x5b, 0x1c, 0x41, 0x59, 0xa1, 0xe5, 0x88, 0xb4, 0x7a, 0x41, 0x79, 0xa1,
+ 0x04, 0xc9, 0xfe, 0x7a, 0x16, 0x6b, 0x6b, 0xad, 0x03, 0xf1, 0x41, 0x4c, 0xa8, 0xb4, 0x52, 0x5b,
+ 0x5b, 0xb5, 0x77, 0xce, 0x09, 0x22, 0xfa, 0x70, 0x20, 0x76, 0xc0, 0x55, 0x6a, 0xa9, 0xad, 0x42,
+ 0xbd, 0x1b, 0x2c, 0x54, 0xaa, 0x9f, 0x4d, 0xab, 0xa7, 0x9e, 0xbd, 0x7c, 0x5f, 0xc8, 0xeb, 0xde,
+ 0x9e, 0x0b, 0x54, 0xab, 0xf6, 0x86, 0x57, 0xde, 0x97, 0x89, 0x0b, 0xcd, 0x80, 0xac, 0x44, 0x43,
+ 0xc7, 0x18, 0xab, 0x67, 0xde, 0x01, 0xe5, 0x1e, 0xb2, 0x4e, 0xe9, 0x29, 0xa8, 0xcc, 0x9e, 0x72,
+ 0x59, 0x54, 0xb1, 0xc8, 0x3b, 0x75, 0xc5, 0x1d, 0xab, 0x48, 0x2b, 0xc9, 0xaa, 0xaa, 0x30, 0x52,
+ 0x4b, 0xd6, 0x07, 0x66, 0xf6, 0x78, 0xc0, 0xec, 0x26, 0x0b, 0xed, 0xfd, 0xea, 0x22, 0xcf, 0xbe,
+ 0xc8, 0xda, 0xcf, 0xee, 0xf9, 0x1d, 0x4a, 0xff, 0x1f, 0xb4, 0xda, 0xbf, 0x3b, 0x7d, 0x6e, 0x7b,
+ 0x1b, 0xda, 0xd0, 0x86, 0x36, 0xb4, 0xa1, 0x0d, 0x6d, 0x68, 0x43, 0x1b, 0xda, 0xd0, 0x86, 0x36,
+ 0xb4, 0xa1, 0x0d, 0x6d, 0x68, 0x43, 0x1b, 0xda, 0xd0, 0x86, 0x36, 0xf4, 0xfb, 0xa0, 0xde, 0x5f,
+ 0xcb, 0xfa, 0x7a, 0x75, 0x5d, 0xdb, 0xfb, 0x73, 0xd0, 0xa8, 0x17, 0x77, 0xfa, 0x67, 0xbd, 0x47,
+ 0xd9, 0x02, 0xf9, 0xa7, 0xac, 0x5e, 0x67, 0x5d, 0x8f, 0x0e, 0x70, 0x81, 0x56, 0x16, 0x5b, 0xc0,
+ 0xca, 0x3e, 0x7d, 0x18, 0x8a, 0x16, 0x59, 0xc3, 0x03, 0x47, 0xeb, 0x53, 0x7b, 0xb3, 0xbe, 0x65,
+ 0x73, 0xa5, 0x3d, 0xa6, 0xbd, 0x15, 0x85, 0xd9, 0x75, 0x0d, 0x33, 0xc3, 0x15, 0x91, 0x45, 0x32,
+ 0x36, 0x90, 0x85, 0x2b, 0x2a, 0x56, 0x5f, 0xa0, 0x1c, 0x8e, 0xd0, 0x19, 0x14, 0x19, 0x98, 0xc8,
+ 0xc2, 0x15, 0x9c, 0x61, 0x29, 0x43, 0xad, 0x30, 0x04, 0x57, 0x35, 0xd1, 0xa1, 0x47, 0x08, 0x65,
+ 0x95, 0x12, 0xca, 0x71, 0x02, 0x1d, 0x96, 0x88, 0xec, 0xd5, 0x40, 0x9e, 0x43, 0x7b, 0xb5, 0x9a,
+ 0x6a, 0x4a, 0xc7, 0x53, 0xeb, 0x2a, 0xb5, 0x2c, 0xd5, 0x7d, 0x7e, 0x25, 0x8f, 0xc4, 0xe3, 0x38,
+ 0x8e, 0xf5, 0xda, 0x84, 0x7a, 0xcf, 0x19, 0x5b, 0x5c, 0x4d, 0x5e, 0x31, 0x98, 0x81, 0x3c, 0xa7,
+ 0x50, 0x8e, 0xf4, 0xdc, 0xcd, 0x98, 0xb1, 0xea, 0x97, 0x94, 0xca, 0xc7, 0xe6, 0x4e, 0x9a, 0xce,
+ 0xea, 0xef, 0x05, 0xca, 0xf1, 0xba, 0x3f, 0xfb, 0x23, 0xfe, 0x0e, 0x85, 0xb6, 0xe5, 0x4d, 0xf2,
0x31, 0x44, 0x9e, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82
};
/*
* CINELERRA
* Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
- *
+ *
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
- *
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
+ *
*/
#ifndef BLACK_UP_PNG_H
#define BLACK_UP_PNG_H
-static unsigned char black_up_png[] =
+static unsigned char black_up_png[] =
{
- 0x00, 0x00, 0x00, 0xe2,
- 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
- 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x59, 0x08, 0x06, 0x00, 0x00, 0x00, 0xc2, 0x5a, 0x2f,
- 0x75, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00, 0x0b,
- 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4d, 0x45, 0x07, 0xd7,
- 0x02, 0x0b, 0x07, 0x2a, 0x18, 0x17, 0x66, 0x10, 0xad, 0x00, 0x00, 0x00, 0x1d, 0x74, 0x45, 0x58,
- 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x00, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64,
- 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x54, 0x68, 0x65, 0x20, 0x47, 0x49, 0x4d, 0x50, 0xef, 0x64,
- 0x25, 0x6e, 0x00, 0x00, 0x00, 0x58, 0x49, 0x44, 0x41, 0x54, 0x68, 0xde, 0xed, 0xda, 0xb1, 0x0d,
- 0x80, 0x50, 0x14, 0x02, 0x40, 0x34, 0x0e, 0xc7, 0xc8, 0x6f, 0x3b, 0x7f, 0xf5, 0x47, 0x30, 0x1a,
- 0x73, 0x54, 0x74, 0x17, 0x7a, 0x8e, 0xb6, 0x77, 0x92, 0xcc, 0x4c, 0x9e, 0x4e, 0xdb, 0x24, 0xc9,
- 0x99, 0x17, 0x02, 0x85, 0x42, 0xa1, 0x50, 0x28, 0x14, 0x0a, 0x85, 0x42, 0xa1, 0x50, 0x28, 0x14,
- 0x0a, 0x85, 0x42, 0xa1, 0x50, 0x28, 0x14, 0x0a, 0x85, 0x42, 0xa1, 0x50, 0x28, 0x14, 0x0a, 0x85,
- 0x42, 0xa1, 0x50, 0xe8, 0xa7, 0xd0, 0x6b, 0x97, 0x7d, 0xaf, 0xfb, 0xed, 0xd2, 0x05, 0x7d, 0x42,
- 0x06, 0x63, 0x11, 0xb3, 0x8c, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42,
+ 0x00, 0x00, 0x00, 0xe2,
+ 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
+ 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x59, 0x08, 0x06, 0x00, 0x00, 0x00, 0xc2, 0x5a, 0x2f,
+ 0x75, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00, 0x0b,
+ 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4d, 0x45, 0x07, 0xd7,
+ 0x02, 0x0b, 0x07, 0x2a, 0x18, 0x17, 0x66, 0x10, 0xad, 0x00, 0x00, 0x00, 0x1d, 0x74, 0x45, 0x58,
+ 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x00, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64,
+ 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x54, 0x68, 0x65, 0x20, 0x47, 0x49, 0x4d, 0x50, 0xef, 0x64,
+ 0x25, 0x6e, 0x00, 0x00, 0x00, 0x58, 0x49, 0x44, 0x41, 0x54, 0x68, 0xde, 0xed, 0xda, 0xb1, 0x0d,
+ 0x80, 0x50, 0x14, 0x02, 0x40, 0x34, 0x0e, 0xc7, 0xc8, 0x6f, 0x3b, 0x7f, 0xf5, 0x47, 0x30, 0x1a,
+ 0x73, 0x54, 0x74, 0x17, 0x7a, 0x8e, 0xb6, 0x77, 0x92, 0xcc, 0x4c, 0x9e, 0x4e, 0xdb, 0x24, 0xc9,
+ 0x99, 0x17, 0x02, 0x85, 0x42, 0xa1, 0x50, 0x28, 0x14, 0x0a, 0x85, 0x42, 0xa1, 0x50, 0x28, 0x14,
+ 0x0a, 0x85, 0x42, 0xa1, 0x50, 0x28, 0x14, 0x0a, 0x85, 0x42, 0xa1, 0x50, 0x28, 0x14, 0x0a, 0x85,
+ 0x42, 0xa1, 0x50, 0xe8, 0xa7, 0xd0, 0x6b, 0x97, 0x7d, 0xaf, 0xfb, 0xed, 0xd2, 0x05, 0x7d, 0x42,
+ 0x06, 0x63, 0x11, 0xb3, 0x8c, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42,
0x60, 0x82
};
/*
* CINELERRA
- * Copyright (C) 1997-2011 Adam Williams <broadcast at earthling dot net>
+ * Copyright (C) 1997-2017 Adam Williams <broadcast at earthling dot net>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
//printf("Synth::read_data %s\n", keyframe->get_data());
int result = 0, current_osc = 0;
- //int total_oscillators = 0;
while(!result)
{
result = input.read_tag();
}
config.wavefunction = input.tag.get_property("WAVEFUNCTION", config.wavefunction);
- //total_oscillators = input.tag.get_property("OSCILLATORS", 0);
+ // int total_oscillators = input.tag.get_property("OSCILLATORS", 0);
}
else
if(input.tag.title_is("OSCILLATOR"))
config.oscillator_config.values[i]->save_data(&output);
}
- output.tag.set_title("/SYNTH");
- output.append_tag();
- output.append_newline();
output.terminate_string();
//printf("Synth::save_data %d %s\n", __LINE__, output.string);
// data is now in *text
void Synth::update_gui()
{
- if( !thread ) return;
- SynthWindow *window = (SynthWindow*)thread->window;
-// load_configuration,read_data deletes oscillator_config
- window->lock_window("Synth::update_gui");
- if( load_configuration() )
- window->update_gui();
- window->unlock_window();
+ if(thread)
+ {
+ if(load_configuration())
+ {
+ thread->window->lock_window();
+ ((SynthWindow*)thread->window)->update_gui();
+ thread->window->unlock_window();
+ }
+ }
}
void Synth::add_oscillator()
{
- if(config.oscillator_config.total > 20) return;
+ if(config.oscillator_config.total > MAX_OSCILLATORS) return;
config.oscillator_config.append(new SynthOscillatorConfig(config.oscillator_config.total - 1));
}
freq;
// Starting sample in waveform
double x = waveform_sample;
- double phase_offset = config->phase * orig_period;
//printf("Synth::solve_eqn %d %f\n", __LINE__, config->phase);
+ double phase_offset = config->phase * orig_period;
// Period of current oscillator
double period = orig_period / config->freq_factor;
int sample;
{
case DC:
return power;
+ break;
case SINE:
return sin((x + config->phase) * config->freq_factor * 2 * M_PI) * power;
+ break;
case SAWTOOTH:
return function_sawtooth((x + config->phase) * config->freq_factor) * power;
+ break;
case SQUARE:
return function_square((x + config->phase) * config->freq_factor) * power;
+ break;
case TRIANGLE:
return function_triangle((x + config->phase) * config->freq_factor) * power;
+ break;
case PULSE:
return function_pulse((x + config->phase) * config->freq_factor) * power;
+ break;
case NOISE:
return function_noise() * power;
+ break;
}
return 0;
}
void SynthWindow::create_objects()
{
+ int margin = client->get_theme()->widget_border;
+
BC_MenuBar *menu;
add_subwindow(menu = new BC_MenuBar(0, 0, get_w()));
phasemenu->add_item(new SynthPhaseSine(synth));
phasemenu->add_item(new SynthPhaseZero(synth));
+ harmonicmenu->add_item(new SynthFreqMin(synth));
harmonicmenu->add_item(new SynthFreqEnum(synth));
harmonicmenu->add_item(new SynthFreqEven(synth));
harmonicmenu->add_item(new SynthFreqFibonacci(synth));
add_subwindow(waveform = new SynthWaveForm(synth, x, y, string));
waveform->create_objects();
y += ys30;
- int x1 = x + waveform->get_w() + xs10;
+ int x1 = x + waveform->get_w() + xs50;
add_subwindow(new BC_Title(x, y, _("Base Frequency:")));
add_subwindow(note_subwindow = new BC_SubWindow(x1+xS(20),
- y,
- get_w() - (x1+xS(20)),
- white_key[0]->get_h() + MARGIN +
- get_text_height(MEDIUMFONT) + MARGIN +
- get_text_height(MEDIUMFONT) + MARGIN));
- add_subwindow(note_scroll = new NoteScroll(synth,
- this,
- x1,
+ y, get_w() - (x1+xS(20)),
+ white_key[0]->get_h() + margin +
+ get_text_height(MEDIUMFONT) + margin +
+ get_text_height(MEDIUMFONT) + margin));
+ add_subwindow(note_scroll = new NoteScroll(synth, this, x1,
note_subwindow->get_y() + note_subwindow->get_h(),
note_subwindow->get_w()));
add_subwindow(momentary = new SynthMomentary(this, x1,
- note_scroll->get_y() + note_scroll->get_h() + MARGIN,
+ note_scroll->get_y() + note_scroll->get_h() + margin,
_("Momentary notes")));
add_subwindow(note_instructions = new BC_Title( x1,
- momentary->get_y() + momentary->get_h() + MARGIN,
+ momentary->get_y() + momentary->get_h() + margin,
_("Ctrl or Shift to select multiple notes.")));
update_scrollbar();
if(number >= FIRST_TITLE && number < LAST_TITLE)
note_subwindow->add_subwindow(
note_titles[(*current_title)++] = new BC_Title(
- x + text_white_margin,
- y2,
+ x + text_white_margin, y2,
keyboard_map[number - FIRST_TITLE]));
//printf("SynthWindow::update_whitekey %d\n", __LINE__);
}
if(number >= FIRST_TITLE && number < LAST_TITLE)
note_subwindow->add_subwindow(
note_titles[(*current_title)++] = new BC_Title(x + text_black_margin,
- y1,
- keyboard_map[number - FIRST_TITLE]));
+ y1, keyboard_map[number - FIRST_TITLE]));
}
else
{
notes[number]->reposition_window(x, y);
if(number >= FIRST_TITLE && number < LAST_TITLE)
- note_titles[(*current_title)++]->reposition_window(x + text_black_margin,
- y1);
+ note_titles[(*current_title)++]->reposition_window(x + text_black_margin, y1);
}
}
int white_w1 = white_w - black_w / 2 - 2;
int white_w2 = white_w / 2;
int white_w3 = white_w * 2 / 3;
- int y = 0;
- int x = 0;
- y1 = y + white_key[0]->get_h() + 10;
- y2 = y1 + get_text_height(MEDIUMFONT) + 10;
- y3 = y2 + get_text_height(MEDIUMFONT) + 10;
+ int x = 0, y = 0, ys5 = yS(5);
+ y1 = y + white_key[0]->get_h() + ys5;
+ y2 = y1 + get_text_height(MEDIUMFONT) + ys5;
+ y3 = y2 + get_text_height(MEDIUMFONT) + ys5;
text_black_margin = black_w / 2 - get_text_width(MEDIUMFONT, "O") / 2;
text_white_margin = white_w / 2 - get_text_width(MEDIUMFONT, "O") / 2;
gui->phase->update((int64_t)(config->phase * 360));
gui->freq->reposition_window(gui->freq->get_x(), y);
- gui->freq->update((int64_t)(config->freq_factor));
+ gui->freq->update(config->freq_factor);
}
y += OSCILLATORHEIGHT;
}
}
+
+
+
+
+
SynthOscGUI::SynthOscGUI(SynthWindow *window, int number)
{
this->window = window;
SynthOscGUIFreq::SynthOscGUIFreq(Synth *synth, SynthOscGUI *gui, int y)
- : BC_IPot(xS(200), y,
+ : BC_FPot(xS(200), y,
(int64_t)(synth->config.oscillator_config.values[gui->number]->freq_factor),
1, 100)
{
}
+
+
+
+
SynthWaveForm::SynthWaveForm(Synth *synth, int x, int y, char *text)
: BC_PopupMenu(x, y, xS(120), text)
{
return 1;
}
+SynthFreqPow1::SynthFreqPow1(Synth *synth)
+ : BC_MenuItem(_("Powers of 1.4"))
+{
+ this->synth = synth;
+}
+SynthFreqPow1::~SynthFreqPow1()
+{
+}
+
+int SynthFreqPow1::handle_event()
+{
+ for(int i = 0; i < synth->config.oscillator_config.total; i++)
+ {
+ synth->config.oscillator_config.values[i]->freq_factor = pow(sqrt(2), i);
+ }
+
+ ((SynthWindow*)synth->thread->window)->update_gui();
+ synth->send_configure_change();
+ return 1;
+}
+
+
+SynthFreqPow2::SynthFreqPow2(Synth *synth)
+ : BC_MenuItem(_("Powers of 2"))
+{
+ this->synth = synth;
+}
+SynthFreqPow2::~SynthFreqPow2()
+{
+}
+
+int SynthFreqPow2::handle_event()
+{
+ for(int i = 0; i < synth->config.oscillator_config.total; i++)
+ {
+ synth->config.oscillator_config.values[i]->freq_factor = pow(2, i);
+ }
+
+ ((SynthWindow*)synth->thread->window)->update_gui();
+ synth->send_configure_change();
+ return 1;
+}
+
+
+
+
+SynthFreqMin::SynthFreqMin(Synth *synth)
+ : BC_MenuItem(_("Minimum"))
+{
+ this->synth = synth;
+}
+SynthFreqMin::~SynthFreqMin()
+{
+}
+
+int SynthFreqMin::handle_event()
+{
+ for(int i = 0; i < synth->config.oscillator_config.total; i++)
+ {
+ synth->config.oscillator_config.values[i]->freq_factor = 1;
+ }
+
+ ((SynthWindow*)synth->thread->window)->update_gui();
+ synth->send_configure_change();
+ return 1;
+}
+
+
SynthFreqEnum::SynthFreqEnum(Synth *synth)
: BC_MenuItem(_("Enumerate"))
{
#include "guicast.h"
#include "mutex.h"
#include "pluginaclient.h"
-#include "synthesizer.inc"
#include "vframe.inc"
+class Synth;
+class SynthWindow;
+
// Frequency table for piano
float keyboard_freqs[] =
{
};
#define MAX_FREQS 16
-#define TOTALOSCILLATORS 1
+#define MAX_OSCILLATORS 256
+#define OSCILLATORHEIGHT yS(40)
#define TOTALNOTES ((int)(sizeof(keyboard_freqs) / sizeof(float)))
#define MIDDLE_C 24
#define FIRST_TITLE (MIDDLE_C - 12)
#define LAST_TITLE (MIDDLE_C + 12)
-#define MARGIN yS(10)
+#define YMARGIN yS(10)
#define SINE 0
#define SAWTOOTH 1
SynthOscGUI *gui;
};
-class SynthOscGUIFreq : public BC_IPot
+class SynthOscGUIFreq : public BC_FPot
{
public:
SynthOscGUIFreq(Synth *synth, SynthOscGUI *gui, int y);
Synth *synth;
};
+class SynthFreqPow1 : public BC_MenuItem
+{
+public:
+ SynthFreqPow1(Synth *synth);
+ ~SynthFreqPow1();
+ int handle_event();
+ Synth *synth;
+};
+
+class SynthFreqPow2 : public BC_MenuItem
+{
+public:
+ SynthFreqPow2(Synth *synth);
+ ~SynthFreqPow2();
+ int handle_event();
+ Synth *synth;
+};
+
class SynthFreqEnum : public BC_MenuItem
{
public:
Synth *synth;
};
+class SynthFreqMin : public BC_MenuItem
+{
+public:
+ SynthFreqMin(Synth *synth);
+ ~SynthFreqMin();
+ int handle_event();
+ Synth *synth;
+};
+
class SynthFreqEven : public BC_MenuItem
{
public:
/*
* CINELERRA
* Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
- *
+ *
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
- *
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
+ *
*/
#ifndef SYNTHESIZER_INC
class Synth;
class SynthOscillator;
-#define OSCILLATORHEIGHT yS(40)
+
#endif
/*
* CINELERRA
* Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
- *
+ *
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
- *
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
+ *
*/
#ifndef SYNTHWINDOW_INC
#define SYNTHWINDOW_INC
+
+
class SynthThread;
class SynthOscGUI;
class SynthOscGUILevel;
class SynthScroll;
class SynthClear;
+#define OSCILLATORHEIGHT 40
+
+
#endif
/*
* CINELERRA
* Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
- *
+ *
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
- *
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
+ *
*/
#ifndef WHITE_CHECKED_PNG_H
#define WHITE_CHECKED_PNG_H
-static unsigned char white_checked_png[] =
+static unsigned char white_checked_png[] =
{
- 0x00, 0x00, 0x00, 0xfb,
- 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
- 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0xa4, 0x08, 0x02, 0x00, 0x00, 0x00, 0x74, 0x27, 0xcb,
- 0x2a, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00, 0x0b,
- 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4d, 0x45, 0x07, 0xd8,
- 0x07, 0x09, 0x11, 0x02, 0x01, 0xa5, 0x44, 0x3c, 0x2b, 0x00, 0x00, 0x00, 0x1d, 0x74, 0x45, 0x58,
- 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x00, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64,
- 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x54, 0x68, 0x65, 0x20, 0x47, 0x49, 0x4d, 0x50, 0xef, 0x64,
- 0x25, 0x6e, 0x00, 0x00, 0x00, 0x71, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xed, 0xdc, 0x31, 0x0d,
- 0x00, 0x20, 0x10, 0x04, 0xc1, 0x87, 0xa0, 0x19, 0x0f, 0xa8, 0xc2, 0x03, 0x8a, 0xe8, 0x08, 0x06,
- 0xf8, 0x82, 0xcc, 0x56, 0xd7, 0x8d, 0x83, 0x2b, 0xb3, 0xf7, 0x78, 0xdf, 0x58, 0xeb, 0xec, 0x1a,
- 0xe9, 0x21, 0x91, 0x48, 0x24, 0x12, 0x89, 0x44, 0x22, 0x91, 0x48, 0x24, 0x12, 0x89, 0x44, 0x22,
- 0x91, 0x48, 0x24, 0x12, 0x89, 0x44, 0x22, 0x91, 0x48, 0x24, 0x12, 0x89, 0x44, 0x22, 0x91, 0x48,
- 0x24, 0x12, 0x89, 0x44, 0x22, 0x91, 0x48, 0x24, 0x12, 0x89, 0x44, 0x22, 0x91, 0x48, 0x24, 0x12,
- 0x89, 0x44, 0x22, 0x91, 0x48, 0x24, 0x12, 0x89, 0x44, 0x22, 0x91, 0x48, 0x24, 0x12, 0x89, 0xfc,
- 0x82, 0x6c, 0xf7, 0xa5, 0x51, 0x4e, 0x1b, 0xcd, 0x2e, 0x07, 0x4f, 0xa7, 0x42, 0x67, 0xd0, 0x00,
+ 0x00, 0x00, 0x00, 0xfb,
+ 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
+ 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0xa4, 0x08, 0x02, 0x00, 0x00, 0x00, 0x74, 0x27, 0xcb,
+ 0x2a, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00, 0x0b,
+ 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4d, 0x45, 0x07, 0xd8,
+ 0x07, 0x09, 0x11, 0x02, 0x01, 0xa5, 0x44, 0x3c, 0x2b, 0x00, 0x00, 0x00, 0x1d, 0x74, 0x45, 0x58,
+ 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x00, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64,
+ 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x54, 0x68, 0x65, 0x20, 0x47, 0x49, 0x4d, 0x50, 0xef, 0x64,
+ 0x25, 0x6e, 0x00, 0x00, 0x00, 0x71, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xed, 0xdc, 0x31, 0x0d,
+ 0x00, 0x20, 0x10, 0x04, 0xc1, 0x87, 0xa0, 0x19, 0x0f, 0xa8, 0xc2, 0x03, 0x8a, 0xe8, 0x08, 0x06,
+ 0xf8, 0x82, 0xcc, 0x56, 0xd7, 0x8d, 0x83, 0x2b, 0xb3, 0xf7, 0x78, 0xdf, 0x58, 0xeb, 0xec, 0x1a,
+ 0xe9, 0x21, 0x91, 0x48, 0x24, 0x12, 0x89, 0x44, 0x22, 0x91, 0x48, 0x24, 0x12, 0x89, 0x44, 0x22,
+ 0x91, 0x48, 0x24, 0x12, 0x89, 0x44, 0x22, 0x91, 0x48, 0x24, 0x12, 0x89, 0x44, 0x22, 0x91, 0x48,
+ 0x24, 0x12, 0x89, 0x44, 0x22, 0x91, 0x48, 0x24, 0x12, 0x89, 0x44, 0x22, 0x91, 0x48, 0x24, 0x12,
+ 0x89, 0x44, 0x22, 0x91, 0x48, 0x24, 0x12, 0x89, 0x44, 0x22, 0x91, 0x48, 0x24, 0x12, 0x89, 0xfc,
+ 0x82, 0x6c, 0xf7, 0xa5, 0x51, 0x4e, 0x1b, 0xcd, 0x2e, 0x07, 0x4f, 0xa7, 0x42, 0x67, 0xd0, 0x00,
0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82
};
/*
* CINELERRA
* Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
- *
+ *
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
- *
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
+ *
*/
#ifndef WHITE_CHECKEDHI_PNG_H
#define WHITE_CHECKEDHI_PNG_H
-static unsigned char white_checkedhi_png[] =
+static unsigned char white_checkedhi_png[] =
{
- 0x00, 0x00, 0x02, 0xd3,
- 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
- 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0xa4, 0x08, 0x02, 0x00, 0x00, 0x00, 0x74, 0x27, 0xcb,
- 0x2a, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00, 0x0b,
- 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4d, 0x45, 0x07, 0xd8,
- 0x07, 0x09, 0x11, 0x04, 0x0f, 0x14, 0xa6, 0xb6, 0xaa, 0x00, 0x00, 0x00, 0x1d, 0x74, 0x45, 0x58,
- 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x00, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64,
- 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x54, 0x68, 0x65, 0x20, 0x47, 0x49, 0x4d, 0x50, 0xef, 0x64,
- 0x25, 0x6e, 0x00, 0x00, 0x02, 0x49, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xed, 0xdc, 0xcd, 0x75,
- 0xc3, 0x20, 0x10, 0x04, 0xe0, 0x1d, 0x4c, 0xcd, 0xe9, 0x21, 0x55, 0xa5, 0x87, 0xf4, 0x93, 0x9d,
- 0x1c, 0x16, 0x10, 0xc2, 0xfa, 0x41, 0x8e, 0xed, 0x4b, 0x86, 0x97, 0x03, 0x91, 0xf5, 0xf8, 0xb2,
- 0x80, 0x51, 0x2e, 0x23, 0x7c, 0x7d, 0x7c, 0xd8, 0xeb, 0xdb, 0xe7, 0xf7, 0x77, 0xeb, 0x27, 0x7b,
- 0x7b, 0x13, 0xf9, 0xa2, 0x96, 0x4f, 0xef, 0xc0, 0xc4, 0x28, 0x7c, 0x0a, 0x59, 0x24, 0xe0, 0x54,
- 0x65, 0xdc, 0x40, 0x4e, 0xda, 0x79, 0xd7, 0x03, 0x50, 0x50, 0xec, 0x95, 0xcb, 0x7a, 0x9d, 0xa4,
- 0x01, 0x34, 0x03, 0xc9, 0x07, 0xc8, 0xe6, 0x21, 0xb4, 0xda, 0xdf, 0x2e, 0x91, 0x8c, 0x2a, 0x19,
- 0xbf, 0x00, 0xa7, 0x6a, 0x3e, 0xf2, 0x80, 0xd4, 0xf5, 0x87, 0x42, 0xd9, 0x48, 0x92, 0x80, 0x07,
- 0x34, 0xa1, 0xde, 0x55, 0xb9, 0xf6, 0xe2, 0x07, 0xd5, 0xec, 0x6b, 0x8d, 0xfa, 0x42, 0x0c, 0xcf,
- 0xdb, 0x07, 0x80, 0xed, 0xa3, 0x79, 0x73, 0x73, 0xc2, 0xac, 0x78, 0x29, 0xdd, 0xd6, 0x6a, 0x6c,
- 0x28, 0x1b, 0x3c, 0xd2, 0xdc, 0xcd, 0xcc, 0x6b, 0x7d, 0xd8, 0xdf, 0x4a, 0x5b, 0x6b, 0x59, 0x47,
- 0x4f, 0xc0, 0x0d, 0xb8, 0xa5, 0x94, 0x52, 0x4a, 0x8d, 0xec, 0x26, 0x36, 0x3c, 0xb8, 0x9b, 0xbb,
- 0x01, 0x31, 0xa9, 0x65, 0x37, 0x5d, 0x5b, 0xcb, 0x0e, 0x5e, 0x0a, 0x0d, 0xb4, 0xde, 0xc0, 0x4a,
- 0xc2, 0xdd, 0x52, 0x22, 0xe9, 0xf1, 0x27, 0x91, 0xc7, 0x25, 0xee, 0x7f, 0x49, 0xba, 0x16, 0x6a,
- 0x5b, 0xd4, 0x7e, 0x2d, 0xdd, 0xcc, 0x52, 0xa2, 0xbb, 0x03, 0x09, 0xe8, 0x55, 0xdb, 0x5f, 0xce,
- 0x3c, 0x50, 0xc3, 0x8a, 0xde, 0xef, 0xa3, 0xfb, 0x13, 0xc7, 0xd7, 0xd7, 0x71, 0x76, 0x20, 0x1c,
- 0x9d, 0x3e, 0xfd, 0x4c, 0xf6, 0x1b, 0x68, 0xb5, 0x0a, 0x24, 0xba, 0x9b, 0x9f, 0x71, 0xac, 0xd7,
- 0xba, 0x57, 0xa5, 0xaf, 0xfb, 0xcb, 0x36, 0x7e, 0x0a, 0xd9, 0x8f, 0xb8, 0x0d, 0x4f, 0x1c, 0xc2,
- 0x7f, 0x78, 0x78, 0x45, 0x29, 0xc0, 0xd2, 0xf9, 0xa7, 0x8f, 0x68, 0xfc, 0x8b, 0x2a, 0x45, 0x8a,
- 0x14, 0x29, 0x52, 0xa4, 0x48, 0x91, 0x22, 0x45, 0x8a, 0x14, 0x29, 0x52, 0xa4, 0x48, 0x91, 0x22,
- 0x45, 0x8a, 0x14, 0x29, 0x52, 0xa4, 0x48, 0x91, 0x22, 0x45, 0x8a, 0x14, 0x29, 0x52, 0xa4, 0x48,
- 0x91, 0x22, 0x45, 0x8a, 0x14, 0x29, 0x52, 0xa4, 0x48, 0x91, 0x22, 0x45, 0x8a, 0x14, 0x29, 0x52,
- 0xa4, 0x48, 0x91, 0x22, 0x45, 0x8a, 0x14, 0x29, 0x72, 0xb2, 0xf1, 0xc9, 0x64, 0x4d, 0xcb, 0x2e,
- 0x9d, 0x57, 0x54, 0xc9, 0x1a, 0x05, 0x5e, 0xfa, 0xfd, 0x75, 0xbb, 0x10, 0x87, 0x9e, 0xae, 0xf2,
- 0x00, 0x6b, 0x59, 0xd3, 0x8b, 0x55, 0xe6, 0xa3, 0xfa, 0x22, 0xa3, 0x5b, 0xe8, 0x71, 0x1e, 0x23,
- 0xbb, 0xbb, 0xdc, 0xc9, 0xd9, 0x89, 0xce, 0x63, 0x4d, 0x00, 0x07, 0xb5, 0x66, 0x90, 0x6d, 0xc8,
- 0x45, 0x93, 0x4e, 0x3a, 0x47, 0x8e, 0x8f, 0x55, 0xc9, 0xae, 0x79, 0xcd, 0xe8, 0xc6, 0x07, 0xe8,
- 0xc6, 0x75, 0xd2, 0xdd, 0xbd, 0xde, 0xb6, 0xb2, 0x27, 0x73, 0xd1, 0xd6, 0x32, 0xf2, 0x5d, 0x7d,
- 0x25, 0x13, 0xec, 0xee, 0x3b, 0x21, 0xe5, 0xa6, 0x36, 0xef, 0x72, 0x96, 0xb6, 0x2c, 0x61, 0x64,
- 0xc8, 0x49, 0x73, 0x6f, 0x19, 0xe4, 0xbd, 0x28, 0xf6, 0x4f, 0x54, 0xd9, 0x2d, 0xf0, 0x2c, 0xc9,
- 0x2e, 0xf6, 0x5c, 0xd6, 0xcf, 0xdd, 0x6a, 0xfa, 0xf8, 0x38, 0x70, 0xee, 0x55, 0x3d, 0x2d, 0x34,
- 0x6f, 0xd4, 0x58, 0x23, 0xcd, 0xbe, 0x5c, 0x38, 0x8b, 0xd5, 0x47, 0xd4, 0x7c, 0xd9, 0xc4, 0x57,
- 0xd2, 0xdf, 0xe5, 0x9d, 0x03, 0x4d, 0x25, 0x23, 0x5d, 0x7d, 0xf0, 0xf2, 0x80, 0x55, 0xc5, 0x76,
- 0x16, 0x37, 0xdf, 0x5e, 0xcb, 0x4e, 0x6d, 0x53, 0xdd, 0xf6, 0xea, 0xe6, 0x89, 0xda, 0xbe, 0xa0,
- 0xf6, 0xd8, 0x2b, 0x12, 0x16, 0xd5, 0xac, 0x84, 0xe5, 0x0f, 0x97, 0xe7, 0xea, 0xc9, 0x97, 0x8f,
- 0x9f, 0x09, 0x68, 0x03, 0xed, 0x45, 0x92, 0xe7, 0xbe, 0x18, 0x53, 0xe4, 0x38, 0xd0, 0xa3, 0xcf,
- 0x0d, 0xfd, 0x57, 0x20, 0x52, 0xe4, 0xe5, 0x96, 0xfb, 0x57, 0x1a, 0xbd, 0xa7, 0xfd, 0x02, 0x43,
- 0x72, 0xcd, 0x31, 0x9b, 0x48, 0xbe, 0xc7, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae,
+ 0x00, 0x00, 0x02, 0xd3,
+ 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
+ 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0xa4, 0x08, 0x02, 0x00, 0x00, 0x00, 0x74, 0x27, 0xcb,
+ 0x2a, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00, 0x0b,
+ 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4d, 0x45, 0x07, 0xd8,
+ 0x07, 0x09, 0x11, 0x04, 0x0f, 0x14, 0xa6, 0xb6, 0xaa, 0x00, 0x00, 0x00, 0x1d, 0x74, 0x45, 0x58,
+ 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x00, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64,
+ 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x54, 0x68, 0x65, 0x20, 0x47, 0x49, 0x4d, 0x50, 0xef, 0x64,
+ 0x25, 0x6e, 0x00, 0x00, 0x02, 0x49, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xed, 0xdc, 0xcd, 0x75,
+ 0xc3, 0x20, 0x10, 0x04, 0xe0, 0x1d, 0x4c, 0xcd, 0xe9, 0x21, 0x55, 0xa5, 0x87, 0xf4, 0x93, 0x9d,
+ 0x1c, 0x16, 0x10, 0xc2, 0xfa, 0x41, 0x8e, 0xed, 0x4b, 0x86, 0x97, 0x03, 0x91, 0xf5, 0xf8, 0xb2,
+ 0x80, 0x51, 0x2e, 0x23, 0x7c, 0x7d, 0x7c, 0xd8, 0xeb, 0xdb, 0xe7, 0xf7, 0x77, 0xeb, 0x27, 0x7b,
+ 0x7b, 0x13, 0xf9, 0xa2, 0x96, 0x4f, 0xef, 0xc0, 0xc4, 0x28, 0x7c, 0x0a, 0x59, 0x24, 0xe0, 0x54,
+ 0x65, 0xdc, 0x40, 0x4e, 0xda, 0x79, 0xd7, 0x03, 0x50, 0x50, 0xec, 0x95, 0xcb, 0x7a, 0x9d, 0xa4,
+ 0x01, 0x34, 0x03, 0xc9, 0x07, 0xc8, 0xe6, 0x21, 0xb4, 0xda, 0xdf, 0x2e, 0x91, 0x8c, 0x2a, 0x19,
+ 0xbf, 0x00, 0xa7, 0x6a, 0x3e, 0xf2, 0x80, 0xd4, 0xf5, 0x87, 0x42, 0xd9, 0x48, 0x92, 0x80, 0x07,
+ 0x34, 0xa1, 0xde, 0x55, 0xb9, 0xf6, 0xe2, 0x07, 0xd5, 0xec, 0x6b, 0x8d, 0xfa, 0x42, 0x0c, 0xcf,
+ 0xdb, 0x07, 0x80, 0xed, 0xa3, 0x79, 0x73, 0x73, 0xc2, 0xac, 0x78, 0x29, 0xdd, 0xd6, 0x6a, 0x6c,
+ 0x28, 0x1b, 0x3c, 0xd2, 0xdc, 0xcd, 0xcc, 0x6b, 0x7d, 0xd8, 0xdf, 0x4a, 0x5b, 0x6b, 0x59, 0x47,
+ 0x4f, 0xc0, 0x0d, 0xb8, 0xa5, 0x94, 0x52, 0x4a, 0x8d, 0xec, 0x26, 0x36, 0x3c, 0xb8, 0x9b, 0xbb,
+ 0x01, 0x31, 0xa9, 0x65, 0x37, 0x5d, 0x5b, 0xcb, 0x0e, 0x5e, 0x0a, 0x0d, 0xb4, 0xde, 0xc0, 0x4a,
+ 0xc2, 0xdd, 0x52, 0x22, 0xe9, 0xf1, 0x27, 0x91, 0xc7, 0x25, 0xee, 0x7f, 0x49, 0xba, 0x16, 0x6a,
+ 0x5b, 0xd4, 0x7e, 0x2d, 0xdd, 0xcc, 0x52, 0xa2, 0xbb, 0x03, 0x09, 0xe8, 0x55, 0xdb, 0x5f, 0xce,
+ 0x3c, 0x50, 0xc3, 0x8a, 0xde, 0xef, 0xa3, 0xfb, 0x13, 0xc7, 0xd7, 0xd7, 0x71, 0x76, 0x20, 0x1c,
+ 0x9d, 0x3e, 0xfd, 0x4c, 0xf6, 0x1b, 0x68, 0xb5, 0x0a, 0x24, 0xba, 0x9b, 0x9f, 0x71, 0xac, 0xd7,
+ 0xba, 0x57, 0xa5, 0xaf, 0xfb, 0xcb, 0x36, 0x7e, 0x0a, 0xd9, 0x8f, 0xb8, 0x0d, 0x4f, 0x1c, 0xc2,
+ 0x7f, 0x78, 0x78, 0x45, 0x29, 0xc0, 0xd2, 0xf9, 0xa7, 0x8f, 0x68, 0xfc, 0x8b, 0x2a, 0x45, 0x8a,
+ 0x14, 0x29, 0x52, 0xa4, 0x48, 0x91, 0x22, 0x45, 0x8a, 0x14, 0x29, 0x52, 0xa4, 0x48, 0x91, 0x22,
+ 0x45, 0x8a, 0x14, 0x29, 0x52, 0xa4, 0x48, 0x91, 0x22, 0x45, 0x8a, 0x14, 0x29, 0x52, 0xa4, 0x48,
+ 0x91, 0x22, 0x45, 0x8a, 0x14, 0x29, 0x52, 0xa4, 0x48, 0x91, 0x22, 0x45, 0x8a, 0x14, 0x29, 0x52,
+ 0xa4, 0x48, 0x91, 0x22, 0x45, 0x8a, 0x14, 0x29, 0x72, 0xb2, 0xf1, 0xc9, 0x64, 0x4d, 0xcb, 0x2e,
+ 0x9d, 0x57, 0x54, 0xc9, 0x1a, 0x05, 0x5e, 0xfa, 0xfd, 0x75, 0xbb, 0x10, 0x87, 0x9e, 0xae, 0xf2,
+ 0x00, 0x6b, 0x59, 0xd3, 0x8b, 0x55, 0xe6, 0xa3, 0xfa, 0x22, 0xa3, 0x5b, 0xe8, 0x71, 0x1e, 0x23,
+ 0xbb, 0xbb, 0xdc, 0xc9, 0xd9, 0x89, 0xce, 0x63, 0x4d, 0x00, 0x07, 0xb5, 0x66, 0x90, 0x6d, 0xc8,
+ 0x45, 0x93, 0x4e, 0x3a, 0x47, 0x8e, 0x8f, 0x55, 0xc9, 0xae, 0x79, 0xcd, 0xe8, 0xc6, 0x07, 0xe8,
+ 0xc6, 0x75, 0xd2, 0xdd, 0xbd, 0xde, 0xb6, 0xb2, 0x27, 0x73, 0xd1, 0xd6, 0x32, 0xf2, 0x5d, 0x7d,
+ 0x25, 0x13, 0xec, 0xee, 0x3b, 0x21, 0xe5, 0xa6, 0x36, 0xef, 0x72, 0x96, 0xb6, 0x2c, 0x61, 0x64,
+ 0xc8, 0x49, 0x73, 0x6f, 0x19, 0xe4, 0xbd, 0x28, 0xf6, 0x4f, 0x54, 0xd9, 0x2d, 0xf0, 0x2c, 0xc9,
+ 0x2e, 0xf6, 0x5c, 0xd6, 0xcf, 0xdd, 0x6a, 0xfa, 0xf8, 0x38, 0x70, 0xee, 0x55, 0x3d, 0x2d, 0x34,
+ 0x6f, 0xd4, 0x58, 0x23, 0xcd, 0xbe, 0x5c, 0x38, 0x8b, 0xd5, 0x47, 0xd4, 0x7c, 0xd9, 0xc4, 0x57,
+ 0xd2, 0xdf, 0xe5, 0x9d, 0x03, 0x4d, 0x25, 0x23, 0x5d, 0x7d, 0xf0, 0xf2, 0x80, 0x55, 0xc5, 0x76,
+ 0x16, 0x37, 0xdf, 0x5e, 0xcb, 0x4e, 0x6d, 0x53, 0xdd, 0xf6, 0xea, 0xe6, 0x89, 0xda, 0xbe, 0xa0,
+ 0xf6, 0xd8, 0x2b, 0x12, 0x16, 0xd5, 0xac, 0x84, 0xe5, 0x0f, 0x97, 0xe7, 0xea, 0xc9, 0x97, 0x8f,
+ 0x9f, 0x09, 0x68, 0x03, 0xed, 0x45, 0x92, 0xe7, 0xbe, 0x18, 0x53, 0xe4, 0x38, 0xd0, 0xa3, 0xcf,
+ 0x0d, 0xfd, 0x57, 0x20, 0x52, 0xe4, 0xe5, 0x96, 0xfb, 0x57, 0x1a, 0xbd, 0xa7, 0xfd, 0x02, 0x43,
+ 0x72, 0xcd, 0x31, 0x9b, 0x48, 0xbe, 0xc7, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae,
0x42, 0x60, 0x82
};
/*
* CINELERRA
* Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
- *
+ *
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
- *
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
+ *
*/
#ifndef WHITE_DN_PNG_H
#define WHITE_DN_PNG_H
-static unsigned char white_dn_png[] =
+static unsigned char white_dn_png[] =
{
- 0x00, 0x00, 0x02, 0xe2,
- 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
- 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0xa4, 0x08, 0x02, 0x00, 0x00, 0x00, 0x74, 0x27, 0xcb,
- 0x2a, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00, 0x0b,
- 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4d, 0x45, 0x07, 0xd7,
- 0x02, 0x0b, 0x07, 0x29, 0x28, 0x1a, 0x92, 0x73, 0xc2, 0x00, 0x00, 0x00, 0x1d, 0x74, 0x45, 0x58,
- 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x00, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64,
- 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x54, 0x68, 0x65, 0x20, 0x47, 0x49, 0x4d, 0x50, 0xef, 0x64,
- 0x25, 0x6e, 0x00, 0x00, 0x02, 0x58, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xed, 0x9c, 0x4b, 0x92,
- 0xc3, 0x20, 0x0c, 0x44, 0x6d, 0x15, 0x87, 0xcb, 0x89, 0x72, 0x89, 0xdc, 0x19, 0xcf, 0x82, 0x29,
- 0x47, 0xa3, 0x96, 0x1a, 0x9c, 0xf9, 0x65, 0xd1, 0x2c, 0xa6, 0x08, 0x89, 0xfc, 0x68, 0xfd, 0xc6,
- 0x1b, 0xd8, 0x6f, 0xb7, 0xdb, 0xf6, 0xb7, 0xa3, 0x6d, 0xdb, 0x76, 0xbf, 0xdf, 0x8f, 0xe3, 0x18,
- 0x9f, 0xcf, 0x89, 0x9f, 0xfb, 0x45, 0x32, 0xf6, 0x7d, 0x0f, 0x13, 0x3f, 0x7f, 0x3c, 0x1e, 0x4f,
- 0x24, 0x3e, 0x7a, 0x4c, 0xfc, 0x5f, 0xdc, 0x07, 0x3e, 0xfd, 0x38, 0x0e, 0x84, 0x85, 0xc5, 0x4f,
- 0x64, 0x85, 0x09, 0xc8, 0x54, 0xeb, 0x58, 0x0c, 0x0f, 0x0d, 0x7b, 0x0a, 0xd4, 0x96, 0xf2, 0xc2,
- 0x84, 0x80, 0x83, 0x14, 0x14, 0x3a, 0x56, 0xbc, 0x55, 0x4b, 0x79, 0xc8, 0x9e, 0xaa, 0x44, 0x07,
- 0x4e, 0x54, 0x9e, 0xf6, 0x88, 0x9c, 0x52, 0xbd, 0x94, 0x8a, 0x9a, 0xc4, 0xf2, 0xa8, 0x47, 0xe5,
- 0x61, 0xcf, 0x1b, 0x93, 0x93, 0x3a, 0x06, 0x2b, 0x12, 0xdc, 0x7b, 0x05, 0xae, 0x62, 0xe9, 0x61,
- 0x95, 0xb8, 0x0b, 0x2a, 0x91, 0x8a, 0xf9, 0x92, 0xba, 0xb4, 0xaa, 0xe6, 0x36, 0xd5, 0xd7, 0x7b,
- 0x27, 0x35, 0x13, 0x02, 0x69, 0x66, 0xd3, 0xfa, 0x89, 0x2a, 0x43, 0xea, 0x0e, 0x5e, 0xe5, 0x5b,
- 0x4c, 0x9c, 0xde, 0xfb, 0xa0, 0xa6, 0xe5, 0x91, 0xc7, 0x72, 0xdd, 0xb7, 0x95, 0x57, 0xc3, 0xe6,
- 0x4a, 0x95, 0xbc, 0xe1, 0x55, 0xc8, 0x95, 0x82, 0x59, 0x6a, 0x78, 0x48, 0x5a, 0x47, 0x7a, 0x71,
- 0xc3, 0x04, 0xdd, 0x60, 0xc4, 0xb2, 0xea, 0xe9, 0x64, 0x07, 0x2b, 0xff, 0x7c, 0x92, 0x1e, 0x8b,
- 0xc6, 0x41, 0x28, 0x29, 0x03, 0x74, 0x26, 0x26, 0x91, 0x91, 0x62, 0x42, 0x06, 0xa6, 0x77, 0xfa,
- 0x15, 0x2f, 0x4d, 0x4b, 0x9d, 0x93, 0xae, 0x54, 0x9e, 0xa8, 0x1c, 0x50, 0xf9, 0xd6, 0x2e, 0xbd,
- 0x43, 0xa4, 0xad, 0xf1, 0xea, 0x8b, 0x88, 0x4d, 0x9f, 0x4e, 0x3a, 0xf0, 0xba, 0xc9, 0xeb, 0x2a,
- 0x7f, 0x64, 0xbc, 0x19, 0xf2, 0x85, 0x38, 0xad, 0x58, 0xc9, 0xb1, 0xbf, 0x8e, 0x5c, 0x8c, 0xdc,
- 0xb4, 0xb9, 0x4c, 0xa3, 0xab, 0x58, 0x0a, 0x29, 0xa4, 0x90, 0x42, 0x0a, 0x29, 0xa4, 0x90, 0x42,
- 0x0a, 0x29, 0xa4, 0x90, 0x42, 0x0a, 0x29, 0xa4, 0x90, 0x42, 0x0a, 0x29, 0xa4, 0x90, 0x42, 0x0a,
- 0x29, 0xa4, 0x90, 0x42, 0x0a, 0x29, 0xa4, 0x90, 0x42, 0x0a, 0x29, 0xa4, 0x90, 0x42, 0x0a, 0x29,
- 0xa4, 0x90, 0x42, 0x0a, 0x29, 0xa4, 0x90, 0x42, 0x0a, 0x29, 0xa4, 0x90, 0x42, 0x0a, 0x29, 0xa4,
- 0x90, 0x42, 0xbe, 0x05, 0x92, 0x9c, 0x7e, 0xf5, 0x63, 0xe5, 0xe8, 0x2a, 0x31, 0x51, 0x2c, 0xff,
- 0x07, 0xb9, 0x18, 0xaa, 0xab, 0x56, 0xef, 0xa4, 0x32, 0xbd, 0x7c, 0xe0, 0x5c, 0x49, 0xcf, 0x77,
- 0x13, 0x93, 0xd7, 0x55, 0x12, 0xcc, 0x35, 0x95, 0xc1, 0x0c, 0x15, 0x78, 0x59, 0x58, 0x97, 0xa9,
- 0x68, 0x72, 0xcc, 0xdd, 0xf8, 0xae, 0xab, 0x93, 0xf9, 0xd5, 0x13, 0x57, 0xcc, 0xdb, 0xf9, 0x5d,
- 0x38, 0x67, 0xeb, 0x4f, 0xe6, 0x07, 0x1b, 0xff, 0x1b, 0xbf, 0x03, 0xff, 0x11, 0x3d, 0x31, 0x89,
- 0x65, 0x95, 0x08, 0xe8, 0xc9, 0x4a, 0xd6, 0xe4, 0xf2, 0x80, 0x20, 0x34, 0xdc, 0x04, 0xc0, 0x13,
- 0x04, 0x85, 0xa2, 0xdc, 0xf2, 0xf4, 0xf7, 0xf6, 0xf5, 0xbe, 0x03, 0x7e, 0xd1, 0xc2, 0x54, 0x37,
- 0x91, 0xdb, 0x3c, 0x09, 0xb7, 0xc6, 0xef, 0xae, 0x08, 0xbf, 0x4c, 0x07, 0x4b, 0x9f, 0x33, 0x35,
- 0xbc, 0x38, 0x33, 0xeb, 0xbd, 0x13, 0xdd, 0x81, 0x6a, 0x66, 0xb8, 0xe9, 0xc0, 0x6e, 0x95, 0xa3,
- 0x9e, 0x09, 0x66, 0x86, 0x07, 0xe4, 0x3d, 0xf8, 0xbb, 0x2a, 0x49, 0x97, 0xf1, 0x5e, 0x45, 0x1e,
- 0xa1, 0x26, 0x2a, 0xf1, 0xee, 0x04, 0x0c, 0x21, 0xc9, 0x26, 0xcc, 0xcf, 0xf9, 0x0d, 0x1b, 0xa4,
- 0xcb, 0x9c, 0xa7, 0xbc, 0x79, 0xf6, 0xa6, 0x79, 0xcb, 0x54, 0x12, 0x71, 0x7e, 0x42, 0x4e, 0xce,
- 0xa2, 0x7b, 0x89, 0xdc, 0xb6, 0xad, 0x5d, 0x77, 0xe2, 0x13, 0x87, 0xb7, 0x9b, 0xd5, 0x56, 0x40,
- 0x6a, 0x20, 0x68, 0xe5, 0xdd, 0x1c, 0x6b, 0x1a, 0xa9, 0x2d, 0x95, 0x42, 0xbc, 0x47, 0x12, 0xad,
- 0xc2, 0x24, 0x2a, 0xb9, 0x94, 0x90, 0xcf, 0xd3, 0x3d, 0x4d, 0xdf, 0x75, 0x3f, 0x00, 0x14, 0xfc,
- 0x3e, 0xb1, 0xa5, 0x99, 0xf4, 0xd2, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42,
+ 0x00, 0x00, 0x02, 0xe2,
+ 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
+ 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0xa4, 0x08, 0x02, 0x00, 0x00, 0x00, 0x74, 0x27, 0xcb,
+ 0x2a, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00, 0x0b,
+ 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4d, 0x45, 0x07, 0xd7,
+ 0x02, 0x0b, 0x07, 0x29, 0x28, 0x1a, 0x92, 0x73, 0xc2, 0x00, 0x00, 0x00, 0x1d, 0x74, 0x45, 0x58,
+ 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x00, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64,
+ 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x54, 0x68, 0x65, 0x20, 0x47, 0x49, 0x4d, 0x50, 0xef, 0x64,
+ 0x25, 0x6e, 0x00, 0x00, 0x02, 0x58, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xed, 0x9c, 0x4b, 0x92,
+ 0xc3, 0x20, 0x0c, 0x44, 0x6d, 0x15, 0x87, 0xcb, 0x89, 0x72, 0x89, 0xdc, 0x19, 0xcf, 0x82, 0x29,
+ 0x47, 0xa3, 0x96, 0x1a, 0x9c, 0xf9, 0x65, 0xd1, 0x2c, 0xa6, 0x08, 0x89, 0xfc, 0x68, 0xfd, 0xc6,
+ 0x1b, 0xd8, 0x6f, 0xb7, 0xdb, 0xf6, 0xb7, 0xa3, 0x6d, 0xdb, 0x76, 0xbf, 0xdf, 0x8f, 0xe3, 0x18,
+ 0x9f, 0xcf, 0x89, 0x9f, 0xfb, 0x45, 0x32, 0xf6, 0x7d, 0x0f, 0x13, 0x3f, 0x7f, 0x3c, 0x1e, 0x4f,
+ 0x24, 0x3e, 0x7a, 0x4c, 0xfc, 0x5f, 0xdc, 0x07, 0x3e, 0xfd, 0x38, 0x0e, 0x84, 0x85, 0xc5, 0x4f,
+ 0x64, 0x85, 0x09, 0xc8, 0x54, 0xeb, 0x58, 0x0c, 0x0f, 0x0d, 0x7b, 0x0a, 0xd4, 0x96, 0xf2, 0xc2,
+ 0x84, 0x80, 0x83, 0x14, 0x14, 0x3a, 0x56, 0xbc, 0x55, 0x4b, 0x79, 0xc8, 0x9e, 0xaa, 0x44, 0x07,
+ 0x4e, 0x54, 0x9e, 0xf6, 0x88, 0x9c, 0x52, 0xbd, 0x94, 0x8a, 0x9a, 0xc4, 0xf2, 0xa8, 0x47, 0xe5,
+ 0x61, 0xcf, 0x1b, 0x93, 0x93, 0x3a, 0x06, 0x2b, 0x12, 0xdc, 0x7b, 0x05, 0xae, 0x62, 0xe9, 0x61,
+ 0x95, 0xb8, 0x0b, 0x2a, 0x91, 0x8a, 0xf9, 0x92, 0xba, 0xb4, 0xaa, 0xe6, 0x36, 0xd5, 0xd7, 0x7b,
+ 0x27, 0x35, 0x13, 0x02, 0x69, 0x66, 0xd3, 0xfa, 0x89, 0x2a, 0x43, 0xea, 0x0e, 0x5e, 0xe5, 0x5b,
+ 0x4c, 0x9c, 0xde, 0xfb, 0xa0, 0xa6, 0xe5, 0x91, 0xc7, 0x72, 0xdd, 0xb7, 0x95, 0x57, 0xc3, 0xe6,
+ 0x4a, 0x95, 0xbc, 0xe1, 0x55, 0xc8, 0x95, 0x82, 0x59, 0x6a, 0x78, 0x48, 0x5a, 0x47, 0x7a, 0x71,
+ 0xc3, 0x04, 0xdd, 0x60, 0xc4, 0xb2, 0xea, 0xe9, 0x64, 0x07, 0x2b, 0xff, 0x7c, 0x92, 0x1e, 0x8b,
+ 0xc6, 0x41, 0x28, 0x29, 0x03, 0x74, 0x26, 0x26, 0x91, 0x91, 0x62, 0x42, 0x06, 0xa6, 0x77, 0xfa,
+ 0x15, 0x2f, 0x4d, 0x4b, 0x9d, 0x93, 0xae, 0x54, 0x9e, 0xa8, 0x1c, 0x50, 0xf9, 0xd6, 0x2e, 0xbd,
+ 0x43, 0xa4, 0xad, 0xf1, 0xea, 0x8b, 0x88, 0x4d, 0x9f, 0x4e, 0x3a, 0xf0, 0xba, 0xc9, 0xeb, 0x2a,
+ 0x7f, 0x64, 0xbc, 0x19, 0xf2, 0x85, 0x38, 0xad, 0x58, 0xc9, 0xb1, 0xbf, 0x8e, 0x5c, 0x8c, 0xdc,
+ 0xb4, 0xb9, 0x4c, 0xa3, 0xab, 0x58, 0x0a, 0x29, 0xa4, 0x90, 0x42, 0x0a, 0x29, 0xa4, 0x90, 0x42,
+ 0x0a, 0x29, 0xa4, 0x90, 0x42, 0x0a, 0x29, 0xa4, 0x90, 0x42, 0x0a, 0x29, 0xa4, 0x90, 0x42, 0x0a,
+ 0x29, 0xa4, 0x90, 0x42, 0x0a, 0x29, 0xa4, 0x90, 0x42, 0x0a, 0x29, 0xa4, 0x90, 0x42, 0x0a, 0x29,
+ 0xa4, 0x90, 0x42, 0x0a, 0x29, 0xa4, 0x90, 0x42, 0x0a, 0x29, 0xa4, 0x90, 0x42, 0x0a, 0x29, 0xa4,
+ 0x90, 0x42, 0xbe, 0x05, 0x92, 0x9c, 0x7e, 0xf5, 0x63, 0xe5, 0xe8, 0x2a, 0x31, 0x51, 0x2c, 0xff,
+ 0x07, 0xb9, 0x18, 0xaa, 0xab, 0x56, 0xef, 0xa4, 0x32, 0xbd, 0x7c, 0xe0, 0x5c, 0x49, 0xcf, 0x77,
+ 0x13, 0x93, 0xd7, 0x55, 0x12, 0xcc, 0x35, 0x95, 0xc1, 0x0c, 0x15, 0x78, 0x59, 0x58, 0x97, 0xa9,
+ 0x68, 0x72, 0xcc, 0xdd, 0xf8, 0xae, 0xab, 0x93, 0xf9, 0xd5, 0x13, 0x57, 0xcc, 0xdb, 0xf9, 0x5d,
+ 0x38, 0x67, 0xeb, 0x4f, 0xe6, 0x07, 0x1b, 0xff, 0x1b, 0xbf, 0x03, 0xff, 0x11, 0x3d, 0x31, 0x89,
+ 0x65, 0x95, 0x08, 0xe8, 0xc9, 0x4a, 0xd6, 0xe4, 0xf2, 0x80, 0x20, 0x34, 0xdc, 0x04, 0xc0, 0x13,
+ 0x04, 0x85, 0xa2, 0xdc, 0xf2, 0xf4, 0xf7, 0xf6, 0xf5, 0xbe, 0x03, 0x7e, 0xd1, 0xc2, 0x54, 0x37,
+ 0x91, 0xdb, 0x3c, 0x09, 0xb7, 0xc6, 0xef, 0xae, 0x08, 0xbf, 0x4c, 0x07, 0x4b, 0x9f, 0x33, 0x35,
+ 0xbc, 0x38, 0x33, 0xeb, 0xbd, 0x13, 0xdd, 0x81, 0x6a, 0x66, 0xb8, 0xe9, 0xc0, 0x6e, 0x95, 0xa3,
+ 0x9e, 0x09, 0x66, 0x86, 0x07, 0xe4, 0x3d, 0xf8, 0xbb, 0x2a, 0x49, 0x97, 0xf1, 0x5e, 0x45, 0x1e,
+ 0xa1, 0x26, 0x2a, 0xf1, 0xee, 0x04, 0x0c, 0x21, 0xc9, 0x26, 0xcc, 0xcf, 0xf9, 0x0d, 0x1b, 0xa4,
+ 0xcb, 0x9c, 0xa7, 0xbc, 0x79, 0xf6, 0xa6, 0x79, 0xcb, 0x54, 0x12, 0x71, 0x7e, 0x42, 0x4e, 0xce,
+ 0xa2, 0x7b, 0x89, 0xdc, 0xb6, 0xad, 0x5d, 0x77, 0xe2, 0x13, 0x87, 0xb7, 0x9b, 0xd5, 0x56, 0x40,
+ 0x6a, 0x20, 0x68, 0xe5, 0xdd, 0x1c, 0x6b, 0x1a, 0xa9, 0x2d, 0x95, 0x42, 0xbc, 0x47, 0x12, 0xad,
+ 0xc2, 0x24, 0x2a, 0xb9, 0x94, 0x90, 0xcf, 0xd3, 0x3d, 0x4d, 0xdf, 0x75, 0x3f, 0x00, 0x14, 0xfc,
+ 0x3e, 0xb1, 0xa5, 0x99, 0xf4, 0xd2, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42,
0x60, 0x82
};
/*
* CINELERRA
* Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
- *
+ *
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
- *
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
+ *
*/
#ifndef WHITE_HI_PNG_H
#define WHITE_HI_PNG_H
-static unsigned char white_hi_png[] =
+static unsigned char white_hi_png[] =
{
- 0x00, 0x00, 0x02, 0xfe,
- 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
- 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0xa4, 0x08, 0x02, 0x00, 0x00, 0x00, 0x74, 0x27, 0xcb,
- 0x2a, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00, 0x0b,
- 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4d, 0x45, 0x07, 0xd7,
- 0x02, 0x0b, 0x07, 0x29, 0x1a, 0xd2, 0x45, 0x22, 0x42, 0x00, 0x00, 0x00, 0x1d, 0x74, 0x45, 0x58,
- 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x00, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64,
- 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x54, 0x68, 0x65, 0x20, 0x47, 0x49, 0x4d, 0x50, 0xef, 0x64,
- 0x25, 0x6e, 0x00, 0x00, 0x02, 0x74, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xed, 0x9c, 0x4b, 0x72,
- 0x03, 0x21, 0x0c, 0x44, 0x67, 0x28, 0x0e, 0xe7, 0xab, 0xf9, 0x54, 0xbe, 0x19, 0x93, 0x05, 0x89,
- 0xa2, 0x92, 0x5a, 0x0d, 0xb6, 0x53, 0xde, 0xa4, 0x59, 0xb8, 0xf0, 0xf0, 0x79, 0xb4, 0x24, 0x34,
- 0xb3, 0x81, 0xf3, 0xf1, 0x78, 0x1c, 0x3f, 0xe5, 0x3c, 0xcf, 0x50, 0x09, 0x75, 0x7b, 0x72, 0x5d,
- 0x57, 0x78, 0xe8, 0x9f, 0x58, 0xdd, 0x2a, 0xf7, 0xfb, 0xdd, 0x5a, 0x3b, 0x61, 0xcc, 0x0a, 0x69,
- 0xaa, 0xc0, 0xb6, 0xa6, 0xd9, 0x6d, 0x8c, 0xe1, 0xfb, 0xf4, 0xac, 0x00, 0xfe, 0xee, 0xcb, 0x9d,
- 0xe0, 0xaa, 0xe9, 0x1b, 0x99, 0x65, 0xed, 0x80, 0x83, 0x20, 0x48, 0x9d, 0x12, 0xc3, 0x5a, 0x3b,
- 0xe4, 0x11, 0x76, 0xb0, 0x87, 0x09, 0xca, 0x6c, 0xa6, 0x32, 0xf3, 0xaa, 0xbf, 0x50, 0xcd, 0xfc,
- 0x85, 0x80, 0x29, 0x31, 0x34, 0x75, 0xc8, 0x83, 0xe0, 0x4c, 0x0d, 0xe2, 0x66, 0xdd, 0x03, 0xcc,
- 0x00, 0xa5, 0x4a, 0xdf, 0xb5, 0xc2, 0x57, 0x12, 0x3d, 0x2c, 0x53, 0x71, 0xc4, 0x9e, 0x45, 0x69,
- 0xad, 0x05, 0xd7, 0x7a, 0xa4, 0x09, 0xf5, 0x3b, 0xc1, 0xc7, 0x47, 0x36, 0x78, 0xe7, 0xfa, 0x26,
- 0x0f, 0x0a, 0x35, 0xd8, 0x9c, 0xb4, 0xb5, 0x66, 0x54, 0xb8, 0x1d, 0xa3, 0x2f, 0xa1, 0xf3, 0x8c,
- 0xe7, 0x85, 0x66, 0x3f, 0x99, 0x44, 0xa3, 0x42, 0x17, 0xb2, 0x54, 0x50, 0x81, 0x2b, 0xc3, 0x42,
- 0x58, 0xc5, 0xc3, 0xbe, 0x24, 0x7e, 0xb5, 0xd6, 0xec, 0x21, 0x3f, 0xd0, 0x53, 0x81, 0x2f, 0x61,
- 0x8e, 0x25, 0xec, 0x6a, 0x83, 0x7a, 0x52, 0xde, 0x39, 0x8b, 0x84, 0xb7, 0x8c, 0x61, 0x38, 0x51,
- 0x20, 0xe5, 0xe4, 0xbe, 0x1b, 0xb1, 0x55, 0x1a, 0x0a, 0xd1, 0xe1, 0xf5, 0x41, 0xaf, 0xfb, 0xd2,
- 0x8e, 0x55, 0xe1, 0xb9, 0x9e, 0x98, 0x7a, 0x8d, 0x24, 0xc3, 0xe0, 0x1b, 0x94, 0xbc, 0xd4, 0xf8,
- 0x9c, 0x8d, 0xf4, 0xf6, 0xf6, 0xe1, 0x2a, 0x73, 0xff, 0x2d, 0x95, 0xd5, 0xea, 0xde, 0xa9, 0xaf,
- 0x91, 0x9b, 0xcb, 0xdc, 0x71, 0x3f, 0x99, 0xaa, 0xed, 0x38, 0x00, 0xbe, 0x9c, 0xf7, 0x65, 0x3d,
- 0x1d, 0xb1, 0x7f, 0x5e, 0x84, 0xfc, 0xc7, 0xc8, 0x17, 0x32, 0x9c, 0x0c, 0x2b, 0xa4, 0x90, 0x42,
- 0x0a, 0x29, 0xa4, 0x90, 0x42, 0x0a, 0x29, 0xa4, 0x90, 0x42, 0x0a, 0x29, 0xa4, 0x90, 0x42, 0x0a,
- 0x29, 0xa4, 0x90, 0x42, 0x0a, 0x29, 0xa4, 0x90, 0x42, 0x0a, 0x29, 0xa4, 0x90, 0x42, 0x0a, 0x29,
- 0xa4, 0x90, 0x42, 0x0a, 0x29, 0xa4, 0x90, 0x42, 0x0a, 0x29, 0xa4, 0x90, 0x42, 0x0a, 0x29, 0xa4,
- 0x90, 0x42, 0x0a, 0x29, 0xa4, 0x90, 0x42, 0x7e, 0x02, 0x69, 0xc7, 0x3c, 0x65, 0x58, 0x21, 0x11,
- 0x92, 0x1f, 0x99, 0x5f, 0xfe, 0x7d, 0x0e, 0x59, 0x9d, 0xa8, 0x7e, 0x21, 0xaa, 0xc9, 0x54, 0x8d,
- 0xec, 0x84, 0xf7, 0xeb, 0xcf, 0xf9, 0x32, 0x9f, 0xae, 0xf6, 0x3b, 0x32, 0x9f, 0x33, 0xe7, 0xca,
- 0x30, 0x92, 0xf4, 0x7e, 0xd9, 0x97, 0xb0, 0xa9, 0xef, 0x38, 0xa6, 0x3a, 0x24, 0x1b, 0xa4, 0xef,
- 0x86, 0x4f, 0x5e, 0x72, 0x28, 0x47, 0x3a, 0xc5, 0x5e, 0x3d, 0xcc, 0x03, 0x61, 0xe9, 0x87, 0xbb,
- 0xce, 0x20, 0x1f, 0xca, 0xcd, 0x83, 0xbd, 0x68, 0x8e, 0x81, 0xa7, 0xec, 0x7f, 0x0d, 0xeb, 0x61,
- 0x36, 0x3e, 0x5f, 0x06, 0x90, 0x93, 0x7b, 0xa5, 0x95, 0xb8, 0xb3, 0xe7, 0x59, 0x8c, 0x54, 0xf9,
- 0x29, 0x47, 0xe9, 0x0e, 0xbb, 0x0c, 0x9f, 0xac, 0x6f, 0x8c, 0xd1, 0x5a, 0xcb, 0x66, 0xf7, 0xab,
- 0x1c, 0x63, 0x64, 0xde, 0xc2, 0x97, 0x21, 0x1a, 0x03, 0x6c, 0xde, 0xe7, 0x10, 0x4e, 0x60, 0x67,
- 0xdb, 0x42, 0x70, 0xc6, 0xf7, 0x1c, 0x32, 0x7e, 0x11, 0x41, 0x62, 0xd8, 0x2d, 0x7e, 0x76, 0xcf,
- 0x5b, 0xab, 0xe4, 0x49, 0x0b, 0x4a, 0x24, 0x41, 0xb4, 0x04, 0x83, 0x88, 0x85, 0xf9, 0x85, 0xdf,
- 0x3d, 0x41, 0xcc, 0x88, 0x23, 0xb6, 0xba, 0x05, 0xc4, 0x9f, 0x91, 0xaf, 0x2e, 0x40, 0x21, 0x69,
- 0xa1, 0xfa, 0x50, 0xea, 0x55, 0x56, 0x5b, 0x4a, 0xac, 0x84, 0x86, 0x1d, 0x02, 0x54, 0x86, 0xd4,
- 0x53, 0xe5, 0x9a, 0x7c, 0xf9, 0x40, 0x48, 0x2e, 0xd5, 0x1b, 0x66, 0x2b, 0xe1, 0x71, 0xad, 0x3c,
- 0xab, 0x55, 0xa2, 0x17, 0xa9, 0x60, 0x49, 0x25, 0x41, 0x1e, 0x56, 0x80, 0xef, 0x11, 0x09, 0x3d,
- 0x88, 0x20, 0x3e, 0x51, 0x75, 0xa5, 0x10, 0xcb, 0xb1, 0x10, 0xb6, 0x9c, 0x7d, 0xf9, 0xea, 0x06,
- 0xb7, 0x54, 0xdc, 0x6e, 0xb7, 0x0f, 0x7f, 0x54, 0x7e, 0x01, 0x5e, 0x90, 0xcf, 0x1a, 0x43, 0x7f,
+ 0x00, 0x00, 0x02, 0xfe,
+ 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
+ 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0xa4, 0x08, 0x02, 0x00, 0x00, 0x00, 0x74, 0x27, 0xcb,
+ 0x2a, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00, 0x0b,
+ 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4d, 0x45, 0x07, 0xd7,
+ 0x02, 0x0b, 0x07, 0x29, 0x1a, 0xd2, 0x45, 0x22, 0x42, 0x00, 0x00, 0x00, 0x1d, 0x74, 0x45, 0x58,
+ 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x00, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64,
+ 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x54, 0x68, 0x65, 0x20, 0x47, 0x49, 0x4d, 0x50, 0xef, 0x64,
+ 0x25, 0x6e, 0x00, 0x00, 0x02, 0x74, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xed, 0x9c, 0x4b, 0x72,
+ 0x03, 0x21, 0x0c, 0x44, 0x67, 0x28, 0x0e, 0xe7, 0xab, 0xf9, 0x54, 0xbe, 0x19, 0x93, 0x05, 0x89,
+ 0xa2, 0x92, 0x5a, 0x0d, 0xb6, 0x53, 0xde, 0xa4, 0x59, 0xb8, 0xf0, 0xf0, 0x79, 0xb4, 0x24, 0x34,
+ 0xb3, 0x81, 0xf3, 0xf1, 0x78, 0x1c, 0x3f, 0xe5, 0x3c, 0xcf, 0x50, 0x09, 0x75, 0x7b, 0x72, 0x5d,
+ 0x57, 0x78, 0xe8, 0x9f, 0x58, 0xdd, 0x2a, 0xf7, 0xfb, 0xdd, 0x5a, 0x3b, 0x61, 0xcc, 0x0a, 0x69,
+ 0xaa, 0xc0, 0xb6, 0xa6, 0xd9, 0x6d, 0x8c, 0xe1, 0xfb, 0xf4, 0xac, 0x00, 0xfe, 0xee, 0xcb, 0x9d,
+ 0xe0, 0xaa, 0xe9, 0x1b, 0x99, 0x65, 0xed, 0x80, 0x83, 0x20, 0x48, 0x9d, 0x12, 0xc3, 0x5a, 0x3b,
+ 0xe4, 0x11, 0x76, 0xb0, 0x87, 0x09, 0xca, 0x6c, 0xa6, 0x32, 0xf3, 0xaa, 0xbf, 0x50, 0xcd, 0xfc,
+ 0x85, 0x80, 0x29, 0x31, 0x34, 0x75, 0xc8, 0x83, 0xe0, 0x4c, 0x0d, 0xe2, 0x66, 0xdd, 0x03, 0xcc,
+ 0x00, 0xa5, 0x4a, 0xdf, 0xb5, 0xc2, 0x57, 0x12, 0x3d, 0x2c, 0x53, 0x71, 0xc4, 0x9e, 0x45, 0x69,
+ 0xad, 0x05, 0xd7, 0x7a, 0xa4, 0x09, 0xf5, 0x3b, 0xc1, 0xc7, 0x47, 0x36, 0x78, 0xe7, 0xfa, 0x26,
+ 0x0f, 0x0a, 0x35, 0xd8, 0x9c, 0xb4, 0xb5, 0x66, 0x54, 0xb8, 0x1d, 0xa3, 0x2f, 0xa1, 0xf3, 0x8c,
+ 0xe7, 0x85, 0x66, 0x3f, 0x99, 0x44, 0xa3, 0x42, 0x17, 0xb2, 0x54, 0x50, 0x81, 0x2b, 0xc3, 0x42,
+ 0x58, 0xc5, 0xc3, 0xbe, 0x24, 0x7e, 0xb5, 0xd6, 0xec, 0x21, 0x3f, 0xd0, 0x53, 0x81, 0x2f, 0x61,
+ 0x8e, 0x25, 0xec, 0x6a, 0x83, 0x7a, 0x52, 0xde, 0x39, 0x8b, 0x84, 0xb7, 0x8c, 0x61, 0x38, 0x51,
+ 0x20, 0xe5, 0xe4, 0xbe, 0x1b, 0xb1, 0x55, 0x1a, 0x0a, 0xd1, 0xe1, 0xf5, 0x41, 0xaf, 0xfb, 0xd2,
+ 0x8e, 0x55, 0xe1, 0xb9, 0x9e, 0x98, 0x7a, 0x8d, 0x24, 0xc3, 0xe0, 0x1b, 0x94, 0xbc, 0xd4, 0xf8,
+ 0x9c, 0x8d, 0xf4, 0xf6, 0xf6, 0xe1, 0x2a, 0x73, 0xff, 0x2d, 0x95, 0xd5, 0xea, 0xde, 0xa9, 0xaf,
+ 0x91, 0x9b, 0xcb, 0xdc, 0x71, 0x3f, 0x99, 0xaa, 0xed, 0x38, 0x00, 0xbe, 0x9c, 0xf7, 0x65, 0x3d,
+ 0x1d, 0xb1, 0x7f, 0x5e, 0x84, 0xfc, 0xc7, 0xc8, 0x17, 0x32, 0x9c, 0x0c, 0x2b, 0xa4, 0x90, 0x42,
+ 0x0a, 0x29, 0xa4, 0x90, 0x42, 0x0a, 0x29, 0xa4, 0x90, 0x42, 0x0a, 0x29, 0xa4, 0x90, 0x42, 0x0a,
+ 0x29, 0xa4, 0x90, 0x42, 0x0a, 0x29, 0xa4, 0x90, 0x42, 0x0a, 0x29, 0xa4, 0x90, 0x42, 0x0a, 0x29,
+ 0xa4, 0x90, 0x42, 0x0a, 0x29, 0xa4, 0x90, 0x42, 0x0a, 0x29, 0xa4, 0x90, 0x42, 0x0a, 0x29, 0xa4,
+ 0x90, 0x42, 0x0a, 0x29, 0xa4, 0x90, 0x42, 0x7e, 0x02, 0x69, 0xc7, 0x3c, 0x65, 0x58, 0x21, 0x11,
+ 0x92, 0x1f, 0x99, 0x5f, 0xfe, 0x7d, 0x0e, 0x59, 0x9d, 0xa8, 0x7e, 0x21, 0xaa, 0xc9, 0x54, 0x8d,
+ 0xec, 0x84, 0xf7, 0xeb, 0xcf, 0xf9, 0x32, 0x9f, 0xae, 0xf6, 0x3b, 0x32, 0x9f, 0x33, 0xe7, 0xca,
+ 0x30, 0x92, 0xf4, 0x7e, 0xd9, 0x97, 0xb0, 0xa9, 0xef, 0x38, 0xa6, 0x3a, 0x24, 0x1b, 0xa4, 0xef,
+ 0x86, 0x4f, 0x5e, 0x72, 0x28, 0x47, 0x3a, 0xc5, 0x5e, 0x3d, 0xcc, 0x03, 0x61, 0xe9, 0x87, 0xbb,
+ 0xce, 0x20, 0x1f, 0xca, 0xcd, 0x83, 0xbd, 0x68, 0x8e, 0x81, 0xa7, 0xec, 0x7f, 0x0d, 0xeb, 0x61,
+ 0x36, 0x3e, 0x5f, 0x06, 0x90, 0x93, 0x7b, 0xa5, 0x95, 0xb8, 0xb3, 0xe7, 0x59, 0x8c, 0x54, 0xf9,
+ 0x29, 0x47, 0xe9, 0x0e, 0xbb, 0x0c, 0x9f, 0xac, 0x6f, 0x8c, 0xd1, 0x5a, 0xcb, 0x66, 0xf7, 0xab,
+ 0x1c, 0x63, 0x64, 0xde, 0xc2, 0x97, 0x21, 0x1a, 0x03, 0x6c, 0xde, 0xe7, 0x10, 0x4e, 0x60, 0x67,
+ 0xdb, 0x42, 0x70, 0xc6, 0xf7, 0x1c, 0x32, 0x7e, 0x11, 0x41, 0x62, 0xd8, 0x2d, 0x7e, 0x76, 0xcf,
+ 0x5b, 0xab, 0xe4, 0x49, 0x0b, 0x4a, 0x24, 0x41, 0xb4, 0x04, 0x83, 0x88, 0x85, 0xf9, 0x85, 0xdf,
+ 0x3d, 0x41, 0xcc, 0x88, 0x23, 0xb6, 0xba, 0x05, 0xc4, 0x9f, 0x91, 0xaf, 0x2e, 0x40, 0x21, 0x69,
+ 0xa1, 0xfa, 0x50, 0xea, 0x55, 0x56, 0x5b, 0x4a, 0xac, 0x84, 0x86, 0x1d, 0x02, 0x54, 0x86, 0xd4,
+ 0x53, 0xe5, 0x9a, 0x7c, 0xf9, 0x40, 0x48, 0x2e, 0xd5, 0x1b, 0x66, 0x2b, 0xe1, 0x71, 0xad, 0x3c,
+ 0xab, 0x55, 0xa2, 0x17, 0xa9, 0x60, 0x49, 0x25, 0x41, 0x1e, 0x56, 0x80, 0xef, 0x11, 0x09, 0x3d,
+ 0x88, 0x20, 0x3e, 0x51, 0x75, 0xa5, 0x10, 0xcb, 0xb1, 0x10, 0xb6, 0x9c, 0x7d, 0xf9, 0xea, 0x06,
+ 0xb7, 0x54, 0xdc, 0x6e, 0xb7, 0x0f, 0x7f, 0x54, 0x7e, 0x01, 0x5e, 0x90, 0xcf, 0x1a, 0x43, 0x7f,
0x15, 0x70, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82
};
/*
* CINELERRA
* Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
- *
+ *
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
- *
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
+ *
*/
#ifndef WHITE_UP_PNG_H
#define WHITE_UP_PNG_H
-static unsigned char white_up_png[] =
+static unsigned char white_up_png[] =
{
- 0x00, 0x00, 0x00, 0xf5,
- 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
- 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0xa4, 0x08, 0x02, 0x00, 0x00, 0x00, 0x74, 0x27, 0xcb,
- 0x2a, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00, 0x0b,
- 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4d, 0x45, 0x07, 0xd7,
- 0x02, 0x0b, 0x07, 0x29, 0x07, 0xb1, 0x43, 0x4e, 0x9b, 0x00, 0x00, 0x00, 0x1d, 0x74, 0x45, 0x58,
- 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x00, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64,
- 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x54, 0x68, 0x65, 0x20, 0x47, 0x49, 0x4d, 0x50, 0xef, 0x64,
- 0x25, 0x6e, 0x00, 0x00, 0x00, 0x6b, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xed, 0xcd, 0xb1, 0x11,
- 0x00, 0x20, 0x08, 0x00, 0x31, 0x71, 0x3a, 0x56, 0x63, 0x2a, 0x56, 0xb3, 0x73, 0x03, 0x29, 0xbc,
- 0x7c, 0xf5, 0x5d, 0xa2, 0xbb, 0xd7, 0xfb, 0xaa, 0xea, 0xfe, 0x5e, 0xe3, 0x21, 0x91, 0x48, 0x24,
- 0x12, 0x89, 0x44, 0x22, 0x91, 0x48, 0x24, 0x12, 0x89, 0x44, 0x22, 0x91, 0x48, 0x24, 0x12, 0x89,
- 0x44, 0x22, 0x91, 0x48, 0x24, 0x12, 0x89, 0x44, 0x22, 0x91, 0x48, 0x24, 0x12, 0x89, 0x44, 0x22,
- 0x91, 0x48, 0x24, 0x12, 0x89, 0x44, 0x22, 0x91, 0x48, 0x24, 0x12, 0x89, 0x44, 0x22, 0x91, 0x48,
- 0x24, 0x12, 0x89, 0x44, 0x22, 0x91, 0x48, 0x24, 0x12, 0x89, 0xfc, 0x82, 0x8c, 0xcc, 0x1c, 0x26,
- 0x0f, 0x6f, 0xc5, 0x05, 0xf7, 0x5c, 0xa1, 0x13, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e,
+ 0x00, 0x00, 0x00, 0xf5,
+ 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
+ 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0xa4, 0x08, 0x02, 0x00, 0x00, 0x00, 0x74, 0x27, 0xcb,
+ 0x2a, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00, 0x0b,
+ 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4d, 0x45, 0x07, 0xd7,
+ 0x02, 0x0b, 0x07, 0x29, 0x07, 0xb1, 0x43, 0x4e, 0x9b, 0x00, 0x00, 0x00, 0x1d, 0x74, 0x45, 0x58,
+ 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x00, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64,
+ 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x54, 0x68, 0x65, 0x20, 0x47, 0x49, 0x4d, 0x50, 0xef, 0x64,
+ 0x25, 0x6e, 0x00, 0x00, 0x00, 0x6b, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xed, 0xcd, 0xb1, 0x11,
+ 0x00, 0x20, 0x08, 0x00, 0x31, 0x71, 0x3a, 0x56, 0x63, 0x2a, 0x56, 0xb3, 0x73, 0x03, 0x29, 0xbc,
+ 0x7c, 0xf5, 0x5d, 0xa2, 0xbb, 0xd7, 0xfb, 0xaa, 0xea, 0xfe, 0x5e, 0xe3, 0x21, 0x91, 0x48, 0x24,
+ 0x12, 0x89, 0x44, 0x22, 0x91, 0x48, 0x24, 0x12, 0x89, 0x44, 0x22, 0x91, 0x48, 0x24, 0x12, 0x89,
+ 0x44, 0x22, 0x91, 0x48, 0x24, 0x12, 0x89, 0x44, 0x22, 0x91, 0x48, 0x24, 0x12, 0x89, 0x44, 0x22,
+ 0x91, 0x48, 0x24, 0x12, 0x89, 0x44, 0x22, 0x91, 0x48, 0x24, 0x12, 0x89, 0x44, 0x22, 0x91, 0x48,
+ 0x24, 0x12, 0x89, 0x44, 0x22, 0x91, 0x48, 0x24, 0x12, 0x89, 0xfc, 0x82, 0x8c, 0xcc, 0x1c, 0x26,
+ 0x0f, 0x6f, 0xc5, 0x05, 0xf7, 0x5c, 0xa1, 0x13, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e,
0x44, 0xae, 0x42, 0x60, 0x82
};