compressors: added mkup_gain reset, fixed smooth_only
authorGood Guy <good1.2guy@gmail.com>
Sat, 14 Dec 2019 01:54:49 +0000 (18:54 -0700)
committerGood Guy <good1.2guy@gmail.com>
Sat, 14 Dec 2019 01:54:49 +0000 (18:54 -0700)
ported 7.2 synthesizer spectrogram, tweaked get_truncated_text
add 6 profiles via olaf, audioscope rework,
plugin synchronization improvements from 7.2

50 files changed:
cinelerra-5.1/cinelerra/compressortools.C
cinelerra-5.1/cinelerra/compressortools.h
cinelerra-5.1/cinelerra/ctracking.C
cinelerra-5.1/cinelerra/mwindow.C
cinelerra-5.1/cinelerra/mwindow.h
cinelerra-5.1/cinelerra/pluginaclient.C
cinelerra-5.1/cinelerra/pluginclient.C
cinelerra-5.1/cinelerra/pluginclient.h
cinelerra-5.1/cinelerra/pluginserver.h
cinelerra-5.1/cinelerra/trackpopup.C
cinelerra-5.1/ffmpeg/audio/user_flac.flac [new file with mode: 0644]
cinelerra-5.1/ffmpeg/audio/user_s24le.mkv [new file with mode: 0644]
cinelerra-5.1/ffmpeg/audio/user_s24le.wav [new file with mode: 0644]
cinelerra-5.1/ffmpeg/audio/user_s32le.wav [new file with mode: 0644]
cinelerra-5.1/ffmpeg/video/user_ffv1.mkv [new file with mode: 0644]
cinelerra-5.1/ffmpeg/video/user_ffvhuff.mkv [new file with mode: 0644]
cinelerra-5.1/guicast/arraylist.h
cinelerra-5.1/guicast/bclistbox.C
cinelerra-5.1/guicast/bcpopupmenu.C
cinelerra-5.1/guicast/bcwindowbase.C
cinelerra-5.1/guicast/bcwindowbase.h
cinelerra-5.1/guicast/bcwindowdraw.C
cinelerra-5.1/plugin_defs
cinelerra-5.1/plugins/audioscope/audioscope.C
cinelerra-5.1/plugins/compressor/compressor.C
cinelerra-5.1/plugins/compressor/compressor.h
cinelerra-5.1/plugins/compressormulti/comprmulti.C
cinelerra-5.1/plugins/compressormulti/comprmulti.h
cinelerra-5.1/plugins/compressormulti/comprmultigui.C
cinelerra-5.1/plugins/compressormulti/comprmultigui.h
cinelerra-5.1/plugins/graphic/graphic.C
cinelerra-5.1/plugins/parametric/parametric.C
cinelerra-5.1/plugins/reverb/reverb.C
cinelerra-5.1/plugins/spectrogram/Makefile
cinelerra-5.1/plugins/spectrogram/spectrogram.C
cinelerra-5.1/plugins/spectrogram/spectrogram.h
cinelerra-5.1/plugins/synthesizer/black_checked_png.h
cinelerra-5.1/plugins/synthesizer/black_checkedhi_png.h
cinelerra-5.1/plugins/synthesizer/black_dn_png.h
cinelerra-5.1/plugins/synthesizer/black_hi_png.h
cinelerra-5.1/plugins/synthesizer/black_up_png.h
cinelerra-5.1/plugins/synthesizer/synthesizer.C
cinelerra-5.1/plugins/synthesizer/synthesizer.h
cinelerra-5.1/plugins/synthesizer/synthesizer.inc
cinelerra-5.1/plugins/synthesizer/synthwindow.inc
cinelerra-5.1/plugins/synthesizer/white_checked_png.h
cinelerra-5.1/plugins/synthesizer/white_checkedhi_png.h
cinelerra-5.1/plugins/synthesizer/white_dn_png.h
cinelerra-5.1/plugins/synthesizer/white_hi_png.h
cinelerra-5.1/plugins/synthesizer/white_up_png.h

index fee76d3..d876dbd 100644 (file)
 
 BandConfig::BandConfig()
 {
-       freq = 0;
-       solo = 0;
-       bypass = 0;
-//     readahead_len = 1.0;
-       attack_len = 1.0;
-       release_len = 1.0;
+       reset();
 }
 
 BandConfig::~BandConfig()
@@ -56,14 +51,15 @@ void BandConfig::save_data(FileXML *xml, int number, int do_multiband)
                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();
        }
@@ -81,6 +77,7 @@ void BandConfig::read_data(FileXML *xml, int do_multiband)
                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();
@@ -107,7 +104,7 @@ void BandConfig::copy_from(BandConfig *src)
 {
        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;
@@ -116,6 +113,7 @@ void BandConfig::copy_from(BandConfig *src)
        freq = src->freq;
        solo = src->solo;
        bypass = src->bypass;
+       mkup_gain = src->mkup_gain;
 }
 
 int BandConfig::equiv(BandConfig *src)
@@ -124,6 +122,7 @@ 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) ) {
@@ -131,8 +130,8 @@ int BandConfig::equiv(BandConfig *src)
        }
 
        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;
@@ -145,7 +144,7 @@ int BandConfig::equiv(BandConfig *src)
 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;
@@ -153,6 +152,18 @@ void BandConfig::boundaries(CompressorConfigBase *base)
        }
 }
 
+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)
 {
@@ -163,13 +174,7 @@ 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();
 }
 
 
@@ -178,6 +183,23 @@ CompressorConfigBase::~CompressorConfigBase()
        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 ) {
@@ -220,7 +242,7 @@ double CompressorConfigBase::get_y(int band, int 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)
@@ -229,7 +251,7 @@ 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)
@@ -239,27 +261,30 @@ 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;
 }
 
@@ -529,10 +554,10 @@ void CompressorCanvasBase::update()
 // 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);
 
@@ -553,36 +578,35 @@ void CompressorCanvasBase::update()
 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;
@@ -625,17 +649,19 @@ int CompressorCanvasBase::cursor_motion_event()
 {
        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));
                }
                
                
@@ -654,24 +680,21 @@ int CompressorCanvasBase::cursor_motion_event()
 
                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);
                }
@@ -741,11 +764,9 @@ void CompressorEngine::reset()
        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;
@@ -918,33 +939,19 @@ __LINE__, start_position + i, attack_slope, release_slope, current_value); bug =
                        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);
@@ -955,10 +962,12 @@ __LINE__, start_position + i, attack_slope, release_slope, current_value); bug =
                                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;
                }
        }
 }
index abfb098..37589f8 100644 (file)
@@ -100,6 +100,7 @@ public:
        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;
@@ -108,6 +109,7 @@ public:
 //     double readahead_len;
        double attack_len;
        double release_len;
+       double mkup_gain;
 
 // upper frequency in Hz
        int freq;
@@ -123,6 +125,8 @@ public:
        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);
@@ -315,13 +319,6 @@ public:
        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
 
 
index 52549c3..23c7d1b 100644 (file)
@@ -65,6 +65,7 @@ int CTracking::stop_playback()
 {
        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;
 }
index e3bf6b6..d932f67 100644 (file)
@@ -3446,6 +3446,20 @@ void MWindow::update_plugin_guis(int do_keyframe_guis)
        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;
index b0e7877..66b4362 100644 (file)
@@ -314,6 +314,7 @@ public:
 // 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();
index b1434b0..2970ed5 100644 (file)
@@ -116,13 +116,13 @@ int PluginAClient::process_buffer(int64_t size, Samples *buffer,
 
 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);
 }
 
 
index dcafd89..333e895 100644 (file)
@@ -653,11 +653,11 @@ PluginClientFrame* PluginClientFrames::get_gui_frame(double pos, int dir)
 
 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;
 }
 
 
@@ -670,9 +670,9 @@ void PluginClient::update_gui()
 {
 }
 
-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();
@@ -682,9 +682,28 @@ int PluginClient::pending_gui_frames()
        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()
@@ -699,7 +718,7 @@ int PluginClient::get_tracking_direction()
 
 void PluginClient::send_render_gui()
 {
-       server->send_render_gui(&frame_buffer);
+       server->send_render_gui(&client_frames);
 }
 
 void PluginClient::send_render_gui(void *data)
@@ -719,7 +738,7 @@ void PluginClient::plugin_reset_gui_frames()
        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();
 }
 
@@ -729,11 +748,11 @@ void PluginClient::plugin_render_gui_frames(PluginClientFrames *frames)
        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();
 }
index 67a1148..068f5ea 100644 (file)
@@ -24,7 +24,7 @@
 
 // Base class inherited by all the different types of plugins.
 
-#define MAX_FRAME_BUFFER 1024
+#define MAX_FRAME_BUFFER 8192
 
 class PluginClient;
 
@@ -486,6 +486,7 @@ public:
 // 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);
@@ -499,7 +500,8 @@ public:
        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)
@@ -577,7 +579,7 @@ public:
        PluginClientThread *thread;
 
 // Frames for updating GUI
-       PluginClientFrames frame_buffer;
+       PluginClientFrames client_frames;
 // Time of last GUI update
        Timer *update_timer;
 
index 16c2c5c..fd01f39 100644 (file)
@@ -274,7 +274,7 @@ public:
 // 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);
index e914bf7..224343b 100644 (file)
@@ -573,15 +573,16 @@ void TrackPopupShowWindow::create_objects()
        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;
diff --git a/cinelerra-5.1/ffmpeg/audio/user_flac.flac b/cinelerra-5.1/ffmpeg/audio/user_flac.flac
new file mode 100644 (file)
index 0000000..2925b6a
--- /dev/null
@@ -0,0 +1,6 @@
+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
diff --git a/cinelerra-5.1/ffmpeg/audio/user_s24le.mkv b/cinelerra-5.1/ffmpeg/audio/user_s24le.mkv
new file mode 100644 (file)
index 0000000..5bdc55f
--- /dev/null
@@ -0,0 +1,5 @@
+matroska pcm_s24le
+# Lossless PCM (pcm_s24le) in Matroska container.
+# If onlyaudio is exported, the extension should
+# be "mka".
+# ffmpeg --help encoder=pcm_s24le
diff --git a/cinelerra-5.1/ffmpeg/audio/user_s24le.wav b/cinelerra-5.1/ffmpeg/audio/user_s24le.wav
new file mode 100644 (file)
index 0000000..5c68064
--- /dev/null
@@ -0,0 +1,5 @@
+wav pcm_s24le
+# PCM (pcm_s24le) in RIFF WAVE.
+# ffmpeg --help muxer=wav
+# Use RF64 header rather than RIFF for large files:
+rf64 1
diff --git a/cinelerra-5.1/ffmpeg/audio/user_s32le.wav b/cinelerra-5.1/ffmpeg/audio/user_s32le.wav
new file mode 100644 (file)
index 0000000..9b9433b
--- /dev/null
@@ -0,0 +1,5 @@
+wav pcm_s32le
+# PCM (pcm_s32le) in RIFF WAVE.
+# ffmpeg --help muxer=wav
+# Use RF64 header rather than RIFF for large files:
+rf64 1
diff --git a/cinelerra-5.1/ffmpeg/video/user_ffv1.mkv b/cinelerra-5.1/ffmpeg/video/user_ffv1.mkv
new file mode 100644 (file)
index 0000000..4ffb0d4
--- /dev/null
@@ -0,0 +1,8 @@
+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
diff --git a/cinelerra-5.1/ffmpeg/video/user_ffvhuff.mkv b/cinelerra-5.1/ffmpeg/video/user_ffvhuff.mkv
new file mode 100644 (file)
index 0000000..7f4d13f
--- /dev/null
@@ -0,0 +1,6 @@
+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
index 602557f..2fade20 100644 (file)
@@ -47,14 +47,14 @@ public:
                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) {
index 18d93c9..ae34187 100644 (file)
@@ -3725,12 +3725,11 @@ int BC_ListBox::draw_items(int flush, int draw_bg)
                                                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);
index 62a2b40..a502ee0 100644 (file)
@@ -216,13 +216,13 @@ int BC_PopupMenu::draw_face(int dx, int color)
        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 ) {
index e979d5c..e9047f2 100644 (file)
@@ -3060,6 +3060,39 @@ int BC_WindowBase::get_text_height(int font, const char *text)
        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();
index 153aab3..6acffd1 100644 (file)
@@ -342,6 +342,8 @@ public:
        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);
@@ -407,8 +409,6 @@ public:
                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);
index 7164bab..ab44e7c 100644 (file)
@@ -380,40 +380,6 @@ int BC_WindowBase::draw_single_text(int draw, int font,
        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);
index faff9ee..86fa7fc 100644 (file)
@@ -129,6 +129,7 @@ audio := \
        cdripper \
        chorus \
        compressor \
+       compressormulti \
        dcoffset \
        delayaudio \
        denoise \
index 356f811..9a8da42 100644 (file)
@@ -232,10 +232,7 @@ void AudioScopeCanvas::calculate_point()
        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));
 }
@@ -338,14 +335,11 @@ int AudioScopeMode::text_to_mode(const char *text)
 
 
 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()
@@ -889,20 +883,15 @@ void AudioScope::update_gui()
 //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);
index 956d2ae..550f5c6 100644 (file)
@@ -214,8 +214,8 @@ int CompressorEffect::process_buffer(int64_t size, Samples **buffer,
        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);
@@ -337,7 +337,6 @@ void CompressorConfig::copy_from(CompressorConfig &that)
 int CompressorConfig::equivalent(CompressorConfig &that)
 {
        return CompressorConfigBase::equivalent(that);
-       return 1;
 }
 
 void CompressorConfig::interpolate(CompressorConfig &prev,
@@ -444,7 +443,19 @@ void CompressorWindow::create_objects()
        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);
 
@@ -457,6 +468,8 @@ void CompressorWindow::create_objects()
 void CompressorWindow::update()
 {
        update_textboxes();
+       BandConfig *band_config = &plugin->config.bands[0];
+       mkup_gain->update(band_config->mkup_gain);
        canvas->update();
 }
 
@@ -489,8 +502,8 @@ void CompressorWindow::update_textboxes()
                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);
        }
 }
 
@@ -573,6 +586,7 @@ CompressorX::CompressorX(CompressorEffect *plugin,
        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);
 }
@@ -581,8 +595,8 @@ int CompressorX::handle_event()
        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;
@@ -594,6 +608,7 @@ CompressorY::CompressorY(CompressorEffect *plugin,
        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);
 }
@@ -602,8 +617,8 @@ int CompressorY::handle_event()
        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;
@@ -668,22 +683,63 @@ int CompressorInput::text_to_value(char *text)
        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"))
 {
index dc9c54a..ec26cfb 100644 (file)
@@ -76,9 +76,32 @@ public:
 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
@@ -88,6 +111,7 @@ public:
                        int x, int y);
        int handle_event();
        CompressorEffect *plugin;
+       CompressorWindow *window;
 };
 
 class CompressorY : public BC_TumbleTextBox
@@ -97,6 +121,7 @@ public:
                        int x, int y);
        int handle_event();
        CompressorEffect *plugin;
+       CompressorWindow *window;
 };
 
 class CompressorTrigger : public BC_TumbleTextBox
@@ -146,6 +171,8 @@ public:
        CompressorLookAhead *readahead;
        CompressorAttack *attack;
        CompressorClear *clear;
+       CompressorReset *reset;
+       CompressorMkupGain *mkup_gain;
        CompressorX *x_text;
        CompressorY *y_text;
        CompressorTrigger *trigger;
index 2207ba0..0e7a185 100644 (file)
@@ -212,7 +212,7 @@ void ComprMultiEffect::save_data(KeyFrame *keyframe)
 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: {
@@ -244,7 +244,7 @@ void ComprMultiEffect::update_gui()
 //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();
 }
@@ -632,7 +632,7 @@ void BandState::calculate_envelope()
        }
 }
 
-
+#if 0
 void BandState::process_readbehind(int size,
                int reaction_samples, int decay_samples, int trigger)
 {
@@ -819,7 +819,7 @@ void BandState::process_readahead(int size, int preview_samples,
                }
        }
 }
-
+#endif
 
 ComprMultiFFT::ComprMultiFFT(ComprMultiEffect *plugin, int channel)
 {
index bc54267..d334ba5 100644 (file)
@@ -77,10 +77,10 @@ public:
        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
index 95b4c5d..24aea81 100644 (file)
@@ -72,12 +72,6 @@ void ComprMultiWindow::create_objects()
        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();
@@ -161,35 +155,27 @@ void ComprMultiWindow::create_objects()
        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;
@@ -198,10 +184,10 @@ void ComprMultiWindow::create_objects()
 
        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);
@@ -220,14 +206,13 @@ void ComprMultiWindow::create_objects()
 
        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();
@@ -236,28 +221,15 @@ void ComprMultiWindow::create_objects()
 // 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 {
@@ -266,16 +238,11 @@ void ComprMultiWindow::update()
        }
 
 // 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 {
@@ -284,6 +251,10 @@ void ComprMultiWindow::update()
        }
 
        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);
@@ -448,7 +419,6 @@ int ComprMultiSize::handle_event()
        return 1;
 }
 
-
 void ComprMultiSize::create_objects()
 {
        add_item(new BC_MenuItem("2048"));
@@ -461,7 +431,6 @@ void ComprMultiSize::create_objects()
        add_item(new BC_MenuItem("262144"));
 }
 
-
 void ComprMultiSize::update(int size)
 {
        char string[BCTEXTLEN];
@@ -470,6 +439,26 @@ void ComprMultiSize::update(int size)
 }
 
 
+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)
@@ -483,7 +472,7 @@ void ComprMultiCanvas::update_window()
 
 
 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))
@@ -503,7 +492,7 @@ int ComprMultiReaction::handle_event()
 
 
 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))
@@ -521,11 +510,12 @@ int ComprMultiDecay::handle_event()
 
 
 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);
 }
@@ -533,10 +523,10 @@ int ComprMultiX::handle_event()
 {
        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;
@@ -544,13 +534,12 @@ int ComprMultiX::handle_event()
 
 
 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);
 }
@@ -558,10 +547,10 @@ int ComprMultiY::handle_event()
 {
        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;
@@ -569,9 +558,7 @@ int ComprMultiY::handle_event()
 
 
 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))
 {
@@ -585,16 +572,18 @@ int ComprMultiTrigger::handle_event()
 }
 
 
-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;
 }
@@ -627,19 +616,41 @@ int ComprMultiInput::text_to_value(char *text)
 }
 
 
-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;
 }
index b772216..e0fa866 100644 (file)
@@ -58,7 +58,7 @@ class ComprMultiReaction : public BC_TumbleTextBox
 {
 public:
        ComprMultiReaction(ComprMultiEffect *plugin,
-               ComprMultiWindow *window, int x, int y);
+                       ComprMultiWindow *window, int x, int y);
        int handle_event();
        ComprMultiEffect *plugin;
 };
@@ -66,23 +66,28 @@ public:
 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;
 };
@@ -90,7 +95,8 @@ public:
 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;
 };
@@ -99,9 +105,21 @@ public:
 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
@@ -131,12 +149,14 @@ public:
 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;
 };
 
 
@@ -167,7 +187,7 @@ class ComprMultiSize : public BC_PopupMenu
 {
 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);
@@ -175,6 +195,17 @@ public:
        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
 {
@@ -192,6 +223,7 @@ public:
        ComprMultiCanvas *canvas;
        ComprMultiReaction *reaction;
        ComprMultiClear *clear;
+       ComprMultiReset *reset;
        ComprMultiX *x_text;
        ComprMultiY *y_text;
        ComprMultiTrigger *trigger;
@@ -209,6 +241,7 @@ public:
        ComprMultiQPot *freq1;
        ComprMultiQPot *freq2;
        ComprMultiFPot *q;
+       ComprMultiMkupGain *mkup_gain;
        ComprMultiSize *size;
        EQCanvas *eqcanvas;
 
index b7cf072..7a99221 100644 (file)
@@ -977,23 +977,6 @@ void GraphicGUI::update_textboxes()
 }
 
 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
 GraphicEQ::GraphicEQ(PluginServer *server)
  : PluginAClient(server)
 {
@@ -1036,32 +1019,21 @@ void GraphicEQ::read_data(KeyFrame *keyframe)
        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;
 }
 
@@ -1082,8 +1054,7 @@ void GraphicEQ::save_data(KeyFrame *keyframe)
        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);
@@ -1109,30 +1080,27 @@ void GraphicEQ::update_gui()
                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;
        }
 
index 59bd8e5..67ff6ad 100644 (file)
@@ -995,7 +995,7 @@ void ParametricEQ::update_gui()
                calculate_envelope();
                window->update_gui();
        }
-       else if(pending_gui_frames()) {
+       else if( pending_gui_frame() ) {
                window->update_canvas();
        }
        window->unlock_window();
index 4248a3c..7d38fe5 100644 (file)
@@ -359,12 +359,12 @@ void Reverb::update_gui()
        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();
 }
index 64b4d6a..0edc151 100644 (file)
@@ -1,13 +1,9 @@
 include ../../plugin_defs
 
-OBJS = \
-       $(OBJDIR)/spectrogram.o
+OBJS = $(OBJDIR)/spectrogram.o
 
 PLUGIN = spectrogram
 
 include ../../plugin_config
 
-
-
-
 $(OBJDIR)/spectrogram.o: spectrogram.C
index 15730e6..4782530 100644 (file)
@@ -1,7 +1,6 @@
-
 /*
  * 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
@@ -92,10 +91,11 @@ void SpectrogramConfig::interpolate(SpectrogramConfig &prev,
 
 
 SpectrogramFrame::SpectrogramFrame(int data_size)
+ : PluginClientFrame()
 {
        this->data_size = data_size;
        data = new float[data_size];
-       force = 0;
+//     force = 0;
 }
 
 SpectrogramFrame::~SpectrogramFrame()
@@ -139,8 +139,7 @@ void SpectrogramMode::create_objects()
 
 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;
@@ -153,7 +152,7 @@ int SpectrogramMode::handle_event()
 
 const char* SpectrogramMode::mode_to_text(int mode)
 {
-       switch(mode)
+       switch( mode )
        {
                case VERTICAL:
                        return _("Vertical");
@@ -165,7 +164,7 @@ const char* SpectrogramMode::mode_to_text(int mode)
 
 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;
 }
 
@@ -217,7 +216,7 @@ SpectrogramWindowSizeTumbler::SpectrogramWindowSizeTumbler(Spectrogram *plugin,
 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);
@@ -229,7 +228,7 @@ int SpectrogramWindowSizeTumbler::handle_up_event()
 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);
@@ -301,8 +300,7 @@ SpectrogramCanvas::SpectrogramCanvas(Spectrogram *plugin, int x, int y, int w, i
 
 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();
@@ -313,8 +311,7 @@ int SpectrogramCanvas::button_press_event()
 
 int SpectrogramCanvas::button_release_event()
 {
-       if(current_operation == DRAG)
-       {
+       if( current_operation == DRAG ) {
                current_operation = NONE;
                return 1;
        }
@@ -323,8 +320,7 @@ int SpectrogramCanvas::button_release_event()
 
 int SpectrogramCanvas::cursor_motion_event()
 {
-       if(current_operation == DRAG)
-       {
+       if( current_operation == DRAG ) {
                calculate_point();
        }
        return 0;
@@ -349,11 +345,10 @@ void SpectrogramCanvas::calculate_point()
 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();
        }
@@ -418,8 +413,7 @@ void SpectrogramWindow::create_objects()
        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));
        }
@@ -486,7 +480,7 @@ int SpectrogramWindow::resize_event(int w, int h)
        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(
@@ -539,10 +533,10 @@ int SpectrogramWindow::resize_event(int w, int h)
 
 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;
@@ -550,32 +544,27 @@ void SpectrogramWindow::calculate_frequency(int x, int y, int do_overlay)
 
 // 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;
                }
@@ -594,8 +583,7 @@ void SpectrogramWindow::calculate_frequency(int x, int y, int do_overlay)
                amplitude_title->update(string);
        }
 
-       if(do_overlay)
-       {
+       if( do_overlay ) {
                canvas->draw_overlay();
                canvas->flash();
        }
@@ -647,7 +635,6 @@ Spectrogram::Spectrogram(PluginServer *server)
  : PluginAClient(server)
 {
        reset();
-       timer = new Timer;
        w = xS(640);
        h = yS(480);
 }
@@ -655,12 +642,9 @@ Spectrogram::Spectrogram(PluginServer *server)
 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();
 }
 
@@ -670,14 +654,11 @@ void Spectrogram::reset()
        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));
 }
 
 
@@ -689,54 +670,34 @@ int Spectrogram::process_buffer(int64_t size,
                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(),
@@ -747,80 +708,49 @@ int Spectrogram::process_buffer(int64_t size,
 
        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;
 }
 
@@ -828,389 +758,277 @@ void Spectrogram::render_stop()
 {
        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);
                        }
                }
        }
@@ -1237,7 +1055,3 @@ void Spectrogram::save_data(KeyFrame *keyframe)
        output.terminate_string();
 }
 
-
-
-
-
index 0a103cf..6d1b927 100644 (file)
@@ -239,33 +239,18 @@ public:
        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
@@ -283,16 +268,17 @@ public:
        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
@@ -302,21 +288,19 @@ public:
 // 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;
 };
index 348dff2..3dd143d 100644 (file)
@@ -2,43 +2,43 @@
 /*
  * 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
 };
 
index 56f40de..54bfaaf 100644 (file)
@@ -2,65 +2,65 @@
 /*
  * 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
 };
 
index 925d946..128474b 100644 (file)
@@ -2,43 +2,43 @@
 /*
  * 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
 };
 
index cfedece..bb6cbaa 100644 (file)
@@ -2,66 +2,66 @@
 /*
  * 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
 };
 
index 09a544f..19467a3 100644 (file)
@@ -2,43 +2,43 @@
 /*
  * 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
 };
 
index 72ead06..01a4973 100644 (file)
@@ -1,7 +1,7 @@
 
 /*
  * 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
@@ -86,7 +86,6 @@ void Synth::read_data(KeyFrame *keyframe)
 
 //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();
@@ -112,7 +111,7 @@ void Synth::read_data(KeyFrame *keyframe)
                                }
 
                                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"))
@@ -164,9 +163,6 @@ void Synth::save_data(KeyFrame *keyframe)
                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
@@ -176,19 +172,21 @@ void Synth::save_data(KeyFrame *keyframe)
 
 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));
 }
@@ -234,8 +232,8 @@ double Synth::solve_eqn(double *output,
                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;
@@ -325,18 +323,25 @@ double Synth::get_oscillator_point(float x,
        {
                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;
 }
@@ -521,6 +526,8 @@ static const char *keyboard_map[] =
 
 void SynthWindow::create_objects()
 {
+       int margin = client->get_theme()->widget_border;
+
        BC_MenuBar *menu;
        add_subwindow(menu = new BC_MenuBar(0, 0, get_w()));
 
@@ -541,6 +548,7 @@ void SynthWindow::create_objects()
        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));
@@ -566,7 +574,7 @@ void SynthWindow::create_objects()
        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:")));
@@ -633,24 +641,21 @@ void SynthWindow::create_objects()
 
 
        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();
@@ -740,8 +745,7 @@ void SynthWindow::update_whitekey(int number,
                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__);
        }
@@ -767,15 +771,13 @@ void SynthWindow::update_blackkey(int number,
                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);
        }
 }
 
@@ -787,11 +789,10 @@ void SynthWindow::update_notes()
        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;
 
@@ -951,7 +952,7 @@ void SynthWindow::update_oscillators()
                        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;
        }
@@ -1182,6 +1183,11 @@ int SynthNote::draw_face(int flash, int flush)
 }
 
 
+
+
+
+
+
 SynthOscGUI::SynthOscGUI(SynthWindow *window, int number)
 {
        this->window = window;
@@ -1259,7 +1265,7 @@ int SynthOscGUIPhase::handle_event()
 
 
 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)
 {
@@ -1381,6 +1387,10 @@ int SynthClear::handle_event()
 }
 
 
+
+
+
+
 SynthWaveForm::SynthWaveForm(Synth *synth, int x, int y, char *text)
  : BC_PopupMenu(x, y, xS(120), text)
 {
@@ -1817,6 +1827,74 @@ int SynthFreqRandom::handle_event()
        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"))
 {
index d8d10bd..79bc035 100644 (file)
 #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[] =
 {
@@ -106,12 +108,13 @@ 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
@@ -251,7 +254,7 @@ public:
        SynthOscGUI *gui;
 };
 
-class SynthOscGUIFreq : public BC_IPot
+class SynthOscGUIFreq : public BC_FPot
 {
 public:
        SynthOscGUIFreq(Synth *synth, SynthOscGUI *gui, int y);
@@ -507,6 +510,24 @@ public:
        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:
@@ -516,6 +537,15 @@ public:
        Synth *synth;
 };
 
+class SynthFreqMin : public BC_MenuItem
+{
+public:
+       SynthFreqMin(Synth *synth);
+       ~SynthFreqMin();
+       int handle_event();
+       Synth *synth;
+};
+
 class SynthFreqEven : public BC_MenuItem
 {
 public:
index 024c704..d1cddf8 100644 (file)
@@ -2,21 +2,21 @@
 /*
  * 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
@@ -27,6 +27,6 @@
 class Synth;
 class SynthOscillator;
 
-#define OSCILLATORHEIGHT yS(40)
+
 
 #endif
index cddf807..a4b4e7f 100644 (file)
@@ -2,26 +2,28 @@
 /*
  * 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;
@@ -38,4 +40,7 @@ class SynthSubWindow;
 class SynthScroll;
 class SynthClear;
 
+#define OSCILLATORHEIGHT 40
+
+
 #endif
index 161515b..9ccc8b5 100644 (file)
@@ -2,44 +2,44 @@
 /*
  * 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
 };
 
index 9deb264..b837716 100644 (file)
@@ -2,74 +2,74 @@
 /*
  * 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
 };
 
index d1f924f..f43e9ae 100644 (file)
@@ -2,75 +2,75 @@
 /*
  * 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
 };
 
index f455078..234e441 100644 (file)
@@ -2,76 +2,76 @@
 /*
  * 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
 };
 
index 536db9b..3181634 100644 (file)
@@ -2,44 +2,44 @@
 /*
  * 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
 };