OpenGL optimisations for Tickers and gLineChart

This commit is contained in:
Mark Watkins 2011-06-16 18:18:48 +10:00
parent 623162a539
commit 36e7368dff
6 changed files with 351 additions and 232 deletions

View File

@ -29,12 +29,14 @@
<Option compiler="gcc" />
<Option projectLinkerOptionsRelation="2" />
<Compiler>
<Add option="-pg" />
<Add option="-g" />
<Add option="`wx-config --version=2.9 --cflags`" />
<Add directory="../../src/libs" />
<Add directory="../../src" />
</Compiler>
<Linker>
<Add option="-pg" />
<Add option="`wx-config --version=2.9 --libs aui,xrc,qa,html,adv,gl,core,net,base`" />
</Linker>
</Target>
@ -68,14 +70,17 @@
<Compiler>
<Add option="-march=i686" />
<Add option="-O2" />
<Add option="-pg" />
<Add option="-g" />
<Add option="-I/usr/include/freetype2" />
<Add option="`i686-pc-mingw32-wx-config --version=2.8 --cflags`" />
<Add option="`i686-pc-mingw32-wx-config --version=2.9 --cflags`" />
<Add directory="../../src/libs" />
<Add directory="../../src" />
</Compiler>
<Linker>
<Add option="-s" />
<Add option="`i686-pc-mingw32-wx-config --version=2.8 --libs gl,richtext,aui,xrc,qa,html,adv,core,xml,net,base`" />
<Add option="-pg" />
<Add option="`i686-pc-mingw32-wx-config --version=2.9 --libs gl,richtext,aui,xrc,qa,html,adv,core,xml,net,base`" />
<Add option="-lfreetype" />
<Add option="-lGLEW" />
<Add option="-lopengl32" />

View File

@ -8309,7 +8309,7 @@
1308026543 D
1308153347 /home/mark/projects/git/sleepyhead/src/version.h
1308212286 /home/mark/projects/git/sleepyhead/src/version.h
1308003040 ent of cb2ab33... Linux wx2.8 & wx2.9 builds fixed
<wx/dcbuffer.h>
@ -8341,7 +8341,7 @@
"preferences.h"
"tinyxml/tinyxml.h"
1308140971 source:/home/mark/projects/git/sleepyhead/src/SleepyHeadMain.cpp
1308160664 source:/home/mark/projects/git/sleepyhead/src/SleepyHeadMain.cpp
"wx_pch.h"
"version.h"
<wx/app.h>
@ -8362,7 +8362,7 @@
"sleeplib/profiles.h"
"sleeplib/machine_loader.h"
1308152899 source:/home/mark/projects/git/sleepyhead/src/graphs/graph.cpp
1308212184 source:/home/mark/projects/git/sleepyhead/src/graphs/graph.cpp
"freetype-gl/font-manager.h"
"freetype-gl/texture-font.h"
"graph.h"

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<CodeBlocks_layout_file>
<ActiveTarget name="Debug-wx29" />
<ActiveTarget name="Windows" />
<File name="../../src/GUIFrame.cpp" open="1" top="0" tabpos="9">
<Cursor position="6211" topLine="144" />
</File>
@ -11,7 +11,7 @@
<Cursor position="1078" topLine="44" />
</File>
<File name="../../src/SleepyHeadMain.cpp" open="1" top="0" tabpos="1">
<Cursor position="29385" topLine="793" />
<Cursor position="24248" topLine="650" />
</File>
<File name="../../src/SleepyHeadMain.h" open="1" top="0" tabpos="2">
<Cursor position="2035" topLine="47" />
@ -20,16 +20,16 @@
<Cursor position="0" topLine="0" />
</File>
<File name="../../src/graphs/gl_pbuffer.cpp" open="1" top="0" tabpos="5">
<Cursor position="5466" topLine="159" />
<Cursor position="8152" topLine="220" />
</File>
<File name="../../src/graphs/gl_pbuffer.h" open="1" top="0" tabpos="6">
<Cursor position="382" topLine="0" />
<Cursor position="644" topLine="58" />
</File>
<File name="../../src/graphs/graph.cpp" open="1" top="1" tabpos="3">
<Cursor position="44916" topLine="1656" />
<Cursor position="54702" topLine="2014" />
</File>
<File name="../../src/graphs/graph.h" open="1" top="0" tabpos="4">
<Cursor position="285" topLine="0" />
<Cursor position="10808" topLine="297" />
</File>
<File name="../../src/libs/freetype-gl/font-manager.cpp" open="0" top="0" tabpos="9">
<Cursor position="0" topLine="0" />

View File

@ -630,10 +630,150 @@ Daily::Daily(wxWindow *win,Profile *p)
Notebook->AddPage(HTMLInfo,wxT("Details"),false,wxNullBitmap);
Notebook->AddPage(EventTree,wxT("Events"),false,wxNullBitmap);
AddCPAPData(flags[0]=new FlagData(CPAP_CSR,7,1,0));
AddCPAPData(flags[1]=new FlagData(CPAP_ClearAirway,6));
AddCPAPData(flags[2]=new FlagData(CPAP_Obstructive,5));
AddCPAPData(flags[3]=new FlagData(CPAP_Hypopnea,4));
AddCPAPData(flags[4]=new FlagData(CPAP_FlowLimit,3));
AddCPAPData(flags[5]=new FlagData(CPAP_VSnore,2));
AddCPAPData(flags[6]=new FlagData(CPAP_RERA,1));
AddCPAPData(flags[7]=new FlagData(PRS1_PressurePulse,1));
AddCPAPData(flags[8]=new FlagData(PRS1_VSnore2,1));
AddCPAPData(flags[9]=new FlagData(PRS1_Unknown0E,1));
AddCPAPData(frw=new WaveData(CPAP_FlowRate));
FRW=new gGraphWindow(GraphWindow,-1,wxT("Flow Rate"),wxPoint(0,0), wxSize(600,150), wxNO_BORDER);
gLineChart *g;
FRW->AddLayer(new gYAxis(wxBLACK));
FRW->AddLayer(new gXAxis(wxBLACK));
FRW->AddLayer(new gFooBar());
FRW->AddLayer(new gLineOverlayBar(flags[0],wxGREEN2,wxT("CSR")));
FRW->AddLayer(g=new gLineChart(frw,wxBLACK,200000,true));
g->ReportEmpty(true);
FRW->AddLayer(new gLineOverlayBar(flags[7],wxRED,wxT("PR"),LOT_Dot));
FRW->AddLayer(new gLineOverlayBar(flags[6],wxYELLOW,wxT("RE")));
FRW->AddLayer(new gLineOverlayBar(flags[9],wxDARK_GREEN,wxT("U0E")));
FRW->AddLayer(new gLineOverlayBar(flags[5],wxRED,wxT("VS")));
FRW->AddLayer(new gLineOverlayBar(flags[4],wxBLACK,wxT("FL")));
FRW->AddLayer(new gLineOverlayBar(flags[3],wxBLUE,wxT("H")));
FRW->AddLayer(new gLineOverlayBar(flags[2],wxAQUA,wxT("OA")));
FRW->AddLayer(new gLineOverlayBar(flags[1],wxPURPLE,wxT("CA")));
SF=new gGraphWindow(GraphWindow,-1,wxT("Event Flags"),wxPoint(0,0), wxSize(600,180), wxNO_BORDER);
AddCPAPData(pressure_iap=new EventData(CPAP_IAP));
AddCPAPData(pressure_eap=new EventData(CPAP_EAP));
AddCPAPData(prd=new EventData(CPAP_Pressure));
PRD=new gGraphWindow(GraphWindow,-1,wxT("Pressure"),wxPoint(0,0), wxSize(600,130), wxNO_BORDER);
PRD->AddLayer(new gXAxis(wxBLACK));
PRD->AddLayer(new gYAxis(wxBLACK));
PRD->AddLayer(new gFooBar());
PRD->AddLayer(new gLineChart(prd,wxDARK_GREEN,4096,false,false,true));
PRD->AddLayer(new gLineChart(pressure_iap,wxBLUE,4096,false,true,true));
PRD->AddLayer(new gLineChart(pressure_eap,wxRED,4096,false,true,true));
AddCPAPData(leakdata=new EventData(CPAP_Leak,0));
//leakdata->ForceMinY(0);
//leakdata->ForceMaxY(120);
LEAK=new gGraphWindow(GraphWindow,-1,wxT("Leaks"),wxPoint(0,0), wxSize(600,130), wxNO_BORDER);
LEAK->AddLayer(new gXAxis(wxBLACK));
LEAK->AddLayer(new gYAxis(wxBLACK));
LEAK->AddLayer(new gFooBar());
LEAK->AddLayer(new gLineChart(leakdata,wxPURPLE,4096,false,false,false));
// SF->SetMargins(10,15,20,80);
// #endif
const int sfc=9;
SF->SetLeftMargin(SF->GetLeftMargin()+gYAxis::Margin);
SF->SetBlockZoom(true);
SF->AddLayer(new gXAxis(wxBLACK));
SF->AddLayer(new gFlagsLine(flags[9],wxDARK_GREEN,wxT("U0E"),8,sfc));
SF->AddLayer(new gFlagsLine(flags[8],wxRED,wxT("VS2"),6,sfc));
SF->AddLayer(new gFlagsLine(flags[6],wxYELLOW,wxT("RE"),7,sfc));
SF->AddLayer(new gFlagsLine(flags[5],wxRED,wxT("VS"),5,sfc));
SF->AddLayer(new gFlagsLine(flags[4],wxBLACK,wxT("FL"),4,sfc));
SF->AddLayer(new gFlagsLine(flags[3],wxBLUE,wxT("H"),3,sfc));
SF->AddLayer(new gFlagsLine(flags[2],wxAQUA,wxT("OA"),2,sfc));
SF->AddLayer(new gFlagsLine(flags[1],wxPURPLE,wxT("CA"),1,sfc));
SF->AddLayer(new gFlagsLine(flags[0],wxGREEN2,wxT("CSR"),0,sfc));
SF->AddLayer(new gFooBar(wxGREEN,wxDARK_GREY,true));
AddCPAPData(snore=new EventData(CPAP_SnoreGraph,0));
//snore->ForceMinY(0);
//snore->ForceMaxY(15);
SNORE=new gGraphWindow(GraphWindow,-1,wxT("Snore"),wxPoint(0,0), wxSize(600,130), wxNO_BORDER);
SNORE->AddLayer(new gXAxis(wxBLACK));
SNORE->AddLayer(new gYAxis(wxBLACK));
SNORE->AddLayer(new gFooBar());
SNORE->AddLayer(new gLineChart(snore,wxDARK_GREY,4096,false,false,true));
AddOXIData(pulse=new EventData(OXI_Pulse,0,65536,true));
//pulse->ForceMinY(40);
//pulse->ForceMaxY(120);
PULSE=new gGraphWindow(GraphWindow,-1,wxT("Pulse"),wxPoint(0,0), wxSize(600,130), wxNO_BORDER);
PULSE->AddLayer(new gXAxis(wxBLACK));
PULSE->AddLayer(new gYAxis(wxBLACK));
PULSE->AddLayer(new gFooBar());
PULSE->AddLayer(new gLineChart(pulse,wxRED,65536,false,false,true));
AddOXIData(spo2=new EventData(OXI_SPO2,0,65536,true));
//spo2->ForceMinY(60);
//spo2->ForceMaxY(100);
SPO2=new gGraphWindow(GraphWindow,-1,wxT("SpO2"),wxPoint(0,0), wxSize(600,130), wxNO_BORDER);
SPO2->AddLayer(new gXAxis(wxBLACK));
SPO2->AddLayer(new gYAxis(wxBLACK));
SPO2->AddLayer(new gFooBar());
SPO2->AddLayer(new gLineChart(spo2,wxBLUE,65536,false,false,true));
SPO2->LinkZoom(PULSE);
PULSE->LinkZoom(SPO2);
// #if defined(__UNIX__)
FRW->LinkZoom(SF);
FRW->LinkZoom(PRD);
FRW->LinkZoom(LEAK);
FRW->LinkZoom(SNORE);
SF->LinkZoom(FRW);
SF->LinkZoom(PRD); // Uncomment to link in more graphs.. Too slow on windows.
SF->LinkZoom(LEAK);
SF->LinkZoom(SNORE);
PRD->LinkZoom(SF);
PRD->LinkZoom(FRW);
PRD->LinkZoom(LEAK);
PRD->LinkZoom(SNORE);
LEAK->LinkZoom(SF);
LEAK->LinkZoom(FRW);
LEAK->LinkZoom(PRD);
LEAK->LinkZoom(SNORE);
SNORE->LinkZoom(SF);
SNORE->LinkZoom(FRW);
SNORE->LinkZoom(PRD);
SNORE->LinkZoom(LEAK);
AddCPAPData(tap_eap=new TAPData(CPAP_EAP));
AddCPAPData(tap_iap=new TAPData(CPAP_IAP));
AddCPAPData(tap=new TAPData(CPAP_Pressure));
TAP=new gGraphWindow(GraphWindow,-1,wxT(""),wxPoint(0,0), wxSize(600,30), wxNO_BORDER); //Time@Pressure
//TAP->SetMargins(20,15,5,50);
TAP->SetMargins(0,1,0,1);
@ -666,166 +806,37 @@ Daily::Daily(wxWindow *win,Profile *p)
l->color.push_back(*wxGREEN2);
G_AHI->AddLayer(l);
AddOXIData(pulse=new EventData(OXI_Pulse,0,65536,true));
//pulse->ForceMinY(40);
//pulse->ForceMaxY(120);
PULSE=new gGraphWindow(GraphWindow,-1,wxT("Pulse"),wxPoint(0,0), wxSize(600,130), wxNO_BORDER);
PULSE->AddLayer(new gXAxis(wxBLACK));
PULSE->AddLayer(new gYAxis(wxBLACK));
PULSE->AddLayer(new gFooBar());
PULSE->AddLayer(new gLineChart(pulse,wxRED,65536,false,false,true));
AddOXIData(spo2=new EventData(OXI_SPO2,0,65536,true));
//spo2->ForceMinY(60);
//spo2->ForceMaxY(100);
SPO2=new gGraphWindow(GraphWindow,-1,wxT("SpO2"),wxPoint(0,0), wxSize(600,130), wxNO_BORDER);
SPO2->AddLayer(new gXAxis(wxBLACK));
SPO2->AddLayer(new gYAxis(wxBLACK));
SPO2->AddLayer(new gFooBar());
SPO2->AddLayer(new gLineChart(spo2,wxBLUE,65536,false,false,true));
SPO2->LinkZoom(PULSE);
PULSE->LinkZoom(SPO2);
AddCPAPData(leakdata=new EventData(CPAP_Leak,0));
//leakdata->ForceMinY(0);
//leakdata->ForceMaxY(120);
LEAK=new gGraphWindow(GraphWindow,-1,wxT("Leaks"),wxPoint(0,0), wxSize(600,130), wxNO_BORDER);
LEAK->AddLayer(new gXAxis(wxBLACK));
LEAK->AddLayer(new gYAxis(wxBLACK));
LEAK->AddLayer(new gFooBar());
LEAK->AddLayer(new gLineChart(leakdata,wxPURPLE,4096,false,false,false));
AddCPAPData(snore=new EventData(CPAP_SnoreGraph,0));
//snore->ForceMinY(0);
//snore->ForceMaxY(15);
SNORE=new gGraphWindow(GraphWindow,-1,wxT("Snore"),wxPoint(0,0), wxSize(600,130), wxNO_BORDER);
SNORE->AddLayer(new gXAxis(wxBLACK));
SNORE->AddLayer(new gYAxis(wxBLACK));
SNORE->AddLayer(new gFooBar());
SNORE->AddLayer(new gLineChart(snore,wxDARK_GREY,4096,false,false,true));
AddCPAPData(pressure_iap=new EventData(CPAP_IAP));
AddCPAPData(pressure_eap=new EventData(CPAP_EAP));
AddCPAPData(prd=new EventData(CPAP_Pressure));
PRD=new gGraphWindow(GraphWindow,-1,wxT("Pressure"),wxPoint(0,0), wxSize(600,130), wxNO_BORDER);
PRD->AddLayer(new gXAxis(wxBLACK));
PRD->AddLayer(new gYAxis(wxBLACK));
PRD->AddLayer(new gFooBar());
PRD->AddLayer(new gLineChart(prd,wxDARK_GREEN,4096,false,false,false));
PRD->AddLayer(new gLineChart(pressure_iap,wxBLUE,4096,false,true,true));
PRD->AddLayer(new gLineChart(pressure_eap,wxRED,4096,false,true,true));
SF=new gGraphWindow(GraphWindow,-1,wxT("Event Flags"),wxPoint(0,0), wxSize(600,180), wxNO_BORDER);
// SF->SetMargins(10,15,20,80);
// #endif
const int sfc=9;
AddCPAPData(flags[0]=new FlagData(CPAP_CSR,7,1,0));
AddCPAPData(flags[1]=new FlagData(CPAP_ClearAirway,6));
AddCPAPData(flags[2]=new FlagData(CPAP_Obstructive,5));
AddCPAPData(flags[3]=new FlagData(CPAP_Hypopnea,4));
AddCPAPData(flags[4]=new FlagData(CPAP_FlowLimit,3));
AddCPAPData(flags[5]=new FlagData(CPAP_VSnore,2));
AddCPAPData(flags[6]=new FlagData(CPAP_RERA,1));
AddCPAPData(flags[7]=new FlagData(PRS1_PressurePulse,1));
AddCPAPData(flags[8]=new FlagData(PRS1_VSnore2,1));
AddCPAPData(flags[9]=new FlagData(PRS1_Unknown0E,1));
SF->SetLeftMargin(SF->GetLeftMargin()+gYAxis::Margin);
SF->SetBlockZoom(true);
SF->AddLayer(new gXAxis(wxBLACK));
SF->AddLayer(new gFlagsLine(flags[9],wxDARK_GREEN,wxT("U0E"),8,sfc));
SF->AddLayer(new gFlagsLine(flags[8],wxRED,wxT("VS2"),6,sfc));
SF->AddLayer(new gFlagsLine(flags[6],wxYELLOW,wxT("RE"),7,sfc));
SF->AddLayer(new gFlagsLine(flags[5],wxRED,wxT("VS"),5,sfc));
SF->AddLayer(new gFlagsLine(flags[4],wxBLACK,wxT("FL"),4,sfc));
SF->AddLayer(new gFlagsLine(flags[3],wxBLUE,wxT("H"),3,sfc));
SF->AddLayer(new gFlagsLine(flags[2],wxAQUA,wxT("OA"),2,sfc));
SF->AddLayer(new gFlagsLine(flags[1],wxPURPLE,wxT("CA"),1,sfc));
SF->AddLayer(new gFlagsLine(flags[0],wxGREEN2,wxT("CSR"),0,sfc));
SF->AddLayer(new gFooBar(wxGREEN,wxDARK_GREY,true));
AddCPAPData(frw=new WaveData(CPAP_FlowRate));
FRW=new gGraphWindow(GraphWindow,-1,wxT("Flow Rate"),wxPoint(0,0), wxSize(600,150), wxNO_BORDER);
gLineChart *g;
FRW->AddLayer(new gYAxis(wxBLACK));
FRW->AddLayer(new gXAxis(wxBLACK));
FRW->AddLayer(new gFooBar());
FRW->AddLayer(new gLineOverlayBar(flags[0],wxGREEN2,wxT("CSR")));
FRW->AddLayer(g=new gLineChart(frw,wxBLACK,200000,true));
g->ReportEmpty(true);
FRW->AddLayer(new gLineOverlayBar(flags[7],wxRED,wxT("PR"),LOT_Dot));
FRW->AddLayer(new gLineOverlayBar(flags[6],wxYELLOW,wxT("RE")));
FRW->AddLayer(new gLineOverlayBar(flags[9],wxDARK_GREEN,wxT("U0E")));
FRW->AddLayer(new gLineOverlayBar(flags[5],wxRED,wxT("VS")));
FRW->AddLayer(new gLineOverlayBar(flags[4],wxBLACK,wxT("FL")));
FRW->AddLayer(new gLineOverlayBar(flags[3],wxBLUE,wxT("H")));
FRW->AddLayer(new gLineOverlayBar(flags[2],wxAQUA,wxT("OA")));
FRW->AddLayer(new gLineOverlayBar(flags[1],wxPURPLE,wxT("CA")));
// #if defined(__UNIX__)
FRW->LinkZoom(SF);
FRW->LinkZoom(PRD);
FRW->LinkZoom(LEAK);
FRW->LinkZoom(SNORE);
SF->LinkZoom(FRW);
SF->LinkZoom(PRD); // Uncomment to link in more graphs.. Too slow on windows.
SF->LinkZoom(LEAK);
SF->LinkZoom(SNORE);
PRD->LinkZoom(SF);
PRD->LinkZoom(FRW);
PRD->LinkZoom(LEAK);
PRD->LinkZoom(SNORE);
LEAK->LinkZoom(SF);
LEAK->LinkZoom(FRW);
LEAK->LinkZoom(PRD);
LEAK->LinkZoom(SNORE);
SNORE->LinkZoom(SF);
SNORE->LinkZoom(FRW);
SNORE->LinkZoom(PRD);
SNORE->LinkZoom(LEAK);
G_AHI->Hide();
TAP->Hide();
TAP_IAP->Hide();
TAP_EAP->Hide();
gwSizer->Add(SF,1,wxEXPAND);
gwSizer->Add(FRW,1,wxEXPAND);
gwSizer->Add(PRD,1,wxEXPAND);
gwSizer->Add(LEAK,1,wxEXPAND);
gwSizer->Add(SNORE,1,wxEXPAND);
gwSizer->Add(TAP,1,wxEXPAND);
//gwSizer->Add(TAP,1,wxEXPAND);
gwSizer->Add(PULSE,1,wxEXPAND);
gwSizer->Add(SPO2,1,wxEXPAND);
gwSizer->Layout();
G_AHI->Hide();
TAP->Hide();
TAP_IAP->Hide();
TAP_EAP->Hide();
//fgSizer->Add(G_AHI,1,wxEXPAND);
//fgSizer->Add(TAP,1,wxEXPAND);
//fgSizer->Add(TAP_IAP,1,wxEXPAND);
//fgSizer->Add(TAP_EAP,1,wxEXPAND);
this->Connect(wxEVT_COMMAND_TREE_SEL_CHANGED, wxTreeEventHandler( Daily::OnEventTreeSelection), NULL, this);
this->Connect(wxEVT_COMMAND_TREE_SEL_CHANGED, wxTreeEventHandler(Daily::OnEventTreeSelection), NULL, this);
this->Connect(wxID_ANY, wxEVT_REFRESH_DAILY, wxCommandEventHandler(Daily::RefreshData));
//this->Connect(wxEVT_SCROLLWIN_THUMBTRACK
//EVT_SCROLLWIN_THUMBTRACK(Daily::OnWinScroll)
//this->Connect(GraphWindow->GetId(),wxEVT_SCROLLWIN_THUMBTRACK, wxScrollWinEventHandler(Daily::OnWinScroll));
Refresh();
//Update();
Refresh(); // Important. Don't change the order of the next two lines.
ResetDate();
}
@ -1245,6 +1256,7 @@ void Daily::RefreshData(wxCommandEvent& event)
html+=wxT("</table></div></body></html>");
HTMLInfo->SetPage(html);
Refresh();
event.Skip();
}
void Daily::OnSelectSession( wxCommandEvent& event )
{

View File

@ -31,6 +31,8 @@ License: LGPL
#error "OpenGL required: set wxUSE_GLCANVAS to 1 and rebuild the wx library"
#endif
//#define EXTRA_ASSERTS
extern pBuffer *buffer;
#if !wxCHECK_VERSION(2,9,0)
@ -64,15 +66,23 @@ TextMarkup *markup=NULL;
// Must be called from a thread inside the application.
void GraphInit()
{
#if defined(__WXMSW__)
static bool glewinit_called=false;
if (!glewinit_called) {
glewInit(); // Dont forget this nasty little sucker.. :)
glewinit_called=true;
}
#endif
if (!gfont_init) {
#if defined(__WXMSW__)
if (!glewinit_called) {
glewInit(); // Dont forget this nasty little sucker.. :)
glewinit_called=true;
}
#endif
wxString glvendor=wxString((char *)glGetString(GL_VENDOR),wxConvUTF8);
wxString glrenderer=wxString((char *)glGetString(GL_RENDERER),wxConvUTF8);
wxString glversion=wxString((char *)glGetString(GL_VERSION),wxConvUTF8);
wxLogDebug(wxT("GLInfo: ")+glvendor+wxT(" ")+glrenderer+wxT(" ")+glversion);
if (!glGenBuffers) {
wxLogError(wxT("Sorry, your computers graphics card drivers are too old to run this program.\n")+glvendor+wxT(" may have an update"));
abort();
}
font_manager=new FontManager();
vbuffer=new VertexBuffer((char *)"v3i:t2f:c4f");
zfont=font_manager->GetFromFilename(pref.Get("{home}{sep}FreeSans.ttf"),12);
@ -1336,7 +1346,7 @@ void gGraphWindow::DataChanged(gLayer *layer)
}
long l=t.GetMilliseconds().GetLo();
wxLogMessage(wxString::Format(wxT("%li"),l));
//wxLogMessage(wxString::Format(wxT("%li"),l));
if ((t==wxTimeSpan::Milliseconds(0)) && (layer!=lastlayer)) {
lastlayer=layer;
return;
@ -1435,7 +1445,6 @@ void gXAxis::Plot(gGraphWindow & w,float scrx,float scry)
//if (min_tick>10) min_tick=10;
}
//.Clip(start_px-10,start_py+height,width+20,w.GetBottomMargin());
double st3=st;
while (st3>minx) {
st3-=min_tick/10.0;
@ -1444,19 +1453,19 @@ void gXAxis::Plot(gGraphWindow & w,float scrx,float scry)
py=w.GetBottomMargin();
glLineWidth(0.25);
glColor3f(0,0,0);
const int maxverts=2048;
int vertcnt=0;
static GLfloat vertarray[maxverts+4];
for (double i=st3; i<=maxx; i+=min_tick/10.0) {
if (i<minx) continue;
//px=x2p(w,i);
px=(i-minx)*xmult+w.GetLeftMargin(); //w.GetLeftMargin()+((i - w.min_x) * xmult);
glBegin(GL_LINES);
glVertex2f(px,py);
glVertex2f(px,py-4);
glEnd();
px=(i-minx)*xmult+w.GetLeftMargin();
vertarray[vertcnt++]=px;
vertarray[vertcnt++]=py;
vertarray[vertcnt++]=px;
vertarray[vertcnt++]=py-4;
}
//st=st3;
while (st<minx) {
st+=min_tick; //10.0; // mucking with this changes the scrollyness of the ticker.
@ -1486,25 +1495,31 @@ void gXAxis::Plot(gGraphWindow & w,float scrx,float scry)
}
px=(i-minx)*xmult+w.GetLeftMargin();
glColor3f(0,0,0);
glBegin(GL_LINES);
glVertex2f(px,py);
glVertex2f(px,py-6);
glEnd();
vertarray[vertcnt++]=px;
vertarray[vertcnt++]=py;
vertarray[vertcnt++]=px;
vertarray[vertcnt++]=py-6;
GetTextExtent(fd,x,y);
// There is a wx2.8 bug in wxMSW that screws up calculating x properly.
const int offset=0;
if (!show_time) {
DrawText(fd, px-(y/2)-2, py-(x/2)-14+offset, 90.0,*wxBLACK);
DrawText(fd, px-(y/2)-2, py-(x/2)-14, 90.0,*wxBLACK);
} else {
DrawText(fd, px-(x/2), py-14-y);
}
}
// Draw the little ticks.
assert(vertcnt<maxverts);
glLineWidth(1);
glColor3f(0,0,0);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(2, GL_FLOAT, 0, vertarray);
glDrawArrays(GL_LINES, 0, vertcnt>>1);
glDisableClientState(GL_VERTEX_ARRAY); // deactivate vertex arrays after drawing
}
@ -1524,31 +1539,45 @@ gYAxis::~gYAxis()
}
void gYAxis::Plot(gGraphWindow &w,float scrx,float scry)
{
static wxColor wxDARK_GREY(0xA0,0xA0,0xA0,0xA0);
static wxPen pen1(*wxLIGHT_GREY, 1, wxDOT);
static wxPen pen2(wxDARK_GREY, 1, wxDOT);
static wxColor wxDARK_GREY(0xb8,0xb8,0xb8,0xa0);
float x,y;
int labelW=0;
double miny=w.min_y;
double maxy=w.max_y;
if (maxy==miny)
return;
if (maxy==miny) return;
if ((w.max_x-w.min_x)==0) return;
int start_px=w.GetLeftMargin();
int start_py=w.GetBottomMargin();
int width=scrx-(w.GetLeftMargin()+w.GetRightMargin());
int height=scry-(w.GetTopMargin()+w.GetBottomMargin());
int width=scrx-(w.GetRightMargin()+start_px);
int height=scry-(w.GetTopMargin()+start_py);
const wxColor & linecol1=*wxLIGHT_GREY;
const wxColor & linecol2=wxDARK_GREY;
wxString fd=wxT("0");
GetTextExtent(fd,x,y);
double max_yticksdiv=(y+15.0)/(height); // y+50 for rotated text
double max_yticks=1/max_yticksdiv;
double max_yticks=round(height / (y+15.0)); // plus spacing between lines
double yt=1/max_yticks;
double mxy=MAX(maxy,fabs(miny));
double mny=MIN(maxy,fabs(miny));
if (miny<0) mny=-mny;
if (maxy<0) mxy=-mxy;
double rxy=mxy-mny;
double ymult=height/rxy;
double min_ytick=rxy*yt;
//if (miny>=0) {
//} else {
//}
/*double max_yticks=1/max_yticksdiv;
double yy=w.max_y-w.min_y;
double ymult=height/yy;
double major_ytick=max_yticksdiv*yy;
@ -1568,25 +1597,24 @@ void gYAxis::Plot(gGraphWindow &w,float scrx,float scry)
min_ytick=60;
}
if (min_ytick<=0.25)
min_ytick=0.25;
min_ytick=0.25; */
int ty,h;
glColor3f(0,0,0);
glLineWidth(0.25);
for (float i=w.min_y; i<w.max_y; i+=min_ytick/2) {
ty=(i - w.min_y) * ymult;
h=(start_py+height)-ty;
glBegin(GL_LINES);
glVertex2f(start_px-4, h);
glVertex2f(start_px, h);
glEnd();
}
const int maxverts=2048;
int vertcnt=0;
static GLfloat vertarray[maxverts+4];
glColor4ub(linecol1.Red(),linecol1.Green(),linecol1.Blue(),linecol1.Alpha());
for (double i=w.min_y; i<w.max_y; i+=min_ytick/2) {
ty=(i - w.min_y) * ymult;
h=start_py+ty;
if (m_show_minor_lines && (i > w.min_y)) {
for (double i=miny+(min_ytick/2.0); i<maxy; i+=min_ytick) {
ty=(i - miny) * ymult;
h=(start_py+height)-ty;
vertarray[vertcnt++]=start_px-4;
vertarray[vertcnt++]=h;
vertarray[vertcnt++]=start_px;
vertarray[vertcnt++]=h;
if (m_show_minor_lines && (i > miny)) {
glBegin(GL_LINES);
glVertex2f(start_px+1, h);
glVertex2f(start_px+width, h);
@ -1594,29 +1622,39 @@ void gYAxis::Plot(gGraphWindow &w,float scrx,float scry)
}
}
for (double i=w.min_y; i<=w.max_y; i+=min_ytick) {
ty=(i - w.min_y) * ymult;
for (double i=miny; i<=maxy; i+=min_ytick) {
ty=(i - miny) * ymult;
fd=Format(i); // Override this as a function.
GetTextExtent(fd,x,y);
if (x>labelW) labelW=x;
h=start_py+ty;
DrawText(fd,start_px-8-x,h - (y / 2));
glColor3f(0,0,0);
glBegin(GL_LINES);
glVertex2f(start_px-6, h);
glVertex2f(start_px, h);
glEnd();
if (m_show_major_lines && (i > w.min_y)) {
glColor4ub(linecol1.Red(),linecol1.Green(),linecol1.Blue(),linecol1.Alpha());
vertarray[vertcnt++]=start_px-4;
vertarray[vertcnt++]=h;
vertarray[vertcnt++]=start_px;
vertarray[vertcnt++]=h;
if (m_show_major_lines && (i > miny)) {
glColor4ub(linecol2.Red(),linecol2.Green(),linecol2.Blue(),linecol2.Alpha());
glBegin(GL_LINES);
glVertex2f(start_px+1, h);
glVertex2f(start_px+width, h);
glEnd();
}
}
assert(vertcnt<maxverts);
// Draw the little ticks.
glLineWidth(1);
glColor3f(0,0,0);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(2, GL_FLOAT, 0, vertarray);
glDrawArrays(GL_LINES, 0, vertcnt>>1);
glDisableClientState(GL_VERTEX_ARRAY); // deactivate vertex arrays after drawing
}
gGraphTitle::gGraphTitle(const wxString & _title,wxOrientation o, const wxColor * color)
@ -1978,8 +2016,8 @@ void gLineChart::Plot(gGraphWindow & w,float scrx,float scry)
if (!num_points) { // No Data?
if (m_report_empty) {
wxString msg=_("No Waveform Available");
float x,y; //,descent,leading;
GetTextExtent(msg,x,y); //,largefont);//,&descent,&leading);
float x,y;
GetTextExtent(msg,x,y);
DrawText(msg,start_px+(width/2.0)-(x/2.0),start_py+(height/2.0)-(y/2.0),0,*wxDARK_GREY); //,largefont);
}
return;
@ -2000,7 +2038,12 @@ void gLineChart::Plot(gGraphWindow & w,float scrx,float scry)
glLineWidth (.25);
//glEnable(GL_LINE_SMOOTH);
//glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
glBegin (GL_LINES); //_LOOP);
const int maxverts=65536; // Resolution dependant..
int vertcnt=0;
static GLfloat vertarray[maxverts+8];
//glBegin (GL_LINES); //_LOOP);
float lastpx,lastpy;
float px,py;
@ -2014,16 +2057,18 @@ void gLineChart::Plot(gGraphWindow & w,float scrx,float scry)
bool first=true;
wxPoint2DDouble * point=data->point[n];
double sr=point[1].m_x-point[0].m_x;// Time distance between points
// Calculate the number of points to skip when too much data.
if (accel) {
sr=point[1].m_x-point[0].m_x; // Time distance between points
sfit=xx/sr;
sam=sfit/width;
if (sam<=8) { // Don't accelerate if threshold less than this.
accel=false;
sam=1;
} else {
sam/=25; // lower this number the more data is skipped over (and the faster things run)
sam/=18; // lower this number the more data is skipped over (and the faster things run)
if (sam<=1) {
sam=1;
accel=false;
@ -2042,10 +2087,37 @@ void gLineChart::Plot(gGraphWindow & w,float scrx,float scry)
int minz=width,maxz=0;
// Technically shouldn't never ever get fed reverse data.
assert(point[0].m_x < point[siz-1].m_x);
double x1=point[0].m_x;
double x2=point[siz-1].m_x;
assert(x1<x2);
int idx=0;
if (minx>x2) continue; // don't even bother this round (segments could be out of order)
if (maxx<x1) continue;
if (minx>x1) {
double j=minx-x1; // == starting min of first sample in this segment
idx=floor(j/sr);
} // else just start from the beginning
int idxend=0;
idxend=floor(xx/sr);
idxend/=sam; // devide by number of samples skips
int np=(idxend-idx)+sam;
// better to do it here than in the main loop.
if (!accel) {
np<<=2;
if (m_square_plot) np<<=1; // double it again
assert(np<maxverts);
} else {
np/=sam;
np <<=2;
assert(np<maxverts);
}
bool firstpx=true;
for (int i=0;i<siz;i+=sam) {
for (int i=idx;i<siz;i+=sam) {
if (point[i].m_x < minx) continue; // Skip stuff before the start of our data window
@ -2065,13 +2137,27 @@ void gLineChart::Plot(gGraphWindow & w,float scrx,float scry)
firstpx=false;
} else {
if (m_square_plot) {
glVertex2f(lastpx,lastpy);
glVertex2f(start_px+px,lastpy);
glVertex2f(start_px+px,lastpy);
vertarray[vertcnt++]=lastpx;
vertarray[vertcnt++]=lastpy;
vertarray[vertcnt++]=start_px+px;
vertarray[vertcnt++]=lastpy;
vertarray[vertcnt++]=start_px+px;
vertarray[vertcnt++]=lastpy;
//glVertex2f(lastpx,lastpy);
//glVertex2f(start_px+px,lastpy);
//glVertex2f(start_px+px,lastpy);
} else {
glVertex2f(lastpx,lastpy);
vertarray[vertcnt++]=lastpx;
vertarray[vertcnt++]=lastpy;
//glVertex2f(lastpx,lastpy);
}
glVertex2f(start_px+px,start_py+py);
vertarray[vertcnt++]=start_px+px;
vertarray[vertcnt++]=start_py+py;
#if defined(EXTRA_ASSERTS)
assert(vertcnt<maxverts);
#endif
//glVertex2f(start_px+px,start_py+py);
}
lastpx=start_px+px;
lastpy=start_py+py;
@ -2103,12 +2189,28 @@ void gLineChart::Plot(gGraphWindow & w,float scrx,float scry)
dp=0;
// Plot compressed accelerated vertex list
for (int i=minz;i<maxz;i++) {
glVertex2f(start_px+i+1,start_py+m_drawlist[i].x);
glVertex2f(start_px+i+1,start_py+m_drawlist[i].y);
vertarray[vertcnt++]=start_px+i+1;
vertarray[vertcnt++]=start_py+m_drawlist[i].x;
vertarray[vertcnt++]=start_px+i+1;
vertarray[vertcnt++]=start_py+m_drawlist[i].y;
#if defined(EXTRA_ASSERTS)
assert(vertcnt<maxverts);
#endif
//glVertex2f(start_px+i+1,start_py+m_drawlist[i].x);
//glVertex2f(start_px+i+1,start_py+m_drawlist[i].y);
}
}
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(2, GL_FLOAT, 0, vertarray);
glDrawArrays(GL_LINES, 0, vertcnt>>1);
// deactivate vertex arrays after drawing
glDisableClientState(GL_VERTEX_ARRAY);
}
glEnd ();
//glEnd ();
//glDisable(GL_LINE_SMOOTH);
glDisable(GL_SCISSOR_TEST);
}

View File

@ -16,14 +16,14 @@ namespace AutoVersion{
//Standard Version Type
static const long _MAJOR = 0;
static const long _MINOR = 7;
static const long _BUILD = 6158;
static const long _REVISION = 16927;
static const long _BUILD = 6244;
static const long _REVISION = 17411;
//Miscellaneous Version Types
static const long _BUILDS_COUNT = 6918;
#define _RC_FILEVERSION 0,7,6158,16927
#define _RC_FILEVERSION_STRING "0, 7, 6158, 16927\0"
static const char _FULLVERSION_STRING[] = "0.7.6158.16927";
static const long _BUILDS_COUNT = 7100;
#define _RC_FILEVERSION 0,7,6244,17411
#define _RC_FILEVERSION_STRING "0, 7, 6244, 17411\0"
static const char _FULLVERSION_STRING[] = "0.7.6244.17411";
//These values are to keep track of your versioning state, don't modify them.
static const long _BUILD_HISTORY = 0;