Mercurial > hg > orthanc-stone
annotate Applications/Samples/SingleFrameEditorApplication.h @ 408:6834c236b36d
reorganization
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Mon, 12 Nov 2018 14:52:10 +0100 |
parents | 842a3c7cfdc0 |
children | 6decc0ba9da5 |
rev | line source |
---|---|
325
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
1 /** |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
2 * Stone of Orthanc |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
4 * Department, University Hospital of Liege, Belgium |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
5 * Copyright (C) 2017-2018 Osimis S.A., Belgium |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
6 * |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
7 * This program is free software: you can redistribute it and/or |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
8 * modify it under the terms of the GNU Affero General Public License |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
9 * as published by the Free Software Foundation, either version 3 of |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
10 * the License, or (at your option) any later version. |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
11 * |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
12 * This program is distributed in the hope that it will be useful, but |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
13 * WITHOUT ANY WARRANTY; without even the implied warranty of |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
15 * Affero General Public License for more details. |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
16 * |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
17 * You should have received a copy of the GNU Affero General Public License |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
18 * along with this program. If not, see <http://www.gnu.org/licenses/>. |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
19 **/ |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
20 |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
21 |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
22 #pragma once |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
23 |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
24 #include "SampleApplicationBase.h" |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
25 |
408 | 26 #include "../../Framework/Radiography/RadiographyScene.h" |
27 | |
28 #include "../../Framework/Toolbox/UndoRedoStack.h" | |
359
100df90bf0ea
preparing to implement Export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
358
diff
changeset
|
29 |
343 | 30 #include <Core/Images/FontRegistry.h> |
359
100df90bf0ea
preparing to implement Export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
358
diff
changeset
|
31 #include <Core/Images/Image.h> |
339 | 32 #include <Core/Images/ImageProcessing.h> |
338 | 33 #include <Core/Images/PamReader.h> |
361
f559ac66ef55
first export of a dicom image
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
360
diff
changeset
|
34 #include <Core/Images/PamWriter.h> |
362
12cec26d08ce
export of a valid DICOM CR
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
361
diff
changeset
|
35 #include <Core/Images/PngWriter.h> |
325
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
36 #include <Core/Logging.h> |
403 | 37 #include <Core/OrthancException.h> |
361
f559ac66ef55
first export of a dicom image
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
360
diff
changeset
|
38 #include <Core/Toolbox.h> |
359
100df90bf0ea
preparing to implement Export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
358
diff
changeset
|
39 #include <Plugins/Samples/Common/DicomDatasetReader.h> |
338 | 40 #include <Plugins/Samples/Common/FullOrthancDataset.h> |
325
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
41 |
407 | 42 |
43 // Export using PAM is faster than using PNG, but requires Orthanc | |
44 // core >= 1.4.3 | |
362
12cec26d08ce
export of a valid DICOM CR
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
361
diff
changeset
|
45 #define EXPORT_USING_PAM 1 |
12cec26d08ce
export of a valid DICOM CR
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
361
diff
changeset
|
46 |
340
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
47 |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
48 #include <boost/math/constants/constants.hpp> |
376
70256a53ff21
fix compatibility with Visual Studio 2008
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
369
diff
changeset
|
49 #include <boost/math/special_functions/round.hpp> |
70256a53ff21
fix compatibility with Visual Studio 2008
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
369
diff
changeset
|
50 |
340
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
51 |
325
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
52 namespace OrthancStone |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
53 { |
408 | 54 class RadiographyLayerCommand : public UndoRedoStack::ICommand |
336
c7fdc8bac581
creating GrayscaleBitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
334
diff
changeset
|
55 { |
408 | 56 private: |
57 RadiographyScene& scene_; | |
58 size_t layer_; | |
350
c57e049ed079
drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
348
diff
changeset
|
59 |
408 | 60 protected: |
61 virtual void UndoInternal(RadiographyScene::Layer& layer) const = 0; | |
354 | 62 |
408 | 63 virtual void RedoInternal(RadiographyScene::Layer& layer) const = 0; |
338 | 64 |
65 public: | |
408 | 66 RadiographyLayerCommand(RadiographyScene& scene, |
67 size_t layer) : | |
407 | 68 scene_(scene), |
69 layer_(layer) | |
354 | 70 { |
71 } | |
72 | |
408 | 73 RadiographyLayerCommand(const RadiographyScene::LayerAccessor& accessor) : |
407 | 74 scene_(accessor.GetScene()), |
75 layer_(accessor.GetIndex()) | |
354 | 76 { |
77 } | |
78 | |
79 virtual void Undo() const | |
80 { | |
408 | 81 RadiographyScene::LayerAccessor accessor(scene_, layer_); |
354 | 82 |
83 if (accessor.IsValid()) | |
84 { | |
407 | 85 UndoInternal(accessor.GetLayer()); |
354 | 86 } |
87 } | |
88 | |
89 virtual void Redo() const | |
90 { | |
408 | 91 RadiographyScene::LayerAccessor accessor(scene_, layer_); |
354 | 92 |
93 if (accessor.IsValid()) | |
94 { | |
407 | 95 RedoInternal(accessor.GetLayer()); |
354 | 96 } |
97 } | |
98 }; | |
99 | |
100 | |
408 | 101 class RadiographyLayerRotateTracker : public IWorldSceneMouseTracker |
354 | 102 { |
103 private: | |
407 | 104 UndoRedoStack& undoRedoStack_; |
408 | 105 RadiographyScene::LayerAccessor accessor_; |
407 | 106 double centerX_; |
107 double centerY_; | |
108 double originalAngle_; | |
109 double clickAngle_; | |
110 bool roundAngles_; | |
354 | 111 |
112 bool ComputeAngle(double& angle /* out */, | |
113 double sceneX, | |
114 double sceneY) const | |
115 { | |
116 Vector u; | |
117 LinearAlgebra::AssignVector(u, sceneX - centerX_, sceneY - centerY_); | |
118 | |
119 double nu = boost::numeric::ublas::norm_2(u); | |
120 | |
121 if (!LinearAlgebra::IsCloseToZero(nu)) | |
122 { | |
123 u /= nu; | |
124 angle = atan2(u[1], u[0]); | |
125 return true; | |
126 } | |
127 else | |
128 { | |
129 return false; | |
130 } | |
131 } | |
132 | |
133 | |
408 | 134 class UndoRedoCommand : public RadiographyLayerCommand |
354 | 135 { |
136 private: | |
137 double sourceAngle_; | |
138 double targetAngle_; | |
139 | |
140 static int ToDegrees(double angle) | |
141 { | |
376
70256a53ff21
fix compatibility with Visual Studio 2008
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
369
diff
changeset
|
142 return boost::math::iround(angle * 180.0 / boost::math::constants::pi<double>()); |
354 | 143 } |
144 | |
145 protected: | |
408 | 146 virtual void UndoInternal(RadiographyScene::Layer& layer) const |
354 | 147 { |
148 LOG(INFO) << "Undo - Set angle to " << ToDegrees(sourceAngle_) << " degrees"; | |
407 | 149 layer.SetAngle(sourceAngle_); |
354 | 150 } |
151 | |
408 | 152 virtual void RedoInternal(RadiographyScene::Layer& layer) const |
354 | 153 { |
154 LOG(INFO) << "Redo - Set angle to " << ToDegrees(sourceAngle_) << " degrees"; | |
407 | 155 layer.SetAngle(targetAngle_); |
354 | 156 } |
157 | |
158 public: | |
408 | 159 UndoRedoCommand(const RadiographyLayerRotateTracker& tracker) : |
160 RadiographyLayerCommand(tracker.accessor_), | |
355
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
161 sourceAngle_(tracker.originalAngle_), |
407 | 162 targetAngle_(tracker.accessor_.GetLayer().GetAngle()) |
354 | 163 { |
164 } | |
165 }; | |
166 | |
167 | |
168 public: | |
408 | 169 RadiographyLayerRotateTracker(UndoRedoStack& undoRedoStack, |
170 RadiographyScene& scene, | |
171 const ViewportGeometry& view, | |
172 size_t layer, | |
173 double x, | |
174 double y, | |
175 bool roundAngles) : | |
354 | 176 undoRedoStack_(undoRedoStack), |
407 | 177 accessor_(scene, layer), |
354 | 178 roundAngles_(roundAngles) |
179 { | |
180 if (accessor_.IsValid()) | |
181 { | |
407 | 182 accessor_.GetLayer().GetCenter(centerX_, centerY_); |
183 originalAngle_ = accessor_.GetLayer().GetAngle(); | |
354 | 184 |
185 double sceneX, sceneY; | |
186 view.MapDisplayToScene(sceneX, sceneY, x, y); | |
187 | |
188 if (!ComputeAngle(clickAngle_, x, y)) | |
189 { | |
190 accessor_.Invalidate(); | |
191 } | |
192 } | |
193 } | |
194 | |
195 virtual bool HasRender() const | |
196 { | |
197 return false; | |
198 } | |
199 | |
200 virtual void Render(CairoContext& context, | |
201 double zoom) | |
202 { | |
203 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); | |
204 } | |
205 | |
206 virtual void MouseUp() | |
207 { | |
208 if (accessor_.IsValid()) | |
209 { | |
355
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
210 undoRedoStack_.Add(new UndoRedoCommand(*this)); |
354 | 211 } |
212 } | |
213 | |
214 virtual void MouseMove(int displayX, | |
215 int displayY, | |
216 double sceneX, | |
217 double sceneY) | |
218 { | |
219 static const double ROUND_ANGLE = 15.0 / 180.0 * boost::math::constants::pi<double>(); | |
220 | |
221 double angle; | |
222 | |
223 if (accessor_.IsValid() && | |
224 ComputeAngle(angle, sceneX, sceneY)) | |
225 { | |
226 angle = angle - clickAngle_ + originalAngle_; | |
227 | |
228 if (roundAngles_) | |
229 { | |
376
70256a53ff21
fix compatibility with Visual Studio 2008
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
369
diff
changeset
|
230 angle = boost::math::round<double>((angle / ROUND_ANGLE) * ROUND_ANGLE); |
354 | 231 } |
232 | |
407 | 233 accessor_.GetLayer().SetAngle(angle); |
354 | 234 } |
235 } | |
236 }; | |
237 | |
238 | |
408 | 239 class RadiographyLayerMoveTracker : public IWorldSceneMouseTracker |
354 | 240 { |
241 private: | |
408 | 242 UndoRedoStack& undoRedoStack_; |
243 RadiographyScene::LayerAccessor accessor_; | |
244 double clickX_; | |
245 double clickY_; | |
246 double panX_; | |
247 double panY_; | |
248 bool oneAxis_; | |
407 | 249 |
408 | 250 class UndoRedoCommand : public RadiographyLayerCommand |
354 | 251 { |
252 private: | |
253 double sourceX_; | |
254 double sourceY_; | |
255 double targetX_; | |
256 double targetY_; | |
257 | |
258 protected: | |
408 | 259 virtual void UndoInternal(RadiographyScene::Layer& layer) const |
354 | 260 { |
407 | 261 layer.SetPan(sourceX_, sourceY_); |
354 | 262 } |
263 | |
408 | 264 virtual void RedoInternal(RadiographyScene::Layer& layer) const |
354 | 265 { |
407 | 266 layer.SetPan(targetX_, targetY_); |
354 | 267 } |
268 | |
269 public: | |
408 | 270 UndoRedoCommand(const RadiographyLayerMoveTracker& tracker) : |
271 RadiographyLayerCommand(tracker.accessor_), | |
355
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
272 sourceX_(tracker.panX_), |
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
273 sourceY_(tracker.panY_), |
407 | 274 targetX_(tracker.accessor_.GetLayer().GetPanX()), |
275 targetY_(tracker.accessor_.GetLayer().GetPanY()) | |
354 | 276 { |
277 } | |
278 }; | |
279 | |
280 | |
281 public: | |
408 | 282 RadiographyLayerMoveTracker(UndoRedoStack& undoRedoStack, |
283 RadiographyScene& scene, | |
284 size_t layer, | |
285 double x, | |
286 double y, | |
287 bool oneAxis) : | |
354 | 288 undoRedoStack_(undoRedoStack), |
407 | 289 accessor_(scene, layer), |
354 | 290 clickX_(x), |
291 clickY_(y), | |
292 oneAxis_(oneAxis) | |
293 { | |
294 if (accessor_.IsValid()) | |
295 { | |
407 | 296 panX_ = accessor_.GetLayer().GetPanX(); |
297 panY_ = accessor_.GetLayer().GetPanY(); | |
354 | 298 } |
299 } | |
300 | |
301 virtual bool HasRender() const | |
302 { | |
303 return false; | |
304 } | |
305 | |
306 virtual void Render(CairoContext& context, | |
307 double zoom) | |
308 { | |
309 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); | |
310 } | |
311 | |
312 virtual void MouseUp() | |
313 { | |
314 if (accessor_.IsValid()) | |
315 { | |
355
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
316 undoRedoStack_.Add(new UndoRedoCommand(*this)); |
354 | 317 } |
318 } | |
319 | |
320 virtual void MouseMove(int displayX, | |
321 int displayY, | |
322 double sceneX, | |
323 double sceneY) | |
324 { | |
325 if (accessor_.IsValid()) | |
326 { | |
327 double dx = sceneX - clickX_; | |
328 double dy = sceneY - clickY_; | |
329 | |
330 if (oneAxis_) | |
331 { | |
332 if (fabs(dx) > fabs(dy)) | |
333 { | |
407 | 334 accessor_.GetLayer().SetPan(dx + panX_, panY_); |
354 | 335 } |
336 else | |
337 { | |
407 | 338 accessor_.GetLayer().SetPan(panX_, dy + panY_); |
354 | 339 } |
340 } | |
341 else | |
342 { | |
407 | 343 accessor_.GetLayer().SetPan(dx + panX_, dy + panY_); |
354 | 344 } |
345 } | |
346 } | |
347 }; | |
348 | |
349 | |
408 | 350 class RadiographyLayerCropTracker : public IWorldSceneMouseTracker |
354 | 351 { |
352 private: | |
408 | 353 UndoRedoStack& undoRedoStack_; |
354 RadiographyScene::LayerAccessor accessor_; | |
355 RadiographyScene::Corner corner_; | |
356 unsigned int cropX_; | |
357 unsigned int cropY_; | |
358 unsigned int cropWidth_; | |
359 unsigned int cropHeight_; | |
407 | 360 |
408 | 361 class UndoRedoCommand : public RadiographyLayerCommand |
355
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
362 { |
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
363 private: |
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
364 unsigned int sourceCropX_; |
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
365 unsigned int sourceCropY_; |
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
366 unsigned int sourceCropWidth_; |
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
367 unsigned int sourceCropHeight_; |
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
368 unsigned int targetCropX_; |
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
369 unsigned int targetCropY_; |
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
370 unsigned int targetCropWidth_; |
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
371 unsigned int targetCropHeight_; |
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
372 |
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
373 protected: |
408 | 374 virtual void UndoInternal(RadiographyScene::Layer& layer) const |
355
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
375 { |
407 | 376 layer.SetCrop(sourceCropX_, sourceCropY_, sourceCropWidth_, sourceCropHeight_); |
355
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
377 } |
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
378 |
408 | 379 virtual void RedoInternal(RadiographyScene::Layer& layer) const |
355
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
380 { |
407 | 381 layer.SetCrop(targetCropX_, targetCropY_, targetCropWidth_, targetCropHeight_); |
355
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
382 } |
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
383 |
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
384 public: |
408 | 385 UndoRedoCommand(const RadiographyLayerCropTracker& tracker) : |
386 RadiographyLayerCommand(tracker.accessor_), | |
355
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
387 sourceCropX_(tracker.cropX_), |
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
388 sourceCropY_(tracker.cropY_), |
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
389 sourceCropWidth_(tracker.cropWidth_), |
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
390 sourceCropHeight_(tracker.cropHeight_) |
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
391 { |
407 | 392 tracker.accessor_.GetLayer().GetCrop(targetCropX_, targetCropY_, |
393 targetCropWidth_, targetCropHeight_); | |
355
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
394 } |
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
395 }; |
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
396 |
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
397 |
354 | 398 public: |
408 | 399 RadiographyLayerCropTracker(UndoRedoStack& undoRedoStack, |
400 RadiographyScene& scene, | |
401 const ViewportGeometry& view, | |
402 size_t layer, | |
403 double x, | |
404 double y, | |
405 RadiographyScene::Corner corner) : | |
355
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
406 undoRedoStack_(undoRedoStack), |
407 | 407 accessor_(scene, layer), |
354 | 408 corner_(corner) |
409 { | |
410 if (accessor_.IsValid()) | |
411 { | |
407 | 412 accessor_.GetLayer().GetCrop(cropX_, cropY_, cropWidth_, cropHeight_); |
354 | 413 } |
414 } | |
415 | |
416 virtual bool HasRender() const | |
417 { | |
418 return false; | |
419 } | |
420 | |
421 virtual void Render(CairoContext& context, | |
422 double zoom) | |
423 { | |
424 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); | |
425 } | |
426 | |
427 virtual void MouseUp() | |
428 { | |
355
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
429 if (accessor_.IsValid()) |
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
430 { |
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
431 undoRedoStack_.Add(new UndoRedoCommand(*this)); |
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
432 } |
354 | 433 } |
434 | |
435 virtual void MouseMove(int displayX, | |
436 int displayY, | |
437 double sceneX, | |
438 double sceneY) | |
439 { | |
440 if (accessor_.IsValid()) | |
441 { | |
442 unsigned int x, y; | |
443 | |
408 | 444 RadiographyScene::Layer& layer = accessor_.GetLayer(); |
407 | 445 if (layer.GetPixel(x, y, sceneX, sceneY)) |
354 | 446 { |
447 unsigned int targetX, targetWidth; | |
448 | |
408 | 449 if (corner_ == RadiographyScene::Corner_TopLeft || |
450 corner_ == RadiographyScene::Corner_BottomLeft) | |
354 | 451 { |
452 targetX = std::min(x, cropX_ + cropWidth_); | |
453 targetWidth = cropX_ + cropWidth_ - targetX; | |
454 } | |
455 else | |
456 { | |
457 targetX = cropX_; | |
458 targetWidth = std::max(x, cropX_) - cropX_; | |
459 } | |
460 | |
461 unsigned int targetY, targetHeight; | |
462 | |
408 | 463 if (corner_ == RadiographyScene::Corner_TopLeft || |
464 corner_ == RadiographyScene::Corner_TopRight) | |
354 | 465 { |
466 targetY = std::min(y, cropY_ + cropHeight_); | |
467 targetHeight = cropY_ + cropHeight_ - targetY; | |
468 } | |
469 else | |
470 { | |
471 targetY = cropY_; | |
472 targetHeight = std::max(y, cropY_) - cropY_; | |
473 } | |
474 | |
407 | 475 layer.SetCrop(targetX, targetY, targetWidth, targetHeight); |
354 | 476 } |
477 } | |
478 } | |
479 }; | |
480 | |
481 | |
408 | 482 class RadiographyLayerResizeTracker : public IWorldSceneMouseTracker |
354 | 483 { |
484 private: | |
408 | 485 UndoRedoStack& undoRedoStack_; |
486 RadiographyScene::LayerAccessor accessor_; | |
487 bool roundScaling_; | |
488 double originalSpacingX_; | |
489 double originalSpacingY_; | |
490 double originalPanX_; | |
491 double originalPanY_; | |
492 RadiographyScene::Corner oppositeCorner_; | |
493 double oppositeX_; | |
494 double oppositeY_; | |
495 double baseScaling_; | |
354 | 496 |
497 static double ComputeDistance(double x1, | |
498 double y1, | |
499 double x2, | |
500 double y2) | |
501 { | |
502 double dx = x1 - x2; | |
503 double dy = y1 - y2; | |
504 return sqrt(dx * dx + dy * dy); | |
505 } | |
506 | |
408 | 507 class UndoRedoCommand : public RadiographyLayerCommand |
355
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
508 { |
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
509 private: |
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
510 double sourceSpacingX_; |
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
511 double sourceSpacingY_; |
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
512 double sourcePanX_; |
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
513 double sourcePanY_; |
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
514 double targetSpacingX_; |
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
515 double targetSpacingY_; |
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
516 double targetPanX_; |
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
517 double targetPanY_; |
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
518 |
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
519 protected: |
408 | 520 virtual void UndoInternal(RadiographyScene::Layer& layer) const |
355
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
521 { |
407 | 522 layer.SetPixelSpacing(sourceSpacingX_, sourceSpacingY_); |
523 layer.SetPan(sourcePanX_, sourcePanY_); | |
355
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
524 } |
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
525 |
408 | 526 virtual void RedoInternal(RadiographyScene::Layer& layer) const |
355
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
527 { |
407 | 528 layer.SetPixelSpacing(targetSpacingX_, targetSpacingY_); |
529 layer.SetPan(targetPanX_, targetPanY_); | |
355
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
530 } |
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
531 |
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
532 public: |
408 | 533 UndoRedoCommand(const RadiographyLayerResizeTracker& tracker) : |
534 RadiographyLayerCommand(tracker.accessor_), | |
355
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
535 sourceSpacingX_(tracker.originalSpacingX_), |
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
536 sourceSpacingY_(tracker.originalSpacingY_), |
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
537 sourcePanX_(tracker.originalPanX_), |
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
538 sourcePanY_(tracker.originalPanY_), |
407 | 539 targetSpacingX_(tracker.accessor_.GetLayer().GetPixelSpacingX()), |
540 targetSpacingY_(tracker.accessor_.GetLayer().GetPixelSpacingY()), | |
541 targetPanX_(tracker.accessor_.GetLayer().GetPanX()), | |
542 targetPanY_(tracker.accessor_.GetLayer().GetPanY()) | |
355
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
543 { |
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
544 } |
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
545 }; |
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
546 |
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
547 |
354 | 548 public: |
408 | 549 RadiographyLayerResizeTracker(UndoRedoStack& undoRedoStack, |
550 RadiographyScene& scene, | |
551 size_t layer, | |
552 double x, | |
553 double y, | |
554 RadiographyScene::Corner corner, | |
555 bool roundScaling) : | |
355
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
556 undoRedoStack_(undoRedoStack), |
407 | 557 accessor_(scene, layer), |
354 | 558 roundScaling_(roundScaling) |
559 { | |
560 if (accessor_.IsValid() && | |
407 | 561 accessor_.GetLayer().IsResizeable()) |
354 | 562 { |
407 | 563 originalSpacingX_ = accessor_.GetLayer().GetPixelSpacingX(); |
564 originalSpacingY_ = accessor_.GetLayer().GetPixelSpacingY(); | |
565 originalPanX_ = accessor_.GetLayer().GetPanX(); | |
566 originalPanY_ = accessor_.GetLayer().GetPanY(); | |
354 | 567 |
568 switch (corner) | |
569 { | |
408 | 570 case RadiographyScene::Corner_TopLeft: |
571 oppositeCorner_ = RadiographyScene::Corner_BottomRight; | |
354 | 572 break; |
573 | |
408 | 574 case RadiographyScene::Corner_TopRight: |
575 oppositeCorner_ = RadiographyScene::Corner_BottomLeft; | |
354 | 576 break; |
577 | |
408 | 578 case RadiographyScene::Corner_BottomLeft: |
579 oppositeCorner_ = RadiographyScene::Corner_TopRight; | |
354 | 580 break; |
581 | |
408 | 582 case RadiographyScene::Corner_BottomRight: |
583 oppositeCorner_ = RadiographyScene::Corner_TopLeft; | |
354 | 584 break; |
585 | |
586 default: | |
587 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); | |
588 } | |
589 | |
407 | 590 accessor_.GetLayer().GetCorner(oppositeX_, oppositeY_, oppositeCorner_); |
354 | 591 |
592 double d = ComputeDistance(x, y, oppositeX_, oppositeY_); | |
593 if (d >= std::numeric_limits<float>::epsilon()) | |
594 { | |
595 baseScaling_ = 1.0 / d; | |
596 } | |
597 else | |
598 { | |
599 // Avoid division by zero in extreme cases | |
600 accessor_.Invalidate(); | |
601 } | |
602 } | |
603 } | |
604 | |
605 virtual bool HasRender() const | |
606 { | |
607 return false; | |
608 } | |
609 | |
610 virtual void Render(CairoContext& context, | |
611 double zoom) | |
612 { | |
613 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); | |
614 } | |
615 | |
616 virtual void MouseUp() | |
617 { | |
357
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
618 if (accessor_.IsValid() && |
407 | 619 accessor_.GetLayer().IsResizeable()) |
355
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
620 { |
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
621 undoRedoStack_.Add(new UndoRedoCommand(*this)); |
d2468dd75b3f
undo redo for all tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
354
diff
changeset
|
622 } |
354 | 623 } |
624 | |
625 virtual void MouseMove(int displayX, | |
626 int displayY, | |
627 double sceneX, | |
628 double sceneY) | |
629 { | |
630 static const double ROUND_SCALING = 0.1; | |
631 | |
632 if (accessor_.IsValid() && | |
407 | 633 accessor_.GetLayer().IsResizeable()) |
354 | 634 { |
635 double scaling = ComputeDistance(oppositeX_, oppositeY_, sceneX, sceneY) * baseScaling_; | |
636 | |
637 if (roundScaling_) | |
638 { | |
376
70256a53ff21
fix compatibility with Visual Studio 2008
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
369
diff
changeset
|
639 scaling = boost::math::round<double>((scaling / ROUND_SCALING) * ROUND_SCALING); |
354 | 640 } |
641 | |
408 | 642 RadiographyScene::Layer& layer = accessor_.GetLayer(); |
407 | 643 layer.SetPixelSpacing(scaling * originalSpacingX_, |
644 scaling * originalSpacingY_); | |
354 | 645 |
646 // Keep the opposite corner at a fixed location | |
647 double ox, oy; | |
407 | 648 layer.GetCorner(ox, oy, oppositeCorner_); |
649 layer.SetPan(layer.GetPanX() + oppositeX_ - ox, | |
650 layer.GetPanY() + oppositeY_ - oy); | |
354 | 651 } |
652 } | |
653 }; | |
654 | |
655 | |
408 | 656 class RadiographyWindowingTracker : public IWorldSceneMouseTracker |
356
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
657 { |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
658 public: |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
659 enum Action |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
660 { |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
661 Action_IncreaseWidth, |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
662 Action_DecreaseWidth, |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
663 Action_IncreaseCenter, |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
664 Action_DecreaseCenter |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
665 }; |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
666 |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
667 private: |
408 | 668 UndoRedoStack& undoRedoStack_; |
669 RadiographyScene& scene_; | |
670 int clickX_; | |
671 int clickY_; | |
672 Action leftAction_; | |
673 Action rightAction_; | |
674 Action upAction_; | |
675 Action downAction_; | |
676 float strength_; | |
677 float sourceCenter_; | |
678 float sourceWidth_; | |
356
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
679 |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
680 static void ComputeAxisEffect(int& deltaCenter, |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
681 int& deltaWidth, |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
682 int delta, |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
683 Action actionNegative, |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
684 Action actionPositive) |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
685 { |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
686 if (delta < 0) |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
687 { |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
688 switch (actionNegative) |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
689 { |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
690 case Action_IncreaseWidth: |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
691 deltaWidth = -delta; |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
692 break; |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
693 |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
694 case Action_DecreaseWidth: |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
695 deltaWidth = delta; |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
696 break; |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
697 |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
698 case Action_IncreaseCenter: |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
699 deltaCenter = -delta; |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
700 break; |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
701 |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
702 case Action_DecreaseCenter: |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
703 deltaCenter = delta; |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
704 break; |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
705 |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
706 default: |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
707 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
708 } |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
709 } |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
710 else if (delta > 0) |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
711 { |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
712 switch (actionPositive) |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
713 { |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
714 case Action_IncreaseWidth: |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
715 deltaWidth = delta; |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
716 break; |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
717 |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
718 case Action_DecreaseWidth: |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
719 deltaWidth = -delta; |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
720 break; |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
721 |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
722 case Action_IncreaseCenter: |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
723 deltaCenter = delta; |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
724 break; |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
725 |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
726 case Action_DecreaseCenter: |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
727 deltaCenter = -delta; |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
728 break; |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
729 |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
730 default: |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
731 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
732 } |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
733 } |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
734 } |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
735 |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
736 |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
737 class UndoRedoCommand : public UndoRedoStack::ICommand |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
738 { |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
739 private: |
408 | 740 RadiographyScene& scene_; |
741 float sourceCenter_; | |
742 float sourceWidth_; | |
743 float targetCenter_; | |
744 float targetWidth_; | |
356
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
745 |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
746 public: |
408 | 747 UndoRedoCommand(const RadiographyWindowingTracker& tracker) : |
407 | 748 scene_(tracker.scene_), |
356
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
749 sourceCenter_(tracker.sourceCenter_), |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
750 sourceWidth_(tracker.sourceWidth_) |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
751 { |
407 | 752 scene_.GetWindowingWithDefault(targetCenter_, targetWidth_); |
356
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
753 } |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
754 |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
755 virtual void Undo() const |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
756 { |
407 | 757 scene_.SetWindowing(sourceCenter_, sourceWidth_); |
356
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
758 } |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
759 |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
760 virtual void Redo() const |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
761 { |
407 | 762 scene_.SetWindowing(targetCenter_, targetWidth_); |
356
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
763 } |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
764 }; |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
765 |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
766 |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
767 public: |
408 | 768 RadiographyWindowingTracker(UndoRedoStack& undoRedoStack, |
769 RadiographyScene& scene, | |
770 int x, | |
771 int y, | |
772 Action leftAction, | |
773 Action rightAction, | |
774 Action upAction, | |
775 Action downAction) : | |
356
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
776 undoRedoStack_(undoRedoStack), |
407 | 777 scene_(scene), |
356
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
778 clickX_(x), |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
779 clickY_(y), |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
780 leftAction_(leftAction), |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
781 rightAction_(rightAction), |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
782 upAction_(upAction), |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
783 downAction_(downAction) |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
784 { |
407 | 785 scene_.GetWindowingWithDefault(sourceCenter_, sourceWidth_); |
356
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
786 |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
787 float minValue, maxValue; |
407 | 788 scene.GetRange(minValue, maxValue); |
356
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
789 |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
790 assert(minValue <= maxValue); |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
791 |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
792 float tmp; |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
793 |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
794 float delta = (maxValue - minValue); |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
795 if (delta <= 1) |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
796 { |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
797 tmp = 0; |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
798 } |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
799 else |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
800 { |
376
70256a53ff21
fix compatibility with Visual Studio 2008
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
369
diff
changeset
|
801 // NB: Visual Studio 2008 does not provide "log2f()", so we |
70256a53ff21
fix compatibility with Visual Studio 2008
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
369
diff
changeset
|
802 // implement it by ourselves |
70256a53ff21
fix compatibility with Visual Studio 2008
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
369
diff
changeset
|
803 tmp = logf(delta) / logf(2.0f); |
356
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
804 } |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
805 |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
806 strength_ = tmp - 7; |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
807 if (strength_ < 1) |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
808 { |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
809 strength_ = 1; |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
810 } |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
811 } |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
812 |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
813 virtual bool HasRender() const |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
814 { |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
815 return false; |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
816 } |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
817 |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
818 virtual void Render(CairoContext& context, |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
819 double zoom) |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
820 { |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
821 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
822 } |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
823 |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
824 virtual void MouseUp() |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
825 { |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
826 undoRedoStack_.Add(new UndoRedoCommand(*this)); |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
827 } |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
828 |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
829 |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
830 virtual void MouseMove(int displayX, |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
831 int displayY, |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
832 double sceneX, |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
833 double sceneY) |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
834 { |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
835 // https://bitbucket.org/osimis/osimis-webviewer-plugin/src/master/frontend/src/app/viewport/image-plugins/windowing-viewport-tool.class.js |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
836 |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
837 static const float SCALE = 1.0; |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
838 |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
839 int deltaCenter = 0; |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
840 int deltaWidth = 0; |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
841 |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
842 ComputeAxisEffect(deltaCenter, deltaWidth, displayX - clickX_, leftAction_, rightAction_); |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
843 ComputeAxisEffect(deltaCenter, deltaWidth, displayY - clickY_, upAction_, downAction_); |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
844 |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
845 float newCenter = sourceCenter_ + (deltaCenter / SCALE * strength_); |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
846 float newWidth = sourceWidth_ + (deltaWidth / SCALE * strength_); |
407 | 847 scene_.SetWindowing(newCenter, newWidth); |
356
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
848 } |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
849 }; |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
850 |
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
355
diff
changeset
|
851 |
408 | 852 class RadiographyWidget : |
338 | 853 public WorldSceneWidget, |
854 public IObserver | |
855 { | |
856 private: | |
408 | 857 RadiographyScene& scene_; |
357
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
858 std::auto_ptr<Orthanc::Image> floatBuffer_; |
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
859 std::auto_ptr<CairoSurface> cairoBuffer_; |
358 | 860 bool invert_; |
359
100df90bf0ea
preparing to implement Export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
358
diff
changeset
|
861 ImageInterpolation interpolation_; |
384
d20d75f20c5d
better following of the MVC design pattern
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
377
diff
changeset
|
862 bool hasSelection_; |
407 | 863 size_t selectedLayer_; |
357
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
864 |
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
865 virtual bool RenderInternal(unsigned int width, |
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
866 unsigned int height, |
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
867 ImageInterpolation interpolation) |
340
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
868 { |
339 | 869 float windowCenter, windowWidth; |
407 | 870 scene_.GetWindowingWithDefault(windowCenter, windowWidth); |
339 | 871 |
872 float x0 = windowCenter - windowWidth / 2.0f; | |
873 float x1 = windowCenter + windowWidth / 2.0f; | |
874 | |
357
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
875 if (windowWidth <= 0.001f) // Avoid division by zero at (*) |
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
876 { |
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
877 return false; |
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
878 } |
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
879 else |
339 | 880 { |
357
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
881 if (floatBuffer_.get() == NULL || |
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
882 floatBuffer_->GetWidth() != width || |
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
883 floatBuffer_->GetHeight() != height) |
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
884 { |
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
885 floatBuffer_.reset(new Orthanc::Image(Orthanc::PixelFormat_Float32, width, height, false)); |
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
886 } |
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
887 |
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
888 if (cairoBuffer_.get() == NULL || |
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
889 cairoBuffer_->GetWidth() != width || |
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
890 cairoBuffer_->GetHeight() != height) |
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
891 { |
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
892 cairoBuffer_.reset(new CairoSurface(width, height)); |
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
893 } |
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
894 |
407 | 895 scene_.Render(*floatBuffer_, GetView().GetMatrix(), interpolation); |
357
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
896 |
360 | 897 // Conversion from Float32 to BGRA32 (cairo). Very similar to |
898 // GrayscaleFrameRenderer => TODO MERGE? | |
357
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
899 |
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
900 Orthanc::ImageAccessor target; |
369
557c8ff1db5c
integration mainline->am-2
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
365
diff
changeset
|
901 cairoBuffer_->GetWriteableAccessor(target); |
360 | 902 |
903 float scaling = 255.0f / (x1 - x0); | |
357
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
904 |
344
fdec8e6893cb
ordering of bitmap layers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
343
diff
changeset
|
905 for (unsigned int y = 0; y < height; y++) |
fdec8e6893cb
ordering of bitmap layers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
343
diff
changeset
|
906 { |
357
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
907 const float* p = reinterpret_cast<const float*>(floatBuffer_->GetConstRow(y)); |
344
fdec8e6893cb
ordering of bitmap layers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
343
diff
changeset
|
908 uint8_t* q = reinterpret_cast<uint8_t*>(target.GetRow(y)); |
339 | 909 |
344
fdec8e6893cb
ordering of bitmap layers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
343
diff
changeset
|
910 for (unsigned int x = 0; x < width; x++, p++, q += 4) |
339 | 911 { |
344
fdec8e6893cb
ordering of bitmap layers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
343
diff
changeset
|
912 uint8_t v = 0; |
339 | 913 if (*p >= x1) |
914 { | |
915 v = 255; | |
916 } | |
917 else if (*p <= x0) | |
918 { | |
919 v = 0; | |
920 } | |
921 else | |
922 { | |
923 // https://en.wikipedia.org/wiki/Linear_interpolation | |
360 | 924 v = static_cast<uint8_t>(scaling * (*p - x0)); // (*) |
339 | 925 } |
926 | |
358 | 927 if (invert_) |
928 { | |
339 | 929 v = 255 - v; |
358 | 930 } |
344
fdec8e6893cb
ordering of bitmap layers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
343
diff
changeset
|
931 |
fdec8e6893cb
ordering of bitmap layers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
343
diff
changeset
|
932 q[0] = v; |
fdec8e6893cb
ordering of bitmap layers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
343
diff
changeset
|
933 q[1] = v; |
fdec8e6893cb
ordering of bitmap layers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
343
diff
changeset
|
934 q[2] = v; |
fdec8e6893cb
ordering of bitmap layers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
343
diff
changeset
|
935 q[3] = 255; |
339 | 936 } |
937 } | |
357
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
938 |
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
939 return true; |
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
940 } |
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
941 } |
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
942 |
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
943 protected: |
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
944 virtual Extent2D GetSceneExtent() |
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
945 { |
407 | 946 return scene_.GetSceneExtent(); |
357
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
947 } |
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
948 |
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
949 virtual bool RenderScene(CairoContext& context, |
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
950 const ViewportGeometry& view) |
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
951 { |
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
952 cairo_t* cr = context.GetObject(); |
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
953 |
359
100df90bf0ea
preparing to implement Export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
358
diff
changeset
|
954 if (RenderInternal(context.GetWidth(), context.GetHeight(), interpolation_)) |
357
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
955 { |
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
956 // https://www.cairographics.org/FAQ/#paint_from_a_surface |
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
957 cairo_save(cr); |
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
958 cairo_identity_matrix(cr); |
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
959 cairo_set_source_surface(cr, cairoBuffer_->GetObject(), 0, 0); |
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
960 cairo_paint(cr); |
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
961 cairo_restore(cr); |
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
962 } |
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
963 else |
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
964 { |
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
965 // https://www.cairographics.org/FAQ/#clear_a_surface |
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
966 context.SetSourceColor(0, 0, 0); |
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
967 cairo_paint(cr); |
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
968 } |
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
969 |
384
d20d75f20c5d
better following of the MVC design pattern
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
377
diff
changeset
|
970 if (hasSelection_) |
d20d75f20c5d
better following of the MVC design pattern
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
377
diff
changeset
|
971 { |
407 | 972 scene_.DrawBorder(context, selectedLayer_, view.GetZoom()); |
384
d20d75f20c5d
better following of the MVC design pattern
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
377
diff
changeset
|
973 } |
357
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
974 |
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
975 return true; |
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
976 } |
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
977 |
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
978 public: |
408 | 979 RadiographyWidget(MessageBroker& broker, |
980 RadiographyScene& scene, | |
981 const std::string& name) : | |
357
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
982 WorldSceneWidget(name), |
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
983 IObserver(broker), |
407 | 984 scene_(scene), |
359
100df90bf0ea
preparing to implement Export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
358
diff
changeset
|
985 invert_(false), |
384
d20d75f20c5d
better following of the MVC design pattern
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
377
diff
changeset
|
986 interpolation_(ImageInterpolation_Nearest), |
d20d75f20c5d
better following of the MVC design pattern
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
377
diff
changeset
|
987 hasSelection_(false), |
407 | 988 selectedLayer_(0) // Dummy initialization |
357
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
989 { |
407 | 990 scene.RegisterObserverCallback( |
408 | 991 new Callable<RadiographyWidget, RadiographyScene::GeometryChangedMessage> |
992 (*this, &RadiographyWidget::OnGeometryChanged)); | |
407 | 993 |
994 scene.RegisterObserverCallback( | |
408 | 995 new Callable<RadiographyWidget, RadiographyScene::ContentChangedMessage> |
996 (*this, &RadiographyWidget::OnContentChanged)); | |
358 | 997 } |
998 | |
408 | 999 RadiographyScene& GetScene() const |
358 | 1000 { |
407 | 1001 return scene_; |
357
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
1002 } |
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
1003 |
384
d20d75f20c5d
better following of the MVC design pattern
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
377
diff
changeset
|
1004 void Unselect() |
d20d75f20c5d
better following of the MVC design pattern
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
377
diff
changeset
|
1005 { |
d20d75f20c5d
better following of the MVC design pattern
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
377
diff
changeset
|
1006 hasSelection_ = false; |
d20d75f20c5d
better following of the MVC design pattern
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
377
diff
changeset
|
1007 } |
d20d75f20c5d
better following of the MVC design pattern
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
377
diff
changeset
|
1008 |
407 | 1009 void Select(size_t layer) |
384
d20d75f20c5d
better following of the MVC design pattern
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
377
diff
changeset
|
1010 { |
d20d75f20c5d
better following of the MVC design pattern
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
377
diff
changeset
|
1011 hasSelection_ = true; |
407 | 1012 selectedLayer_ = layer; |
384
d20d75f20c5d
better following of the MVC design pattern
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
377
diff
changeset
|
1013 } |
d20d75f20c5d
better following of the MVC design pattern
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
377
diff
changeset
|
1014 |
407 | 1015 bool LookupSelectedLayer(size_t& layer) |
384
d20d75f20c5d
better following of the MVC design pattern
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
377
diff
changeset
|
1016 { |
d20d75f20c5d
better following of the MVC design pattern
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
377
diff
changeset
|
1017 if (hasSelection_) |
d20d75f20c5d
better following of the MVC design pattern
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
377
diff
changeset
|
1018 { |
407 | 1019 layer = selectedLayer_; |
384
d20d75f20c5d
better following of the MVC design pattern
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
377
diff
changeset
|
1020 return true; |
d20d75f20c5d
better following of the MVC design pattern
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
377
diff
changeset
|
1021 } |
d20d75f20c5d
better following of the MVC design pattern
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
377
diff
changeset
|
1022 else |
d20d75f20c5d
better following of the MVC design pattern
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
377
diff
changeset
|
1023 { |
d20d75f20c5d
better following of the MVC design pattern
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
377
diff
changeset
|
1024 return false; |
d20d75f20c5d
better following of the MVC design pattern
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
377
diff
changeset
|
1025 } |
d20d75f20c5d
better following of the MVC design pattern
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
377
diff
changeset
|
1026 } |
d20d75f20c5d
better following of the MVC design pattern
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
377
diff
changeset
|
1027 |
408 | 1028 void OnGeometryChanged(const RadiographyScene::GeometryChangedMessage& message) |
357
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
1029 { |
358 | 1030 LOG(INFO) << "Geometry has changed"; |
357
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
1031 FitContent(); |
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
1032 } |
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
1033 |
408 | 1034 void OnContentChanged(const RadiographyScene::ContentChangedMessage& message) |
357
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
1035 { |
358 | 1036 LOG(INFO) << "Content has changed"; |
1037 NotifyContentChanged(); | |
1038 } | |
1039 | |
1040 void SetInvert(bool invert) | |
1041 { | |
359
100df90bf0ea
preparing to implement Export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
358
diff
changeset
|
1042 if (invert_ != invert) |
100df90bf0ea
preparing to implement Export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
358
diff
changeset
|
1043 { |
100df90bf0ea
preparing to implement Export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
358
diff
changeset
|
1044 invert_ = invert; |
100df90bf0ea
preparing to implement Export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
358
diff
changeset
|
1045 NotifyContentChanged(); |
100df90bf0ea
preparing to implement Export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
358
diff
changeset
|
1046 } |
358 | 1047 } |
1048 | |
1049 void SwitchInvert() | |
1050 { | |
1051 invert_ = !invert_; | |
357
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
1052 NotifyContentChanged(); |
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
1053 } |
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
1054 |
384
d20d75f20c5d
better following of the MVC design pattern
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
377
diff
changeset
|
1055 bool IsInverted() const |
358 | 1056 { |
1057 return invert_; | |
1058 } | |
359
100df90bf0ea
preparing to implement Export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
358
diff
changeset
|
1059 |
100df90bf0ea
preparing to implement Export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
358
diff
changeset
|
1060 void SetInterpolation(ImageInterpolation interpolation) |
100df90bf0ea
preparing to implement Export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
358
diff
changeset
|
1061 { |
100df90bf0ea
preparing to implement Export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
358
diff
changeset
|
1062 if (interpolation_ != interpolation) |
100df90bf0ea
preparing to implement Export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
358
diff
changeset
|
1063 { |
100df90bf0ea
preparing to implement Export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
358
diff
changeset
|
1064 interpolation_ = interpolation; |
100df90bf0ea
preparing to implement Export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
358
diff
changeset
|
1065 NotifyContentChanged(); |
100df90bf0ea
preparing to implement Export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
358
diff
changeset
|
1066 } |
100df90bf0ea
preparing to implement Export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
358
diff
changeset
|
1067 } |
100df90bf0ea
preparing to implement Export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
358
diff
changeset
|
1068 |
100df90bf0ea
preparing to implement Export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
358
diff
changeset
|
1069 ImageInterpolation GetInterpolation() const |
100df90bf0ea
preparing to implement Export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
358
diff
changeset
|
1070 { |
100df90bf0ea
preparing to implement Export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
358
diff
changeset
|
1071 return interpolation_; |
100df90bf0ea
preparing to implement Export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
358
diff
changeset
|
1072 } |
358 | 1073 }; |
1074 | |
1075 | |
407 | 1076 namespace Samples |
358 | 1077 { |
408 | 1078 class RadiographyEditorInteractor : |
407 | 1079 public IWorldSceneInteractor, |
1080 public IObserver | |
358 | 1081 { |
407 | 1082 private: |
1083 enum Tool | |
1084 { | |
1085 Tool_Move, | |
1086 Tool_Rotate, | |
1087 Tool_Crop, | |
1088 Tool_Resize, | |
1089 Tool_Windowing | |
1090 }; | |
358 | 1091 |
1092 | |
407 | 1093 UndoRedoStack undoRedoStack_; |
1094 Tool tool_; | |
1095 | |
1096 | |
1097 static double GetHandleSize() | |
1098 { | |
1099 return 10.0; | |
1100 } | |
358 | 1101 |
384
d20d75f20c5d
better following of the MVC design pattern
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
377
diff
changeset
|
1102 |
407 | 1103 public: |
408 | 1104 RadiographyEditorInteractor(MessageBroker& broker) : |
407 | 1105 IObserver(broker), |
1106 tool_(Tool_Move) | |
1107 { | |
1108 } | |
358 | 1109 |
407 | 1110 virtual IWorldSceneMouseTracker* CreateMouseTracker(WorldSceneWidget& worldWidget, |
1111 const ViewportGeometry& view, | |
1112 MouseButton button, | |
1113 KeyboardModifiers modifiers, | |
1114 int viewportX, | |
1115 int viewportY, | |
1116 double x, | |
1117 double y, | |
1118 IStatusBar* statusBar) | |
357
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
1119 { |
408 | 1120 RadiographyWidget& widget = dynamic_cast<RadiographyWidget&>(worldWidget); |
407 | 1121 |
1122 if (button == MouseButton_Left) | |
358 | 1123 { |
407 | 1124 size_t selected; |
1125 | |
1126 if (tool_ == Tool_Windowing) | |
358 | 1127 { |
408 | 1128 return new RadiographyWindowingTracker( |
1129 undoRedoStack_, widget.GetScene(), | |
1130 viewportX, viewportY, | |
1131 RadiographyWindowingTracker::Action_DecreaseWidth, | |
1132 RadiographyWindowingTracker::Action_IncreaseWidth, | |
1133 RadiographyWindowingTracker::Action_DecreaseCenter, | |
1134 RadiographyWindowingTracker::Action_IncreaseCenter); | |
358 | 1135 } |
407 | 1136 else if (!widget.LookupSelectedLayer(selected)) |
358 | 1137 { |
407 | 1138 // No layer is currently selected |
1139 size_t layer; | |
1140 if (widget.GetScene().LookupLayer(layer, x, y)) | |
358 | 1141 { |
407 | 1142 widget.Select(layer); |
358 | 1143 } |
407 | 1144 |
1145 return NULL; | |
358 | 1146 } |
407 | 1147 else if (tool_ == Tool_Crop || |
1148 tool_ == Tool_Resize) | |
358 | 1149 { |
408 | 1150 RadiographyScene::LayerAccessor accessor(widget.GetScene(), selected); |
1151 RadiographyScene::Corner corner; | |
407 | 1152 if (accessor.GetLayer().LookupCorner(corner, x, y, view.GetZoom(), GetHandleSize())) |
358 | 1153 { |
407 | 1154 switch (tool_) |
1155 { | |
1156 case Tool_Crop: | |
408 | 1157 return new RadiographyLayerCropTracker |
1158 (undoRedoStack_, widget.GetScene(), view, selected, x, y, corner); | |
407 | 1159 |
1160 case Tool_Resize: | |
408 | 1161 return new RadiographyLayerResizeTracker |
1162 (undoRedoStack_, widget.GetScene(), selected, x, y, corner, | |
1163 (modifiers & KeyboardModifiers_Shift)); | |
407 | 1164 |
1165 default: | |
1166 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); | |
1167 } | |
384
d20d75f20c5d
better following of the MVC design pattern
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
377
diff
changeset
|
1168 } |
d20d75f20c5d
better following of the MVC design pattern
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
377
diff
changeset
|
1169 else |
d20d75f20c5d
better following of the MVC design pattern
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
377
diff
changeset
|
1170 { |
407 | 1171 size_t layer; |
358 | 1172 |
407 | 1173 if (widget.GetScene().LookupLayer(layer, x, y)) |
384
d20d75f20c5d
better following of the MVC design pattern
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
377
diff
changeset
|
1174 { |
407 | 1175 widget.Select(layer); |
384
d20d75f20c5d
better following of the MVC design pattern
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
377
diff
changeset
|
1176 } |
407 | 1177 else |
1178 { | |
1179 widget.Unselect(); | |
1180 } | |
1181 | |
384
d20d75f20c5d
better following of the MVC design pattern
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
377
diff
changeset
|
1182 return NULL; |
d20d75f20c5d
better following of the MVC design pattern
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
377
diff
changeset
|
1183 } |
358 | 1184 } |
1185 else | |
1186 { | |
407 | 1187 size_t layer; |
1188 | |
1189 if (widget.GetScene().LookupLayer(layer, x, y)) | |
1190 { | |
1191 if (layer == selected) | |
1192 { | |
1193 switch (tool_) | |
1194 { | |
1195 case Tool_Move: | |
408 | 1196 return new RadiographyLayerMoveTracker |
1197 (undoRedoStack_, widget.GetScene(), layer, x, y, | |
1198 (modifiers & KeyboardModifiers_Shift)); | |
407 | 1199 |
1200 case Tool_Rotate: | |
408 | 1201 return new RadiographyLayerRotateTracker |
1202 (undoRedoStack_, widget.GetScene(), view, layer, x, y, | |
1203 (modifiers & KeyboardModifiers_Shift)); | |
407 | 1204 |
1205 default: | |
1206 break; | |
1207 } | |
1208 | |
1209 return NULL; | |
1210 } | |
1211 else | |
1212 { | |
1213 widget.Select(layer); | |
1214 return NULL; | |
1215 } | |
1216 } | |
1217 else | |
1218 { | |
1219 widget.Unselect(); | |
1220 return NULL; | |
1221 } | |
1222 } | |
1223 } | |
1224 else | |
1225 { | |
1226 return NULL; | |
1227 } | |
1228 } | |
1229 | |
1230 virtual void MouseOver(CairoContext& context, | |
1231 WorldSceneWidget& worldWidget, | |
1232 const ViewportGeometry& view, | |
1233 double x, | |
1234 double y, | |
1235 IStatusBar* statusBar) | |
1236 { | |
408 | 1237 RadiographyWidget& widget = dynamic_cast<RadiographyWidget&>(worldWidget); |
407 | 1238 |
1239 #if 0 | |
1240 if (statusBar != NULL) | |
1241 { | |
1242 char buf[64]; | |
1243 sprintf(buf, "X = %.02f Y = %.02f (in cm)", x / 10.0, y / 10.0); | |
1244 statusBar->SetMessage(buf); | |
1245 } | |
1246 #endif | |
1247 | |
1248 size_t selected; | |
1249 | |
1250 if (widget.LookupSelectedLayer(selected) && | |
1251 (tool_ == Tool_Crop || | |
1252 tool_ == Tool_Resize)) | |
1253 { | |
408 | 1254 RadiographyScene::LayerAccessor accessor(widget.GetScene(), selected); |
407 | 1255 |
408 | 1256 RadiographyScene::Corner corner; |
407 | 1257 if (accessor.GetLayer().LookupCorner(corner, x, y, view.GetZoom(), GetHandleSize())) |
1258 { | |
1259 accessor.GetLayer().GetCorner(x, y, corner); | |
1260 | |
1261 double z = 1.0 / view.GetZoom(); | |
1262 | |
1263 context.SetSourceColor(255, 0, 0); | |
1264 cairo_t* cr = context.GetObject(); | |
1265 cairo_set_line_width(cr, 2.0 * z); | |
1266 cairo_move_to(cr, x - GetHandleSize() * z, y - GetHandleSize() * z); | |
1267 cairo_line_to(cr, x + GetHandleSize() * z, y - GetHandleSize() * z); | |
1268 cairo_line_to(cr, x + GetHandleSize() * z, y + GetHandleSize() * z); | |
1269 cairo_line_to(cr, x - GetHandleSize() * z, y + GetHandleSize() * z); | |
1270 cairo_line_to(cr, x - GetHandleSize() * z, y - GetHandleSize() * z); | |
1271 cairo_stroke(cr); | |
358 | 1272 } |
1273 } | |
339 | 1274 } |
407 | 1275 |
1276 virtual void MouseWheel(WorldSceneWidget& widget, | |
1277 MouseWheelDirection direction, | |
1278 KeyboardModifiers modifiers, | |
1279 IStatusBar* statusBar) | |
344
fdec8e6893cb
ordering of bitmap layers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
343
diff
changeset
|
1280 { |
358 | 1281 } |
407 | 1282 |
1283 virtual void KeyPressed(WorldSceneWidget& worldWidget, | |
1284 KeyboardKeys key, | |
1285 char keyChar, | |
1286 KeyboardModifiers modifiers, | |
1287 IStatusBar* statusBar) | |
345 | 1288 { |
408 | 1289 RadiographyWidget& widget = dynamic_cast<RadiographyWidget&>(worldWidget); |
407 | 1290 |
1291 switch (keyChar) | |
358 | 1292 { |
407 | 1293 case 'a': |
1294 widget.FitContent(); | |
1295 break; | |
1296 | |
1297 case 'c': | |
1298 tool_ = Tool_Crop; | |
1299 break; | |
1300 | |
1301 case 'e': | |
1302 { | |
1303 Orthanc::DicomMap tags; | |
1304 | |
1305 // Minimal set of tags to generate a valid CR image | |
1306 tags.SetValue(Orthanc::DICOM_TAG_ACCESSION_NUMBER, "NOPE", false); | |
1307 tags.SetValue(Orthanc::DICOM_TAG_BODY_PART_EXAMINED, "PELVIS", false); | |
1308 tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "1", false); | |
1309 //tags.SetValue(Orthanc::DICOM_TAG_LATERALITY, "", false); | |
1310 tags.SetValue(Orthanc::DICOM_TAG_MANUFACTURER, "OSIMIS", false); | |
1311 tags.SetValue(Orthanc::DICOM_TAG_MODALITY, "CR", false); | |
1312 tags.SetValue(Orthanc::DICOM_TAG_PATIENT_BIRTH_DATE, "20000101", false); | |
1313 tags.SetValue(Orthanc::DICOM_TAG_PATIENT_ID, "hello", false); | |
1314 tags.SetValue(Orthanc::DICOM_TAG_PATIENT_NAME, "HELLO^WORLD", false); | |
1315 tags.SetValue(Orthanc::DICOM_TAG_PATIENT_ORIENTATION, "", false); | |
1316 tags.SetValue(Orthanc::DICOM_TAG_PATIENT_SEX, "M", false); | |
1317 tags.SetValue(Orthanc::DICOM_TAG_REFERRING_PHYSICIAN_NAME, "HOUSE^MD", false); | |
1318 tags.SetValue(Orthanc::DICOM_TAG_SERIES_NUMBER, "1", false); | |
1319 tags.SetValue(Orthanc::DICOM_TAG_SOP_CLASS_UID, "1.2.840.10008.5.1.4.1.1.1", false); | |
1320 tags.SetValue(Orthanc::DICOM_TAG_STUDY_ID, "STUDY", false); | |
1321 tags.SetValue(Orthanc::DICOM_TAG_VIEW_POSITION, "", false); | |
1322 | |
408 | 1323 widget.GetScene().ExportDicom(tags, 0.1, 0.1, widget.IsInverted(), |
1324 widget.GetInterpolation(), EXPORT_USING_PAM); | |
407 | 1325 break; |
1326 } | |
1327 | |
1328 case 'i': | |
1329 widget.SwitchInvert(); | |
1330 break; | |
1331 | |
1332 case 'm': | |
1333 tool_ = Tool_Move; | |
1334 break; | |
1335 | |
1336 case 'n': | |
1337 { | |
1338 switch (widget.GetInterpolation()) | |
1339 { | |
1340 case ImageInterpolation_Nearest: | |
1341 LOG(INFO) << "Switching to bilinear interpolation"; | |
1342 widget.SetInterpolation(ImageInterpolation_Bilinear); | |
1343 break; | |
1344 | |
1345 case ImageInterpolation_Bilinear: | |
1346 LOG(INFO) << "Switching to nearest neighbor interpolation"; | |
1347 widget.SetInterpolation(ImageInterpolation_Nearest); | |
1348 break; | |
1349 | |
1350 default: | |
1351 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); | |
1352 } | |
358 | 1353 |
407 | 1354 break; |
1355 } | |
1356 | |
1357 case 'r': | |
1358 tool_ = Tool_Rotate; | |
1359 break; | |
1360 | |
1361 case 's': | |
1362 tool_ = Tool_Resize; | |
1363 break; | |
1364 | |
1365 case 'w': | |
1366 tool_ = Tool_Windowing; | |
1367 break; | |
1368 | |
1369 case 'y': | |
1370 if (modifiers & KeyboardModifiers_Control) | |
1371 { | |
1372 undoRedoStack_.Redo(); | |
1373 widget.NotifyContentChanged(); | |
1374 } | |
1375 break; | |
1376 | |
1377 case 'z': | |
1378 if (modifiers & KeyboardModifiers_Control) | |
1379 { | |
1380 undoRedoStack_.Undo(); | |
1381 widget.NotifyContentChanged(); | |
1382 } | |
1383 break; | |
1384 | |
1385 default: | |
1386 break; | |
358 | 1387 } |
345 | 1388 } |
407 | 1389 }; |
336
c7fdc8bac581
creating GrayscaleBitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
334
diff
changeset
|
1390 |
c7fdc8bac581
creating GrayscaleBitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
334
diff
changeset
|
1391 |
358 | 1392 |
325
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
1393 class SingleFrameEditorApplication : |
340
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
1394 public SampleSingleCanvasApplicationBase, |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
1395 public IObserver |
325
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
1396 { |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
1397 private: |
334
c34784e5f299
compatibility fixes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
330
diff
changeset
|
1398 std::auto_ptr<OrthancApiClient> orthancApiClient_; |
408 | 1399 std::auto_ptr<RadiographyScene> scene_; |
1400 RadiographyEditorInteractor interactor_; | |
325
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
1401 |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
1402 public: |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
1403 SingleFrameEditorApplication(MessageBroker& broker) : |
362
12cec26d08ce
export of a valid DICOM CR
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
361
diff
changeset
|
1404 IObserver(broker), |
12cec26d08ce
export of a valid DICOM CR
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
361
diff
changeset
|
1405 interactor_(broker) |
325
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
1406 { |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
1407 } |
384
d20d75f20c5d
better following of the MVC design pattern
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
377
diff
changeset
|
1408 |
d20d75f20c5d
better following of the MVC design pattern
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
377
diff
changeset
|
1409 virtual ~SingleFrameEditorApplication() |
d20d75f20c5d
better following of the MVC design pattern
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
377
diff
changeset
|
1410 { |
d20d75f20c5d
better following of the MVC design pattern
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
377
diff
changeset
|
1411 LOG(WARNING) << "Destroying the application"; |
d20d75f20c5d
better following of the MVC design pattern
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
377
diff
changeset
|
1412 } |
325
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
1413 |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
1414 virtual void DeclareStartupOptions(boost::program_options::options_description& options) |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
1415 { |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
1416 boost::program_options::options_description generic("Sample options"); |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
1417 generic.add_options() |
340
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
1418 ("instance", boost::program_options::value<std::string>(), |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
1419 "Orthanc ID of the instance") |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
1420 ("frame", boost::program_options::value<unsigned int>()->default_value(0), |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
1421 "Number of the frame, for multi-frame DICOM instances") |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
1422 ; |
325
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
1423 |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
1424 options.add(generic); |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
1425 } |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
1426 |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
1427 virtual void Initialize(StoneApplicationContext* context, |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
1428 IStatusBar& statusBar, |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
1429 const boost::program_options::variables_map& parameters) |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
1430 { |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
1431 using namespace OrthancStone; |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
1432 |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
1433 context_ = context; |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
1434 |
358 | 1435 statusBar.SetMessage("Use the key \"a\" to reinitialize the layout"); |
1436 statusBar.SetMessage("Use the key \"c\" to crop"); | |
359
100df90bf0ea
preparing to implement Export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
358
diff
changeset
|
1437 statusBar.SetMessage("Use the key \"e\" to export DICOM to the Orthanc server"); |
358 | 1438 statusBar.SetMessage("Use the key \"f\" to switch full screen"); |
1439 statusBar.SetMessage("Use the key \"i\" to invert contrast"); | |
1440 statusBar.SetMessage("Use the key \"m\" to move objects"); | |
359
100df90bf0ea
preparing to implement Export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
358
diff
changeset
|
1441 statusBar.SetMessage("Use the key \"n\" to switch between nearest neighbor and bilinear interpolation"); |
358 | 1442 statusBar.SetMessage("Use the key \"r\" to rotate objects"); |
407 | 1443 statusBar.SetMessage("Use the key \"s\" to resize objects (not applicable to DICOM layers)"); |
358 | 1444 statusBar.SetMessage("Use the key \"w\" to change windowing"); |
1445 | |
1446 statusBar.SetMessage("Use the key \"ctrl-z\" to undo action"); | |
1447 statusBar.SetMessage("Use the key \"ctrl-y\" to redo action"); | |
325
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
1448 |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
1449 if (parameters.count("instance") != 1) |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
1450 { |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
1451 LOG(ERROR) << "The instance ID is missing"; |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
1452 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
1453 } |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
1454 |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
1455 std::string instance = parameters["instance"].as<std::string>(); |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
1456 int frame = parameters["frame"].as<unsigned int>(); |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
1457 |
393
e7a494bdd956
removed Messages/MessageType.h
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
392
diff
changeset
|
1458 orthancApiClient_.reset(new OrthancApiClient(GetBroker(), context_->GetWebService())); |
337 | 1459 |
343 | 1460 Orthanc::FontRegistry fonts; |
1461 fonts.AddFromResource(Orthanc::EmbeddedResources::FONT_UBUNTU_MONO_BOLD_16); | |
1462 | |
408 | 1463 scene_.reset(new RadiographyScene(GetBroker(), *orthancApiClient_)); |
407 | 1464 scene_->LoadDicomFrame(instance, frame, false); //.SetPan(200, 0); |
1465 //scene_->LoadDicomFrame("61f3143e-96f34791-ad6bbb8d-62559e75-45943e1b", 0, false); | |
354 | 1466 |
1467 { | |
408 | 1468 RadiographyScene::Layer& layer = scene_->LoadText(fonts.GetFont(0), "Hello\nworld"); |
1469 //dynamic_cast<RadiographyScene::Layer&>(layer).SetForegroundValue(256); | |
1470 dynamic_cast<RadiographyScene::Layer&>(layer).SetResizeable(true); | |
354 | 1471 } |
1472 | |
1473 { | |
408 | 1474 RadiographyScene::Layer& layer = scene_->LoadTestBlock(100, 50); |
1475 //dynamic_cast<RadiographyScene::Layer&>(layer).SetForegroundValue(256); | |
1476 dynamic_cast<RadiographyScene::Layer&>(layer).SetResizeable(true); | |
1477 dynamic_cast<RadiographyScene::Layer&>(layer).SetPan(0, 200); | |
354 | 1478 } |
1479 | |
337 | 1480 |
408 | 1481 mainWidget_ = new RadiographyWidget(GetBroker(), *scene_, "main-widget"); |
325
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
1482 mainWidget_->SetTransmitMouseOver(true); |
358 | 1483 mainWidget_->SetInteractor(interactor_); |
325
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
1484 |
407 | 1485 //scene_->SetWindowing(128, 256); |
325
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
1486 } |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
1487 }; |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
1488 } |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
1489 } |