void PrimaryGLContext::drawSingleDemodLabel(const std::wstring& demodStr, float uxPos, float hPos, float xOfs, float yOfs, GLFont::Align demodAlign) { GLFont::Drawer refDrawingFont = GLFont::getFont(16, GLFont::getScaleFactor()); glColor3f(0, 0, 0); refDrawingFont.drawString(demodStr, 2.0 * (uxPos - 0.5) + xOfs, -1.0 + hPos - yOfs, demodAlign, GLFont::GLFONT_ALIGN_CENTER, 0, 0, true); glColor3f(1, 1, 1); refDrawingFont.drawString(demodStr, 2.0 * (uxPos - 0.5), -1.0 + hPos, demodAlign, GLFont::GLFONT_ALIGN_CENTER, 0, 0, true); }
void ScopeContext::DrawTunerTitles(bool ppmMode) { glLoadIdentity(); GLint vp[4]; glGetIntegerv(GL_VIEWPORT, vp); float viewHeight = (float) vp[3]; float hPos = (float) (13) / viewHeight; glColor3f(0.65f, 0.65f, 0.65f); GLFont::Drawer refDrawingFont = GLFont::getFont(12, GLFont::getScaleFactor()); //better position frequency/bandwith labels according to font scale double shiftFactor = GLFont::getScaleFactor()+0.5; refDrawingFont.drawString(ppmMode?"Device PPM":"Frequency", -0.66f, -1.0 +hPos*shiftFactor, GLFont::GLFONT_ALIGN_CENTER, GLFont::GLFONT_ALIGN_CENTER, 0, 0, true); refDrawingFont.drawString("Bandwidth", 0.0, -1.0 +hPos*shiftFactor, GLFont::GLFONT_ALIGN_CENTER, GLFont::GLFONT_ALIGN_CENTER, 0, 0, true); refDrawingFont.drawString("Center Frequency", 0.66f, -1.0 +hPos*shiftFactor, GLFont::GLFONT_ALIGN_CENTER, GLFont::GLFONT_ALIGN_CENTER, 0, 0, true); }
void TuningContext::DrawTuner(long long freq, int count, float displayPos, float displayWidth) { GLint vp[4]; glGetIntegerv( GL_VIEWPORT, vp); float viewWidth = (float) vp[2]; float viewHeight = (float) vp[3]; freqStr.str(""); freqStr << freq; std::string freqChars = freqStr.str(); int fontSize = 32; if (viewWidth < 300) { fontSize = 18; } else if (viewWidth < 500) { fontSize = 24; } if (viewHeight < 18) { fontSize = 12; } else if (viewHeight < 24) { fontSize = 16; } else if (viewHeight < 28) { fontSize = 18; } glColor3f(ThemeMgr::mgr.currentTheme->text.r, ThemeMgr::mgr.currentTheme->text.g, ThemeMgr::mgr.currentTheme->text.b); int numChars = freqChars.length(); int ofs = count - numChars; //do not zoom this one: GLFont::Drawer refDrawingFont = GLFont::getFont(fontSize); for (int i = ofs; i < count; i++) { float xpos = displayPos + (displayWidth / (float) count) * (float) i + ((displayWidth / 2.0) / (float) count); refDrawingFont.drawString(freqStr.str().substr(i - ofs, 1), xpos, 0, GLFont::GLFONT_ALIGN_CENTER, GLFont::GLFONT_ALIGN_CENTER); } glColor4f(0.65f, 0.65f, 0.65f, 0.25f); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBegin(GL_LINES); for (int i = count; i >= 0; i--) { float xpos = displayPos + (displayWidth / (float) count) * (float) i; glVertex2f(xpos, -1.0); glVertex2f(xpos, 1.0); } glEnd(); glDisable(GL_BLEND); }
void PrimaryGLContext::DrawFreqBwInfo(long long freq, int bw, RGBA4f color, long long center_freq, long long srate, bool stack, bool centerline) { if (!srate) { srate = wxGetApp().getSampleRate(); } GLint vp[4]; glGetIntegerv( GL_VIEWPORT, vp); float viewHeight = (float) vp[3]; float viewWidth = (float) vp[2]; if (center_freq == -1) { center_freq = wxGetApp().getFrequency(); } float uxPos = (float) (freq - (center_freq - srate / 2)) / (float) srate; uxPos = (uxPos - 0.5) * 2.0; std::string lastType = wxGetApp().getDemodMgr().getLastDemodulatorType(); float ofs = (float) bw / (float) srate; float ofsLeft = (lastType!="USB")?ofs:0, ofsRight = (lastType!="LSB")?ofs:0; float labelHeight = 20.0 / viewHeight; float hPos = -1.0 + (stack?(labelHeight*3.0):labelHeight); glDisable(GL_TEXTURE_2D); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glColor4f(0, 0, 0, 0.35f); glBegin(GL_QUADS); glVertex3f(uxPos - ofsLeft, hPos + labelHeight, 0.0); glVertex3f(uxPos - ofsLeft, -1.0, 0.0); glVertex3f(uxPos + ofsRight, -1.0, 0.0); glVertex3f(uxPos + ofsRight, hPos + labelHeight, 0.0); glEnd(); glBlendFunc(GL_SRC_ALPHA, GL_ONE); glColor4f(color.r, color.g, color.b, 0.1f); glBegin(GL_QUADS); glVertex3f(uxPos - ofsLeft, 1.0, 0.0); glVertex3f(uxPos - ofsLeft, -1.0, 0.0); glVertex3f(uxPos + ofsRight, -1.0, 0.0); glVertex3f(uxPos + ofsRight, 1.0, 0.0); glEnd(); if (ofs * 2.0 < 16.0 / viewWidth) { glColor4f(color.r, color.g, color.b, 0.1f); glBegin(GL_QUADS); glVertex3f(uxPos - ofsLeft, hPos + labelHeight, 0.0); glVertex3f(uxPos - ofsLeft, -1.0, 0.0); glVertex3f(uxPos + ofsRight, -1.0, 0.0); glVertex3f(uxPos + ofsRight, hPos + labelHeight, 0.0); glEnd(); } if (centerline) { glColor4f(color.r, color.g, color.b, 0.5); glBegin(GL_LINES); glVertex3f(uxPos, 1.0, 0.0); glVertex3f(uxPos, -1.0, 0.0); glEnd(); } glColor4f(1.0, 1.0, 1.0, 0.8f); std::string demodLabel = std::to_string((double)freq/1000000.0); double shadowOfsX = 4.0 / viewWidth, shadowOfsY = 2.0 / viewHeight; GLFont::Drawer refDrawingFont = GLFont::getFont(16, GLFont::getScaleFactor()); if (lastType == "USB") { glColor4f(0,0,0, 1.0); glBlendFunc(GL_ONE, GL_ZERO); refDrawingFont.drawString(demodLabel, uxPos+shadowOfsX, hPos+shadowOfsY, GLFont::GLFONT_ALIGN_LEFT, GLFont::GLFONT_ALIGN_CENTER); refDrawingFont.drawString(demodLabel, uxPos-shadowOfsX, hPos-shadowOfsY, GLFont::GLFONT_ALIGN_LEFT, GLFont::GLFONT_ALIGN_CENTER); glColor4f(color.r, color.g, color.b, 1.0); glBlendFunc(GL_SRC_ALPHA, GL_ONE); refDrawingFont.drawString(demodLabel, uxPos, hPos, GLFont::GLFONT_ALIGN_LEFT, GLFont::GLFONT_ALIGN_CENTER); } else if (lastType == "LSB") { glBlendFunc(GL_ONE, GL_ZERO); glColor4f(0,0,0, 1.0); refDrawingFont.drawString(demodLabel, uxPos+shadowOfsX, hPos+shadowOfsY, GLFont::GLFONT_ALIGN_RIGHT, GLFont::GLFONT_ALIGN_CENTER); refDrawingFont.drawString(demodLabel, uxPos-shadowOfsX, hPos-shadowOfsY, GLFont::GLFONT_ALIGN_RIGHT, GLFont::GLFONT_ALIGN_CENTER); glColor4f(color.r, color.g, color.b, 1.0); glBlendFunc(GL_SRC_ALPHA, GL_ONE); refDrawingFont.drawString(demodLabel, uxPos, hPos, GLFont::GLFONT_ALIGN_RIGHT, GLFont::GLFONT_ALIGN_CENTER); } else { glBlendFunc(GL_ONE, GL_ZERO); glColor4f(0,0,0, 1.0); glBlendFunc(GL_SRC_ALPHA, GL_ONE); refDrawingFont.drawString(demodLabel, uxPos+shadowOfsX, hPos+shadowOfsY, GLFont::GLFONT_ALIGN_CENTER, GLFont::GLFONT_ALIGN_CENTER); refDrawingFont.drawString(demodLabel, uxPos-shadowOfsX, hPos-shadowOfsY, GLFont::GLFONT_ALIGN_CENTER, GLFont::GLFONT_ALIGN_CENTER); glColor4f(color.r, color.g, color.b, 1.0); refDrawingFont.drawString(demodLabel, uxPos, hPos, GLFont::GLFONT_ALIGN_CENTER, GLFont::GLFONT_ALIGN_CENTER); } glDisable(GL_BLEND); }
void SpectrumPanel::drawPanelContents() { glDisable(GL_TEXTURE_2D); glEnable(GL_BLEND); glEnable(GL_LINE_SMOOTH); glHint( GL_LINE_SMOOTH_HINT, GL_NICEST ); glLoadMatrixf(transform * (CubicVR::mat4::translate(-1.0f, -0.75f, 0.0f) * CubicVR::mat4::scale(2.0f, 1.5f, 1.0f))); if (points.size()) { glBlendFunc(GL_SRC_ALPHA, GL_ONE); double range = ceilValue-floorValue; double ranges[3][4] = { { 90.0, 5000.0, 10.0, 100.0 }, { 20.0, 150.0, 10.0, 10.0 }, { -20.0, 30.0, 10.0, 1.0 } }; for (int i = 0; i < 3; i++) { double p = 0; double rangeMin = ranges[i][0]; double rangeMax = ranges[i][1]; double rangeTrans = ranges[i][2]; double rangeStep = ranges[i][3]; if (range >= rangeMin && range <= rangeMax) { double a = 1.0; if (range <= rangeMin+rangeTrans) { a *= (range-rangeMin)/rangeTrans; } if (range >= rangeMax-rangeTrans) { a *= (rangeTrans-(range-(rangeMax-rangeTrans)))/rangeTrans; } glColor4f(0.12f, 0.12f, 0.12f, a); glBegin(GL_LINES); for (double l = floorValue; l<=ceilValue+rangeStep; l+=rangeStep) { p += rangeStep/range; glVertex2f(0,p); glVertex2f(1,p); } glEnd(); } } glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glColor3f(ThemeMgr::mgr.currentTheme->fftLine.r, ThemeMgr::mgr.currentTheme->fftLine.g, ThemeMgr::mgr.currentTheme->fftLine.b); glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(2, GL_FLOAT, 0, &points[0]); glDrawArrays(GL_LINE_STRIP, 0, points.size() / 2); if (peak_points.size()) { glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glColor4f(0, 1.0, 0, 0.5); glVertexPointer(2, GL_FLOAT, 0, &peak_points[0]); glDrawArrays(GL_LINE_STRIP, 0, peak_points.size() / 2); } glDisableClientState(GL_VERTEX_ARRAY); } GLint vp[4]; glGetIntegerv( GL_VIEWPORT, vp); float viewHeight = (float) vp[3]; float viewWidth = (float) vp[2]; glLoadMatrixf(transform); long long leftFreq = (double) freq - ((double) bandwidth / 2.0); long long rightFreq = leftFreq + (double) bandwidth; long long hzStep = 1000000; long double mhzStep = (100000.0 / (long double) (rightFreq - leftFreq)) * 2.0; double mhzVisualStep = 0.1; std::stringstream label; label.precision(1); double fontScale = GLFont::getScaleFactor(); if (mhzStep * 0.5 * viewWidth < 40 * fontScale) { mhzStep = (250000.0 / (long double) (rightFreq - leftFreq)) * 2.0; mhzVisualStep = 0.25; if (mhzStep * 0.5 * viewWidth < 40 * fontScale) { mhzStep = (500000.0 / (long double) (rightFreq - leftFreq)) * 2.0; mhzVisualStep = 0.5; } if (mhzStep * 0.5 * viewWidth < 40 * fontScale) { mhzStep = (1000000.0 / (long double) (rightFreq - leftFreq)) * 2.0; mhzVisualStep = 1.0; } if (mhzStep * 0.5 * viewWidth < 40 * fontScale) { mhzStep = (2500000.0 / (long double) (rightFreq - leftFreq)) * 2.0; mhzVisualStep = 2.5; } if (mhzStep * 0.5 * viewWidth < 40 * fontScale) { mhzStep = (5000000.0 / (long double) (rightFreq - leftFreq)) * 2.0; mhzVisualStep = 5.0; } if (mhzStep * 0.5 * viewWidth < 40 * fontScale) { mhzStep = (10000000.0 / (long double) (rightFreq - leftFreq)) * 2.0; mhzVisualStep = 10.0; } if (mhzStep * 0.5 * viewWidth < 40 * fontScale) { mhzStep = (50000000.0 / (long double) (rightFreq - leftFreq)) * 2.0; mhzVisualStep = 50.0; } } else if (mhzStep * 0.5 * viewWidth > 350 * fontScale) { mhzStep = (10000.0 / (long double) (rightFreq - leftFreq)) * 2.0; mhzVisualStep = 0.01; label.precision(2); } long long firstMhz = (leftFreq / hzStep) * hzStep; long double mhzStart = ((long double) (firstMhz - leftFreq) / (long double) (rightFreq - leftFreq)) * 2.0; long double currentMhz = trunc(floor(firstMhz / (long double)1000000.0)); double hPos = 1.0 - (16.0 / viewHeight) * GLFont::getScaleFactor(); double lMhzPos = 1.0 - (5.0 / viewHeight); int fontSize = 12; if (viewHeight > 135) { fontSize = 16; hPos = 1.0 - (18.0 / viewHeight) * GLFont::getScaleFactor(); } GLFont::Drawer refDrawingFont = GLFont::getFont(fontSize, GLFont::getScaleFactor()); for (double m = -1.0 + mhzStart, mMax = 1.0 + ((mhzStart>0)?mhzStart:-mhzStart); m <= mMax; m += mhzStep) { if (m < -1.0) { currentMhz += mhzVisualStep; continue; } if (m > 1.0) { break; } label << std::fixed << currentMhz; double fractpart, intpart; fractpart = modf(currentMhz, &intpart); if (fractpart < 0.001) { glLineWidth(4.0); glColor3f(ThemeMgr::mgr.currentTheme->freqLine.r, ThemeMgr::mgr.currentTheme->freqLine.g, ThemeMgr::mgr.currentTheme->freqLine.b); } else { glLineWidth(1.0); glColor3f(ThemeMgr::mgr.currentTheme->freqLine.r * 0.65, ThemeMgr::mgr.currentTheme->freqLine.g * 0.65, ThemeMgr::mgr.currentTheme->freqLine.b * 0.65); } glDisable(GL_TEXTURE_2D); glBegin(GL_LINES); glVertex2f(m, lMhzPos); glVertex2f(m, 1); glEnd(); glColor4f(ThemeMgr::mgr.currentTheme->text.r, ThemeMgr::mgr.currentTheme->text.g, ThemeMgr::mgr.currentTheme->text.b,1.0); refDrawingFont.drawString(label.str(), m, hPos, GLFont::GLFONT_ALIGN_CENTER, GLFont::GLFONT_ALIGN_CENTER, 0, 0, true); label.str(std::string()); currentMhz += mhzVisualStep; } glLineWidth(1.0); if (showDb) { float dbPanelWidth = (1.0 / viewWidth)*88.0 * GLFont::getScaleFactor(); float dbPanelHeight = (1.0/viewHeight)*14.0 * GLFont::getScaleFactor(); std::stringstream ssLabel(""); if (getCeilValue() != getFloorValue() && fftSize) { ssLabel << std::fixed << std::setprecision(1) << (20.0 * log10(2.0*(getCeilValue())/(double)fftSize)) << "dB"; } dbPanelCeil.setText(ssLabel.str(), GLFont::GLFONT_ALIGN_RIGHT); dbPanelCeil.setSize(dbPanelWidth, dbPanelHeight); dbPanelCeil.setPosition(-1.0 + dbPanelWidth, 1.0 - dbPanelHeight); ssLabel.str(""); if (getCeilValue() != getFloorValue() && fftSize) { ssLabel << (20.0 * log10(2.0*(getFloorValue())/(double)fftSize)) << "dB"; } dbPanelFloor.setText(ssLabel.str(), GLFont::GLFONT_ALIGN_RIGHT); dbPanelFloor.setSize(dbPanelWidth, dbPanelHeight); dbPanelFloor.setPosition(-1.0 + dbPanelWidth, - 1.0 + dbPanelHeight); } }