From 772fee62aae47a80754588192bfa089e5229f91c Mon Sep 17 00:00:00 2001 From: EvanR Date: Mon, 5 Jan 2009 19:51:20 -0600 Subject: [PATCH] Improved drawing performance. Arranger, event editor, and piano roll have faster drawing by not drawing stuff outside the clip region. The program was slowing down on a large midi file. --- BUGS | 16 ++++++---------- src/arranger.cpp | 50 ++++++++++++++++---------------------------------- src/arranger.h | 3 --- src/eventedit.cpp | 43 ++++++++++++++++++++++--------------------- src/keyboard.cpp | 1 + src/pianoroll.cpp | 22 ++++++++++++++-------- src/saveload.cpp | 2 -- src/timeline.cpp | 2 ++ src/uihelper.cpp | 1 + 9 files changed, 62 insertions(+), 78 deletions(-) diff --git a/BUGS b/BUGS index e34afcf..99b4069 100644 --- a/BUGS +++ b/BUGS @@ -1,15 +1,11 @@ -arranger generally has drawing problems related to follow playback -zero measures per phrase causes division by zero -occasional bug on switching layers +occasional bug on switching layers - check sequencer/backend details +pop up window toggles need to be reset if window closes - simple fix +import midi doesnt handle misfit events - see 'extratracks' in loadsmf +scroll bar size does not indicate scroll range -pop up window toggles need to be reset if window closes -import midi doesnt handle misfit events - -zoom all the way in draws wrong in piano roll - -end of frame sequencing bug -out of order dispatch bug +end of frame sequencing bug - unknown cause +out of order dispatch bug - sequencer needs to sort dispatched events diff --git a/src/arranger.cpp b/src/arranger.cpp index 48e5c79..62a1674 100644 --- a/src/arranger.cpp +++ b/src/arranger.cpp @@ -61,8 +61,6 @@ Arranger::Arranger(int x, int y, int w, int h, const char* label = 0) : fltk::Wi rresize_flag = 0; lresize_flag = 0; - last_handle == NULL; - color_flag = 0; maxt = 0; @@ -73,6 +71,9 @@ Arranger::Arranger(int x, int y, int w, int h, const char* label = 0) : fltk::Wi scrollbuffer = 30; + scrollx=0; + scrolly=0; + } int Arranger::handle(int event){ @@ -327,18 +328,10 @@ int Arranger::handle(int event){ else if(rresize_flag){ apply_rresize(); rresize_flag = 0; - if(last_handle){ - last_handle->lhandle = 0; - last_handle->rhandle = 0; - } } else if(lresize_flag){ apply_lresize(); lresize_flag = 0; - if(last_handle){ - last_handle->lhandle = 0; - last_handle->rhandle = 0; - } } insert_flag=0; @@ -373,19 +366,6 @@ int Arranger::handle(int event){ else{s->rhandle = 0;} if(over_lhandle(s)){s->lhandle = 1;} else{s->lhandle = 0;} - if(s != last_handle){ - if(last_handle){ - last_handle->rhandle = 0; - last_handle->lhandle = 0; - } - last_handle = s; - } - redraw(); - } - else if(last_handle){ - last_handle->rhandle = 0; - last_handle->lhandle = 0; - last_handle = NULL; redraw(); } return 1; @@ -412,6 +392,7 @@ void Arranger::draw(){ fltk::fillrect(I,0,1,h()); } } + fltk::setcolor(fltk::GRAY50); int P = config.measures_per_phrase; if(P){ @@ -424,7 +405,6 @@ void Arranger::draw(){ } } - if(insert_flag){ fltk::setcolor(fltk::BLUE); int T1 = insert_torig; @@ -546,10 +526,10 @@ void Arranger::draw(){ setcolor(fltk::color(128,0,0)); } - W = 5; - X = tick2xpix(s->tick+s->dur) - W - 1 - scrollx; + int W2 = 5; + X = tick2xpix(s->tick+s->dur) - W2 - 1 - scrollx; Y = s->track*30 - scrolly; - addvertex(X+W,Y+28/2); + addvertex(X+W2,Y+28/2); addvertex(X,Y); addvertex(X,Y+28); fillpath(); @@ -560,12 +540,12 @@ void Arranger::draw(){ if(delete_flag){ setcolor(fltk::color(128,0,0)); } - W = 5; + int W2 = 5; X = tick2xpix(s->tick)+1-scrollx; Y = s->track*30 - scrolly; addvertex(X,Y+28/2); - addvertex(X+W,Y); - addvertex(X+W,Y+28); + addvertex(X+W2,Y); + addvertex(X+W2,Y+28); fillpath(); } @@ -580,9 +560,11 @@ void Arranger::draw(){ if(e->type == MIDI_NOTE_ON){ X = tick2xpix(e->tick) + tick2xpix(s->tick)+2 - scrollx; Y = s->track*30 + 27 - e->value1*27/127 - scrolly; - W = tick2xpix(e->dur); - if(W==0){W=1;} - fillrect(X,Y,W,1); + int W2 = tick2xpix(e->dur); + if(W2==0){W2=1;} + if(!(X+W2<0 || X>W )){ + fillrect(X,Y,W2,1); + } } e=e->next; } @@ -732,7 +714,7 @@ void Arranger::layout(){ if(newsize<20){ newsize=20; } - ui->song_vscroll->slider_size(newsize); + //ui->song_vscroll->slider_size(379); } diff --git a/src/arranger.h b/src/arranger.h index 94225bb..c6c4fef 100644 --- a/src/arranger.h +++ b/src/arranger.h @@ -55,7 +55,6 @@ class Arranger : public fltk::Widget { int move_w; int move_offset; - seqpat* last_handle; int rresize_flag; int rresize_torig; int rresize_toffset; @@ -131,8 +130,6 @@ class Arranger : public fltk::Widget { void layout(); - void reset_handle(){last_handle==NULL;} - void scrollTo(int X, int Y); }; diff --git a/src/eventedit.cpp b/src/eventedit.cpp index 3402dfe..9612806 100644 --- a/src/eventedit.cpp +++ b/src/eventedit.cpp @@ -301,30 +301,31 @@ void EventEdit::draw(){ int X = tick2xpix(e->tick) - scroll; int Y = mag2ypix(M); int H = h()-Y; + if(!(X<0 || X>w())){ + fltk::Color c1,c2,c3; + c1 = fltk::BLACK; + c2 = fltk::BLACK; + c3 = fltk::BLACK; + get_event_color(e,&c1,&c2,&c3); - fltk::Color c1,c2,c3; - c1 = fltk::BLACK; - c2 = fltk::BLACK; - c3 = fltk::BLACK; - get_event_color(e,&c1,&c2,&c3); - - fltk::setcolor(c1); - fltk::fillrect(X,Y+1,1,H); - fltk::fillrect(X+1,Y,1,1); - fltk::setcolor(c2); - fltk::fillrect(X+1,Y+1,1,H); - fltk::setcolor(c3); - fltk::fillrect(X,Y,1,1); - if(label_flag){ fltk::setcolor(c1); - char buf[16]; - if(e->type == MIDI_PITCH_WHEEL){ - snprintf(buf,16,"%d",M); + fltk::fillrect(X,Y+1,1,H); + fltk::fillrect(X+1,Y,1,1); + fltk::setcolor(c2); + fltk::fillrect(X+1,Y+1,1,H); + fltk::setcolor(c3); + fltk::fillrect(X,Y,1,1); + if(label_flag){ + fltk::setcolor(c1); + char buf[16]; + if(e->type == MIDI_PITCH_WHEEL){ + snprintf(buf,16,"%d",M); + } + else{ + snprintf(buf,16,"%d",mag2val(M)); + } + fltk::drawtext(buf,X+2,Y+12next; diff --git a/src/keyboard.cpp b/src/keyboard.cpp index 4ff356b..be6b429 100644 --- a/src/keyboard.cpp +++ b/src/keyboard.cpp @@ -63,6 +63,7 @@ Keyboard::Keyboard(int x, int y, int w, int h, const char* label = 0) : fltk::Wi octave = 4; + scroll = 0; } diff --git a/src/pianoroll.cpp b/src/pianoroll.cpp index e9e91ad..657f144 100644 --- a/src/pianoroll.cpp +++ b/src/pianoroll.cpp @@ -72,6 +72,9 @@ PianoRoll::PianoRoll(int x, int y, int w, int h, const char* label = 0) : fltk:: fakeh = wkeyh*75; fakehmin = wkeyh*75; if(fakeh < h){fakeh = h;} + + scrollx=0; + scrolly=0; } int PianoRoll::handle(int event){ @@ -478,16 +481,19 @@ void PianoRoll::draw(){ int W = tick2xpix(T2)-scrollx - X; get_event_color(e,&c1,&c2,&c3); - fltk::setcolor(c1); - fltk::fillrect(X+1,Y+1,W-1,10); + if(!(X+W<0 || X > w())){ + + fltk::setcolor(c1); + fltk::fillrect(X+1,Y+1,W-1,10); - fltk::setcolor(c2); - fltk::fillrect(X,Y+11,W,1); - fltk::fillrect(X+W-1,Y+1,1,11); + fltk::setcolor(c2); + fltk::fillrect(X,Y+11,W,1); + fltk::fillrect(X+W-1,Y+1,1,11); - fltk::setcolor(c3); - fltk::fillrect(X,Y,W,1); - fltk::fillrect(X,Y,1,11); + fltk::setcolor(c3); + fltk::fillrect(X,Y,W,1); + fltk::fillrect(X,Y,1,11); + } } e=e->next; } diff --git a/src/saveload.cpp b/src/saveload.cpp index 977bfa5..53c75e6 100644 --- a/src/saveload.cpp +++ b/src/saveload.cpp @@ -556,7 +556,6 @@ int load(const char* filename){ ui->track_info->set_rec(0); ui->track_info->update(); - ui->arranger->reset_handle(); ui->arranger->redraw(); reset_backend(0); @@ -1384,7 +1383,6 @@ int loadsmf(const char* filename){ ui->track_info->set_rec(0); ui->track_info->update(); - ui->arranger->reset_handle(); ui->arranger->redraw(); update_config_gui(); diff --git a/src/timeline.cpp b/src/timeline.cpp index 2c384a5..5d04926 100644 --- a/src/timeline.cpp +++ b/src/timeline.cpp @@ -54,6 +54,8 @@ Timeline::Timeline(int x, int y, int w, int h, const char* label = 0) : fltk::Wi edit_flag = 0; px_last = 0; + + scroll=0; } int Timeline::handle(int event){ diff --git a/src/uihelper.cpp b/src/uihelper.cpp index 2f5367b..6443623 100644 --- a/src/uihelper.cpp +++ b/src/uihelper.cpp @@ -743,6 +743,7 @@ void remove_track(int n){ void init_gui(){ ui->arranger->layout(); + ui->song_vscroll->slider_size(60); ui->song_vscroll->value(0); ui->song_hscroll->minimum(0); -- 2.11.4.GIT