Mercurial > hg > svgui
comparison layer/ScrollableImageCache.h @ 1043:fccee028a522 3.0-integration
Merge from branch "spectrogram-minor-refactor"
| author | Chris Cannam | 
|---|---|
| date | Thu, 04 Feb 2016 11:18:08 +0000 | 
| parents | 55ac6ac1982e | 
| children | 5144d7185fb5 | 
   comparison
  equal
  deleted
  inserted
  replaced
| 1042:cd9e76e755bf | 1043:fccee028a522 | 
|---|---|
| 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ | |
| 2 | |
| 3 /* | |
| 4 Sonic Visualiser | |
| 5 An audio file viewer and annotation editor. | |
| 6 Centre for Digital Music, Queen Mary, University of London. | |
| 7 | |
| 8 This program is free software; you can redistribute it and/or | |
| 9 modify it under the terms of the GNU General Public License as | |
| 10 published by the Free Software Foundation; either version 2 of the | |
| 11 License, or (at your option) any later version. See the file | |
| 12 COPYING included with this distribution for more information. | |
| 13 */ | |
| 14 | |
| 15 #ifndef SCROLLABLE_IMAGE_CACHE_H | |
| 16 #define SCROLLABLE_IMAGE_CACHE_H | |
| 17 | |
| 18 #include "base/BaseTypes.h" | |
| 19 | |
| 20 #include "view/LayerGeometryProvider.h" | |
| 21 | |
| 22 #include <QImage> | |
| 23 #include <QRect> | |
| 24 #include <QPainter> | |
| 25 | |
| 26 /** | |
| 27 * A cached image for a view that scrolls horizontally, primarily the | |
| 28 * spectrogram. The cache object holds an image, reports the size of | |
| 29 * the image (likely the same as the underlying view, but it's the | |
| 30 * caller's responsibility to set the size appropriately), can scroll | |
| 31 * the image, and can report and update which contiguous horizontal | |
| 32 * range of the image is valid. | |
| 33 * | |
| 34 * The only way to *update* the valid area in a cache is to draw to it | |
| 35 * using the drawImage call. | |
| 36 */ | |
| 37 class ScrollableImageCache | |
| 38 { | |
| 39 public: | |
| 40 ScrollableImageCache(const LayerGeometryProvider *v = 0) : | |
| 41 m_v(v), | |
| 42 m_left(0), | |
| 43 m_width(0), | |
| 44 m_startFrame(0), | |
| 45 m_zoomLevel(0) | |
| 46 {} | |
| 47 | |
| 48 void invalidate() { | |
| 49 m_width = 0; | |
| 50 } | |
| 51 | |
| 52 bool isValid() const { | |
| 53 return m_width > 0; | |
| 54 } | |
| 55 | |
| 56 QSize getSize() const { | |
| 57 return m_image.size(); | |
| 58 } | |
| 59 | |
| 60 void resize(QSize newSize) { | |
| 61 m_image = QImage(newSize, QImage::Format_ARGB32_Premultiplied); | |
| 62 invalidate(); | |
| 63 } | |
| 64 | |
| 65 int getValidLeft() const { | |
| 66 return m_left; | |
| 67 } | |
| 68 | |
| 69 int getValidWidth() const { | |
| 70 return m_width; | |
| 71 } | |
| 72 | |
| 73 int getValidRight() const { | |
| 74 return m_left + m_width; | |
| 75 } | |
| 76 | |
| 77 QRect getValidArea() const { | |
| 78 return QRect(m_left, 0, m_width, m_image.height()); | |
| 79 } | |
| 80 | |
| 81 int getZoomLevel() const { | |
| 82 return m_zoomLevel; | |
| 83 } | |
| 84 | |
| 85 void setZoomLevel(int zoom) { | |
| 86 m_zoomLevel = zoom; | |
| 87 invalidate(); | |
| 88 } | |
| 89 | |
| 90 sv_frame_t getStartFrame() const { | |
| 91 return m_startFrame; | |
| 92 } | |
| 93 | |
| 94 /** | |
| 95 * Set the start frame and invalidate the cache. To scroll, | |
| 96 * i.e. to set the start frame while retaining cache validity | |
| 97 * where possible, use scrollTo() instead. | |
| 98 */ | |
| 99 void setStartFrame(sv_frame_t frame) { | |
| 100 m_startFrame = frame; | |
| 101 invalidate(); | |
| 102 } | |
| 103 | |
| 104 const QImage &getImage() const { | |
| 105 return m_image; | |
| 106 } | |
| 107 | |
| 108 /** | |
| 109 * Set the new start frame for the cache, if possible also moving | |
| 110 * along any existing valid data within the cache so that it | |
| 111 * continues to be valid for the new start frame. | |
| 112 */ | |
| 113 void scrollTo(sv_frame_t newStartFrame); | |
| 114 | |
| 115 /** | |
| 116 * Take a left coordinate and width describing a region, and | |
| 117 * adjust them so that they are contiguous with the cache valid | |
| 118 * region and so that the union of the adjusted region with the | |
| 119 * cache valid region contains the supplied region. | |
| 120 */ | |
| 121 void adjustToTouchValidArea(int &left, int &width, | |
| 122 bool &isLeftOfValidArea) const; | |
| 123 /** | |
| 124 * Draw from an image onto the cache. The supplied image must have | |
| 125 * the same height as the cache and the full height is always | |
| 126 * drawn. The left and width parameters determine the target | |
| 127 * region of the cache, the imageLeft and imageWidth parameters | |
| 128 * the source region of the image. | |
| 129 */ | |
| 130 void drawImage(int left, | |
| 131 int width, | |
| 132 QImage image, | |
| 133 int imageLeft, | |
| 134 int imageWidth); | |
| 135 | |
| 136 private: | |
| 137 const LayerGeometryProvider *m_v; | |
| 138 QImage m_image; | |
| 139 int m_left; // of valid region | |
| 140 int m_width; // of valid region | |
| 141 sv_frame_t m_startFrame; | |
| 142 int m_zoomLevel; | |
| 143 }; | |
| 144 | |
| 145 #endif | 
