comparison OrthancStone/Sources/Viewport/SdlWindow.cpp @ 1512:244ad1e4e76a

reorganization of folders
author Sebastien Jodogne <s.jodogne@gmail.com>
date Tue, 07 Jul 2020 16:21:02 +0200
parents Framework/Viewport/SdlWindow.cpp@30deba7bc8e2
children
comparison
equal deleted inserted replaced
1511:9dfeee74c1e6 1512:244ad1e4e76a
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-2020 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 <Logging.h>
27 #include <OrthancException.h>
28
29 #ifdef WIN32
30 #include <windows.h> // for SetProcessDpiAware
31 #endif
32 // WIN32
33
34 #include <SDL_render.h>
35 #include <SDL_video.h>
36 #include <SDL.h>
37
38 namespace OrthancStone
39 {
40 SdlWindow::SdlWindow(const char* title,
41 unsigned int width,
42 unsigned int height,
43 bool enableOpenGl,
44 bool allowDpiScaling) :
45 maximized_(false)
46 {
47 // TODO Understand why, with SDL_WINDOW_OPENGL + MinGW32 + Release
48 // build mode, the application crashes whenever the SDL window is
49 // resized or maximized
50
51 uint32_t windowFlags, rendererFlags;
52 if (enableOpenGl)
53 {
54 windowFlags = SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE;
55 rendererFlags = SDL_RENDERER_ACCELERATED;
56 }
57 else
58 {
59 windowFlags = SDL_WINDOW_RESIZABLE;
60 rendererFlags = SDL_RENDERER_SOFTWARE;
61 }
62
63 // TODO: probably required on MacOS X, too
64 #if defined(WIN32) && (_WIN32_WINNT >= 0x0600)
65 if (!allowDpiScaling)
66 {
67 // if we do NOT allow DPI scaling, it means an SDL pixel will be a real
68 // monitor pixel. This is needed for high-DPI applications
69
70 // Enable high-DPI support on Windows
71
72 // THE FOLLOWING HAS BEEN COMMENTED OUT BECAUSE IT WILL CRASH UNDER
73 // OLD WINDOWS VERSIONS
74 // ADD THIS AT THE TOP TO ENABLE IT:
75 //
76 //#pragma comment(lib, "Shcore.lib") THIS IS ONLY REQUIRED FOR SetProcessDpiAwareness
77 //#include <windows.h>
78 //#include <ShellScalingAPI.h> THIS IS ONLY REQUIRED FOR SetProcessDpiAwareness
79 //#include <comdef.h> THIS IS ONLY REQUIRED FOR SetProcessDpiAwareness
80 // SetProcessDpiAwareness(PROCESS_PER_MONITOR_DPI_AWARE);
81
82 // This is supported on Vista+
83 SetProcessDPIAware();
84
85 windowFlags |= SDL_WINDOW_ALLOW_HIGHDPI;
86 }
87 #endif
88 // WIN32
89
90 window_ = SDL_CreateWindow(title,
91 SDL_WINDOWPOS_UNDEFINED,
92 SDL_WINDOWPOS_UNDEFINED,
93 width, height, windowFlags);
94
95 if (window_ == NULL)
96 {
97 LOG(ERROR) << "Cannot create the SDL window: " << SDL_GetError();
98 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError);
99 }
100
101 renderer_ = SDL_CreateRenderer(window_, -1, rendererFlags);
102 if (!renderer_)
103 {
104 LOG(ERROR) << "Cannot create the SDL renderer: " << SDL_GetError();
105 SDL_DestroyWindow(window_);
106 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError);
107 }
108 }
109
110
111 SdlWindow::~SdlWindow()
112 {
113 if (renderer_ != NULL)
114 {
115 SDL_DestroyRenderer(renderer_);
116 }
117
118 if (window_ != NULL)
119 {
120 SDL_DestroyWindow(window_);
121 }
122 }
123
124
125 unsigned int SdlWindow::GetWidth() const
126 {
127 int w = -1;
128 SDL_GetWindowSize(window_, &w, NULL);
129
130 if (w < 0)
131 {
132 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError);
133 }
134 else
135 {
136 return static_cast<unsigned int>(w);
137 }
138 }
139
140
141 unsigned int SdlWindow::GetHeight() const
142 {
143 int h = -1;
144 SDL_GetWindowSize(window_, NULL, &h);
145
146 if (h < 0)
147 {
148 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError);
149 }
150 else
151 {
152 return static_cast<unsigned int>(h);
153 }
154 }
155
156
157 void SdlWindow::Render(SDL_Surface* surface)
158 {
159 /**
160 * "You are strongly encouraged to call SDL_RenderClear() to
161 * initialize the backbuffer before starting each new frame's
162 * drawing, even if you plan to overwrite every pixel."
163 * https://wiki.libsdl.org/SDL_RenderPresent
164 **/
165 SDL_SetRenderDrawColor(renderer_, 0, 0, 0, 255);
166 SDL_RenderClear(renderer_); // Clear the entire screen to our selected color
167
168 SDL_Texture *texture = SDL_CreateTextureFromSurface(renderer_, surface);
169 if (texture != NULL)
170 {
171 SDL_RenderCopy(renderer_, texture, NULL, NULL);
172 SDL_DestroyTexture(texture);
173 }
174
175 SDL_RenderPresent(renderer_);
176 }
177
178
179 void SdlWindow::ToggleMaximize()
180 {
181 if (maximized_)
182 {
183 SDL_RestoreWindow(window_);
184 maximized_ = false;
185 }
186 else
187 {
188 SDL_MaximizeWindow(window_);
189 maximized_ = true;
190 }
191 }
192
193
194 void SdlWindow::GlobalInitialize()
195 {
196 if (SDL_Init(SDL_INIT_VIDEO) != 0)
197 {
198 LOG(ERROR) << "Cannot initialize SDL";
199 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError);
200 }
201 }
202
203
204 void SdlWindow::GlobalFinalize()
205 {
206 SDL_Quit();
207 }
208 }
209
210 #endif