Mercurial > hg > orthanc-stone
annotate Applications/Platforms/Sdl/SdlViewport.cpp @ 1868:87de32ac3ea7
sync
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Tue, 11 Jan 2022 10:45:58 +0100 |
parents | 5a872e69c74f |
children | 3889ae96d2e9 |
rev | line source |
---|---|
891
0aff28f15ea2
new abstraction: IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1 /** |
0aff28f15ea2
new abstraction: IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2 * Stone of Orthanc |
0aff28f15ea2
new abstraction: IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics |
0aff28f15ea2
new abstraction: IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
4 * Department, University Hospital of Liege, Belgium |
1739
9ac2a65d4172
upgrade to year 2021
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1591
diff
changeset
|
5 * Copyright (C) 2017-2021 Osimis S.A., Belgium |
891
0aff28f15ea2
new abstraction: IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
6 * |
0aff28f15ea2
new abstraction: IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
7 * This program is free software: you can redistribute it and/or |
0aff28f15ea2
new abstraction: IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
8 * modify it under the terms of the GNU Affero General Public License |
0aff28f15ea2
new abstraction: IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
9 * as published by the Free Software Foundation, either version 3 of |
0aff28f15ea2
new abstraction: IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
10 * the License, or (at your option) any later version. |
0aff28f15ea2
new abstraction: IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
11 * |
0aff28f15ea2
new abstraction: IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
12 * This program is distributed in the hope that it will be useful, but |
0aff28f15ea2
new abstraction: IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
13 * WITHOUT ANY WARRANTY; without even the implied warranty of |
0aff28f15ea2
new abstraction: IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
0aff28f15ea2
new abstraction: IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
15 * Affero General Public License for more details. |
0aff28f15ea2
new abstraction: IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
16 * |
0aff28f15ea2
new abstraction: IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
17 * You should have received a copy of the GNU Affero General Public License |
0aff28f15ea2
new abstraction: IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
18 * along with this program. If not, see <http://www.gnu.org/licenses/>. |
0aff28f15ea2
new abstraction: IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
19 **/ |
0aff28f15ea2
new abstraction: IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
20 |
0aff28f15ea2
new abstraction: IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
21 #include "SdlViewport.h" |
0aff28f15ea2
new abstraction: IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
22 |
1591
5887a4f8594b
moving platform-specific files out of the "OrthancStone" folder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1576
diff
changeset
|
23 #include "../../../OrthancStone/Sources/Scene2DViewport/ViewportController.h" |
1560
b4ccd4963d37
fix sdl and wasm samples
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1512
diff
changeset
|
24 |
1455
30deba7bc8e2
simplifying include_directories
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1391
diff
changeset
|
25 #include <OrthancException.h> |
891
0aff28f15ea2
new abstraction: IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
26 |
1331
ab81ee8fce1f
- Viewport is not passed and stored as a shared_ptr instead
Benjamin Golinvaux <bgo@osimis.io>
parents:
1315
diff
changeset
|
27 #include <boost/make_shared.hpp> |
ab81ee8fce1f
- Viewport is not passed and stored as a shared_ptr instead
Benjamin Golinvaux <bgo@osimis.io>
parents:
1315
diff
changeset
|
28 |
891
0aff28f15ea2
new abstraction: IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
29 namespace OrthancStone |
0aff28f15ea2
new abstraction: IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
30 { |
1216
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
31 ICompositor& SdlViewport::SdlLock::GetCompositor() |
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
32 { |
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
33 if (that_.compositor_.get() == NULL) |
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
34 { |
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
35 // The derived class should have called "AcquireCompositor()" |
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
36 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); |
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
37 } |
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
38 else |
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
39 { |
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
40 return *that_.compositor_; |
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
41 } |
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
42 } |
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
43 |
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
44 |
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
45 void SdlViewport::AcquireCompositor(ICompositor* compositor /* takes ownership */) |
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
46 { |
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
47 if (compositor == NULL) |
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
48 { |
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
49 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); |
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
50 } |
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
51 |
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
52 compositor_.reset(compositor); |
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
53 } |
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
54 |
1576
92fca2b3ba3d
sanitizing the handling of canvas size
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1571
diff
changeset
|
55 |
1331
ab81ee8fce1f
- Viewport is not passed and stored as a shared_ptr instead
Benjamin Golinvaux <bgo@osimis.io>
parents:
1315
diff
changeset
|
56 SdlViewport::SdlViewport() |
1205 | 57 { |
58 refreshEvent_ = SDL_RegisterEvents(1); | |
1307
8a28a9bf8876
ViewportController now gets a ref to its parent viewport for proper lock usage
Benjamin Golinvaux <bgo@osimis.io>
parents:
1279
diff
changeset
|
59 |
1205 | 60 if (refreshEvent_ == static_cast<uint32_t>(-1)) |
61 { | |
62 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); | |
63 } | |
64 } | |
1331
ab81ee8fce1f
- Viewport is not passed and stored as a shared_ptr instead
Benjamin Golinvaux <bgo@osimis.io>
parents:
1315
diff
changeset
|
65 |
ab81ee8fce1f
- Viewport is not passed and stored as a shared_ptr instead
Benjamin Golinvaux <bgo@osimis.io>
parents:
1315
diff
changeset
|
66 void SdlViewport::PostConstructor() |
1307
8a28a9bf8876
ViewportController now gets a ref to its parent viewport for proper lock usage
Benjamin Golinvaux <bgo@osimis.io>
parents:
1279
diff
changeset
|
67 { |
1331
ab81ee8fce1f
- Viewport is not passed and stored as a shared_ptr instead
Benjamin Golinvaux <bgo@osimis.io>
parents:
1315
diff
changeset
|
68 controller_ = boost::make_shared<ViewportController>(shared_from_this()); |
1307
8a28a9bf8876
ViewportController now gets a ref to its parent viewport for proper lock usage
Benjamin Golinvaux <bgo@osimis.io>
parents:
1279
diff
changeset
|
69 } |
1331
ab81ee8fce1f
- Viewport is not passed and stored as a shared_ptr instead
Benjamin Golinvaux <bgo@osimis.io>
parents:
1315
diff
changeset
|
70 |
1205 | 71 void SdlViewport::SendRefreshEvent() |
72 { | |
73 SDL_Event event; | |
74 SDL_memset(&event, 0, sizeof(event)); | |
75 event.type = refreshEvent_; | |
76 SDL_PushEvent(&event); // This function is thread-safe, and can be called from other threads safely. | |
77 } | |
78 | |
79 | |
1576
92fca2b3ba3d
sanitizing the handling of canvas size
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1571
diff
changeset
|
80 void SdlViewport::UpdateSize(unsigned int width, unsigned int height) |
92fca2b3ba3d
sanitizing the handling of canvas size
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1571
diff
changeset
|
81 { |
92fca2b3ba3d
sanitizing the handling of canvas size
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1571
diff
changeset
|
82 SdlLock lock(*this); |
92fca2b3ba3d
sanitizing the handling of canvas size
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1571
diff
changeset
|
83 lock.GetCompositor().SetCanvasSize(width, height); |
92fca2b3ba3d
sanitizing the handling of canvas size
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1571
diff
changeset
|
84 lock.Invalidate(); |
92fca2b3ba3d
sanitizing the handling of canvas size
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1571
diff
changeset
|
85 } |
92fca2b3ba3d
sanitizing the handling of canvas size
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1571
diff
changeset
|
86 |
92fca2b3ba3d
sanitizing the handling of canvas size
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1571
diff
changeset
|
87 |
1804 | 88 #if ORTHANC_ENABLE_OPENGL == 1 |
1332
be614695747d
std::string in viewport ctor
Benjamin Golinvaux <bgo@osimis.io>
parents:
1331
diff
changeset
|
89 SdlOpenGLViewport::SdlOpenGLViewport(const std::string& title, |
905
88bf49aebc13
introduced ICompositor and allow SdlViewport to work with a CairoCompositor (to run on machines without OpenGL drivers)
Alain Mazy <alain@mazy.be>
parents:
893
diff
changeset
|
90 unsigned int width, |
88bf49aebc13
introduced ICompositor and allow SdlViewport to work with a CairoCompositor (to run on machines without OpenGL drivers)
Alain Mazy <alain@mazy.be>
parents:
893
diff
changeset
|
91 unsigned int height, |
88bf49aebc13
introduced ICompositor and allow SdlViewport to work with a CairoCompositor (to run on machines without OpenGL drivers)
Alain Mazy <alain@mazy.be>
parents:
893
diff
changeset
|
92 bool allowDpiScaling) : |
1332
be614695747d
std::string in viewport ctor
Benjamin Golinvaux <bgo@osimis.io>
parents:
1331
diff
changeset
|
93 context_(title.c_str(), width, height, allowDpiScaling) |
905
88bf49aebc13
introduced ICompositor and allow SdlViewport to work with a CairoCompositor (to run on machines without OpenGL drivers)
Alain Mazy <alain@mazy.be>
parents:
893
diff
changeset
|
94 { |
1216
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
95 AcquireCompositor(new OpenGLCompositor(context_)); // (*) |
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
96 } |
1804 | 97 #endif |
1216
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
98 |
1576
92fca2b3ba3d
sanitizing the handling of canvas size
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1571
diff
changeset
|
99 |
1804 | 100 #if ORTHANC_ENABLE_OPENGL == 1 |
1576
92fca2b3ba3d
sanitizing the handling of canvas size
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1571
diff
changeset
|
101 void SdlOpenGLViewport::RefreshCanvasSize() |
92fca2b3ba3d
sanitizing the handling of canvas size
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1571
diff
changeset
|
102 { |
92fca2b3ba3d
sanitizing the handling of canvas size
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1571
diff
changeset
|
103 UpdateSize(context_.GetCanvasWidth(), context_.GetCanvasHeight()); |
92fca2b3ba3d
sanitizing the handling of canvas size
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1571
diff
changeset
|
104 } |
1804 | 105 #endif |
1576
92fca2b3ba3d
sanitizing the handling of canvas size
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1571
diff
changeset
|
106 |
92fca2b3ba3d
sanitizing the handling of canvas size
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1571
diff
changeset
|
107 |
1804 | 108 #if ORTHANC_ENABLE_OPENGL == 1 |
109 boost::shared_ptr<SdlOpenGLViewport> SdlOpenGLViewport::Create(const std::string& title, | |
110 unsigned int width, | |
111 unsigned int height, | |
112 bool allowDpiScaling) | |
1307
8a28a9bf8876
ViewportController now gets a ref to its parent viewport for proper lock usage
Benjamin Golinvaux <bgo@osimis.io>
parents:
1279
diff
changeset
|
113 { |
1331
ab81ee8fce1f
- Viewport is not passed and stored as a shared_ptr instead
Benjamin Golinvaux <bgo@osimis.io>
parents:
1315
diff
changeset
|
114 boost::shared_ptr<SdlOpenGLViewport> that = |
ab81ee8fce1f
- Viewport is not passed and stored as a shared_ptr instead
Benjamin Golinvaux <bgo@osimis.io>
parents:
1315
diff
changeset
|
115 boost::shared_ptr<SdlOpenGLViewport>(new SdlOpenGLViewport(title, width, height, allowDpiScaling)); |
ab81ee8fce1f
- Viewport is not passed and stored as a shared_ptr instead
Benjamin Golinvaux <bgo@osimis.io>
parents:
1315
diff
changeset
|
116 that->SdlViewport::PostConstructor(); |
ab81ee8fce1f
- Viewport is not passed and stored as a shared_ptr instead
Benjamin Golinvaux <bgo@osimis.io>
parents:
1315
diff
changeset
|
117 return that; |
1307
8a28a9bf8876
ViewportController now gets a ref to its parent viewport for proper lock usage
Benjamin Golinvaux <bgo@osimis.io>
parents:
1279
diff
changeset
|
118 } |
1804 | 119 #endif |
1216
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
120 |
1804 | 121 |
122 #if ORTHANC_ENABLE_OPENGL == 1 | |
1391
32272ecfc6c2
Drilled a hole through the abstractions to be able to match
Benjamin Golinvaux <bgo@osimis.io>
parents:
1332
diff
changeset
|
123 uint32_t SdlOpenGLViewport::GetSdlWindowId() |
32272ecfc6c2
Drilled a hole through the abstractions to be able to match
Benjamin Golinvaux <bgo@osimis.io>
parents:
1332
diff
changeset
|
124 { |
1571 | 125 const SdlWindow& sdlWindowWrapper = context_.GetWindow(); |
1391
32272ecfc6c2
Drilled a hole through the abstractions to be able to match
Benjamin Golinvaux <bgo@osimis.io>
parents:
1332
diff
changeset
|
126 SDL_Window* sdlWindow = sdlWindowWrapper.GetObject(); |
32272ecfc6c2
Drilled a hole through the abstractions to be able to match
Benjamin Golinvaux <bgo@osimis.io>
parents:
1332
diff
changeset
|
127 Uint32 sdlWindowId = SDL_GetWindowID(sdlWindow); |
32272ecfc6c2
Drilled a hole through the abstractions to be able to match
Benjamin Golinvaux <bgo@osimis.io>
parents:
1332
diff
changeset
|
128 return sdlWindowId; |
32272ecfc6c2
Drilled a hole through the abstractions to be able to match
Benjamin Golinvaux <bgo@osimis.io>
parents:
1332
diff
changeset
|
129 } |
1804 | 130 #endif |
131 | |
1391
32272ecfc6c2
Drilled a hole through the abstractions to be able to match
Benjamin Golinvaux <bgo@osimis.io>
parents:
1332
diff
changeset
|
132 |
1804 | 133 #if ORTHANC_ENABLE_OPENGL == 1 |
1216
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
134 SdlOpenGLViewport::~SdlOpenGLViewport() |
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
135 { |
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
136 // Make sure that the "OpenGLCompositor" is destroyed BEFORE the |
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
137 // "OpenGLContext" it references (*) |
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
138 ClearCompositor(); |
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
139 } |
1804 | 140 #endif |
1315
1a08b779be64
warning 4996 (deprecation in jsoncpp) + indentation changes
Benjamin Golinvaux <bgo@osimis.io>
parents:
1311
diff
changeset
|
141 |
1a08b779be64
warning 4996 (deprecation in jsoncpp) + indentation changes
Benjamin Golinvaux <bgo@osimis.io>
parents:
1311
diff
changeset
|
142 |
1804 | 143 #if ORTHANC_ENABLE_OPENGL == 1 |
1216
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
144 void SdlOpenGLViewport::Paint() |
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
145 { |
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
146 SdlLock lock(*this); |
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
147 lock.GetCompositor().Refresh(lock.GetController().GetScene()); |
905
88bf49aebc13
introduced ICompositor and allow SdlViewport to work with a CairoCompositor (to run on machines without OpenGL drivers)
Alain Mazy <alain@mazy.be>
parents:
893
diff
changeset
|
148 } |
1804 | 149 #endif |
1315
1a08b779be64
warning 4996 (deprecation in jsoncpp) + indentation changes
Benjamin Golinvaux <bgo@osimis.io>
parents:
1311
diff
changeset
|
150 |
1a08b779be64
warning 4996 (deprecation in jsoncpp) + indentation changes
Benjamin Golinvaux <bgo@osimis.io>
parents:
1311
diff
changeset
|
151 |
1804 | 152 #if ORTHANC_ENABLE_OPENGL == 1 |
1216
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
153 void SdlOpenGLViewport::ToggleMaximize() |
891
0aff28f15ea2
new abstraction: IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
154 { |
1216
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
155 // No need to call "Invalidate()" here, as "UpdateSize()" will |
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
156 // be invoked after event "SDL_WINDOWEVENT_SIZE_CHANGED" |
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
157 SdlLock lock(*this); |
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
158 context_.ToggleMaximize(); |
891
0aff28f15ea2
new abstraction: IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
159 } |
1804 | 160 #endif |
1315
1a08b779be64
warning 4996 (deprecation in jsoncpp) + indentation changes
Benjamin Golinvaux <bgo@osimis.io>
parents:
1311
diff
changeset
|
161 |
1a08b779be64
warning 4996 (deprecation in jsoncpp) + indentation changes
Benjamin Golinvaux <bgo@osimis.io>
parents:
1311
diff
changeset
|
162 |
1576
92fca2b3ba3d
sanitizing the handling of canvas size
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1571
diff
changeset
|
163 void SdlCairoViewport::RefreshCanvasSize() |
92fca2b3ba3d
sanitizing the handling of canvas size
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1571
diff
changeset
|
164 { |
92fca2b3ba3d
sanitizing the handling of canvas size
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1571
diff
changeset
|
165 UpdateSize(window_.GetWidth(), window_.GetHeight()); |
92fca2b3ba3d
sanitizing the handling of canvas size
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1571
diff
changeset
|
166 } |
92fca2b3ba3d
sanitizing the handling of canvas size
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1571
diff
changeset
|
167 |
1804 | 168 SdlCairoViewport::SdlCairoViewport(const std::string& title, |
905
88bf49aebc13
introduced ICompositor and allow SdlViewport to work with a CairoCompositor (to run on machines without OpenGL drivers)
Alain Mazy <alain@mazy.be>
parents:
893
diff
changeset
|
169 unsigned int width, |
88bf49aebc13
introduced ICompositor and allow SdlViewport to work with a CairoCompositor (to run on machines without OpenGL drivers)
Alain Mazy <alain@mazy.be>
parents:
893
diff
changeset
|
170 unsigned int height, |
88bf49aebc13
introduced ICompositor and allow SdlViewport to work with a CairoCompositor (to run on machines without OpenGL drivers)
Alain Mazy <alain@mazy.be>
parents:
893
diff
changeset
|
171 bool allowDpiScaling) : |
88bf49aebc13
introduced ICompositor and allow SdlViewport to work with a CairoCompositor (to run on machines without OpenGL drivers)
Alain Mazy <alain@mazy.be>
parents:
893
diff
changeset
|
172 window_(title, width, height, false /* enable OpenGL */, allowDpiScaling), |
1205 | 173 sdlSurface_(NULL) |
905
88bf49aebc13
introduced ICompositor and allow SdlViewport to work with a CairoCompositor (to run on machines without OpenGL drivers)
Alain Mazy <alain@mazy.be>
parents:
893
diff
changeset
|
174 { |
1216
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
175 AcquireCompositor(new CairoCompositor(width, height)); |
905
88bf49aebc13
introduced ICompositor and allow SdlViewport to work with a CairoCompositor (to run on machines without OpenGL drivers)
Alain Mazy <alain@mazy.be>
parents:
893
diff
changeset
|
176 } |
88bf49aebc13
introduced ICompositor and allow SdlViewport to work with a CairoCompositor (to run on machines without OpenGL drivers)
Alain Mazy <alain@mazy.be>
parents:
893
diff
changeset
|
177 |
88bf49aebc13
introduced ICompositor and allow SdlViewport to work with a CairoCompositor (to run on machines without OpenGL drivers)
Alain Mazy <alain@mazy.be>
parents:
893
diff
changeset
|
178 SdlCairoViewport::~SdlCairoViewport() |
891
0aff28f15ea2
new abstraction: IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
179 { |
905
88bf49aebc13
introduced ICompositor and allow SdlViewport to work with a CairoCompositor (to run on machines without OpenGL drivers)
Alain Mazy <alain@mazy.be>
parents:
893
diff
changeset
|
180 if (sdlSurface_) |
88bf49aebc13
introduced ICompositor and allow SdlViewport to work with a CairoCompositor (to run on machines without OpenGL drivers)
Alain Mazy <alain@mazy.be>
parents:
893
diff
changeset
|
181 { |
88bf49aebc13
introduced ICompositor and allow SdlViewport to work with a CairoCompositor (to run on machines without OpenGL drivers)
Alain Mazy <alain@mazy.be>
parents:
893
diff
changeset
|
182 SDL_FreeSurface(sdlSurface_); |
88bf49aebc13
introduced ICompositor and allow SdlViewport to work with a CairoCompositor (to run on machines without OpenGL drivers)
Alain Mazy <alain@mazy.be>
parents:
893
diff
changeset
|
183 } |
891
0aff28f15ea2
new abstraction: IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
184 } |
947
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
909
diff
changeset
|
185 |
1391
32272ecfc6c2
Drilled a hole through the abstractions to be able to match
Benjamin Golinvaux <bgo@osimis.io>
parents:
1332
diff
changeset
|
186 uint32_t SdlCairoViewport::GetSdlWindowId() |
32272ecfc6c2
Drilled a hole through the abstractions to be able to match
Benjamin Golinvaux <bgo@osimis.io>
parents:
1332
diff
changeset
|
187 { |
32272ecfc6c2
Drilled a hole through the abstractions to be able to match
Benjamin Golinvaux <bgo@osimis.io>
parents:
1332
diff
changeset
|
188 SDL_Window* sdlWindow = window_.GetObject(); |
32272ecfc6c2
Drilled a hole through the abstractions to be able to match
Benjamin Golinvaux <bgo@osimis.io>
parents:
1332
diff
changeset
|
189 Uint32 sdlWindowId = SDL_GetWindowID(sdlWindow); |
32272ecfc6c2
Drilled a hole through the abstractions to be able to match
Benjamin Golinvaux <bgo@osimis.io>
parents:
1332
diff
changeset
|
190 return sdlWindowId; |
32272ecfc6c2
Drilled a hole through the abstractions to be able to match
Benjamin Golinvaux <bgo@osimis.io>
parents:
1332
diff
changeset
|
191 } |
32272ecfc6c2
Drilled a hole through the abstractions to be able to match
Benjamin Golinvaux <bgo@osimis.io>
parents:
1332
diff
changeset
|
192 |
1216
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
193 void SdlCairoViewport::Paint() |
905
88bf49aebc13
introduced ICompositor and allow SdlViewport to work with a CairoCompositor (to run on machines without OpenGL drivers)
Alain Mazy <alain@mazy.be>
parents:
893
diff
changeset
|
194 { |
1216
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
195 SdlLock lock(*this); |
1213
86a8266b8888
moving the scene from IViewport to ViewportController
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1211
diff
changeset
|
196 |
1216
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
197 lock.GetCompositor().Refresh(lock.GetController().GetScene()); |
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
198 CreateSdlSurfaceFromCompositor(dynamic_cast<CairoCompositor&>(lock.GetCompositor())); |
1205 | 199 |
200 if (sdlSurface_ != NULL) | |
201 { | |
202 window_.Render(sdlSurface_); | |
1216
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
203 } |
905
88bf49aebc13
introduced ICompositor and allow SdlViewport to work with a CairoCompositor (to run on machines without OpenGL drivers)
Alain Mazy <alain@mazy.be>
parents:
893
diff
changeset
|
204 } |
88bf49aebc13
introduced ICompositor and allow SdlViewport to work with a CairoCompositor (to run on machines without OpenGL drivers)
Alain Mazy <alain@mazy.be>
parents:
893
diff
changeset
|
205 |
1203
f3bb9a6dd949
locking abstraction in IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1055
diff
changeset
|
206 |
1216
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
207 void SdlCairoViewport::ToggleMaximize() |
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
208 { |
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
209 // No need to call "Invalidate()" here, as "UpdateSize()" will |
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
210 // be invoked after event "SDL_WINDOWEVENT_SIZE_CHANGED" |
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
211 SdlLock lock(*this); |
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
212 window_.ToggleMaximize(); |
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
213 } |
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
214 |
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
215 |
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
216 // Assumes that the mutex is locked |
1571 | 217 void SdlCairoViewport::CreateSdlSurfaceFromCompositor(const CairoCompositor& compositor) |
909 | 218 { |
219 static const uint32_t rmask = 0x00ff0000; | |
220 static const uint32_t gmask = 0x0000ff00; | |
221 static const uint32_t bmask = 0x000000ff; | |
222 | |
1216
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
223 const unsigned int width = compositor.GetCanvas().GetWidth(); |
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
224 const unsigned int height = compositor.GetCanvas().GetHeight(); |
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
225 |
1205 | 226 if (sdlSurface_ != NULL) |
227 { | |
1216
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
228 if (sdlSurface_->pixels == compositor.GetCanvas().GetBuffer() && |
1205 | 229 sdlSurface_->w == static_cast<int>(width) && |
230 sdlSurface_->h == static_cast<int>(height) && | |
1216
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
231 sdlSurface_->pitch == static_cast<int>(compositor.GetCanvas().GetPitch())) |
1205 | 232 { |
233 // The image from the compositor has not changed, no need to update the surface | |
234 return; | |
235 } | |
236 else | |
237 { | |
238 SDL_FreeSurface(sdlSurface_); | |
239 } | |
240 } | |
241 | |
1216
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
242 sdlSurface_ = SDL_CreateRGBSurfaceFrom((void*)(compositor.GetCanvas().GetBuffer()), width, height, 32, |
5147277850cf
better abstraction for IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
243 compositor.GetCanvas().GetPitch(), rmask, gmask, bmask, 0); |
909 | 244 if (!sdlSurface_) |
245 { | |
246 LOG(ERROR) << "Cannot create a SDL surface from a Cairo surface"; | |
247 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); | |
248 } | |
249 } | |
1804 | 250 |
251 | |
252 boost::shared_ptr<SdlCairoViewport> SdlCairoViewport::Create(const std::string& title, | |
253 unsigned int width, | |
254 unsigned int height, | |
255 bool allowDpiScaling) | |
256 { | |
257 boost::shared_ptr<SdlCairoViewport> that = | |
258 boost::shared_ptr<SdlCairoViewport>(new SdlCairoViewport(title, width, height, allowDpiScaling)); | |
259 that->SdlViewport::PostConstructor(); | |
260 return that; | |
261 } | |
891
0aff28f15ea2
new abstraction: IViewport
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
262 } |