Mercurial > hg > svgui
comparison layer/SpectrumLayer.cpp @ 918:4fe7a09be0fe osx-retina
Many fixes for the previous stuff
| author | Chris Cannam |
|---|---|
| date | Tue, 17 Mar 2015 16:56:03 +0000 |
| parents | 94e4952a6774 |
| children | 64c2b3a4435a |
comparison
equal
deleted
inserted
replaced
| 917:77a1d42353ce | 918:4fe7a09be0fe |
|---|---|
| 384 | 384 |
| 385 return x; | 385 return x; |
| 386 } | 386 } |
| 387 | 387 |
| 388 bool | 388 bool |
| 389 SpectrumLayer::getXScaleValue(const View *v, int x, | 389 SpectrumLayer::getXScaleValue(const LayerGeometryProvider *v, int x, |
| 390 double &value, QString &unit) const | 390 double &value, QString &unit) const |
| 391 { | 391 { |
| 392 if (m_xorigins.find(v) == m_xorigins.end()) return false; | 392 if (m_xorigins.find(v) == m_xorigins.end()) return false; |
| 393 int xorigin = m_xorigins.find(v)->second; | 393 int xorigin = m_xorigins.find(v)->second; |
| 394 value = getFrequencyForX(x - xorigin, v->width() - xorigin - 1); | 394 value = getFrequencyForX(x - xorigin, v->getPaintWidth() - xorigin - 1); |
| 395 unit = "Hz"; | 395 unit = "Hz"; |
| 396 return true; | 396 return true; |
| 397 } | 397 } |
| 398 | 398 |
| 399 bool | 399 bool |
| 400 SpectrumLayer::getYScaleValue(const View *v, int y, | 400 SpectrumLayer::getYScaleValue(const LayerGeometryProvider *v, int y, |
| 401 double &value, QString &unit) const | 401 double &value, QString &unit) const |
| 402 { | 402 { |
| 403 value = getValueForY(y, v); | 403 value = getValueForY(y, v); |
| 404 | 404 |
| 405 if (m_energyScale == dBScale || m_energyScale == MeterScale) { | 405 if (m_energyScale == dBScale || m_energyScale == MeterScale) { |
| 417 | 417 |
| 418 return true; | 418 return true; |
| 419 } | 419 } |
| 420 | 420 |
| 421 bool | 421 bool |
| 422 SpectrumLayer::getYScaleDifference(const View *v, int y0, int y1, | 422 SpectrumLayer::getYScaleDifference(const LayerGeometryProvider *v, int y0, int y1, |
| 423 double &diff, QString &unit) const | 423 double &diff, QString &unit) const |
| 424 { | 424 { |
| 425 bool rv = SliceLayer::getYScaleDifference(v, y0, y1, diff, unit); | 425 bool rv = SliceLayer::getYScaleDifference(v, y0, y1, diff, unit); |
| 426 if (rv && (unit == "dBV")) unit = "dB"; | 426 if (rv && (unit == "dBV")) unit = "dB"; |
| 427 return rv; | 427 return rv; |
| 428 } | 428 } |
| 429 | 429 |
| 430 | 430 |
| 431 bool | 431 bool |
| 432 SpectrumLayer::getCrosshairExtents(View *v, QPainter &paint, | 432 SpectrumLayer::getCrosshairExtents(LayerGeometryProvider *v, QPainter &paint, |
| 433 QPoint cursorPos, | 433 QPoint cursorPos, |
| 434 std::vector<QRect> &extents) const | 434 std::vector<QRect> &extents) const |
| 435 { | 435 { |
| 436 QRect vertical(cursorPos.x(), cursorPos.y(), 1, v->height() - cursorPos.y()); | 436 QRect vertical(cursorPos.x(), cursorPos.y(), 1, v->getPaintHeight() - cursorPos.y()); |
| 437 extents.push_back(vertical); | 437 extents.push_back(vertical); |
| 438 | 438 |
| 439 QRect horizontal(0, cursorPos.y(), v->width(), 12); | 439 QRect horizontal(0, cursorPos.y(), v->getPaintWidth(), 12); |
| 440 extents.push_back(horizontal); | 440 extents.push_back(horizontal); |
| 441 | 441 |
| 442 int hoffset = 2; | 442 int hoffset = 2; |
| 443 if (m_binScale == LogBins) hoffset = 13; | 443 if (m_binScale == LogBins) hoffset = 13; |
| 444 | 444 |
| 453 paint.fontMetrics().width("-80.000 dBV") + 2, | 453 paint.fontMetrics().width("-80.000 dBV") + 2, |
| 454 paint.fontMetrics().height()); | 454 paint.fontMetrics().height()); |
| 455 extents.push_back(log); | 455 extents.push_back(log); |
| 456 | 456 |
| 457 QRect freq(cursorPos.x(), | 457 QRect freq(cursorPos.x(), |
| 458 v->height() - paint.fontMetrics().height() - hoffset, | 458 v->getPaintHeight() - paint.fontMetrics().height() - hoffset, |
| 459 paint.fontMetrics().width("123456 Hz") + 2, | 459 paint.fontMetrics().width("123456 Hz") + 2, |
| 460 paint.fontMetrics().height()); | 460 paint.fontMetrics().height()); |
| 461 extents.push_back(freq); | 461 extents.push_back(freq); |
| 462 | 462 |
| 463 int w(paint.fontMetrics().width("C#10+50c") + 2); | 463 int w(paint.fontMetrics().width("C#10+50c") + 2); |
| 464 QRect pitch(cursorPos.x() - w, | 464 QRect pitch(cursorPos.x() - w, |
| 465 v->height() - paint.fontMetrics().height() - hoffset, | 465 v->getPaintHeight() - paint.fontMetrics().height() - hoffset, |
| 466 w, | 466 w, |
| 467 paint.fontMetrics().height()); | 467 paint.fontMetrics().height()); |
| 468 extents.push_back(pitch); | 468 extents.push_back(pitch); |
| 469 | 469 |
| 470 return true; | 470 return true; |
| 471 } | 471 } |
| 472 | 472 |
| 473 void | 473 void |
| 474 SpectrumLayer::paintCrosshairs(View *v, QPainter &paint, | 474 SpectrumLayer::paintCrosshairs(LayerGeometryProvider *v, QPainter &paint, |
| 475 QPoint cursorPos) const | 475 QPoint cursorPos) const |
| 476 { | 476 { |
| 477 if (!m_sliceableModel) return; | 477 if (!m_sliceableModel) return; |
| 478 | 478 |
| 479 paint.save(); | 479 paint.save(); |
| 485 | 485 |
| 486 ColourMapper mapper(m_colourMap, 0, 1); | 486 ColourMapper mapper(m_colourMap, 0, 1); |
| 487 paint.setPen(mapper.getContrastingColour()); | 487 paint.setPen(mapper.getContrastingColour()); |
| 488 | 488 |
| 489 int xorigin = m_xorigins[v]; | 489 int xorigin = m_xorigins[v]; |
| 490 int w = v->width() - xorigin - 1; | 490 int w = v->getPaintWidth() - xorigin - 1; |
| 491 | 491 |
| 492 paint.drawLine(xorigin, cursorPos.y(), v->width(), cursorPos.y()); | 492 paint.drawLine(xorigin, cursorPos.y(), v->getPaintWidth(), cursorPos.y()); |
| 493 paint.drawLine(cursorPos.x(), cursorPos.y(), cursorPos.x(), v->height()); | 493 paint.drawLine(cursorPos.x(), cursorPos.y(), cursorPos.x(), v->getPaintHeight()); |
| 494 | 494 |
| 495 double fundamental = getFrequencyForX(cursorPos.x() - xorigin, w); | 495 double fundamental = getFrequencyForX(cursorPos.x() - xorigin, w); |
| 496 | 496 |
| 497 int hoffset = 2; | 497 int hoffset = 2; |
| 498 if (m_binScale == LogBins) hoffset = 13; | 498 if (m_binScale == LogBins) hoffset = 13; |
| 499 | 499 |
| 500 v->drawVisibleText(paint, | 500 v->drawVisibleText(paint, |
| 501 cursorPos.x() + 2, | 501 cursorPos.x() + 2, |
| 502 v->height() - 2 - hoffset, | 502 v->getPaintHeight() - 2 - hoffset, |
| 503 QString("%1 Hz").arg(fundamental), | 503 QString("%1 Hz").arg(fundamental), |
| 504 View::OutlinedText); | 504 View::OutlinedText); |
| 505 | 505 |
| 506 if (Pitch::isFrequencyInMidiRange(fundamental)) { | 506 if (Pitch::isFrequencyInMidiRange(fundamental)) { |
| 507 QString pitchLabel = Pitch::getPitchLabelForFrequency(fundamental); | 507 QString pitchLabel = Pitch::getPitchLabelForFrequency(fundamental); |
| 508 v->drawVisibleText(paint, | 508 v->drawVisibleText(paint, |
| 509 cursorPos.x() - paint.fontMetrics().width(pitchLabel) - 2, | 509 cursorPos.x() - paint.fontMetrics().width(pitchLabel) - 2, |
| 510 v->height() - 2 - hoffset, | 510 v->getPaintHeight() - 2 - hoffset, |
| 511 pitchLabel, | 511 pitchLabel, |
| 512 View::OutlinedText); | 512 View::OutlinedText); |
| 513 } | 513 } |
| 514 | 514 |
| 515 double value = getValueForY(cursorPos.y(), v); | 515 double value = getValueForY(cursorPos.y(), v); |
| 535 while (harmonic < 100) { | 535 while (harmonic < 100) { |
| 536 | 536 |
| 537 int hx = int(lrint(getXForFrequency(fundamental * harmonic, w))); | 537 int hx = int(lrint(getXForFrequency(fundamental * harmonic, w))); |
| 538 hx += xorigin; | 538 hx += xorigin; |
| 539 | 539 |
| 540 if (hx < xorigin || hx > v->width()) break; | 540 if (hx < xorigin || hx > v->getPaintWidth()) break; |
| 541 | 541 |
| 542 int len = 7; | 542 int len = 7; |
| 543 | 543 |
| 544 if (harmonic % 2 == 0) { | 544 if (harmonic % 2 == 0) { |
| 545 if (harmonic % 4 == 0) { | 545 if (harmonic % 4 == 0) { |
| 559 | 559 |
| 560 paint.restore(); | 560 paint.restore(); |
| 561 } | 561 } |
| 562 | 562 |
| 563 QString | 563 QString |
| 564 SpectrumLayer::getFeatureDescription(View *v, QPoint &p) const | 564 SpectrumLayer::getFeatureDescription(LayerGeometryProvider *v, QPoint &p) const |
| 565 { | 565 { |
| 566 if (!m_sliceableModel) return ""; | 566 if (!m_sliceableModel) return ""; |
| 567 | 567 |
| 568 int minbin = 0, maxbin = 0, range = 0; | 568 int minbin = 0, maxbin = 0, range = 0; |
| 569 QString genericDesc = SliceLayer::getFeatureDescriptionAux | 569 QString genericDesc = SliceLayer::getFeatureDescriptionAux |
| 667 (const_cast<DenseThreeDimensionalModel *>(m_sliceableModel)); | 667 (const_cast<DenseThreeDimensionalModel *>(m_sliceableModel)); |
| 668 | 668 |
| 669 double thresh = (pow(10, -6) / m_gain) * (m_windowSize / 2.0); // -60dB adj | 669 double thresh = (pow(10, -6) / m_gain) * (m_windowSize / 2.0); // -60dB adj |
| 670 | 670 |
| 671 int xorigin = getVerticalScaleWidth(v, false, paint) + 1; | 671 int xorigin = getVerticalScaleWidth(v, false, paint) + 1; |
| 672 int w = v->width() - xorigin - 1; | 672 int w = v->getPaintWidth() - xorigin - 1; |
| 673 | 673 |
| 674 int pkh = 0; | 674 int pkh = 0; |
| 675 //!!! if (m_binScale == LogBins) { | 675 //!!! if (m_binScale == LogBins) { |
| 676 pkh = 10; | 676 pkh = 10; |
| 677 //!!! } | 677 //!!! } |
| 727 | 727 |
| 728 double norm = 0.f; | 728 double norm = 0.f; |
| 729 (void)getYForValue(values[bin], v, norm); // don't need return value, need norm | 729 (void)getYForValue(values[bin], v, norm); // don't need return value, need norm |
| 730 | 730 |
| 731 paint.setPen(mapper.map(norm)); | 731 paint.setPen(mapper.map(norm)); |
| 732 paint.drawLine(xorigin + x, 0, xorigin + x, v->height() - pkh - 1); | 732 paint.drawLine(xorigin + x, 0, xorigin + x, v->getPaintHeight() - pkh - 1); |
| 733 } | 733 } |
| 734 | 734 |
| 735 paint.restore(); | 735 paint.restore(); |
| 736 } | 736 } |
| 737 | 737 |
| 747 //proposition. | 747 //proposition. |
| 748 | 748 |
| 749 // if (m_binScale == LogBins) { | 749 // if (m_binScale == LogBins) { |
| 750 | 750 |
| 751 // int pkh = 10; | 751 // int pkh = 10; |
| 752 int h = v->height(); | 752 int h = v->getPaintHeight(); |
| 753 | 753 |
| 754 // piano keyboard | 754 // piano keyboard |
| 755 //!!! should be in a new paintHorizontalScale()? | 755 //!!! should be in a new paintHorizontalScale()? |
| 756 // nice to have a piano keyboard class, of course | 756 // nice to have a piano keyboard class, of course |
| 757 | 757 |
