1 // Copyright (c) Charles J. Cliffe
2 // SPDX-License-Identifier: GPL-2.0+
3
4 #include "ScopePanel.h"
5 #include "ColorTheme.h"
6
ScopePanel()7 ScopePanel::ScopePanel() : GLPanel(), scopeMode(SCOPE_MODE_Y) {
8 setFill(GLPanelFillType::GLPANEL_FILL_NONE);
9 bgPanel.setFill(GLPanelFillType::GLPANEL_FILL_GRAD_BAR_Y);
10 bgPanelStereo[0].setFill(GLPanelFillType::GLPANEL_FILL_GRAD_BAR_Y);
11 bgPanelStereo[0].setPosition(0, 0.5);
12 bgPanelStereo[0].setSize(1, 0.5);
13 bgPanelStereo[1].setFill(GLPanelFillType::GLPANEL_FILL_GRAD_BAR_Y);
14 bgPanelStereo[1].setPosition(0, -0.5);
15 bgPanelStereo[1].setSize(1, 0.5);
16 }
17
setMode(ScopeMode scopeMode_in)18 void ScopePanel::setMode(ScopeMode scopeMode_in) {
19 scopeMode = scopeMode_in;
20 }
21
getMode()22 ScopePanel::ScopeMode ScopePanel::getMode() {
23 return this->scopeMode;
24 }
25
setPoints(std::vector<float> & points_in)26 void ScopePanel::setPoints(std::vector<float> &points_in) {
27 points.assign(points_in.begin(), points_in.end());
28 }
29
drawPanelContents()30 void ScopePanel::drawPanelContents() {
31
32 if (scopeMode == SCOPE_MODE_Y) {
33 bgPanel.setFillColor(ThemeMgr::mgr.currentTheme->scopeBackground, ThemeMgr::mgr.currentTheme->scopeBackground * 2.0);
34 bgPanel.calcTransform(transform);
35 bgPanel.draw();
36 glLineWidth(1.0);
37 glEnable(GL_LINE_SMOOTH);
38 glLoadMatrixf(transform.to_ptr());
39 glColor3f(ThemeMgr::mgr.currentTheme->scopeLine.r * 0.35, ThemeMgr::mgr.currentTheme->scopeLine.g * 0.35,
40 ThemeMgr::mgr.currentTheme->scopeLine.b * 0.35);
41 glBegin (GL_LINES);
42 glVertex2f(-1.0, 0.0);
43 glVertex2f(1.0, 0.0);
44 glEnd();
45 } else if (scopeMode == SCOPE_MODE_2Y) {
46 bgPanelStereo[0].setFillColor(ThemeMgr::mgr.currentTheme->scopeBackground, ThemeMgr::mgr.currentTheme->scopeBackground * 2.0);
47 bgPanelStereo[1].setFillColor(ThemeMgr::mgr.currentTheme->scopeBackground, ThemeMgr::mgr.currentTheme->scopeBackground * 2.0);
48
49 bgPanelStereo[0].calcTransform(transform);
50 bgPanelStereo[0].draw();
51 bgPanelStereo[1].calcTransform(transform);
52 bgPanelStereo[1].draw();
53
54 glLineWidth(1.0);
55 glLoadMatrixf(transform.to_ptr());
56 glColor3f(ThemeMgr::mgr.currentTheme->scopeLine.r, ThemeMgr::mgr.currentTheme->scopeLine.g, ThemeMgr::mgr.currentTheme->scopeLine.b);
57 glEnable(GL_LINE_SMOOTH);
58 glBegin (GL_LINES);
59 glVertex2f(-1.0, 0.0);
60 glVertex2f(1.0, 0.0);
61 glColor3f(ThemeMgr::mgr.currentTheme->scopeLine.r * 0.35, ThemeMgr::mgr.currentTheme->scopeLine.g * 0.35,
62 ThemeMgr::mgr.currentTheme->scopeLine.b * 0.35);
63 glVertex2f(-1.0, 0.5);
64 glVertex2f(1.0, 0.5);
65 glVertex2f(-1.0, -0.5);
66 glVertex2f(1.0, -0.5);
67 glEnd();
68
69 } else if (scopeMode == SCOPE_MODE_XY) {
70 RGBA4f bg1(ThemeMgr::mgr.currentTheme->scopeBackground), bg2(ThemeMgr::mgr.currentTheme->scopeBackground * 2.0);
71 bg1.a = 0.05f;
72 bg2.a = 0.05f;
73 bgPanel.setFillColor(bg1, bg2);
74 bgPanel.calcTransform(transform);
75 bgPanel.draw();
76 glLineWidth(1.0);
77 glEnable(GL_POINT_SMOOTH);
78 glPointSize(1.0);
79 glLoadMatrixf(transform.to_ptr());
80 glColor3f(ThemeMgr::mgr.currentTheme->scopeLine.r * 0.15, ThemeMgr::mgr.currentTheme->scopeLine.g * 0.15,
81 ThemeMgr::mgr.currentTheme->scopeLine.b * 0.15);
82 }
83
84 if (!points.empty()) {
85 glEnable (GL_BLEND);
86 glEnable (GL_LINE_SMOOTH);
87 glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
88 if (scopeMode == SCOPE_MODE_XY) {
89 glBlendFunc(GL_ONE, GL_ONE);
90 } else {
91 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
92 }
93 glColor4f(ThemeMgr::mgr.currentTheme->scopeLine.r, ThemeMgr::mgr.currentTheme->scopeLine.g, ThemeMgr::mgr.currentTheme->scopeLine.b, 1.0);
94 glEnableClientState (GL_VERTEX_ARRAY);
95 glVertexPointer(2, GL_FLOAT, 0, &points[0]);
96 glLineWidth(1.5);
97 if (scopeMode == SCOPE_MODE_Y) {
98 glLoadMatrixf(bgPanel.transform.to_ptr());
99 glDrawArrays(GL_LINE_STRIP, 0, points.size() / 2);
100 } else if (scopeMode == SCOPE_MODE_2Y) {
101 glLoadMatrixf(bgPanelStereo[0].transform.to_ptr());
102 glDrawArrays(GL_LINE_STRIP, 0, points.size() / 4);
103
104 glLoadMatrixf(bgPanelStereo[1].transform.to_ptr());
105 glDrawArrays(GL_LINE_STRIP, points.size() / 4, points.size() / 4);
106 } else if (scopeMode == SCOPE_MODE_XY) {
107 glLoadMatrixf(bgPanel.transform.to_ptr());
108 glDrawArrays(GL_POINTS, 0, points.size() / 2);
109 }
110 glLineWidth(1.0);
111 glDisableClientState(GL_VERTEX_ARRAY);
112 glDisable(GL_BLEND);
113 }
114 }
115
116