comparison Framework/Viewport/SdlWindow.cpp @ 1047:efc5b62b9539

reorganization
author Sebastien Jodogne <s.jodogne@gmail.com>
date Wed, 09 Oct 2019 18:06:58 +0200
parents Applications/Sdl/SdlWindow.cpp@794278160a3f
children 4cc997207d8a 2d8ab34c8c91
comparison
equal deleted inserted replaced
1046:513a4053c54a 1047:efc5b62b9539
1 /**
2 * Stone of Orthanc
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics
4 * Department, University Hospital of Liege, Belgium
5 * Copyright (C) 2017-2019 Osimis S.A., Belgium
6 *
7 * This program is free software: you can redistribute it and/or
8 * modify it under the terms of the GNU Affero General Public License
9 * as published by the Free Software Foundation, either version 3 of
10 * the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Affero General Public License for more details.
16 *
17 * You should have received a copy of the GNU Affero General Public License
18 * along with this program. If not, see <http://www.gnu.org/licenses/>.
19 **/
20
21
22 #include "SdlWindow.h"
23
24 #if ORTHANC_ENABLE_SDL == 1
25
26 #include <Core/Logging.h>
27 #include <Core/OrthancException.h>
28
29 #ifdef WIN32
30 #include <windows.h> // for SetProcessDpiAware
31 #endif
32 // WIN32
33
34 #include <SDL.h>
35
36 namespace OrthancStone
37 {
38 SdlWindow::SdlWindow(const char* title,
39 unsigned int width,
40 unsigned int height,
41 bool enableOpenGl,
42 bool allowDpiScaling) :
43 maximized_(false)
44 {
45 // TODO Understand why, with SDL_WINDOW_OPENGL + MinGW32 + Release
46 // build mode, the application crashes whenever the SDL window is
47 // resized or maximized
48
49 uint32_t windowFlags, rendererFlags;
50 if (enableOpenGl)
51 {
52 windowFlags = SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE;
53 rendererFlags = SDL_RENDERER_ACCELERATED;
54 }
55 else
56 {
57 windowFlags = SDL_WINDOW_RESIZABLE;
58 rendererFlags = SDL_RENDERER_SOFTWARE;
59 }
60
61 // TODO: probably required on MacOS X, too
62 #if defined(WIN32) && (_WIN32_WINNT >= 0x0600)
63 if (!allowDpiScaling)
64 {
65 // if we do NOT allow DPI scaling, it means an SDL pixel will be a real
66 // monitor pixel. This is needed for high-DPI applications
67
68 // Enable high-DPI support on Windows
69
70 // THE FOLLOWING HAS BEEN COMMENTED OUT BECAUSE IT WILL CRASH UNDER
71 // OLD WINDOWS VERSIONS
72 // ADD THIS AT THE TOP TO ENABLE IT:
73 //
74 //#pragma comment(lib, "Shcore.lib") THIS IS ONLY REQUIRED FOR SetProcessDpiAwareness
75 //#include <windows.h>
76 //#include <ShellScalingAPI.h> THIS IS ONLY REQUIRED FOR SetProcessDpiAwareness
77 //#include <comdef.h> THIS IS ONLY REQUIRED FOR SetProcessDpiAwareness
78 // SetProcessDpiAwareness(PROCESS_PER_MONITOR_DPI_AWARE);
79
80 // This is supported on Vista+
81 SetProcessDPIAware();
82
83 windowFlags |= SDL_WINDOW_ALLOW_HIGHDPI;
84 }
85 #endif
86 // WIN32
87
88 window_ = SDL_CreateWindow(title,
89 SDL_WINDOWPOS_UNDEFINED,
90 SDL_WINDOWPOS_UNDEFINED,
91 width, height, windowFlags);
92
93 if (window_ == NULL)
94 {
95 LOG(ERROR) << "Cannot create the SDL window: " << SDL_GetError();
96 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError);
97 }
98
99 renderer_ = SDL_CreateRenderer(window_, -1, rendererFlags);
100 if (!renderer_)
101 {
102 LOG(ERROR) << "Cannot create the SDL renderer: " << SDL_GetError();
103 SDL_DestroyWindow(window_);
104 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError);
105 }
106 }
107
108
109 SdlWindow::~SdlWindow()
110 {
111 if (renderer_ != NULL)
112 {
113 SDL_DestroyRenderer(renderer_);
114 }
115
116 if (window_ != NULL)
117 {
118 SDL_DestroyWindow(window_);
119 }
120 }
121
122
123 unsigned int SdlWindow::GetWidth() const
124 {
125 int w = -1;
126 SDL_GetWindowSize(window_, &w, NULL);
127
128 if (w < 0)
129 {
130 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError);
131 }
132 else
133 {
134 return static_cast<unsigned int>(w);
135 }
136 }
137
138
139 unsigned int SdlWindow::GetHeight() const
140 {
141 int h = -1;
142 SDL_GetWindowSize(window_, NULL, &h);
143
144 if (h < 0)
145 {
146 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError);
147 }
148 else
149 {
150 return static_cast<unsigned int>(h);
151 }
152 }
153
154
155 void SdlWindow::Render(SDL_Surface* surface)
156 {
157 //SDL_RenderClear(renderer_);
158
159 SDL_Texture *texture = SDL_CreateTextureFromSurface(renderer_, surface);
160 if (texture != NULL)
161 {
162 SDL_RenderCopy(renderer_, texture, NULL, NULL);
163 SDL_DestroyTexture(texture);
164 }
165
166 SDL_RenderPresent(renderer_);
167 }
168
169
170 void SdlWindow::ToggleMaximize()
171 {
172 if (maximized_)
173 {
174 SDL_RestoreWindow(window_);
175 maximized_ = false;
176 }
177 else
178 {
179 SDL_MaximizeWindow(window_);
180 maximized_ = true;
181 }
182 }
183
184
185 void SdlWindow::GlobalInitialize()
186 {
187 if (SDL_Init(SDL_INIT_VIDEO) != 0)
188 {
189 LOG(ERROR) << "Cannot initialize SDL";
190 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError);
191 }
192 }
193
194
195 void SdlWindow::GlobalFinalize()
196 {
197 SDL_Quit();
198 }
199 }
200
201 #endif