Mercurial > hg > orthanc-stone
annotate Applications/Sdl/SdlOpenGLContext.cpp @ 892:50cd372e2460
fix OpenGL context for fonts
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Thu, 11 Jul 2019 09:18:55 +0200 |
parents | 0aff28f15ea2 |
children | 1091b2adeb5a |
rev | line source |
---|---|
595
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1 /** |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2 * Stone of Orthanc |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
4 * Department, University Hospital of Liege, Belgium |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
5 * Copyright (C) 2017-2019 Osimis S.A., Belgium |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
6 * |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
7 * This program is free software: you can redistribute it and/or |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
8 * modify it under the terms of the GNU Affero General Public License |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
9 * as published by the Free Software Foundation, either version 3 of |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
10 * the License, or (at your option) any later version. |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
11 * |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
12 * This program is distributed in the hope that it will be useful, but |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
13 * WITHOUT ANY WARRANTY; without even the implied warranty of |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
15 * Affero General Public License for more details. |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
16 * |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
17 * You should have received a copy of the GNU Affero General Public License |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
18 * along with this program. If not, see <http://www.gnu.org/licenses/>. |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
19 **/ |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
20 |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
21 |
891
0aff28f15ea2
new abstraction: IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
656
diff
changeset
|
22 #include "SdlOpenGLContext.h" |
595
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
23 |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
24 #if ORTHANC_ENABLE_SDL == 1 |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
25 |
613
412a2d01a189
automatic initialization of glew
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
595
diff
changeset
|
26 #if !defined(ORTHANC_ENABLE_GLEW) |
412a2d01a189
automatic initialization of glew
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
595
diff
changeset
|
27 # error Macro ORTHANC_ENABLE_GLEW must be defined |
412a2d01a189
automatic initialization of glew
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
595
diff
changeset
|
28 #endif |
412a2d01a189
automatic initialization of glew
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
595
diff
changeset
|
29 |
412a2d01a189
automatic initialization of glew
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
595
diff
changeset
|
30 #if ORTHANC_ENABLE_GLEW == 1 |
412a2d01a189
automatic initialization of glew
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
595
diff
changeset
|
31 # include <GL/glew.h> |
412a2d01a189
automatic initialization of glew
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
595
diff
changeset
|
32 #endif |
412a2d01a189
automatic initialization of glew
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
595
diff
changeset
|
33 |
595
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
34 #include <Core/OrthancException.h> |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
35 |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
36 namespace OrthancStone |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
37 { |
891
0aff28f15ea2
new abstraction: IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
656
diff
changeset
|
38 SdlOpenGLContext::SdlOpenGLContext(const char* title, |
0aff28f15ea2
new abstraction: IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
656
diff
changeset
|
39 unsigned int width, |
0aff28f15ea2
new abstraction: IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
656
diff
changeset
|
40 unsigned int height, |
0aff28f15ea2
new abstraction: IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
656
diff
changeset
|
41 bool allowDpiScaling) : |
656
002d9562c8f5
Added support to DISABLE legacy scaling in SDL Windows (only in WIN32... this
Benjamin Golinvaux <bgo@osimis.io>
parents:
615
diff
changeset
|
42 window_(title, width, height, true /* enable OpenGL */, allowDpiScaling) |
595
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
43 { |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
44 context_ = SDL_GL_CreateContext(window_.GetObject()); |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
45 |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
46 if (context_ == NULL) |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
47 { |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
48 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
49 "Cannot initialize OpenGL"); |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
50 } |
613
412a2d01a189
automatic initialization of glew
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
595
diff
changeset
|
51 |
412a2d01a189
automatic initialization of glew
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
595
diff
changeset
|
52 #if ORTHANC_ENABLE_GLEW == 1 |
412a2d01a189
automatic initialization of glew
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
595
diff
changeset
|
53 // The initialization function of glew (i.e. "glewInit()") can |
412a2d01a189
automatic initialization of glew
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
595
diff
changeset
|
54 // only be called once an OpenGL is setup. |
412a2d01a189
automatic initialization of glew
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
595
diff
changeset
|
55 // https://stackoverflow.com/a/45033669/881731 |
412a2d01a189
automatic initialization of glew
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
595
diff
changeset
|
56 { |
614 | 57 static boost::mutex mutex_; |
58 static bool isGlewInitialized_ = false; | |
59 | |
60 boost::mutex::scoped_lock lock(mutex_); | |
613
412a2d01a189
automatic initialization of glew
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
595
diff
changeset
|
61 |
614 | 62 if (!isGlewInitialized_) |
613
412a2d01a189
automatic initialization of glew
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
595
diff
changeset
|
63 { |
412a2d01a189
automatic initialization of glew
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
595
diff
changeset
|
64 LOG(INFO) << "Initializing glew"; |
412a2d01a189
automatic initialization of glew
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
595
diff
changeset
|
65 |
412a2d01a189
automatic initialization of glew
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
595
diff
changeset
|
66 GLenum err = glewInit(); |
412a2d01a189
automatic initialization of glew
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
595
diff
changeset
|
67 if (GLEW_OK != err) |
412a2d01a189
automatic initialization of glew
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
595
diff
changeset
|
68 { |
412a2d01a189
automatic initialization of glew
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
595
diff
changeset
|
69 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, |
412a2d01a189
automatic initialization of glew
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
595
diff
changeset
|
70 "Cannot initialize glew"); |
412a2d01a189
automatic initialization of glew
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
595
diff
changeset
|
71 } |
412a2d01a189
automatic initialization of glew
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
595
diff
changeset
|
72 |
614 | 73 isGlewInitialized_ = true; |
613
412a2d01a189
automatic initialization of glew
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
595
diff
changeset
|
74 } |
412a2d01a189
automatic initialization of glew
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
595
diff
changeset
|
75 } |
412a2d01a189
automatic initialization of glew
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
595
diff
changeset
|
76 #endif |
595
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
77 } |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
78 |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
79 |
891
0aff28f15ea2
new abstraction: IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
656
diff
changeset
|
80 SdlOpenGLContext::~SdlOpenGLContext() |
595
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
81 { |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
82 SDL_GL_DeleteContext(context_); |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
83 } |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
84 |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
85 |
891
0aff28f15ea2
new abstraction: IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
656
diff
changeset
|
86 void SdlOpenGLContext::MakeCurrent() |
595
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
87 { |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
88 if (SDL_GL_MakeCurrent(window_.GetObject(), context_) != 0) |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
89 { |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
90 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
91 "Cannot set current OpenGL context"); |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
92 } |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
93 |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
94 // This makes our buffer swap syncronized with the monitor's vertical refresh |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
95 SDL_GL_SetSwapInterval(1); |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
96 } |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
97 |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
98 |
891
0aff28f15ea2
new abstraction: IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
656
diff
changeset
|
99 void SdlOpenGLContext::SwapBuffer() |
595
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
100 { |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
101 // Swap our buffer to display the current contents of buffer on screen |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
102 SDL_GL_SwapWindow(window_.GetObject()); |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
103 } |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
104 |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
105 |
891
0aff28f15ea2
new abstraction: IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
656
diff
changeset
|
106 unsigned int SdlOpenGLContext::GetCanvasWidth() const |
595
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
107 { |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
108 int w = 0; |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
109 SDL_GL_GetDrawableSize(window_.GetObject(), &w, NULL); |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
110 return static_cast<unsigned int>(w); |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
111 } |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
112 |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
113 |
891
0aff28f15ea2
new abstraction: IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
656
diff
changeset
|
114 unsigned int SdlOpenGLContext::GetCanvasHeight() const |
595
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
115 { |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
116 int h = 0; |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
117 SDL_GL_GetDrawableSize(window_.GetObject(), NULL, &h); |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
118 return static_cast<unsigned int>(h); |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
119 } |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
120 } |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
121 |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
122 #endif |