da847a
da847a
#include <tools modifierclone.h="" modifiers=""></tools>
da847a
da847a
da847a
//*****************************************************************************************
da847a
//    TModifierClone::Interpolator implementation
da847a
//*****************************************************************************************
da847a
da847a
TTrackPoint TModifierClone::Interpolator::interpolateFromOriginal(double originalIndex)
da847a
  { return transform.apply( track.calcPointFromOriginal(originalIndex) ); }
da847a
TTrackPoint TModifierClone::Interpolator::interpolate(double index)
da847a
  { return interpolateFromOriginal(track.originalIndexByIndex(index)); }
da847a
da847a
da847a
//*****************************************************************************************
da847a
//    TModifierClone implementation
da847a
//*****************************************************************************************
da847a
d9135c
TModifierClone::TModifierClone(bool keepOriginals, int skipFirst, int skipLast):
d9135c
  keepOriginals(keepOriginals), skipFirst(skipFirst), skipLast(skipLast) { }
da847a
da847a
void TModifierClone::modifyTrack(const TTrack &track,
da847a
                                 TTrackList &outTracks)
da847a
{
da847a
  if (!track.handler) {
da847a
    Handler *handler = new Handler();
da847a
    track.handler = handler;
da847a
    if (keepOriginals) {
da847a
      handler->original = new TTrack(track);
da847a
      new TTrackIntrOrig(*handler->original);
da847a
    }
da847a
    for(TTrackTransformList::const_iterator i = transforms.begin(); i != transforms.end(); ++i) {
da847a
      handler->tracks.push_back(new TTrack(track));
da847a
      TTrack &subTrack = *handler->tracks.back();
da847a
      new Interpolator(subTrack, *i);
da847a
    }
da847a
  }
da847a
  
da847a
  Handler *handler = dynamic_cast<handler*>(track.handler.getPointer());</handler*>
da847a
  if (!handler)
da847a
    return;
da847a
  
da847a
  if (handler->original)
da847a
    outTracks.push_back(handler->original);
da847a
  outTracks.insert(outTracks.end(), handler->tracks.begin(), handler->tracks.end());
da847a
  if (!track.changed())
da847a
    return;
da847a
da847a
  int start = track.size() - track.pointsAdded;
da847a
  if (start < 0) start = 0;
da847a
da847a
  // process original
da847a
  if (handler->original) {
da847a
    TTrack &subTrack = *handler->original;
da847a
    subTrack.truncate(start);
da847a
    for (int i = start; i < track.size(); ++i)
da847a
      subTrack.push_back(subTrack.pointFromOriginal(i), false);
da847a
    subTrack.fix_to(track.fixedSize());
da847a
  }
da847a
  
da847a
  // process sub-tracks
da847a
  for(TTrackList::iterator i = handler->tracks.begin(); i != handler->tracks.end(); ++i) {
da847a
    TTrack &subTrack = **i;
da847a
    Interpolator *intr = dynamic_cast<interpolator*>(subTrack.getInterpolator().getPointer());</interpolator*>
da847a
    if (!intr)
da847a
      continue;
da847a
    subTrack.truncate(start);
da847a
    for (int i = start; i < track.size(); ++i)
da847a
      subTrack.push_back(intr->interpolateFromOriginal(i), false);
da847a
    subTrack.fix_to(track.fixedSize());
da847a
  }
da847a
  
da847a
  track.resetChanges();
da847a
}
da847a
d9135c
void TModifierClone::modifyTracks(
d9135c
  const TTrackList &tracks,
d9135c
  TTrackList &outTracks )
d9135c
{
d9135c
  int cnt = (int)tracks.size();
d9135c
  int i0 = skipFirst;
d9135c
  int i1 = cnt - skipLast;
d9135c
  for(int i = 0; i < cnt; ++i)
d9135c
    if (i0 <= i && i < i1) modifyTrack(*tracks[i], outTracks);
d9135c
      else TInputModifier::modifyTrack(*tracks[i], outTracks);
d9135c
}
d9135c