Mercurial > hg > svgui
comparison layer/SpectrogramLayer.cpp @ 20:1deb5f87a18c
* Add getXForFrame / getFrameForX in preference to using the zoom level everywhere
| author | Chris Cannam |
|---|---|
| date | Mon, 30 Jan 2006 13:19:42 +0000 |
| parents | 01849cd277e6 |
| children | 3a506d25d95a |
comparison
equal
deleted
inserted
replaced
| 19:46d8f5add6f0 | 20:1deb5f87a18c |
|---|---|
| 1099 | 1099 |
| 1100 return true; | 1100 return true; |
| 1101 } | 1101 } |
| 1102 | 1102 |
| 1103 bool | 1103 bool |
| 1104 SpectrogramLayer::getXBinRange(int x, float &s0, float &s1, LayerRange *range) const | 1104 SpectrogramLayer::getXBinRange(int x, float &s0, float &s1) const |
| 1105 { | 1105 { |
| 1106 long startFrame; | 1106 // long startFrame; |
| 1107 int zoomLevel; | 1107 // int zoomLevel; |
| 1108 size_t modelStart; | 1108 size_t modelStart; |
| 1109 size_t modelEnd; | 1109 size_t modelEnd; |
| 1110 | 1110 |
| 1111 if (range) { | 1111 // startFrame = m_view->getStartFrame(); |
| 1112 startFrame = range->startFrame; | 1112 // zoomLevel = m_view->getZoomLevel(); |
| 1113 zoomLevel = range->zoomLevel; | 1113 modelStart = m_model->getStartFrame(); |
| 1114 modelStart = range->modelStart; | 1114 modelEnd = m_model->getEndFrame(); |
| 1115 modelEnd = range->modelEnd; | |
| 1116 } else { | |
| 1117 startFrame = m_view->getStartFrame(); | |
| 1118 zoomLevel = m_view->getZoomLevel(); | |
| 1119 modelStart = m_model->getStartFrame(); | |
| 1120 modelEnd = m_model->getEndFrame(); | |
| 1121 } | |
| 1122 | 1115 |
| 1123 // Each pixel column covers an exact range of sample frames: | 1116 // Each pixel column covers an exact range of sample frames: |
| 1117 int f0 = getFrameForX(x) - modelStart; | |
| 1118 int f1 = getFrameForX(x + 1) - modelStart - 1; | |
| 1119 | |
| 1120 /* | |
| 1124 int f0 = startFrame + x * zoomLevel - modelStart; | 1121 int f0 = startFrame + x * zoomLevel - modelStart; |
| 1125 int f1 = f0 + zoomLevel - 1; | 1122 int f1 = f0 + zoomLevel - 1; |
| 1126 | 1123 */ |
| 1127 if (f1 < int(modelStart) || f0 > int(modelEnd)) return false; | 1124 if (f1 < int(modelStart) || f0 > int(modelEnd)) return false; |
| 1128 | 1125 |
| 1129 // And that range may be drawn from a possibly non-integral | 1126 // And that range may be drawn from a possibly non-integral |
| 1130 // range of spectrogram windows: | 1127 // range of spectrogram windows: |
| 1131 | 1128 |
| 1132 size_t windowIncrement = getWindowIncrement(); | 1129 size_t windowIncrement = getWindowIncrement(); |
| 1133 | 1130 |
| 1288 | 1285 |
| 1289 if (int(m_pixmapCacheZoomLevel) == zoomLevel && | 1286 if (int(m_pixmapCacheZoomLevel) == zoomLevel && |
| 1290 m_pixmapCache->width() == m_view->width() && | 1287 m_pixmapCache->width() == m_view->width() && |
| 1291 m_pixmapCache->height() == m_view->height()) { | 1288 m_pixmapCache->height() == m_view->height()) { |
| 1292 | 1289 |
| 1293 if (m_pixmapCacheStartFrame / zoomLevel == | 1290 if (getXForFrame(m_pixmapCacheStartFrame) == |
| 1294 startFrame / zoomLevel) { | 1291 getXForFrame(startFrame)) { |
| 1295 | 1292 |
| 1296 #ifdef DEBUG_SPECTROGRAM_REPAINT | 1293 #ifdef DEBUG_SPECTROGRAM_REPAINT |
| 1297 std::cerr << "SpectrogramLayer: pixmap cache good" << std::endl; | 1294 std::cerr << "SpectrogramLayer: pixmap cache good" << std::endl; |
| 1298 #endif | 1295 #endif |
| 1299 | 1296 |
| 1307 std::cerr << "SpectrogramLayer: pixmap cache partially OK" << std::endl; | 1304 std::cerr << "SpectrogramLayer: pixmap cache partially OK" << std::endl; |
| 1308 #endif | 1305 #endif |
| 1309 | 1306 |
| 1310 recreateWholePixmapCache = false; | 1307 recreateWholePixmapCache = false; |
| 1311 | 1308 |
| 1312 int dx = (m_pixmapCacheStartFrame - startFrame) / zoomLevel; | 1309 int dx = getXForFrame(m_pixmapCacheStartFrame) - |
| 1310 getXForFrame(startFrame); | |
| 1313 | 1311 |
| 1314 #ifdef DEBUG_SPECTROGRAM_REPAINT | 1312 #ifdef DEBUG_SPECTROGRAM_REPAINT |
| 1315 std::cerr << "SpectrogramLayer: dx = " << dx << " (pixmap cache " << m_pixmapCache->width() << "x" << m_pixmapCache->height() << ")" << std::endl; | 1313 std::cerr << "SpectrogramLayer: dx = " << dx << " (pixmap cache " << m_pixmapCache->width() << "x" << m_pixmapCache->height() << ")" << std::endl; |
| 1316 #endif | 1314 #endif |
| 1317 | 1315 |
| 1375 | 1373 |
| 1376 // std::cerr << "x0 " << x0 << ", x1 " << x1 << ", w " << w << ", h " << h << std::endl; | 1374 // std::cerr << "x0 " << x0 << ", x1 " << x1 << ", w " << w << ", h " << h << std::endl; |
| 1377 | 1375 |
| 1378 QImage scaled(w, h, QImage::Format_RGB32); | 1376 QImage scaled(w, h, QImage::Format_RGB32); |
| 1379 | 1377 |
| 1380 LayerRange range = { m_view->getStartFrame(), m_view->getZoomLevel(), | |
| 1381 m_model->getStartFrame(), m_model->getEndFrame() }; | |
| 1382 | |
| 1383 m_mutex.unlock(); | 1378 m_mutex.unlock(); |
| 1384 | 1379 |
| 1385 for (int y = 0; y < h; ++y) { | 1380 for (int y = 0; y < h; ++y) { |
| 1386 | 1381 |
| 1387 m_mutex.lock(); | 1382 m_mutex.lock(); |
| 1409 | 1404 |
| 1410 for (int x = 0; x < w; ++x) { | 1405 for (int x = 0; x < w; ++x) { |
| 1411 | 1406 |
| 1412 float s0 = 0, s1 = 0; | 1407 float s0 = 0, s1 = 0; |
| 1413 | 1408 |
| 1414 if (!getXBinRange(x0 + x, s0, s1, &range)) { | 1409 if (!getXBinRange(x0 + x, s0, s1)) { |
| 1415 assert(x <= scaled.width()); | 1410 assert(x <= scaled.width()); |
| 1416 scaled.setPixel(x, y, qRgb(0, 0, 0)); | 1411 scaled.setPixel(x, y, qRgb(0, 0, 0)); |
| 1417 continue; | 1412 continue; |
| 1418 } | 1413 } |
| 1419 | 1414 |
