comparison layer/WaveformLayer.cpp @ 1216:dc2af6616c83

Merge from branch 3.0-integration
author Chris Cannam
date Fri, 13 Jan 2017 10:29:50 +0000
parents 1badacff7ab2
children a34a2a25907c
comparison
equal deleted inserted replaced
1048:e8102ff5573b 1216:dc2af6616c83
17 17
18 #include "base/AudioLevel.h" 18 #include "base/AudioLevel.h"
19 #include "view/View.h" 19 #include "view/View.h"
20 #include "base/Profiler.h" 20 #include "base/Profiler.h"
21 #include "base/RangeMapper.h" 21 #include "base/RangeMapper.h"
22 #include "base/Strings.h"
23
22 #include "ColourDatabase.h" 24 #include "ColourDatabase.h"
25 #include "PaintAssistant.h"
23 26
24 #include <QPainter> 27 #include <QPainter>
25 #include <QPixmap> 28 #include <QPixmap>
26 #include <QTextStream> 29 #include <QTextStream>
27 30
324 m_cacheValid = false; 327 m_cacheValid = false;
325 emit layerParametersChanged(); 328 emit layerParametersChanged();
326 } 329 }
327 330
328 int 331 int
329 WaveformLayer::getCompletion(View *) const 332 WaveformLayer::getCompletion(LayerGeometryProvider *) const
330 { 333 {
331 int completion = 100; 334 int completion = 100;
332 if (!m_model || !m_model->isOK()) return completion; 335 if (!m_model || !m_model->isOK()) return completion;
333 if (m_model->isReady(&completion)) return 100; 336 if (m_model->isReady(&completion)) return 100;
334 return completion; 337 return completion;
397 400
398 return channels; 401 return channels;
399 } 402 }
400 403
401 bool 404 bool
402 WaveformLayer::isLayerScrollable(const View *) const 405 WaveformLayer::isLayerScrollable(const LayerGeometryProvider *) const
403 { 406 {
404 return !m_autoNormalize; 407 return !m_autoNormalize;
405 } 408 }
406 409
407 static float meterdbs[] = { -40, -30, -20, -15, -10, 410 static float meterdbs[] = { -40, -30, -20, -15, -10,
408 -5, -3, -2, -1, -0.5, 0 }; 411 -5, -3, -2, -1, -0.5, 0 };
409 412
410 bool 413 bool
411 WaveformLayer::getSourceFramesForX(View *v, int x, int modelZoomLevel, 414 WaveformLayer::getSourceFramesForX(LayerGeometryProvider *v, int x, int modelZoomLevel,
412 sv_frame_t &f0, sv_frame_t &f1) const 415 sv_frame_t &f0, sv_frame_t &f1) const
413 { 416 {
414 sv_frame_t viewFrame = v->getFrameForX(x); 417 sv_frame_t viewFrame = v->getFrameForX(x);
415 if (viewFrame < 0) { 418 if (viewFrame < 0) {
416 f0 = 0; 419 f0 = 0;
431 434
432 return (f0 < m_model->getEndFrame()); 435 return (f0 < m_model->getEndFrame());
433 } 436 }
434 437
435 float 438 float
436 WaveformLayer::getNormalizeGain(View *v, int channel) const 439 WaveformLayer::getNormalizeGain(LayerGeometryProvider *v, int channel) const
437 { 440 {
438 sv_frame_t startFrame = v->getStartFrame(); 441 sv_frame_t startFrame = v->getStartFrame();
439 sv_frame_t endFrame = v->getEndFrame(); 442 sv_frame_t endFrame = v->getEndFrame();
440 443
441 sv_frame_t modelStart = m_model->getStartFrame(); 444 sv_frame_t modelStart = m_model->getStartFrame();
471 474
472 return float(1.0 / std::max(fabs(range.max()), fabs(range.min()))); 475 return float(1.0 / std::max(fabs(range.max()), fabs(range.min())));
473 } 476 }
474 477
475 void 478 void
476 WaveformLayer::paint(View *v, QPainter &viewPainter, QRect rect) const 479 WaveformLayer::paint(LayerGeometryProvider *v, QPainter &viewPainter, QRect rect) const
477 { 480 {
478 if (!m_model || !m_model->isOK()) { 481 if (!m_model || !m_model->isOK()) {
479 return; 482 return;
480 } 483 }
481 484
492 495
493 channels = getChannelArrangement(minChannel, maxChannel, 496 channels = getChannelArrangement(minChannel, maxChannel,
494 mergingChannels, mixingChannels); 497 mergingChannels, mixingChannels);
495 if (channels == 0) return; 498 if (channels == 0) return;
496 499
497 int w = v->width(); 500 int w = v->getPaintWidth();
498 int h = v->height(); 501 int h = v->getPaintHeight();
499 502
500 bool ready = m_model->isReady(); 503 bool ready = m_model->isReady();
501 QPainter *paint; 504 QPainter *paint;
502 505
503 if (m_aggressive) { 506 if (m_aggressive) {
557 x1 = rect.right(); 560 x1 = rect.right();
558 y0 = rect.top(); 561 y0 = rect.top();
559 y1 = rect.bottom(); 562 y1 = rect.bottom();
560 563
561 if (x0 > 0) --x0; 564 if (x0 > 0) --x0;
562 if (x1 < v->width()) ++x1; 565 if (x1 < w) ++x1;
563 566
564 // Our zoom level may differ from that at which the underlying 567 // Our zoom level may differ from that at which the underlying
565 // model has its blocks. 568 // model has its blocks.
566 569
567 // Each pixel within our visible range must always draw from 570 // Each pixel within our visible range must always draw from
943 paint->restore(); 946 paint->restore();
944 } 947 }
945 948
946 if (m_aggressive) { 949 if (m_aggressive) {
947 950
948 if (ready && rect == v->rect()) { 951 if (ready && rect == v->getPaintRect()) {
949 m_cacheValid = true; 952 m_cacheValid = true;
950 m_cacheZoomLevel = zoomLevel; 953 m_cacheZoomLevel = zoomLevel;
951 } 954 }
952 paint->end(); 955 paint->end();
953 delete paint; 956 delete paint;
957 if (otherChannelRanges != ranges) delete otherChannelRanges; 960 if (otherChannelRanges != ranges) delete otherChannelRanges;
958 delete ranges; 961 delete ranges;
959 } 962 }
960 963
961 QString 964 QString
962 WaveformLayer::getFeatureDescription(View *v, QPoint &pos) const 965 WaveformLayer::getFeatureDescription(LayerGeometryProvider *v, QPoint &pos) const
963 { 966 {
964 int x = pos.x(); 967 int x = pos.x();
965 968
966 if (!m_model || !m_model->isOK()) return ""; 969 if (!m_model || !m_model->isOK()) return "";
967 970
1040 1043
1041 return text; 1044 return text;
1042 } 1045 }
1043 1046
1044 int 1047 int
1045 WaveformLayer::getYForValue(const View *v, double value, int channel) const 1048 WaveformLayer::getYForValue(const LayerGeometryProvider *v, double value, int channel) const
1046 { 1049 {
1047 int channels = 0, minChannel = 0, maxChannel = 0; 1050 int channels = 0, minChannel = 0, maxChannel = 0;
1048 bool mergingChannels = false, mixingChannels = false; 1051 bool mergingChannels = false, mixingChannels = false;
1049 1052
1050 channels = getChannelArrangement(minChannel, maxChannel, 1053 channels = getChannelArrangement(minChannel, maxChannel,
1051 mergingChannels, mixingChannels); 1054 mergingChannels, mixingChannels);
1052 if (channels == 0) return 0; 1055 if (channels == 0) return 0;
1053 if (maxChannel < minChannel || channel < minChannel) return 0; 1056 if (maxChannel < minChannel || channel < minChannel) return 0;
1054 1057
1055 int h = v->height(); 1058 int h = v->getPaintHeight();
1056 int m = (h / channels) / 2; 1059 int m = (h / channels) / 2;
1057 1060
1058 if ((m_scale == dBScale || m_scale == MeterScale) && 1061 if ((m_scale == dBScale || m_scale == MeterScale) &&
1059 m_channelMode != MergeChannels) { 1062 m_channelMode != MergeChannels) {
1060 m = (h / channels); 1063 m = (h / channels);
1083 1086
1084 return my - vy; 1087 return my - vy;
1085 } 1088 }
1086 1089
1087 double 1090 double
1088 WaveformLayer::getValueForY(const View *v, int y, int &channel) const 1091 WaveformLayer::getValueForY(const LayerGeometryProvider *v, int y, int &channel) const
1089 { 1092 {
1090 int channels = 0, minChannel = 0, maxChannel = 0; 1093 int channels = 0, minChannel = 0, maxChannel = 0;
1091 bool mergingChannels = false, mixingChannels = false; 1094 bool mergingChannels = false, mixingChannels = false;
1092 1095
1093 channels = getChannelArrangement(minChannel, maxChannel, 1096 channels = getChannelArrangement(minChannel, maxChannel,
1094 mergingChannels, mixingChannels); 1097 mergingChannels, mixingChannels);
1095 if (channels == 0) return 0; 1098 if (channels == 0) return 0;
1096 if (maxChannel < minChannel) return 0; 1099 if (maxChannel < minChannel) return 0;
1097 1100
1098 int h = v->height(); 1101 int h = v->getPaintHeight();
1099 int m = (h / channels) / 2; 1102 int m = (h / channels) / 2;
1100 1103
1101 if ((m_scale == dBScale || m_scale == MeterScale) && 1104 if ((m_scale == dBScale || m_scale == MeterScale) &&
1102 m_channelMode != MergeChannels) { 1105 m_channelMode != MergeChannels) {
1103 m = (h / channels); 1106 m = (h / channels);
1129 1132
1130 return value / m_gain; 1133 return value / m_gain;
1131 } 1134 }
1132 1135
1133 bool 1136 bool
1134 WaveformLayer::getYScaleValue(const View *v, int y, 1137 WaveformLayer::getYScaleValue(const LayerGeometryProvider *v, int y,
1135 double &value, QString &unit) const 1138 double &value, QString &unit) const
1136 { 1139 {
1137 int channel; 1140 int channel;
1138 1141
1139 value = getValueForY(v, y, channel); 1142 value = getValueForY(v, y, channel);
1155 1158
1156 return true; 1159 return true;
1157 } 1160 }
1158 1161
1159 bool 1162 bool
1160 WaveformLayer::getYScaleDifference(const View *v, int y0, int y1, 1163 WaveformLayer::getYScaleDifference(const LayerGeometryProvider *v, int y0, int y1,
1161 double &diff, QString &unit) const 1164 double &diff, QString &unit) const
1162 { 1165 {
1163 int c0, c1; 1166 int c0, c1;
1164 double v0 = getValueForY(v, y0, c0); 1167 double v0 = getValueForY(v, y0, c0);
1165 double v1 = getValueForY(v, y1, c1); 1168 double v1 = getValueForY(v, y1, c1);
1193 1196
1194 return true; 1197 return true;
1195 } 1198 }
1196 1199
1197 int 1200 int
1198 WaveformLayer::getVerticalScaleWidth(View *, bool, QPainter &paint) const 1201 WaveformLayer::getVerticalScaleWidth(LayerGeometryProvider *, bool, QPainter &paint) const
1199 { 1202 {
1200 if (m_scale == LinearScale) { 1203 if (m_scale == LinearScale) {
1201 return paint.fontMetrics().width("0.0") + 13; 1204 return paint.fontMetrics().width("0.0") + 13;
1202 } else { 1205 } else {
1203 return std::max(paint.fontMetrics().width(tr("0dB")), 1206 return std::max(paint.fontMetrics().width(tr("0dB")),
1204 paint.fontMetrics().width(tr("-Inf"))) + 13; 1207 paint.fontMetrics().width(Strings::minus_infinity)) + 13;
1205 } 1208 }
1206 } 1209 }
1207 1210
1208 void 1211 void
1209 WaveformLayer::paintVerticalScale(View *v, bool, QPainter &paint, QRect rect) const 1212 WaveformLayer::paintVerticalScale(LayerGeometryProvider *v, bool, QPainter &paint, QRect rect) const
1210 { 1213 {
1211 if (!m_model || !m_model->isOK()) { 1214 if (!m_model || !m_model->isOK()) {
1212 return; 1215 return;
1213 } 1216 }
1214 1217
1253 case MeterScale: 1256 case MeterScale:
1254 val = AudioLevel::dB_to_multiplier(meterdbs[i]) * gain; 1257 val = AudioLevel::dB_to_multiplier(meterdbs[i]) * gain;
1255 text = QString("%1").arg(meterdbs[i]); 1258 text = QString("%1").arg(meterdbs[i]);
1256 if (i == n) text = tr("0dB"); 1259 if (i == n) text = tr("0dB");
1257 if (i == 0) { 1260 if (i == 0) {
1258 text = tr("-Inf"); 1261 text = Strings::minus_infinity;
1259 val = 0.0; 1262 val = 0.0;
1260 } 1263 }
1261 break; 1264 break;
1262 1265
1263 case dBScale: 1266 case dBScale:
1264 val = AudioLevel::dB_to_multiplier(-(10*n) + i * 10) * gain; 1267 val = AudioLevel::dB_to_multiplier(-(10*n) + i * 10) * gain;
1265 text = QString("%1").arg(-(10*n) + i * 10); 1268 text = QString("%1").arg(-(10*n) + i * 10);
1266 if (i == n) text = tr("0dB"); 1269 if (i == n) text = tr("0dB");
1267 if (i == 0) { 1270 if (i == 0) {
1268 text = tr("-Inf"); 1271 text = Strings::minus_infinity;
1269 val = 0.0; 1272 val = 0.0;
1270 } 1273 }
1271 break; 1274 break;
1272 } 1275 }
1273 1276