Mercurial > hg > orthanc-stone
annotate Framework/Radiography/RadiographyScene.h @ 432:4eb96c6b4e96 am-vsol-upgrade
improved handling of MONOCHROME1, background and invertion
author | am@osimis.io |
---|---|
date | Mon, 03 Dec 2018 13:53:29 +0100 |
parents | b85f635f1eb5 |
children | 237160cbb44f |
rev | line source |
---|---|
408 | 1 /** |
2 * Stone of Orthanc | |
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics | |
4 * Department, University Hospital of Liege, Belgium | |
5 * Copyright (C) 2017-2018 Osimis S.A., Belgium | |
6 * | |
7 * This program is free software: you can redistribute it and/or | |
8 * modify it under the terms of the GNU Affero General Public License | |
9 * as published by the Free Software Foundation, either version 3 of | |
10 * the License, or (at your option) any later version. | |
11 * | |
12 * This program is distributed in the hope that it will be useful, but | |
13 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 * Affero General Public License for more details. | |
16 * | |
17 * You should have received a copy of the GNU Affero General Public License | |
18 * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
19 **/ | |
20 | |
21 | |
22 #pragma once | |
23 | |
410
6decc0ba9da5
rename RadiographyScene::Layer as RadiographyLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
409
diff
changeset
|
24 #include "RadiographyLayer.h" |
408 | 25 #include "../Toolbox/OrthancApiClient.h" |
432
4eb96c6b4e96
improved handling of MONOCHROME1, background and invertion
am@osimis.io
parents:
430
diff
changeset
|
26 #include "Framework/StoneEnumerations.h" |
408 | 27 |
28 namespace OrthancStone | |
29 { | |
30 class RadiographyScene : | |
426 | 31 public IObserver, |
32 public IObservable | |
408 | 33 { |
34 public: | |
430 | 35 class GeometryChangedMessage : |
36 public OriginMessage<MessageType_Scene_GeometryChanged, RadiographyScene> | |
37 { | |
38 private: | |
39 RadiographyLayer& layer_; | |
40 | |
41 public: | |
42 GeometryChangedMessage(const RadiographyScene& origin, | |
43 RadiographyLayer& layer) : | |
44 OriginMessage(origin), | |
45 layer_(layer) | |
46 { | |
47 } | |
48 | |
49 RadiographyLayer& GetLayer() const | |
50 { | |
51 return layer_; | |
52 } | |
53 }; | |
54 | |
55 class ContentChangedMessage : | |
56 public OriginMessage<MessageType_Scene_ContentChanged, RadiographyScene> | |
57 { | |
58 private: | |
59 RadiographyLayer& layer_; | |
60 | |
61 public: | |
62 ContentChangedMessage(const RadiographyScene& origin, | |
63 RadiographyLayer& layer) : | |
64 OriginMessage(origin), | |
65 layer_(layer) | |
66 { | |
67 } | |
68 | |
69 RadiographyLayer& GetLayer() const | |
70 { | |
71 return layer_; | |
72 } | |
73 }; | |
74 | |
408 | 75 |
76 class LayerAccessor : public boost::noncopyable | |
77 { | |
78 private: | |
79 RadiographyScene& scene_; | |
80 size_t index_; | |
410
6decc0ba9da5
rename RadiographyScene::Layer as RadiographyLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
409
diff
changeset
|
81 RadiographyLayer* layer_; |
408 | 82 |
83 public: | |
84 LayerAccessor(RadiographyScene& scene, | |
85 size_t index); | |
86 | |
87 LayerAccessor(RadiographyScene& scene, | |
88 double x, | |
89 double y); | |
90 | |
91 void Invalidate() | |
92 { | |
93 layer_ = NULL; | |
94 } | |
95 | |
96 bool IsValid() const | |
97 { | |
98 return layer_ != NULL; | |
99 } | |
100 | |
101 RadiographyScene& GetScene() const; | |
102 | |
103 size_t GetIndex() const; | |
104 | |
410
6decc0ba9da5
rename RadiographyScene::Layer as RadiographyLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
409
diff
changeset
|
105 RadiographyLayer& GetLayer() const; |
408 | 106 }; |
107 | |
108 | |
109 private: | |
410
6decc0ba9da5
rename RadiographyScene::Layer as RadiographyLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
409
diff
changeset
|
110 typedef std::map<size_t, RadiographyLayer*> Layers; |
426 | 111 |
417
aee3d7941c9b
preparing to load images using DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
410
diff
changeset
|
112 size_t countLayers_; |
aee3d7941c9b
preparing to load images using DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
410
diff
changeset
|
113 bool hasWindowing_; |
aee3d7941c9b
preparing to load images using DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
410
diff
changeset
|
114 float windowingCenter_; |
aee3d7941c9b
preparing to load images using DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
410
diff
changeset
|
115 float windowingWidth_; |
aee3d7941c9b
preparing to load images using DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
410
diff
changeset
|
116 Layers layers_; |
408 | 117 |
410
6decc0ba9da5
rename RadiographyScene::Layer as RadiographyLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
409
diff
changeset
|
118 RadiographyLayer& RegisterLayer(RadiographyLayer* layer); |
408 | 119 |
120 void OnTagsReceived(const OrthancApiClient::BinaryResponseReadyMessage& message); | |
121 | |
122 void OnFrameReceived(const OrthancApiClient::BinaryResponseReadyMessage& message); | |
123 | |
124 void OnDicomExported(const OrthancApiClient::JsonResponseReadyMessage& message); | |
125 | |
417
aee3d7941c9b
preparing to load images using DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
410
diff
changeset
|
126 void OnDicomWebReceived(const IWebService::HttpRequestSuccessMessage& message); |
aee3d7941c9b
preparing to load images using DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
410
diff
changeset
|
127 |
408 | 128 public: |
417
aee3d7941c9b
preparing to load images using DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
410
diff
changeset
|
129 RadiographyScene(MessageBroker& broker); |
408 | 130 |
131 virtual ~RadiographyScene(); | |
132 | |
133 bool GetWindowing(float& center, | |
134 float& width) const; | |
135 | |
136 void GetWindowingWithDefault(float& center, | |
137 float& width) const; | |
138 | |
139 void SetWindowing(float center, | |
140 float width); | |
141 | |
432
4eb96c6b4e96
improved handling of MONOCHROME1, background and invertion
am@osimis.io
parents:
430
diff
changeset
|
142 PhotometricDisplayMode GetPreferredPhotomotricDisplayMode() const; |
4eb96c6b4e96
improved handling of MONOCHROME1, background and invertion
am@osimis.io
parents:
430
diff
changeset
|
143 |
410
6decc0ba9da5
rename RadiographyScene::Layer as RadiographyLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
409
diff
changeset
|
144 RadiographyLayer& LoadText(const Orthanc::Font& font, |
430 | 145 const std::string& utf8, |
146 RadiographyLayer::Geometry* geometry); | |
408 | 147 |
410
6decc0ba9da5
rename RadiographyScene::Layer as RadiographyLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
409
diff
changeset
|
148 RadiographyLayer& LoadTestBlock(unsigned int width, |
430 | 149 unsigned int height, |
150 RadiographyLayer::Geometry* geometry); | |
151 | |
152 RadiographyLayer& LoadAlphaBitmap(Orthanc::ImageAccessor* bitmap, // takes ownership | |
153 RadiographyLayer::Geometry* geometry); | |
154 | |
417
aee3d7941c9b
preparing to load images using DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
410
diff
changeset
|
155 RadiographyLayer& LoadDicomFrame(OrthancApiClient& orthanc, |
aee3d7941c9b
preparing to load images using DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
410
diff
changeset
|
156 const std::string& instance, |
410
6decc0ba9da5
rename RadiographyScene::Layer as RadiographyLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
409
diff
changeset
|
157 unsigned int frame, |
430 | 158 bool httpCompression, |
159 RadiographyLayer::Geometry* geometry); // pass NULL if you want default geometry | |
408 | 160 |
417
aee3d7941c9b
preparing to load images using DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
410
diff
changeset
|
161 RadiographyLayer& LoadDicomWebFrame(IWebService& web); |
aee3d7941c9b
preparing to load images using DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
410
diff
changeset
|
162 |
425 | 163 void RemoveLayer(size_t layerIndex); |
164 | |
430 | 165 const RadiographyLayer& GetLayer(size_t layerIndex) const; |
425 | 166 |
430 | 167 void GetLayersIndexes(std::vector<size_t>& output) const; |
425 | 168 |
408 | 169 Extent2D GetSceneExtent() const; |
170 | |
171 void Render(Orthanc::ImageAccessor& buffer, | |
409 | 172 const AffineTransform2D& viewTransform, |
408 | 173 ImageInterpolation interpolation) const; |
174 | |
175 bool LookupLayer(size_t& index /* out */, | |
176 double x, | |
177 double y) const; | |
178 | |
179 void DrawBorder(CairoContext& context, | |
180 unsigned int layer, | |
181 double zoom); | |
182 | |
183 void GetRange(float& minValue, | |
184 float& maxValue) const; | |
185 | |
186 // Export using PAM is faster than using PNG, but requires Orthanc | |
187 // core >= 1.4.3 | |
417
aee3d7941c9b
preparing to load images using DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
410
diff
changeset
|
188 void ExportDicom(OrthancApiClient& orthanc, |
aee3d7941c9b
preparing to load images using DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
410
diff
changeset
|
189 const Orthanc::DicomMap& dicom, |
426 | 190 const std::string& parentOrthancId, |
408 | 191 double pixelSpacingX, |
192 double pixelSpacingY, | |
193 bool invert, | |
194 ImageInterpolation interpolation, | |
195 bool usePam); | |
426 | 196 |
197 // temporary version used by VSOL because we need to send the same request at another url | |
427 | 198 void ExportToCreateDicomRequest(Json::Value& createDicomRequestContent, |
426 | 199 const Orthanc::DicomMap& dicom, |
200 double pixelSpacingX, | |
201 double pixelSpacingY, | |
202 bool invert, | |
203 ImageInterpolation interpolation, | |
204 bool usePam); | |
408 | 205 }; |
206 } |