+void ClipItem::slotPrepareAudioThumb(double pixelForOneFrame, QPainterPath path, int startpixel, int endpixel) {
+ int channels = 2;
+
+ QRectF re = path.boundingRect();
+
+ //if ( (!audioThumbWasDrawn || framePixelWidth!=pixelForOneFrame ) && !baseClip()->audioFrameChache.isEmpty()){
+
+ for (int startCache = startpixel - startpixel % 100;startCache + 100 < endpixel ;startCache += 100) {
+ //kDebug() << "creating " << startCache;
+ //if (framePixelWidth!=pixelForOneFrame ||
+ if (framePixelWidth == pixelForOneFrame && audioThumbCachePic.contains(startCache))
+ continue;
+ if (audioThumbCachePic[startCache].isNull() || framePixelWidth != pixelForOneFrame) {
+ audioThumbCachePic[startCache] = QPixmap(100, (int)(re.height()));
+ audioThumbCachePic[startCache].fill(QColor(200, 200, 200, 0));
+ }
+ bool fullAreaDraw = pixelForOneFrame < 10;
+ QMap<int, QPainterPath > positiveChannelPaths;
+ QMap<int, QPainterPath > negativeChannelPaths;
+ QPainter pixpainter(&audioThumbCachePic[startCache]);
+ QPen audiopen;
+ audiopen.setWidth(0);
+ pixpainter.setPen(audiopen);
+ //pixpainter.setRenderHint(QPainter::Antialiasing,true);
+ //pixpainter.drawLine(0,0,100,re.height());
+ int channelHeight = audioThumbCachePic[startCache].height() / channels;
+
+ for (int i = 0;i < channels;i++) {
+
+ positiveChannelPaths[i].moveTo(0, channelHeight*i + channelHeight / 2);
+ negativeChannelPaths[i].moveTo(0, channelHeight*i + channelHeight / 2);
+ }
+
+ for (int samples = 0;samples <= 100;samples++) {
+ double frame = (double)(samples + startCache - 0) / pixelForOneFrame;
+ int sample = (int)((frame - (int)(frame)) * 20); // AUDIO_FRAME_SIZE
+ if (frame < 0 || sample < 0 || sample > 19)
+ continue;
+ QMap<int, QByteArray> frame_channel_data = baseClip()->audioFrameChache[(int)frame];
+
+ for (int channel = 0;channel < channels && frame_channel_data[channel].size() > 0;channel++) {
+
+ int y = channelHeight * channel + channelHeight / 2;
+ int delta = (int)(frame_channel_data[channel][sample] - 127 / 2) * channelHeight / 64;
+ if (fullAreaDraw) {
+ positiveChannelPaths[channel].lineTo(samples, 0.1 + y + qAbs(delta));
+ negativeChannelPaths[channel].lineTo(samples, 0.1 + y - qAbs(delta));
+ } else {
+ positiveChannelPaths[channel].lineTo(samples, 0.1 + y + delta);
+ negativeChannelPaths[channel].lineTo(samples, 0.1 + y - delta);
+ }
+ }
+ for (int channel = 0;channel < channels ;channel++)
+ if (fullAreaDraw && samples == 100) {
+ positiveChannelPaths[channel].lineTo(samples, channelHeight*channel + channelHeight / 2);
+ negativeChannelPaths[channel].lineTo(samples, channelHeight*channel + channelHeight / 2);
+ positiveChannelPaths[channel].lineTo(0, channelHeight*channel + channelHeight / 2);
+ negativeChannelPaths[channel].lineTo(0, channelHeight*channel + channelHeight / 2);
+ }
+
+ }
+ if (m_clipType != AV) pixpainter.setBrush(QBrush(QColor(200, 200, 100)));
+ else {
+ pixpainter.setPen(QPen(QColor(0, 0, 0)));
+ pixpainter.setBrush(QBrush(QColor(60, 60, 60)));
+ }
+ for (int i = 0;i < channels;i++) {
+ if (fullAreaDraw) {
+ //pixpainter.fillPath(positiveChannelPaths[i].united(negativeChannelPaths[i]),QBrush(Qt::SolidPattern));//or singleif looks better
+ pixpainter.drawPath(positiveChannelPaths[i].united(negativeChannelPaths[i]));//or singleif looks better
+ } else
+ pixpainter.drawPath(positiveChannelPaths[i]);
+ }
+ }
+ //audioThumbWasDrawn=true;
+ framePixelWidth = pixelForOneFrame;
+
+ //}
+}
+
+
+
+void ClipItem::setFadeIn(int pos, double scale) {
+ int oldIn = m_startFade;
+ if (pos < 0) pos = 0;
+ if (pos > m_cropDuration.frames(m_fps)) pos = (int)(m_cropDuration.frames(m_fps) / 2);
+ m_startFade = pos;
+ if (oldIn > pos) update(rect().x(), rect().y(), oldIn * scale, rect().height());
+ else update(rect().x(), rect().y(), pos * scale, rect().height());
+}
+
+void ClipItem::setFadeOut(int pos, double scale) {
+ int oldOut = m_endFade;
+ if (pos < 0) pos = 0;
+ if (pos > m_cropDuration.frames(m_fps)) pos = (int)(m_cropDuration.frames(m_fps) / 2);
+ m_endFade = pos;
+ if (oldOut > pos) update(rect().x() + rect().width() - pos * scale, rect().y(), pos * scale, rect().height());
+ else update(rect().x() + rect().width() - oldOut * scale, rect().y(), oldOut * scale, rect().height());
+
+}
+