00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "mark.hpp"
00027 #include "uti.h"
00028 #include "spl.h"
00029
00030
00031
00032 VOID Mark1DList::adjustSRate(DOUBLE sr)
00033 {
00034 if (sr && srate) adjust_scale(sr/srate);
00035 }
00036
00037
00038
00039 BOOL Mark1DList::OK(VOID) const
00040 {
00041 if (!l.OK()) return FALSE;
00042 for (Lix p=l.first(); p!=0; p=l.next(p))
00043 if (!l.item(p).label.OK()) return FALSE;
00044 return TRUE;
00045 }
00046
00047
00048
00049 VOID Mark1DList::adjust_range( LONG t0, LONG t1 )
00050 {
00051 Lix p;
00052 LONG t, tt, sp;
00053
00054 p=first();
00055 while (p) {
00056 sp=span(p);
00057 if (sp==0) {
00058 t=pos(p);
00059 if ((t<t0)||(t>t1)) p=del(p,1);
00060 else p=next(p);
00061 }
00062 else if (sp>0) {
00063 t=pos(p); tt=t+sp-1;
00064 if ((tt<t0)||(t>t1)) p=del(p,1);
00065 else if (t<t0) {
00066 if (tt>t1) tt=t1;
00067 pos(p)=t0; span(p)=tt-t0+1; p=next(p);
00068 }
00069 else if (tt>t1) { span(p)=t1-t+1; p=next(p); }
00070 else p=next(p);
00071 }
00072 else {
00073 t=pos(p); tt=t+sp+1;
00074 if ((t<t0)||(tt>t1)) p=del(p,1);
00075 else if (t>t1) {
00076 if (tt<t0) tt=t0;
00077 pos(p)=t1; span(p)=tt-t1-1; p=next(p);
00078 }
00079 else if (tt<t0) { span(p)=t0-t-1; p=next(p); }
00080 else p=next(p);
00081 }
00082 }
00083 }
00084
00085
00086
00087 VOID Mark1DList::adjust_scale( DOUBLE k, LONG t0 )
00088 {
00089 Lix p;
00090
00091 for (p=first(); p!=0; p=next(p)) {
00092 pos(p) = (LONG)fround((pos(p)-t0)*k);
00093 span(p) = (LONG)fround(span(p)*k);
00094 }
00095 }
00096
00097
00098
00099 VOID Mark1DList::adjust_del( LONG posi, LONG n )
00100 {
00101 Lix p;
00102 LONG posif=posi+n-1;
00103 LONG sp, asp, iposi, iposif;
00104
00105 if (!n) return;
00106 if (n<0) { n=-n; posi-=(n-1); }
00107
00108 p=first();
00109 while (p!=0) {
00110 sp=span(p);
00111 if (sp==0) {
00112 iposi=pos(p);
00113 if (iposi>=posi) {
00114 if (iposi<=posif) p=del(p,1);
00115 else { pos(p)=iposi-n; p=next(p); }
00116 }
00117 else p=next(p);
00118 }
00119 else {
00120 if (sp>0) { iposi=pos(p); iposif=iposi+sp-1; asp=sp;}
00121 else { iposif=pos(p); iposi=iposif+sp+1; asp=-sp;}
00122
00123 if (posi<iposi) {
00124 if (posif>=iposif) p=del(p,1);
00125 else if (posif<iposi) { pos(p)-=n; p=next(p); }
00126 else {
00127 asp -= posif-iposi+1;
00128 if (sp>0) { span(p)=asp; pos(p)=posi; }
00129 else { span(p)=-asp; pos(p)-=n; }
00130 p=next(p);
00131 }
00132 }
00133 else if (posi<=iposif) {
00134 asp -= ((posif>iposif)?iposif:posif)-posi+1;
00135 if (!asp) p=del(p,1);
00136 else {
00137 if (sp>0) span(p)=asp;
00138 else { span(p)=-asp; pos(p)+=(asp+sp); }
00139 p=next(p);
00140 }
00141 }
00142 else p=next(p);
00143 }
00144 }
00145 }
00146
00147
00148
00149 VOID Mark1DList::adjust_ins( LONG posi, LONG n )
00150 {
00151 Lix p;
00152 LONG sp, iposi;
00153
00154 if (!n) return;
00155 if (n<0) n=-n;
00156
00157 p=first();
00158 while (p!=0) {
00159 sp=span(p);
00160 iposi=pos(p);
00161 if (sp==0)
00162 if (iposi>=posi) pos(p)=iposi+n;
00163 else if (sp>0) {
00164 if (posi<=iposi) pos(p)=iposi+n;
00165 else if (posi<iposi+sp-1) span(p)=sp+n;
00166 }
00167 else {
00168 if (posi<=iposi+sp+1) pos(p)=iposi+n;
00169 else if (posi<iposi) span(p)=sp-n;
00170 }
00171 p=next(p);
00172 }
00173 }
00174
00175
00176
00177 VOID Mark1DList::adjust_scale_ms( DOUBLE k, DOUBLE t0 )
00178 {
00179 adjust_scale(k,(LONG)fround(srate?ms2samples(t0,srate):t0));
00180 }
00181
00182
00183
00184 VOID Mark1DList::adjust_del_ms( DOUBLE pos, DOUBLE n )
00185 {
00186 adjust_del((LONG)fround(srate?ms2samples(pos,srate):pos),
00187 (LONG)fround(srate?ms2samples(n,srate):n));
00188 }
00189
00190
00191
00192 VOID Mark1DList::adjust_ins_ms( DOUBLE pos, DOUBLE n )
00193 {
00194 adjust_ins((LONG)fround(srate?ms2samples(pos,srate):pos),
00195 (LONG)fround(srate?ms2samples(n,srate):n));
00196 }
00197
00198
00199
00200 VOID Mark1DList::adjust_range_ms( DOUBLE t0, DOUBLE t1 )
00201 {
00202 adjust_range((LONG)fround(srate?ms2samples(t0,srate):t0),
00203 (LONG)fround(srate?ms2samples(t1,srate):t1));
00204 }
00205
00206