annotate src/Modules/Output/Graphics/GraphicsViewTime.cc @ 121:3cdaa81c3aca

- Massive refactoring to make module tree stuff work. In theory we now support configuration files again. The graphics stuff is untested as yet.
author tomwalters
date Mon, 18 Oct 2010 04:42:28 +0000
parents 18237d55e346
children a9cb396529c2
rev   line source
tomwalters@116 1 // Copyright 2006-2010, Willem van Engen, Thomas Walters
tomwalters@116 2 //
tomwalters@116 3 // AIM-C: A C++ implementation of the Auditory Image Model
tomwalters@116 4 // http://www.acousticscale.org/AIMC
tomwalters@116 5 //
tomwalters@116 6 // Licensed under the Apache License, Version 2.0 (the "License");
tomwalters@116 7 // you may not use this file except in compliance with the License.
tomwalters@116 8 // You may obtain a copy of the License at
tomwalters@116 9 //
tomwalters@116 10 // http://www.apache.org/licenses/LICENSE-2.0
tomwalters@116 11 //
tomwalters@116 12 // Unless required by applicable law or agreed to in writing, software
tomwalters@116 13 // distributed under the License is distributed on an "AS IS" BASIS,
tomwalters@116 14 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
tomwalters@116 15 // See the License for the specific language governing permissions and
tomwalters@116 16 // limitations under the License.
tomwalters@116 17
tomwalters@116 18 /*!
tomwalters@116 19 * \file
tomwalters@116 20 * \brief Time-representation graphics view
tomwalters@116 21 *
tomwalters@116 22 * \author Willem van Engen <cnbh@willem.engen.nl>
tomwalters@116 23 * \date created 2006/09/26
tomwalters@116 24 * \version \$Id: GraphicsViewTime.cpp 607 2008-06-25 00:14:14Z tom $
tomwalters@116 25 */
tomwalters@116 26
tomwalters@116 27 #include "Support/Common.h"
tomwalters@116 28
tomwalters@116 29 #include <stdio.h>
tomwalters@116 30
tomwalters@116 31 #include "Support/SignalBank.h"
tomwalters@116 32 #include "Modules/Output/Graphics/GraphicsView.h"
tomwalters@116 33 #include "Modules/Output/Graphics/GraphicsViewTime.h"
tomwalters@116 34
tom@118 35 namespace aimc {
tom@118 36
tomwalters@116 37 GraphicsViewTime::GraphicsViewTime(Parameters *pParam)
tomwalters@117 38 : GraphicsView(pParam) {
tomwalters@121 39 module_description_ = "Graphics output.";
tomwalters@121 40 module_identifier_ = "graphics_time";
tomwalters@121 41 module_type_ = "output";
tomwalters@121 42 module_version_ = "$Id: $";
tomwalters@116 43 }
tomwalters@116 44
tomwalters@116 45 GraphicsViewTime *GraphicsViewTime::Clone(GraphicsOutputDevice *pDev) {
tomwalters@117 46 GraphicsViewTime *pView = new GraphicsViewTime(m_pParam);
tomwalters@117 47 // Copy everything
tomwalters@117 48 pView->m_pAxisX->SetDisplayRange(m_pAxisX->m_fMax, m_pAxisX->m_fMin);
tomwalters@117 49 pView->m_pAxisX->SetDisplayScale(m_pAxisX->m_pScale->getType());
tomwalters@117 50 pView->m_pAxisY->SetDisplayRange(m_pAxisY->m_fMax, m_pAxisY->m_fMin);
tomwalters@117 51 pView->m_pAxisY->SetDisplayScale(m_pAxisY->m_pScale->getType());
tomwalters@117 52 pView->m_pAxisFreq->SetDisplayRange(m_pAxisFreq->m_fMax, m_pAxisFreq->m_fMin);
tomwalters@117 53 pView->m_pAxisFreq->SetDisplayScale(m_pAxisFreq->m_pScale->getType());
tomwalters@117 54 return pView;
tomwalters@116 55 }
tomwalters@116 56
tomwalters@116 57 void GraphicsViewTime::PlotAxes(const SignalBank &bank) {
tomwalters@117 58 m_pDev->gColor3f(0.0f, 0.7f, 0.7f);
tomwalters@117 59 // Vertical axis
tomwalters@117 60 m_pDev->gBeginLineStrip();
tomwalters@117 61 m_pDev->gVertex2f(m_fMarginLeft, m_fMarginBottom);
tomwalters@117 62 m_pDev->gVertex2f(m_fMarginLeft, 1.0f - m_fMarginTop);
tomwalters@117 63 m_pDev->gEnd();
tomwalters@117 64 // Horizontal axis
tomwalters@117 65 m_pDev->gBeginLineStrip();
tomwalters@117 66 m_pDev->gVertex2f(m_fMarginLeft, m_fMarginBottom);
tomwalters@117 67 m_pDev->gVertex2f(1.0f-m_fMarginRight, m_fMarginBottom);
tomwalters@117 68 m_pDev->gEnd();
tomwalters@116 69
tomwalters@117 70 if (!m_bPlotLabels)
tomwalters@117 71 return;
tomwalters@116 72
tomwalters@117 73 // Labels
tomwalters@117 74 char sTxt[80];
tomwalters@117 75 snprintf(sTxt, sizeof(sTxt) / sizeof(sTxt[0]),
tomwalters@116 76 _S("%s [%.0f..%.0f Hz, %s scale]"),
tomwalters@117 77 m_pAxisFreq->m_sLabel ? m_pAxisFreq->m_sLabel : "",
tomwalters@117 78 m_pAxisFreq->m_fMin, m_pAxisFreq->m_fMax,
tomwalters@117 79 m_pAxisFreq->m_pScale->getName());
tomwalters@117 80 m_pDev->gText2f(0.0025f, 0.35f, sTxt, true);
tom@118 81 snprintf(sTxt, sizeof(sTxt) / sizeof(sTxt[0]),
tomwalters@121 82 _S("%s [%.2f..%.2f ms, %s scale]"),
tomwalters@121 83 m_pAxisX->m_sLabel ? m_pAxisX->m_sLabel : "",
tomwalters@121 84 m_pAxisX->m_fMin,
tomwalters@121 85 m_pAxisX->m_fMax,
tomwalters@121 86 m_pAxisX->m_pScale->getName());
tom@118 87
tomwalters@117 88 m_pDev->gText2f(m_fMarginLeft, 0.0025f, sTxt, false);
tomwalters@116 89
tomwalters@117 90 // Frame time
tom@118 91 //snprintf(sTxt, sizeof(sTxt)/sizeof(sTxt[0]), _S("t=%.0f ms"),
tom@118 92 // pBank->getSampleTime(0));
tom@118 93 //m_pDev->gText2f(0.8f, 0.0025f, sTxt, false);
tomwalters@116 94 }
tomwalters@116 95
tomwalters@116 96 void GraphicsViewTime::PlotData(const vector<float> &signal,
tomwalters@116 97 float sample_rate,
tomwalters@116 98 float yOffset,
tomwalters@116 99 float height,
tomwalters@116 100 float xScale) {
tomwalters@117 101 AIM_ASSERT(xScale >= 0 && xScale <= 1);
tomwalters@117 102 AIM_ASSERT(height > 0 && height <= 1);
tomwalters@117 103 AIM_ASSERT(yOffset >= 0 && yOffset <= 1);
tomwalters@117 104 AIM_ASSERT(m_pAxisX && m_pAxisX->m_pScale);
tomwalters@117 105 AIM_ASSERT(m_pAxisY && m_pAxisY->m_pScale);
tomwalters@116 106
tomwalters@117 107 // Make sure we get time is ms as x value
tomwalters@117 108 xScale *= 1000.0 / sample_rate;
tomwalters@117 109 m_pDev->gColor3f(1.0f, 1.0f, 0.8f);
tomwalters@117 110 BeginDataStrip();
tomwalters@116 111
tomwalters@117 112 // Draw the signal.
tomwalters@117 113 float x = 0;
tomwalters@117 114 float y = 0;
tom@118 115 for (unsigned int i = 0; i < signal.size(); i++) {
tomwalters@117 116 // Find out where to draw and do so
tomwalters@117 117 x = xScale * i;
tomwalters@117 118 y = signal[i];
tomwalters@117 119 x = m_pAxisX->m_pScale->FromLinearScaled(x) + 0.5f;
tomwalters@117 120 y = m_pAxisY->m_pScale->FromLinearScaled(y);
tomwalters@116 121
tomwalters@117 122 if (x < 0.0)
tomwalters@116 123 continue;
tomwalters@116 124
tomwalters@117 125 // Now fit it into the drawing area
tomwalters@117 126 x = x * (1.0f - m_fMarginLeft - m_fMarginRight) + m_fMarginLeft; // fit inside x-axis area
tomwalters@117 127 PlotDataPoint(x, yOffset, y, height, false);
tomwalters@117 128 /* There's no point in drawing anything when x>1.0, outside of view.
tomwalters@117 129 * x is continuously increasing, so we can just stop completely. We need to
tomwalters@117 130 * plot this point however, to finish the final line. */
tomwalters@117 131 if (x > 1.0)
tomwalters@117 132 break;
tomwalters@117 133 }
tomwalters@117 134 // Redraw the last point in case it's needed
tomwalters@117 135 PlotDataPoint(x, yOffset, y, height, true);
tomwalters@116 136
tomwalters@117 137 m_pDev->gEnd();
tomwalters@116 138 }
tom@118 139 } // namespace aimc