Logo Search packages:      
Sourcecode: kdenlive version File versions

trackviewaudiobackgrounddecorator.cpp

/***************************************************************************
                          trackviewbackgrounddecorator  -  description
                             -------------------
    begin                : May 2005
    copyright            : (C) 2005 by Marco Gittler
    email                : g.marco@freenet.de
 ***************************************************************************/

/***************************************************************************
 *                                                                         *
 *   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.                                   *
 *                                                                         *
 ***************************************************************************/
#include "trackviewaudiobackgrounddecorator.h"

#include <qpainter.h>
#include <qimage.h>

#include <klocale.h>
#include <kiconloader.h>
#include <kstandarddirs.h>

#include "docclipref.h"
#include "gentime.h"
#include "kdenlivedoc.h"
#include "ktimeline.h"

namespace Gui {
    TrackViewAudioBackgroundDecorator::
      TrackViewAudioBackgroundDecorator(KTimeLine * timeline,
      KdenliveDoc * doc, const QColor & unselected, bool limitedThumbs, bool shift):DocTrackDecorator(timeline,
      doc),m_shift(shift), m_unselected(unselected), m_limitedAudioThumbs(limitedThumbs)
{
      m_selected = m_unselected.light(140);
      m_overlayPixmap = QPixmap (locate("appdata", "graphics/lighten.png"));
} 

TrackViewAudioBackgroundDecorator::~TrackViewAudioBackgroundDecorator() 
{
}

// virtual
void TrackViewAudioBackgroundDecorator::paintClip(double startX,
      double endX, QPainter & painter, DocClipRef * clip, QRect & rect,
      bool selected) {
      if (!clip->referencedClip() || clip->audioChannels() == 0 || clip->speed() != 1.0) return;
      int sx = (int)startX;
      int ex = (int)endX;

      if (sx < rect.x()) {
          sx = rect.x();
      }
      if (ex > rect.x() + rect.width()) {
          ex = rect.x() + rect.width();
      }

      int y = rect.y();
      int h = rect.height();

      if (m_shift) {
          h = h/3;
          y += 2*h;
      }

      QColor col = selected ? m_selected : m_unselected;
      //double aspect = 4.0 / 3.0;
      int width = ex - sx;
      
      double FramesInOnePixel = (timeline()->mapValueToLocal(1) - timeline()->mapValueToLocal(0));

      if (m_limitedAudioThumbs && FramesInOnePixel < 0.1 && ((endX - startX) / FramesInOnePixel  > 4000)) {
          if (!m_shift) painter.fillRect(sx, y, ex - sx, h, col);
          return;
      }

      FramesInOnePixel = width / FramesInOnePixel;

      double i = sx;

      int channels =clip->audioChannels();
      if (channels==0)
          channels=1;

      painter.setClipRect(sx, y, ex - sx, h);
      if (!m_shift) {
          // Audio track
          painter.fillRect(sx, y, ex - sx, h, col);
      }
      else {
          // video track
          int newx1 = sx;
          int newx2 = ex;
          int clipw = clip->thumbnailWidth();
          if (clipw > endX - startX) clipw = endX - startX;
          if (newx1 < startX + clipw) {
            // draw semi transparent pixmap over thumbnails to lighten them
            painter.drawPixmap(startX, y, m_overlayPixmap, 0, 0, clipw, h);
            newx1 = startX + clipw;
          }

          if (newx2 > endX - clipw) {
            // draw semi transparent pixmap over thumbnails to lighten them
            painter.drawPixmap(endX - clipw, y, m_overlayPixmap, 0, 0, clipw, h);
              newx2 = endX - clipw;
          }
            // draw rect between thumbnails
          if (newx2 > newx1) painter.fillRect(newx1, y, newx2 - newx1, h, col);
      }
      painter.setPen(col.dark(160));
      double timeDiff = clip->cropStartTime().frames(document()->framesPerSecond()) - clip->trackStart().frames(document()->framesPerSecond());
      

      if (clip->referencedClip()->audioThumbCreated == false) {
            if (clip->clipType() == DocClipBase::AV || clip->clipType() == DocClipBase::AUDIO) {
                  QPixmap pixmap(KGlobal::iconLoader()->loadIcon("run", KIcon::Toolbar));
                  painter.drawPixmap((int)startX, rect.y(), pixmap);
            }
      }
      else for (; i < ex; i += width) {
            if (i + width < rect.x() || i > rect.x() + rect.width())
                  continue;
            int deltaHeight = h / channels;
            double RealFrame = timeline()->mapLocalToValue(i);
            for (int countChannel = 0; countChannel < channels;countChannel++) {
            {     
                  QByteArray a=clip->getAudioThumbs(countChannel,
                              RealFrame + timeDiff,
                              FramesInOnePixel, width);
                  drawChannel(&a,(int)i,y + deltaHeight * countChannel,h / channels, ex,painter);
                  }
          }
      }
      painter.setPen(Qt::black);
      painter.setClipping(false);
}

void TrackViewAudioBackgroundDecorator::drawChannel(const QByteArray * ba,
      int x, int y, int height, int maxWidth,
      QPainter & painter) {
            
      for (int a = 0; a < (int)ba->size(); a++) {
            int val = (*ba)[a] * (height / 2) / 128;
            if (a + x >= maxWidth || !painter.isActive())
                  return;     
            painter.drawLine(a + x, y + height / 2 - val, a + x,
                  y + height / 2 + val);
      }
}


};

Generated by  Doxygen 1.6.0   Back to index