Mercurial > hg > orthanc-stone
annotate Applications/Samples/SingleFrameEditorApplication.h @ 342:4297d6c5eef9 am-2
moving bitmap
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Mon, 22 Oct 2018 09:44:52 +0200 |
parents | 7bebbfa56bde |
children | 712acc87fa2e |
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 |
339 | 26 #include "../../Framework/Toolbox/GeometryToolbox.h" |
27 #include "../../Framework/Toolbox/ImageGeometry.h" | |
325
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
28 #include "../../Framework/Layers/OrthancFrameLayerSource.h" |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
29 |
338 | 30 #include <Core/DicomFormat/DicomArray.h> |
339 | 31 #include <Core/Images/ImageProcessing.h> |
338 | 32 #include <Core/Images/PamReader.h> |
325
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
33 #include <Core/Logging.h> |
338 | 34 #include <Plugins/Samples/Common/FullOrthancDataset.h> |
339 | 35 #include <Plugins/Samples/Common/DicomDatasetReader.h> |
325
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
36 |
340
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
37 |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
38 #include <boost/math/constants/constants.hpp> |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
39 |
325
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
40 namespace OrthancStone |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
41 { |
338 | 42 class BitmapStack : |
337 | 43 public IObserver, |
336
c7fdc8bac581
creating GrayscaleBitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
334
diff
changeset
|
44 public IObservable |
c7fdc8bac581
creating GrayscaleBitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
334
diff
changeset
|
45 { |
c7fdc8bac581
creating GrayscaleBitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
334
diff
changeset
|
46 public: |
338 | 47 typedef OriginMessage<MessageType_Widget_GeometryChanged, BitmapStack> GeometryChangedMessage; |
48 typedef OriginMessage<MessageType_Widget_ContentChanged, BitmapStack> ContentChangedMessage; | |
336
c7fdc8bac581
creating GrayscaleBitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
334
diff
changeset
|
49 |
337 | 50 private: |
338 | 51 class Bitmap : public boost::noncopyable |
52 { | |
53 private: | |
339 | 54 bool visible_; |
338 | 55 std::auto_ptr<Orthanc::ImageAccessor> source_; |
56 std::auto_ptr<Orthanc::ImageAccessor> converted_; // Float32 or RGB24 | |
57 std::auto_ptr<Orthanc::Image> alpha_; // Grayscale8 (if any) | |
58 std::auto_ptr<DicomFrameConverter> converter_; | |
339 | 59 unsigned int width_; |
60 unsigned int height_; | |
61 bool hasCrop_; | |
62 unsigned int cropX_; | |
63 unsigned int cropY_; | |
64 unsigned int cropWidth_; | |
65 unsigned int cropHeight_; | |
66 Matrix transform_; | |
342 | 67 double pixelSpacingX_; |
68 double pixelSpacingY_; | |
69 double panX_; | |
70 double panY_; | |
338 | 71 |
342 | 72 |
73 void UpdateTransform() | |
74 { | |
75 transform_ = LinearAlgebra::IdentityMatrix(3); | |
76 | |
77 transform_(0, 0) = pixelSpacingX_; | |
78 transform_(1, 1) = pixelSpacingY_; | |
79 transform_(0, 2) = panX_; | |
80 transform_(1, 2) = panY_; | |
81 | |
82 | |
83 #if 0 | |
84 double a = 10.0 / 180.0 * boost::math::constants::pi<double>(); | |
85 Matrix m; | |
86 const double v[] = { cos(a), -sin(a), 0, | |
87 sin(a), cos(a), 0, | |
88 0, 0, 1 }; | |
89 LinearAlgebra::FillMatrix(m, 3, 3, v); | |
90 transform_ = LinearAlgebra::Product(m, transform_); | |
91 #endif | |
92 } | |
93 | |
94 | |
338 | 95 void ApplyConverter() |
96 { | |
97 if (source_.get() != NULL && | |
98 converter_.get() != NULL) | |
99 { | |
339 | 100 if (width_ != source_->GetWidth() || |
101 height_ != source_->GetHeight()) | |
102 { | |
103 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); | |
104 } | |
105 | |
106 printf("CONVERTED! %dx%d\n", width_, height_); | |
338 | 107 converted_.reset(converter_->ConvertFrame(*source_)); |
108 } | |
109 } | |
110 | |
339 | 111 void AddToExtent(Extent2D& extent, |
112 double x, | |
113 double y) const | |
114 { | |
115 Vector p; | |
340
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
116 LinearAlgebra::AssignVector(p, x, y, 1); |
339 | 117 |
118 Vector q = LinearAlgebra::Product(transform_, p); | |
119 | |
340
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
120 if (!LinearAlgebra::IsNear(q[2], 1.0)) |
339 | 121 { |
122 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); | |
123 } | |
124 else | |
125 { | |
126 extent.AddPoint(q[0], q[1]); | |
127 } | |
128 } | |
129 | |
130 | |
338 | 131 public: |
341 | 132 Bitmap() : |
339 | 133 visible_(true), |
134 width_(0), | |
135 height_(0), | |
136 hasCrop_(false), | |
342 | 137 pixelSpacingX_(1), |
138 pixelSpacingY_(1), | |
139 panX_(0), | |
140 panY_(0) | |
339 | 141 { |
342 | 142 UpdateTransform(); |
339 | 143 } |
144 | |
145 void ResetCrop() | |
146 { | |
147 hasCrop_ = false; | |
148 } | |
149 | |
150 void Crop(unsigned int x, | |
151 unsigned int y, | |
152 unsigned int width, | |
153 unsigned int height) | |
154 { | |
155 hasCrop_ = true; | |
156 cropX_ = x; | |
157 cropY_ = y; | |
158 cropWidth_ = width; | |
159 cropHeight_ = height; | |
160 } | |
161 | |
162 void GetCrop(unsigned int& x, | |
163 unsigned int& y, | |
164 unsigned int& width, | |
165 unsigned int& height) const | |
338 | 166 { |
339 | 167 if (hasCrop_) |
168 { | |
169 x = cropX_; | |
170 y = cropY_; | |
171 width = cropWidth_; | |
172 height = cropHeight_; | |
173 } | |
174 else | |
175 { | |
176 x = 0; | |
177 y = 0; | |
178 width = width_; | |
179 height = height_; | |
180 } | |
181 } | |
182 | |
183 bool IsVisible() const | |
184 { | |
185 return visible_; | |
186 } | |
187 | |
188 void SetVisible(bool visible) | |
189 { | |
190 visible_ = visible; | |
191 } | |
192 | |
193 | |
194 static OrthancPlugins::DicomTag ConvertTag(const Orthanc::DicomTag& tag) | |
195 { | |
196 return OrthancPlugins::DicomTag(tag.GetGroup(), tag.GetElement()); | |
338 | 197 } |
198 | |
199 void SetDicomTags(const OrthancPlugins::FullOrthancDataset& dataset) | |
200 { | |
201 converter_.reset(new DicomFrameConverter); | |
202 converter_->ReadParameters(dataset); | |
203 ApplyConverter(); | |
339 | 204 |
205 transform_ = LinearAlgebra::IdentityMatrix(3); | |
206 | |
207 std::string tmp; | |
208 Vector pixelSpacing; | |
209 | |
210 if (dataset.GetStringValue(tmp, ConvertTag(Orthanc::DICOM_TAG_PIXEL_SPACING)) && | |
211 LinearAlgebra::ParseVector(pixelSpacing, tmp) && | |
212 pixelSpacing.size() == 2) | |
213 { | |
342 | 214 pixelSpacingX_ = pixelSpacing[0]; |
215 pixelSpacingY_ = pixelSpacing[1]; | |
339 | 216 } |
217 | |
340
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
218 static unsigned int c = 0; |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
219 if (c == 0) |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
220 { |
342 | 221 panX_ = 400; |
340
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
222 c ++; |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
223 } |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
224 |
339 | 225 OrthancPlugins::DicomDatasetReader reader(dataset); |
226 | |
227 if (!reader.GetUnsignedIntegerValue(width_, ConvertTag(Orthanc::DICOM_TAG_COLUMNS)) || | |
228 !reader.GetUnsignedIntegerValue(height_, ConvertTag(Orthanc::DICOM_TAG_ROWS))) | |
229 { | |
230 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); | |
231 } | |
342 | 232 |
233 UpdateTransform(); | |
338 | 234 } |
235 | |
339 | 236 |
338 | 237 void SetSourceImage(Orthanc::ImageAccessor* image) // Takes ownership |
238 { | |
239 source_.reset(image); | |
240 ApplyConverter(); | |
241 } | |
242 | |
339 | 243 |
338 | 244 bool GetDefaultWindowing(float& center, |
245 float& width) const | |
246 { | |
247 if (converter_.get() != NULL && | |
248 converter_->HasDefaultWindow()) | |
249 { | |
250 center = static_cast<float>(converter_->GetDefaultWindowCenter()); | |
251 width = static_cast<float>(converter_->GetDefaultWindowWidth()); | |
339 | 252 return true; |
253 } | |
254 else | |
255 { | |
256 return false; | |
257 } | |
258 } | |
259 | |
260 | |
261 Extent2D GetExtent() const | |
262 { | |
263 Extent2D extent; | |
264 | |
265 unsigned int x, y, width, height; | |
266 GetCrop(x, y, width, height); | |
267 | |
268 double dx = static_cast<double>(x) - 0.5; | |
269 double dy = static_cast<double>(y) - 0.5; | |
270 double dwidth = static_cast<double>(width); | |
271 double dheight = static_cast<double>(height); | |
342 | 272 |
273 LinearAlgebra::Print(transform_); | |
339 | 274 |
275 AddToExtent(extent, dx, dy); | |
276 AddToExtent(extent, dx + dwidth, dy); | |
277 AddToExtent(extent, dx, dy + dheight); | |
278 AddToExtent(extent, dx + dwidth, dy + dheight); | |
279 | |
280 return extent; | |
281 } | |
282 | |
283 | |
284 void Render(Orthanc::ImageAccessor& buffer, | |
285 const ViewportGeometry& view) const | |
286 { | |
287 if (converted_.get() != NULL) | |
288 { | |
340
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
289 Matrix m = LinearAlgebra::Product(view.GetMatrix(), transform_); |
342 | 290 //ApplyProjectiveTransform(buffer, *converted_, m, ImageInterpolation_Bilinear, false); |
291 ApplyProjectiveTransform(buffer, *converted_, m, ImageInterpolation_Nearest, false); | |
338 | 292 } |
293 } | |
341 | 294 |
295 | |
296 bool Contains(double x, | |
297 double y) const | |
298 { | |
299 Matrix inv; | |
300 LinearAlgebra::InvertMatrix(inv, transform_); | |
301 | |
302 Vector p; | |
303 LinearAlgebra::AssignVector(p, x, y, 1); | |
304 | |
305 Vector q = LinearAlgebra::Product(inv, p); | |
306 | |
307 if (!LinearAlgebra::IsNear(q[2], 1.0)) | |
308 { | |
309 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); | |
310 } | |
311 else | |
312 { | |
342 | 313 printf("at: (%.02f, %.02f)\n", q[0], q[1]); |
341 | 314 return (q[0] >= 0 && |
315 q[1] >= 0 && | |
316 q[0] <= static_cast<double>(width_) && | |
317 q[1] <= static_cast<double>(height_)); | |
318 } | |
319 } | |
342 | 320 |
321 | |
322 void SetPan(double x, | |
323 double y) | |
324 { | |
325 panX_ = x; | |
326 panY_ = y; | |
327 UpdateTransform(); | |
328 } | |
329 | |
330 | |
331 double GetPanX() const | |
332 { | |
333 return panX_; | |
334 } | |
335 | |
336 | |
337 double GetPanY() const | |
338 { | |
339 return panY_; | |
340 } | |
338 | 341 }; |
342 | |
343 | |
341 | 344 typedef std::map<size_t, Bitmap*> Bitmaps; |
338 | 345 |
341 | 346 OrthancApiClient& orthanc_; |
347 size_t countBitmaps_; | |
348 bool hasWindowing_; | |
349 float windowingCenter_; | |
350 float windowingWidth_; | |
351 Bitmaps bitmaps_; | |
338 | 352 |
353 public: | |
354 BitmapStack(MessageBroker& broker, | |
355 OrthancApiClient& orthanc) : | |
356 IObserver(broker), | |
357 IObservable(broker), | |
358 orthanc_(orthanc), | |
341 | 359 countBitmaps_(0), |
338 | 360 hasWindowing_(false), |
361 windowingCenter_(0), // Dummy initialization | |
362 windowingWidth_(0) // Dummy initialization | |
363 { | |
364 } | |
365 | |
366 | |
367 virtual ~BitmapStack() | |
368 { | |
369 for (Bitmaps::iterator it = bitmaps_.begin(); it != bitmaps_.end(); it++) | |
370 { | |
371 assert(it->second != NULL); | |
372 delete it->second; | |
373 } | |
374 } | |
339 | 375 |
376 | |
377 void GetWindowing(float& center, | |
378 float& width) | |
379 { | |
380 if (hasWindowing_) | |
381 { | |
382 center = windowingCenter_; | |
383 width = windowingWidth_; | |
384 } | |
385 else | |
386 { | |
387 center = 128; | |
388 width = 256; | |
389 } | |
390 } | |
338 | 391 |
392 | |
341 | 393 size_t LoadFrame(const std::string& instance, |
394 unsigned int frame, | |
395 bool httpCompression) | |
338 | 396 { |
341 | 397 size_t bitmap = countBitmaps_++; |
338 | 398 |
341 | 399 bitmaps_[bitmap] = new Bitmap; |
338 | 400 |
401 | |
402 { | |
403 IWebService::Headers headers; | |
404 std::string uri = "/instances/" + instance + "/tags"; | |
405 orthanc_.GetBinaryAsync(uri, headers, | |
406 new Callable<BitmapStack, OrthancApiClient::BinaryResponseReadyMessage> | |
407 (*this, &BitmapStack::OnTagsReceived), NULL, | |
341 | 408 new Orthanc::SingleValueObject<size_t>(bitmap)); |
338 | 409 } |
410 | |
411 { | |
412 IWebService::Headers headers; | |
413 headers["Accept"] = "image/x-portable-arbitrarymap"; | |
414 | |
415 if (httpCompression) | |
416 { | |
417 headers["Accept-Encoding"] = "gzip"; | |
418 } | |
419 | |
420 std::string uri = "/instances/" + instance + "/frames/" + boost::lexical_cast<std::string>(frame) + "/image-uint16"; | |
421 orthanc_.GetBinaryAsync(uri, headers, | |
422 new Callable<BitmapStack, OrthancApiClient::BinaryResponseReadyMessage> | |
423 (*this, &BitmapStack::OnFrameReceived), NULL, | |
341 | 424 new Orthanc::SingleValueObject<size_t>(bitmap)); |
338 | 425 } |
426 | |
341 | 427 return bitmap; |
338 | 428 } |
429 | |
430 | |
431 void OnTagsReceived(const OrthancApiClient::BinaryResponseReadyMessage& message) | |
432 { | |
341 | 433 size_t index = dynamic_cast<Orthanc::SingleValueObject<size_t>*>(message.Payload)->GetValue(); |
338 | 434 |
341 | 435 printf("JSON received: [%s] (%ld bytes) for bitmap %ld\n", |
436 message.Uri.c_str(), message.AnswerSize, index); | |
338 | 437 |
341 | 438 Bitmaps::iterator bitmap = bitmaps_.find(index); |
338 | 439 if (bitmap != bitmaps_.end()) |
440 { | |
441 assert(bitmap->second != NULL); | |
442 | |
443 OrthancPlugins::FullOrthancDataset dicom(message.Answer, message.AnswerSize); | |
444 bitmap->second->SetDicomTags(dicom); | |
445 | |
446 float c, w; | |
447 if (!hasWindowing_ && | |
448 bitmap->second->GetDefaultWindowing(c, w)) | |
449 { | |
450 hasWindowing_ = true; | |
451 windowingCenter_ = c; | |
452 windowingWidth_ = w; | |
453 } | |
454 | |
455 EmitMessage(GeometryChangedMessage(*this)); | |
456 } | |
457 } | |
458 | |
459 | |
460 void OnFrameReceived(const OrthancApiClient::BinaryResponseReadyMessage& message) | |
461 { | |
341 | 462 size_t index = dynamic_cast<Orthanc::SingleValueObject<size_t>*>(message.Payload)->GetValue(); |
338 | 463 |
341 | 464 printf("Frame received: [%s] (%ld bytes) for bitmap %ld\n", |
465 message.Uri.c_str(), message.AnswerSize, index); | |
466 | |
467 Bitmaps::iterator bitmap = bitmaps_.find(index); | |
338 | 468 if (bitmap != bitmaps_.end()) |
469 { | |
470 assert(bitmap->second != NULL); | |
471 | |
472 std::string content; | |
473 if (message.AnswerSize > 0) | |
474 { | |
475 content.assign(reinterpret_cast<const char*>(message.Answer), message.AnswerSize); | |
476 } | |
477 | |
478 std::auto_ptr<Orthanc::PamReader> reader(new Orthanc::PamReader); | |
479 reader->ReadFromMemory(content); | |
480 bitmap->second->SetSourceImage(reader.release()); | |
481 | |
482 EmitMessage(ContentChangedMessage(*this)); | |
483 } | |
484 } | |
339 | 485 |
486 | |
487 Extent2D GetSceneExtent() const | |
488 { | |
489 Extent2D extent; | |
340
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
490 |
339 | 491 for (Bitmaps::const_iterator it = bitmaps_.begin(); |
492 it != bitmaps_.end(); ++it) | |
493 { | |
494 assert(it->second != NULL); | |
495 extent.Union(it->second->GetExtent()); | |
496 } | |
497 | |
498 return extent; | |
499 } | |
500 | |
501 | |
502 void Render(Orthanc::ImageAccessor& buffer, | |
342 | 503 const ViewportGeometry& view) const |
339 | 504 { |
505 Orthanc::ImageProcessing::Set(buffer, 0); | |
506 | |
507 for (Bitmaps::const_iterator it = bitmaps_.begin(); | |
508 it != bitmaps_.end(); ++it) | |
509 { | |
510 assert(it->second != NULL); | |
511 it->second->Render(buffer, view); | |
512 } | |
513 } | |
342 | 514 |
515 | |
516 bool LookupBitmap(size_t& index /* out */, | |
517 double x, | |
518 double y) const | |
519 { | |
520 for (Bitmaps::const_iterator it = bitmaps_.begin(); | |
521 it != bitmaps_.end(); ++it) | |
522 { | |
523 assert(it->second != NULL); | |
524 if (it->second->Contains(x, y)) | |
525 { | |
526 index = it->first; | |
527 return true; | |
528 } | |
529 } | |
530 | |
531 return false; | |
532 } | |
533 | |
534 | |
535 void SetPan(size_t index, | |
536 double panX, | |
537 double panY) | |
538 { | |
539 Bitmaps::iterator bitmap = bitmaps_.find(index); | |
540 if (bitmap != bitmaps_.end()) | |
541 { | |
542 assert(bitmap->second != NULL); | |
543 bitmap->second->SetPan(panX, panY); | |
544 } | |
545 } | |
546 | |
547 | |
548 void GetPan(double& panX, | |
549 double& panY, | |
550 size_t index) const | |
551 { | |
552 Bitmaps::const_iterator bitmap = bitmaps_.find(index); | |
553 if (bitmap != bitmaps_.end()) | |
554 { | |
555 assert(bitmap->second != NULL); | |
556 panX = bitmap->second->GetPanX(); | |
557 panY = bitmap->second->GetPanY(); | |
558 } | |
559 else | |
560 { | |
561 panX = 0; | |
562 panY = 0; | |
563 } | |
564 } | |
338 | 565 }; |
566 | |
341 | 567 |
568 class BitmapStackInteractor : public IWorldSceneInteractor | |
569 { | |
342 | 570 private: |
571 BitmapStack& stack_; | |
572 | |
573 | |
574 class MoveBitmapTracker : public IWorldSceneMouseTracker | |
575 { | |
576 private: | |
577 WorldSceneWidget& widget_; | |
578 BitmapStack& stack_; | |
579 size_t bitmap_; | |
580 double clickX_; | |
581 double clickY_; | |
582 | |
583 public: | |
584 MoveBitmapTracker(WorldSceneWidget& widget, | |
585 BitmapStack& stack, | |
586 size_t bitmap, | |
587 double x, | |
588 double y) : | |
589 widget_(widget), | |
590 stack_(stack), | |
591 bitmap_(bitmap), | |
592 clickX_(x), | |
593 clickY_(y) | |
594 { | |
595 double panX, panY; | |
596 stack.GetPan(panX, panY, bitmap_); | |
597 clickX_ -= panX; | |
598 clickY_ -= panY; | |
599 } | |
600 | |
601 virtual bool HasRender() const | |
602 { | |
603 return false; | |
604 } | |
605 | |
606 virtual void Render(CairoContext& context, | |
607 double zoom) | |
608 { | |
609 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); | |
610 } | |
611 | |
612 virtual void MouseUp() | |
613 { | |
614 } | |
615 | |
616 virtual void MouseMove(int displayX, | |
617 int displayY, | |
618 double sceneX, | |
619 double sceneY) | |
620 { | |
621 stack_.SetPan(bitmap_, sceneX - clickX_, sceneY - clickY_); | |
622 } | |
623 }; | |
624 | |
625 | |
341 | 626 public: |
342 | 627 BitmapStackInteractor(BitmapStack& stack) : |
628 stack_(stack) | |
629 { | |
630 } | |
631 | |
341 | 632 virtual IWorldSceneMouseTracker* CreateMouseTracker(WorldSceneWidget& widget, |
633 const ViewportGeometry& view, | |
634 MouseButton button, | |
635 KeyboardModifiers modifiers, | |
636 double x, | |
637 double y, | |
638 IStatusBar* statusBar) | |
639 { | |
342 | 640 if (button == MouseButton_Left) |
641 { | |
642 size_t bitmap; | |
643 if (stack_.LookupBitmap(bitmap, x, y)) | |
644 { | |
645 printf("CLICK on bitmap %d\n", bitmap); | |
646 return new MoveBitmapTracker(widget, stack_, bitmap, x, y); | |
647 } | |
648 else | |
649 { | |
650 printf("CLICK outside\n"); | |
651 return NULL; | |
652 } | |
653 } | |
654 else | |
655 { | |
656 return NULL; | |
657 } | |
341 | 658 } |
659 | |
660 virtual void MouseOver(CairoContext& context, | |
661 WorldSceneWidget& widget, | |
662 const ViewportGeometry& view, | |
663 double x, | |
664 double y, | |
665 IStatusBar* statusBar) | |
666 { | |
667 } | |
668 | |
669 virtual void MouseWheel(WorldSceneWidget& widget, | |
670 MouseWheelDirection direction, | |
671 KeyboardModifiers modifiers, | |
672 IStatusBar* statusBar) | |
673 { | |
674 } | |
675 | |
676 virtual void KeyPressed(WorldSceneWidget& widget, | |
677 KeyboardKeys key, | |
678 char keyChar, | |
679 KeyboardModifiers modifiers, | |
680 IStatusBar* statusBar) | |
681 { | |
342 | 682 if (keyChar == 's') |
683 widget.FitContent(); | |
341 | 684 } |
685 }; | |
686 | |
687 | |
338 | 688 |
689 class BitmapStackWidget : | |
690 public WorldSceneWidget, | |
691 public IObservable, | |
692 public IObserver | |
693 { | |
694 private: | |
341 | 695 BitmapStack& stack_; |
696 BitmapStackInteractor myInteractor_; | |
337 | 697 |
336
c7fdc8bac581
creating GrayscaleBitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
334
diff
changeset
|
698 protected: |
c7fdc8bac581
creating GrayscaleBitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
334
diff
changeset
|
699 virtual Extent2D GetSceneExtent() |
c7fdc8bac581
creating GrayscaleBitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
334
diff
changeset
|
700 { |
339 | 701 printf("Get extent\n"); |
702 return stack_.GetSceneExtent(); | |
336
c7fdc8bac581
creating GrayscaleBitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
334
diff
changeset
|
703 } |
c7fdc8bac581
creating GrayscaleBitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
334
diff
changeset
|
704 |
c7fdc8bac581
creating GrayscaleBitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
334
diff
changeset
|
705 virtual bool RenderScene(CairoContext& context, |
c7fdc8bac581
creating GrayscaleBitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
334
diff
changeset
|
706 const ViewportGeometry& view) |
c7fdc8bac581
creating GrayscaleBitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
334
diff
changeset
|
707 { |
340
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
708 // "Render()" has been replaced |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
709 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
710 } |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
711 |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
712 public: |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
713 BitmapStackWidget(MessageBroker& broker, |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
714 BitmapStack& stack, |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
715 const std::string& name) : |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
716 WorldSceneWidget(name), |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
717 IObservable(broker), |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
718 IObserver(broker), |
342 | 719 stack_(stack), |
720 myInteractor_(stack_) | |
340
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
721 { |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
722 stack.RegisterObserverCallback(new Callable<BitmapStackWidget, BitmapStack::GeometryChangedMessage>(*this, &BitmapStackWidget::OnGeometryChanged)); |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
723 stack.RegisterObserverCallback(new Callable<BitmapStackWidget, BitmapStack::ContentChangedMessage>(*this, &BitmapStackWidget::OnContentChanged)); |
341 | 724 |
725 SetInteractor(myInteractor_); | |
340
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
726 } |
339 | 727 |
340
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
728 void OnGeometryChanged(const BitmapStack::GeometryChangedMessage& message) |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
729 { |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
730 printf("Geometry has changed\n"); |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
731 FitContent(); |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
732 } |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
733 |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
734 void OnContentChanged(const BitmapStack::ContentChangedMessage& message) |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
735 { |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
736 printf("Content has changed\n"); |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
737 NotifyContentChanged(); |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
738 } |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
739 |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
740 virtual bool Render(Orthanc::ImageAccessor& target) |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
741 { |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
742 Orthanc::Image buffer(Orthanc::PixelFormat_Float32, target.GetWidth(), target.GetHeight(), false); |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
743 stack_.Render(buffer, GetView()); |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
744 |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
745 // As in GrayscaleFrameRenderer => TODO MERGE |
339 | 746 |
747 float windowCenter, windowWidth; | |
748 stack_.GetWindowing(windowCenter, windowWidth); | |
749 | |
750 float x0 = windowCenter - windowWidth / 2.0f; | |
751 float x1 = windowCenter + windowWidth / 2.0f; | |
752 | |
340
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
753 const unsigned int width = target.GetWidth(); |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
754 const unsigned int height = target.GetHeight(); |
339 | 755 |
756 for (unsigned int y = 0; y < height; y++) | |
757 { | |
758 const float* p = reinterpret_cast<const float*>(buffer.GetConstRow(y)); | |
759 uint8_t* q = reinterpret_cast<uint8_t*>(target.GetRow(y)); | |
760 | |
761 for (unsigned int x = 0; x < width; x++, p++, q += 4) | |
762 { | |
763 uint8_t v = 0; | |
764 if (windowWidth >= 0.001f) // Avoid division by zero | |
765 { | |
766 if (*p >= x1) | |
767 { | |
768 v = 255; | |
769 } | |
770 else if (*p <= x0) | |
771 { | |
772 v = 0; | |
773 } | |
774 else | |
775 { | |
776 // https://en.wikipedia.org/wiki/Linear_interpolation | |
777 v = static_cast<uint8_t>(255.0f * (*p - x0) / (x1 - x0)); | |
778 } | |
779 | |
780 // TODO MONOCHROME1 | |
781 /*if (invert_) | |
340
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
782 { |
339 | 783 v = 255 - v; |
784 }*/ | |
785 } | |
786 | |
787 q[3] = 255; | |
788 q[2] = v; | |
789 q[1] = v; | |
340
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
790 q[0] = v; |
339 | 791 } |
792 } | |
793 | |
337 | 794 return true; |
336
c7fdc8bac581
creating GrayscaleBitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
334
diff
changeset
|
795 } |
c7fdc8bac581
creating GrayscaleBitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
334
diff
changeset
|
796 |
c7fdc8bac581
creating GrayscaleBitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
334
diff
changeset
|
797 }; |
c7fdc8bac581
creating GrayscaleBitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
334
diff
changeset
|
798 |
c7fdc8bac581
creating GrayscaleBitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
334
diff
changeset
|
799 |
325
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
800 namespace Samples |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
801 { |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
802 class SingleFrameEditorApplication : |
340
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
803 public SampleSingleCanvasApplicationBase, |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
804 public IObserver |
325
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
805 { |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
806 enum Tools |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
807 { |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
808 Tools_Crop, |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
809 Tools_Windowing, |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
810 Tools_Zoom, |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
811 Tools_Pan |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
812 }; |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
813 |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
814 enum Actions |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
815 { |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
816 Actions_Invert, |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
817 Actions_RotateLeft, |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
818 Actions_RotateRight |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
819 }; |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
820 |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
821 private: |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
822 class Interactor : public IWorldSceneInteractor |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
823 { |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
824 private: |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
825 SingleFrameEditorApplication& application_; |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
826 |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
827 public: |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
828 Interactor(SingleFrameEditorApplication& application) : |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
829 application_(application) |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
830 { |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
831 } |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
832 |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
833 virtual IWorldSceneMouseTracker* CreateMouseTracker(WorldSceneWidget& widget, |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
834 const ViewportGeometry& view, |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
835 MouseButton button, |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
836 KeyboardModifiers modifiers, |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
837 double x, |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
838 double y, |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
839 IStatusBar* statusBar) |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
840 { |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
841 switch (application_.currentTool_) { |
340
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
842 case Tools_Zoom: |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
843 printf("ZOOM\n"); |
329
b10dfdb96866
removing WorldSceneWidget::IWorldObserver
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
327
diff
changeset
|
844 |
b10dfdb96866
removing WorldSceneWidget::IWorldObserver
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
327
diff
changeset
|
845 case Tools_Crop: |
340
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
846 case Tools_Windowing: |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
847 case Tools_Pan: |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
848 // TODO return the right mouse tracker |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
849 return NULL; |
325
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
850 } |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
851 |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
852 return NULL; |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
853 } |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
854 |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
855 virtual void MouseOver(CairoContext& context, |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
856 WorldSceneWidget& widget, |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
857 const ViewportGeometry& view, |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
858 double x, |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
859 double y, |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
860 IStatusBar* statusBar) |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
861 { |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
862 if (statusBar != NULL) |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
863 { |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
864 char buf[64]; |
336
c7fdc8bac581
creating GrayscaleBitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
334
diff
changeset
|
865 sprintf(buf, "X = %.02f Y = %.02f (in cm)", x / 10.0, y / 10.0); |
c7fdc8bac581
creating GrayscaleBitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
334
diff
changeset
|
866 statusBar->SetMessage(buf); |
325
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
867 } |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
868 } |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
869 |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
870 virtual void MouseWheel(WorldSceneWidget& widget, |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
871 MouseWheelDirection direction, |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
872 KeyboardModifiers modifiers, |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
873 IStatusBar* statusBar) |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
874 { |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
875 } |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
876 |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
877 virtual void KeyPressed(WorldSceneWidget& widget, |
327 | 878 KeyboardKeys key, |
879 char keyChar, | |
325
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
880 KeyboardModifiers modifiers, |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
881 IStatusBar* statusBar) |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
882 { |
327 | 883 switch (keyChar) |
325
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
884 { |
340
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
885 case 's': |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
886 widget.FitContent(); |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
887 break; |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
888 case 'p': |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
889 application_.currentTool_ = Tools_Pan; |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
890 break; |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
891 case 'z': |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
892 application_.currentTool_ = Tools_Zoom; |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
893 break; |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
894 case 'c': |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
895 application_.currentTool_ = Tools_Crop; |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
896 break; |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
897 case 'w': |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
898 application_.currentTool_ = Tools_Windowing; |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
899 break; |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
900 case 'i': |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
901 application_.Invert(); |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
902 break; |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
903 case 'r': |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
904 if (modifiers == KeyboardModifiers_None) |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
905 application_.Rotate(90); |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
906 else |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
907 application_.Rotate(-90); |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
908 break; |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
909 case 'e': |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
910 application_.Export(); |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
911 break; |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
912 default: |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
913 break; |
325
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
914 } |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
915 } |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
916 }; |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
917 |
334
c34784e5f299
compatibility fixes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
330
diff
changeset
|
918 std::auto_ptr<Interactor> mainWidgetInteractor_; |
c34784e5f299
compatibility fixes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
330
diff
changeset
|
919 std::auto_ptr<OrthancApiClient> orthancApiClient_; |
338 | 920 std::auto_ptr<BitmapStack> stack_; |
334
c34784e5f299
compatibility fixes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
330
diff
changeset
|
921 Tools currentTool_; |
c34784e5f299
compatibility fixes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
330
diff
changeset
|
922 const OrthancFrameLayerSource* source_; |
c34784e5f299
compatibility fixes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
330
diff
changeset
|
923 unsigned int slice_; |
325
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
924 |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
925 public: |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
926 SingleFrameEditorApplication(MessageBroker& broker) : |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
927 IObserver(broker), |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
928 currentTool_(Tools_Zoom), |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
929 source_(NULL), |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
930 slice_(0) |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
931 { |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
932 } |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
933 |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
934 virtual void DeclareStartupOptions(boost::program_options::options_description& options) |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
935 { |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
936 boost::program_options::options_description generic("Sample options"); |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
937 generic.add_options() |
340
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
938 ("instance", boost::program_options::value<std::string>(), |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
939 "Orthanc ID of the instance") |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
940 ("frame", boost::program_options::value<unsigned int>()->default_value(0), |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
941 "Number of the frame, for multi-frame DICOM instances") |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
942 ; |
325
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
943 |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
944 options.add(generic); |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
945 } |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
946 |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
947 virtual void Initialize(StoneApplicationContext* context, |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
948 IStatusBar& statusBar, |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
949 const boost::program_options::variables_map& parameters) |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
950 { |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
951 using namespace OrthancStone; |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
952 |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
953 context_ = context; |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
954 |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
955 statusBar.SetMessage("Use the key \"s\" to reinitialize the layout, \"p\" to pan, \"z\" to zoom, \"c\" to crop, \"i\" to invert, \"w\" to change windowing, \"r\" to rotate cw, \"shift+r\" to rotate ccw"); |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
956 |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
957 if (parameters.count("instance") != 1) |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
958 { |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
959 LOG(ERROR) << "The instance ID is missing"; |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
960 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
961 } |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
962 |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
963 std::string instance = parameters["instance"].as<std::string>(); |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
964 int frame = parameters["frame"].as<unsigned int>(); |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
965 |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
966 orthancApiClient_.reset(new OrthancApiClient(IObserver::broker_, context_->GetWebService())); |
337 | 967 |
338 | 968 stack_.reset(new BitmapStack(IObserver::broker_, *orthancApiClient_)); |
969 stack_->LoadFrame(instance, frame, false); | |
340
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
970 stack_->LoadFrame("61f3143e-96f34791-ad6bbb8d-62559e75-45943e1b", frame, false); |
337 | 971 |
338 | 972 mainWidget_ = new BitmapStackWidget(IObserver::broker_, *stack_, "main-widget"); |
325
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
973 mainWidget_->SetTransmitMouseOver(true); |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
974 |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
975 mainWidgetInteractor_.reset(new Interactor(*this)); |
341 | 976 //mainWidget_->SetInteractor(*mainWidgetInteractor_); |
325
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
977 } |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
978 |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
979 |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
980 void Invert() |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
981 { |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
982 // TODO |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
983 } |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
984 |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
985 void Rotate(int degrees) |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
986 { |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
987 // TODO |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
988 } |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
989 |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
990 void Export() |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
991 { |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
992 // TODO: export dicom file to a temporary file |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
993 } |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
994 }; |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
995 |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
996 |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
997 } |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
998 } |