23 #include <QMutexLocker> 41 #define INTERPOLATION_PRECISION 4 47 #define INTERPOLATION_ZOOM 0.10 51 :QObject(), m_pixmap(), m_track(track), m_offset(0), m_zoom(0.0),
52 m_vertical_zoom(1.0), m_minmax_mode(false),
53 m_sample_buffer(), m_min_buffer(), m_max_buffer(),
54 m_modified(false), m_valid(0), m_lock_buffer(),
55 m_interpolation_order(0), m_interpolation_alpha(),
70 connect(&track, SIGNAL(sigSelectionChanged(
bool)),
86 const unsigned int buflen =
m_valid.size();
96 qDebug(
"TrackPixmap::setOffset(): buflen = %u", buflen);
97 qDebug(
"TrackPixmap::setOffset(): min_buffer : %u",
99 qDebug(
"TrackPixmap::setOffset(): max_buffer : %u",
104 if (( offset % static_cast<sample_index_t>(ceil(
m_zoom))) !=
107 #ifdef CURRENTLY_UNUSED 109 qWarning(
"TrackPixmap::setOffset(): oh nooo, "\
110 "offset %u is misaligned by %u sample(s), please fix this!",
112 qWarning(
"TrackPixmap::setOffset(): "\
113 "now I have to throw away the whole buffer :-((");
115 qDebug(
"TrackPixmap::setOffset(%u): "\
116 "misaligned->invalidating buffer", offset);
125 if (diff && buflen) {
127 unsigned int dst = 0;
128 while (src < buflen) {
133 while (dst < buflen)
m_valid.clearBit(dst++);
141 if (diff && buflen) {
142 int dst = buflen - 1;
143 while (dst >= diff) {
144 int src = dst - diff;
150 while (diff--)
m_valid.clearBit(dst--);
163 unsigned int dst = 0;
164 while (src < buflen) {
168 while (dst < buflen)
m_valid.clearBit(dst++);
175 int dst = buflen - 1;
176 while (dst >= diff) {
177 int src = dst - diff;
182 while (diff--)
m_valid.clearBit(dst--);
214 while (oldlen < buflen)
m_valid.clearBit(oldlen++);
222 Q_ASSERT(zoom >= 0.0);
223 if (qFuzzyCompare(zoom,
m_zoom))
return;
258 if ((old_width == width) && (old_height == height))
return;
285 if (!reader)
return false;
299 while (first < buflen) {
301 for (first = last; (first < buflen) &&
m_valid.testBit(first);
306 if (first >= buflen) {
312 for (last = first; (last < buflen) && !
m_valid[last]; ++last) {
315 if (last >= buflen) last = buflen - 1;
316 if ((last > first) && (
m_valid[last])) --last;
329 while (first <= last) {
331 floor((first + 1) * m_zoom));
336 reader->
minMax(s1, s2, min, max);
351 first, last - first + 1);
358 while (first <= last) {
365 Q_ASSERT(first >= last);
370 for (first = 0; first <
m_valid.size(); first++) {
371 if (!
m_valid[first]) qWarning(
"TrackPixmap::validateBuffer(): "\
372 "still invalid index: %u", first);
389 if (!w || !h)
return;
420 p.drawLine(0, h >> 1, w - 1, h >> 1);
422 p.drawLine(0, h >> 1, last, h >> 1);
424 p.drawLine(last, h >> 1, w, h >> 1);
471 int last_min =
Kwave::toInt(min_buffer[first] * scale_y);
472 int last_max =
Kwave::toInt(max_buffer[first] * scale_y);
473 for (
int i = first; i <= last; i++) {
480 if (min > last_max + 1) min = last_max + 1;
481 if (max + 1 < last_min) max = last_min - 1;
483 p.drawLine(i, middle - max, i, middle - min);
503 Q_ASSERT(!qFuzzyIsNull(
m_zoom));
504 if (qFuzzyIsNull(
m_zoom))
return;
534 for (k = 0; k <= N; ++k) {
536 sin((2 * k - N) * M_PI * Fg) / ((2 * k - N) * M_PI * Fg);
542 for (k = 0; k <= N; ++k)
586 sig_buffer =
new(std::nothrow)
float[width + N + 2];
587 Q_ASSERT(sig_buffer);
588 if (!sig_buffer)
return;
591 for (i = 0; i < width + N + 2; ++i)
597 sig = sig_buffer + (N / 2);
598 while (x <= width + N / 2) {
599 if ((x >= -N / 2) && (sample > 0) && (sample < buflen)) {
600 sig[x] =
static_cast<float>(sample_buffer[sample] * scale_y);
603 x = Q_LIKELY(sample >= 0) ?
612 for (i = 0; i <
width; ++i) {
613 sig = sig_buffer + (i + N);
615 for (k = 0; k <= N; ++k, --sig)
622 p.drawPolyline(points);
627 sig = sig_buffer + (N / 2);
632 if ((x >= 0) && (x < width)) {
634 points.append(QPoint(x, middle -
Kwave::toInt(sig[x])));
639 p.drawPoints(points);
651 unsigned int buflen = sample_buffer.
size();
666 sample_t value = (sample < buflen) ? sample_buffer[sample] : 0;
668 points.append(QPoint(x, middle - y));
684 y1 = ((sample) && (sample <= buflen)) ?
685 Kwave::toInt(scale_y * sample_buffer[sample - 1]) : 0.0;
686 y2 = (sample < buflen) ?
691 static_cast<float>(y2 - y1) / static_cast<float>(x2 - x1));
693 points.append(QPoint(x, middle - y));
699 p.drawPolyline(points);
702 p.setPen(Qt::darkGray);
703 p.drawPolyline(points);
707 p.drawPoints(points);
724 const int last =
m_valid.size();
725 Q_ASSERT(first <
m_valid.size());
726 Q_ASSERT(last > first);
727 m_valid.fill(
false, first, last);
750 const int last =
m_valid.size();
751 Q_ASSERT(first <
m_valid.size());
752 Q_ASSERT(last > first);
753 m_valid.fill(
false, first, last);
777 Q_ASSERT(first <
m_valid.size());
778 Q_ASSERT(last > first);
779 m_valid.fill(
false, first, last);
793 if (
m_zoom <= 0.0) length = 0;
795 if ((offset + length) <=
m_offset) {
800 unsigned int buflen =
m_valid.size();
810 if (offset >=
m_offset + static_cast<sample_index_t>(
832 if (ofs != static_cast<sample_index_t>(ceil(offset /
m_zoom)))
838 if (offset >= buflen) offset = buflen - 1;
841 if (offset + length > buflen) length = buflen - offset;
virtual int width() const
static Q_DECL_EXPORT ColorSet Disabled
void drawInterpolatedSignal(QPainter &p, int width, int middle, int height)
void slotSamplesInserted(Kwave::Track *src, sample_index_t offset, sample_index_t length)
virtual int height() const
void calculateInterpolation()
Kwave::SampleReader * openReader(Kwave::ReaderMode mode, sample_index_t left=0, sample_index_t right=SAMPLE_INDEX_MAX)
virtual void setVerticalZoom(double zoom)
TrackPixmap(Kwave::Track &track)
void setOffset(sample_index_t offset)
virtual void resize(int width, int height)
void slotSamplesDeleted(Kwave::Track *src, sample_index_t offset, sample_index_t length)
void convertOverlap(sample_index_t &offset, sample_index_t &length)
bool connect(Kwave::StreamObject &source, const char *output, Kwave::StreamObject &sink, const char *input)
Kwave::SampleArray m_sample_buffer
void seek(sample_index_t pos)
void minMax(sample_index_t first, sample_index_t last, sample_t &min, sample_t &max)
Kwave::Colors::ColorSet m_colors
QVector< double > m_interpolation_alpha
#define INTERPOLATION_ZOOM
Kwave::SampleArray m_min_buffer
#define INTERPOLATION_PRECISION
sample_index_t pixels2samples(int pixels)
int samples2pixels(sample_index_t samples)
Kwave::SampleArray m_max_buffer
void slotSamplesModified(Kwave::Track *src, sample_index_t offset, sample_index_t length)
void drawPolyLineSignal(QPainter &p, int width, int middle, int height)
int m_interpolation_order
virtual bool isModified()
unsigned int size() const
unsigned int read(Kwave::SampleArray &buffer, unsigned int dstoff, unsigned int length)
void setZoom(double zoom)
bool resize(unsigned int size) Q_REQUIRED_RESULT
static Q_DECL_EXPORT ColorSet Normal
void drawOverview(QPainter &p, int middle, int height, int first, int last)