comparison layer/Colour3DPlotLayer.cpp @ 1459:42c87368287c

Merge from branch single-point
author Chris Cannam
date Fri, 17 May 2019 10:02:52 +0100
parents 39f1154c0e97
children 11a150e65ee1
comparison
equal deleted inserted replaced
1441:8d5bf4ab98ef 1459:42c87368287c
145 m_model = model; 145 m_model = model;
146 if (!m_model || !m_model->isOK()) return; 146 if (!m_model || !m_model->isOK()) return;
147 147
148 connectSignals(m_model); 148 connectSignals(m_model);
149 149
150 connect(m_model, SIGNAL(modelChanged()), this, SLOT(modelChanged())); 150 connect(m_model, SIGNAL(modelChanged()),
151 this, SLOT(handleModelChanged()));
151 connect(m_model, SIGNAL(modelChangedWithin(sv_frame_t, sv_frame_t)), 152 connect(m_model, SIGNAL(modelChangedWithin(sv_frame_t, sv_frame_t)),
152 this, SLOT(modelChangedWithin(sv_frame_t, sv_frame_t))); 153 this, SLOT(handleModelChangedWithin(sv_frame_t, sv_frame_t)));
153 154
154 m_peakResolution = 256; 155 m_peakResolution = 256;
155 if (model->getResolution() > 512) { 156 if (model->getResolution() > 512) {
156 m_peakResolution = 16; 157 m_peakResolution = 16;
157 } else if (model->getResolution() > 128) { 158 } else if (model->getResolution() > 128) {
158 m_peakResolution = 64; 159 m_peakResolution = 64;
159 } else if (model->getResolution() > 2) { 160 } else if (model->getResolution() > 2) {
160 m_peakResolution = 128; 161 m_peakResolution = 128;
161 } 162 }
162 163
164 invalidatePeakCache();
165
166 emit modelReplaced();
167 emit sliceableModelReplaced(oldModel, model);
168 }
169
170 void
171 Colour3DPlotLayer::invalidatePeakCache()
172 {
173 // renderers use the peak cache, so we must invalidate those too
174 invalidateRenderers();
175 invalidateMagnitudes();
176
163 if (m_peakCache) m_peakCache->aboutToDelete(); 177 if (m_peakCache) m_peakCache->aboutToDelete();
164 delete m_peakCache; 178 delete m_peakCache;
165 m_peakCache = nullptr; 179 m_peakCache = nullptr;
166
167 invalidateRenderers();
168 invalidateMagnitudes();
169
170 emit modelReplaced();
171 emit sliceableModelReplaced(oldModel, model);
172 }
173
174 void
175 Colour3DPlotLayer::cacheInvalid()
176 {
177 invalidateRenderers();
178 invalidateMagnitudes();
179 }
180
181 void
182 Colour3DPlotLayer::cacheInvalid(sv_frame_t /* startFrame */,
183 sv_frame_t /* endFrame */)
184 {
185 //!!! should do this only if the range is visible
186 if (m_peakCache) m_peakCache->aboutToDelete();
187 delete m_peakCache;
188 m_peakCache = nullptr;
189
190 invalidateRenderers();
191 invalidateMagnitudes();
192 } 180 }
193 181
194 void 182 void
195 Colour3DPlotLayer::invalidateRenderers() 183 Colour3DPlotLayer::invalidateRenderers()
196 { 184 {
218 } 206 }
219 return m_peakCache; 207 return m_peakCache;
220 } 208 }
221 209
222 void 210 void
223 Colour3DPlotLayer::modelChanged() 211 Colour3DPlotLayer::handleModelChanged()
224 { 212 {
225 if (!m_colourScaleSet && m_colourScale == ColourScaleType::Linear) { 213 if (!m_colourScaleSet && m_colourScale == ColourScaleType::Linear) {
226 if (m_model) { 214 if (m_model) {
227 if (m_model->shouldUseLogValueScale()) { 215 if (m_model->shouldUseLogValueScale()) {
228 setColourScale(ColourScaleType::Log); 216 setColourScale(ColourScaleType::Log);
229 } else { 217 } else {
230 m_colourScaleSet = true; 218 m_colourScaleSet = true;
231 } 219 }
232 } 220 }
233 } 221 }
234 cacheInvalid(); 222 invalidatePeakCache();
235 } 223 emit modelChanged();
236 224 }
237 void 225
238 Colour3DPlotLayer::modelChangedWithin(sv_frame_t startFrame, sv_frame_t endFrame) 226 void
227 Colour3DPlotLayer::handleModelChangedWithin(sv_frame_t startFrame, sv_frame_t endFrame)
239 { 228 {
240 if (!m_colourScaleSet && m_colourScale == ColourScaleType::Linear) { 229 if (!m_colourScaleSet && m_colourScale == ColourScaleType::Linear) {
241 if (m_model && m_model->getWidth() > 50) { 230 if (m_model && m_model->getWidth() > 50) {
242 if (m_model->shouldUseLogValueScale()) { 231 if (m_model->shouldUseLogValueScale()) {
243 setColourScale(ColourScaleType::Log); 232 setColourScale(ColourScaleType::Log);
244 } else { 233 } else {
245 m_colourScaleSet = true; 234 m_colourScaleSet = true;
246 } 235 }
247 } 236 }
248 } 237 }
249 cacheInvalid(startFrame, endFrame); 238 emit modelChangedWithin(startFrame, endFrame);
250 } 239 }
251 240
252 Layer::PropertyList 241 Layer::PropertyList
253 Colour3DPlotLayer::getProperties() const 242 Colour3DPlotLayer::getProperties() const
254 { 243 {
618 Colour3DPlotLayer::getSmooth() const 607 Colour3DPlotLayer::getSmooth() const
619 { 608 {
620 return m_smooth; 609 return m_smooth;
621 } 610 }
622 611
612 bool
613 Colour3DPlotLayer::hasLightBackground() const
614 {
615 return ColourMapper(m_colourMap, m_colourInverted, 1.f, 255.f)
616 .hasLightBackground();
617 }
618
623 void 619 void
624 Colour3DPlotLayer::setLayerDormant(const LayerGeometryProvider *v, bool dormant) 620 Colour3DPlotLayer::setLayerDormant(const LayerGeometryProvider *v, bool dormant)
625 { 621 {
626 if (dormant) { 622 if (dormant) {
627 623
634 return; 630 return;
635 } 631 }
636 632
637 Layer::setLayerDormant(v, true); 633 Layer::setLayerDormant(v, true);
638 634
639 cacheInvalid(); 635 invalidatePeakCache(); // for memory-saving purposes
640 636
641 } else { 637 } else {
642 638
643 Layer::setLayerDormant(v, false); 639 Layer::setLayerDormant(v, false);
644 } 640 }
1187 sv_frame_t right = left + resolution; 1183 sv_frame_t right = left + resolution;
1188 1184
1189 switch (snap) { 1185 switch (snap) {
1190 case SnapLeft: frame = left; break; 1186 case SnapLeft: frame = left; break;
1191 case SnapRight: frame = right; break; 1187 case SnapRight: frame = right; break;
1192 case SnapNearest:
1193 case SnapNeighbouring: 1188 case SnapNeighbouring:
1194 if (frame - left > right - frame) frame = right; 1189 if (frame - left > right - frame) frame = right;
1195 else frame = left; 1190 else frame = left;
1196 break; 1191 break;
1197 } 1192 }