annotate layer/Colour3DPlotLayer.h @ 855:57efeb75880d

Simplify some logic where loop was used with an unconditional "break" that meant it could only happen once (from coverity scan)
author Chris Cannam
date Wed, 03 Sep 2014 12:05:45 +0100
parents 2d4af227fd32
children 1757933ce5a7
rev   line source
Chris@58 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@0 2
Chris@0 3 /*
Chris@59 4 Sonic Visualiser
Chris@59 5 An audio file viewer and annotation editor.
Chris@59 6 Centre for Digital Music, Queen Mary, University of London.
Chris@182 7 This file copyright 2006 Chris Cannam and QMUL.
Chris@0 8
Chris@59 9 This program is free software; you can redistribute it and/or
Chris@59 10 modify it under the terms of the GNU General Public License as
Chris@59 11 published by the Free Software Foundation; either version 2 of the
Chris@59 12 License, or (at your option) any later version. See the file
Chris@59 13 COPYING included with this distribution for more information.
Chris@0 14 */
Chris@0 15
Chris@0 16 #ifndef _COLOUR_3D_PLOT_H_
Chris@0 17 #define _COLOUR_3D_PLOT_H_
Chris@0 18
Chris@193 19 #include "SliceableLayer.h"
Chris@0 20
Chris@128 21 #include "data/model/DenseThreeDimensionalModel.h"
Chris@0 22
Chris@0 23 class View;
Chris@0 24 class QPainter;
Chris@0 25 class QImage;
Chris@0 26
Chris@0 27 /**
Chris@0 28 * This is a view that displays dense 3-D data (time, some sort of
Chris@0 29 * binned y-axis range, value) as a colour plot with value mapped to
Chris@0 30 * colour range. Its source is a DenseThreeDimensionalModel.
Chris@0 31 *
Chris@0 32 * This was the original implementation for the spectrogram view, but
Chris@0 33 * it was replaced with a more efficient implementation that derived
Chris@0 34 * the spectrogram itself from a DenseTimeValueModel instead of using
Chris@0 35 * a three-dimensional model. This class is retained in case it
Chris@0 36 * becomes useful, but it will probably need some cleaning up if it's
Chris@0 37 * ever actually used.
Chris@0 38 */
Chris@0 39
Chris@193 40 class Colour3DPlotLayer : public SliceableLayer
Chris@0 41 {
Chris@0 42 Q_OBJECT
Chris@0 43
Chris@0 44 public:
Chris@44 45 Colour3DPlotLayer();
Chris@0 46 ~Colour3DPlotLayer();
Chris@0 47
Chris@156 48 virtual const ZoomConstraint *getZoomConstraint() const {
Chris@156 49 return m_model ? m_model->getZoomConstraint() : 0;
Chris@156 50 }
Chris@0 51 virtual const Model *getModel() const { return m_model; }
Chris@44 52 virtual void paint(View *v, QPainter &paint, QRect rect) const;
Chris@0 53
Chris@607 54 virtual int getVerticalScaleWidth(View *v, bool, QPainter &) const;
Chris@607 55 virtual void paintVerticalScale(View *v, bool, QPainter &paint, QRect rect) const;
Chris@25 56
Chris@44 57 virtual QString getFeatureDescription(View *v, QPoint &) const;
Chris@25 58
Chris@44 59 virtual bool snapToFeatureFrame(View *v, int &frame,
Chris@805 60 int &resolution,
Chris@28 61 SnapType snap) const;
Chris@24 62
Chris@475 63 virtual void setLayerDormant(const View *v, bool dormant);
Chris@475 64
Chris@44 65 virtual bool isLayerScrollable(const View *v) const;
Chris@25 66
Chris@287 67 virtual ColourSignificance getLayerColourSignificance() const {
Chris@287 68 return ColourHasMeaningfulValue;
Chris@287 69 }
Chris@183 70
Chris@0 71 void setModel(const DenseThreeDimensionalModel *model);
Chris@0 72
Chris@115 73 virtual int getCompletion(View *) const { return m_model->getCompletion(); }
Chris@24 74
Chris@0 75 virtual PropertyList getProperties() const;
Chris@0 76 virtual PropertyType getPropertyType(const PropertyName &) const;
Chris@159 77 virtual QString getPropertyLabel(const PropertyName &) const;
Chris@346 78 virtual QString getPropertyIconName(const PropertyName &) const;
Chris@159 79 virtual QString getPropertyGroupName(const PropertyName &) const;
Chris@0 80 virtual int getPropertyRangeAndValue(const PropertyName &,
Chris@216 81 int *min, int *max, int *deflt) const;
Chris@0 82 virtual QString getPropertyValueLabel(const PropertyName &,
Chris@0 83 int value) const;
Chris@534 84 virtual RangeMapper *getNewPropertyRangeMapper(const PropertyName &) const;
Chris@0 85 virtual void setProperty(const PropertyName &, int value);
Chris@197 86 virtual void setProperties(const QXmlAttributes &);
Chris@11 87
Chris@509 88 enum ColourScale {
Chris@509 89 LinearScale,
Chris@509 90 LogScale,
Chris@509 91 PlusMinusOneScale,
Chris@509 92 AbsoluteScale
Chris@509 93 };
Chris@159 94
Chris@159 95 void setColourScale(ColourScale);
Chris@159 96 ColourScale getColourScale() const { return m_colourScale; }
Chris@159 97
Chris@197 98 void setColourMap(int map);
Chris@197 99 int getColourMap() const;
Chris@197 100
Chris@534 101 /**
Chris@534 102 * Set the gain multiplier for sample values in this view.
Chris@534 103 * The default is 1.0.
Chris@534 104 */
Chris@534 105 void setGain(float gain);
Chris@534 106 float getGain() const;
Chris@534 107
Chris@531 108 enum BinScale {
Chris@531 109 LinearBinScale,
Chris@531 110 LogBinScale
Chris@531 111 };
Chris@531 112
Chris@531 113 /**
Chris@531 114 * Specify the scale for the y axis.
Chris@531 115 */
Chris@531 116 void setBinScale(BinScale);
Chris@531 117 BinScale getBinScale() const;
Chris@531 118
Chris@719 119 /**
Chris@719 120 * Normalize each column to its maximum value, independent of its
Chris@719 121 * neighbours.
Chris@719 122 */
Chris@197 123 void setNormalizeColumns(bool n);
Chris@197 124 bool getNormalizeColumns() const;
Chris@197 125
Chris@719 126 /**
Chris@719 127 * Normalize each value against the maximum in the visible region.
Chris@719 128 */
Chris@197 129 void setNormalizeVisibleArea(bool n);
Chris@197 130 bool getNormalizeVisibleArea() const;
Chris@197 131
Chris@719 132 /**
Chris@719 133 * Normalize each column to its maximum value, and then scale by
Chris@719 134 * the log of the (absolute) maximum value.
Chris@719 135 */
Chris@719 136 void setNormalizeHybrid(bool n);
Chris@719 137 bool getNormalizeHybrid() const;
Chris@719 138
Chris@357 139 void setInvertVertical(bool i);
Chris@357 140 bool getInvertVertical() const;
Chris@357 141
Chris@465 142 void setOpaque(bool i);
Chris@465 143 bool getOpaque() const;
Chris@465 144
Chris@535 145 void setSmooth(bool i);
Chris@535 146 bool getSmooth() const;
Chris@535 147
Chris@444 148 virtual bool getValueExtents(float &min, float &max,
Chris@444 149 bool &logarithmic, QString &unit) const;
Chris@444 150
Chris@444 151 virtual bool getDisplayExtents(float &min, float &max) const;
Chris@444 152 virtual bool setDisplayExtents(float min, float max);
Chris@444 153
Chris@725 154 virtual bool getYScaleValue(const View *, int /* y */,
Chris@725 155 float &/* value */, QString &/* unit */) const;
Chris@725 156
Chris@444 157 virtual int getVerticalZoomSteps(int &defaultStep) const;
Chris@444 158 virtual int getCurrentVerticalZoomStep() const;
Chris@444 159 virtual void setVerticalZoomStep(int);
Chris@444 160 virtual RangeMapper *getNewVerticalZoomRangeMapper() const;
Chris@444 161
Chris@193 162 virtual const Model *getSliceableModel() const { return m_model; }
Chris@193 163
Chris@316 164 virtual void toXml(QTextStream &stream, QString indent = "",
Chris@316 165 QString extraAttributes = "") const;
Chris@197 166
Chris@0 167 protected slots:
Chris@0 168 void cacheInvalid();
Chris@805 169 void cacheInvalid(int startFrame, int endFrame);
Chris@461 170 void modelChanged();
Chris@823 171 void modelChangedWithin(int, int);
Chris@0 172
Chris@0 173 protected:
Chris@0 174 const DenseThreeDimensionalModel *m_model; // I do not own this
Chris@0 175
Chris@0 176 mutable QImage *m_cache;
Chris@469 177 mutable QImage *m_peaksCache;
Chris@805 178 mutable int m_cacheValidStart;
Chris@805 179 mutable int m_cacheValidEnd;
Chris@98 180
Chris@159 181 ColourScale m_colourScale;
Chris@461 182 bool m_colourScaleSet;
Chris@197 183 int m_colourMap;
Chris@534 184 float m_gain;
Chris@531 185 BinScale m_binScale;
Chris@197 186 bool m_normalizeColumns;
Chris@197 187 bool m_normalizeVisibleArea;
Chris@719 188 bool m_normalizeHybrid;
Chris@357 189 bool m_invertVertical;
Chris@465 190 bool m_opaque;
Chris@535 191 bool m_smooth;
Chris@805 192 int m_peakResolution;
Chris@197 193
Chris@725 194 // Minimum and maximum bin numbers visible within the view. We
Chris@725 195 // always snap to whole bins at view edges.
Chris@444 196 int m_miny;
Chris@444 197 int m_maxy;
Chris@725 198
Chris@725 199 /**
Chris@725 200 * Return the y coordinate at which the given bin "starts"
Chris@725 201 * (i.e. at the bottom of the bin, if the given bin is an integer
Chris@725 202 * and the vertical scale is the usual way up). Bin number may be
Chris@725 203 * fractional, to obtain a position part-way through a bin.
Chris@725 204 */
Chris@725 205 float getYForBin(View *, float bin) const;
Chris@725 206
Chris@725 207 /**
Chris@725 208 * Return the bin number, possibly fractional, at the given y
Chris@725 209 * coordinate. Note that the whole numbers occur at the positions
Chris@725 210 * at which the bins "start" (i.e. the bottom of the visible bin,
Chris@725 211 * if the vertical scale is the usual way up).
Chris@725 212 */
Chris@725 213 float getBinForY(View *, float y) const;
Chris@444 214
Chris@805 215 DenseThreeDimensionalModel::Column getColumn(int col) const;
Chris@159 216
Chris@812 217 /**
Chris@812 218 * True if we have the opaque or smooth flag set, or if the cells
Chris@812 219 * are so small you can't see their borders. False for big,
Chris@812 220 * translucent cells.
Chris@812 221 */
Chris@812 222 bool shouldPaintDenseIn(const View *) const;
Chris@812 223
Chris@469 224 int getColourScaleWidth(QPainter &) const;
Chris@805 225 void fillCache(int firstBin, int lastBin) const;
Chris@469 226 void paintDense(View *v, QPainter &paint, QRect rect) const;
Chris@0 227 };
Chris@0 228
Chris@0 229 #endif