+#ifndef GLGRAPH_H_\r
+#define GLGRAPH_H_\r
+#include "envGraph.h"\r
+#include "Displayable_A.h"\r
+#include "Viewport.h"\r
+#include "GraphObserver_I.h"\r
+#include "FigureVisitor.h"\r
+#include "Graph.h"\r
+#include "CurveParametric.h"\r
+#include "CurveAnalytic.h"\r
+\r
+#include "GLFigure.h"\r
+#include "GLGraphRunnable.h"\r
+\r
+#include <map>\r
+using std::map;\r
+\r
+#include <queue>\r
+using std::queue;\r
+\r
+#include <mutex>\r
+#include <atomic>\r
+//#include <boost/thread/mutex.hpp>\r
+//#include <boost/atomic.hpp>\r
+\r
+using std::mutex;\r
+using std::atomic;\r
+\r
+/*----------------------------------------------------------------------*\\r
+ |* Declaration *|\r
+ \*---------------------------------------------------------------------*/\r
+\r
+/*--------------------------------------*\\r
+ |* Public *|\r
+ \*-------------------------------------*/\r
+\r
+class CBI_GRAPH GLGraph: public GraphObserver_I, public Displayable_A, public FigureVisitor_I\r
+ {\r
+ public:\r
+ GLGraph(Graph* ptrGraph);\r
+\r
+ virtual ~GLGraph();\r
+\r
+ /*--------------------------------------*\\r
+ |* Methodes *|\r
+ \*-------------------------------------*/\r
+\r
+ /**\r
+ * Override\r
+ */\r
+ void init(Panel_A &panel);\r
+\r
+ /**\r
+ * Override\r
+ */\r
+ void reshape(Panel_A &panel, int w, int h);\r
+\r
+ /**\r
+ * Override\r
+ */\r
+ void display(Panel_A &panel);\r
+\r
+ /**\r
+ * Override\r
+ */\r
+ void release(Panel_A &panel);\r
+\r
+ /**\r
+ * Override\r
+ */\r
+ void onFigureAdd(Figure* ptrFigure);\r
+\r
+ /**\r
+ * Override\r
+ */\r
+ void onFigureRemove(Figure* ptrFigure);\r
+\r
+ /**\r
+ * Override\r
+ */\r
+ void update();\r
+\r
+ /**\r
+ * Override\r
+ * visit create the right GLPolylines\r
+ */\r
+ virtual void visit(CurveParametric* ptrPolylines);\r
+\r
+ /**\r
+ * Override\r
+ * visit create the right GLCurve\r
+ */\r
+ virtual void visit(CurveAnalytic* ptrCurve);\r
+\r
+ private:\r
+ void computeViewports(Panel_A &panel);\r
+\r
+ int computeTitleHeight(Panel_A &panel);\r
+\r
+ void drawGraph(Panel_A &panel);\r
+\r
+ void drawTitle(Panel_A &panel);\r
+\r
+ void drawLegend(Panel_A &panel);\r
+\r
+ void drawGraphCadre(Panel_A &panel);\r
+\r
+ void drawGraphGrid(Panel_A &panel);\r
+\r
+ void processQueue(Panel_A &panel);\r
+\r
+ void updateGL(Panel_A &panel);\r
+\r
+ const Font_A* loadFont(FontLoader_A* ptrFontLoader, Title* ptrTitle);\r
+\r
+ /*--------------------------------------*\\r
+ |* Get *|\r
+ \*-------------------------------------*/\r
+\r
+ public:\r
+\r
+ Viewport getPanelViewport() const;\r
+\r
+ Viewport getGraphViewport() const;\r
+\r
+ Viewport getTitleViewport() const;\r
+\r
+ Graph* getGraph() const;\r
+\r
+ /*--------------------------------------*\\r
+ |* Attributs *|\r
+ \*-------------------------------------*/\r
+\r
+ private:\r
+ // Inputs\r
+ Graph* ptrGraph;\r
+\r
+ // Tools\r
+ atomic<bool> isNeedUpdate;\r
+ map<Figure*, GLFigure*> mapFigureGL;\r
+ queue<GLGraphRunnable*> queueGLGraphRunnable;\r
+ Viewport viewportPanel; //in pixel\r
+ Viewport viewportGraph; //in pixel\r
+ Viewport viewportTitle; //in pixel\r
+\r
+ //Thread safe\r
+ mutex mutexQueue;\r
+ mutex mutexMapFigure;\r
+\r
+ static const int LEFT_MARGIN;\r
+ static const int RIGHT_MARGIN;\r
+ static const int TOP_MARGIN;\r
+ static const int BOTTOM_MARGIN;\r
+ static const int GRAPH_MARGIN;\r
+ static const float TITLE_V_SPACING;\r
+ };\r
+\r
+#endif \r
+\r
+/*----------------------------------------------------------------------*\\r
+ |* End *|\r
+ \*---------------------------------------------------------------------*/\r