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