Mercurial > hg > orthanc-stone
annotate Framework/Radiography/RadiographyAlphaLayer.cpp @ 1238:e257b91fae2c
RadiographyWidget: clear selection when changing scene
author | Alain Mazy <alain@mazy.be> |
---|---|
date | Thu, 12 Dec 2019 14:30:33 +0100 |
parents | 355dba5352d7 |
children | 1c7ae79c426d |
rev | line source |
---|---|
430 | 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 #include "RadiographyAlphaLayer.h" | |
23 | |
24 #include "RadiographyScene.h" | |
25 | |
26 #include <Core/Images/Image.h> | |
27 #include <Core/OrthancException.h> | |
1196
a5f2a6b04a31
RadiographyScene: windowing is now only applied to the Dicom layer
Alain Mazy <alain@mazy.be>
parents:
623
diff
changeset
|
28 #include "../Toolbox/ImageGeometry.h" |
430 | 29 |
30 namespace OrthancStone | |
31 { | |
32 | |
33 void RadiographyAlphaLayer::SetAlpha(Orthanc::ImageAccessor* image) | |
34 { | |
35 std::auto_ptr<Orthanc::ImageAccessor> raii(image); | |
36 | |
37 if (image == NULL) | |
38 { | |
39 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); | |
40 } | |
41 | |
42 if (image->GetFormat() != Orthanc::PixelFormat_Grayscale8) | |
43 { | |
44 throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); | |
45 } | |
46 | |
47 SetSize(image->GetWidth(), image->GetHeight()); | |
48 alpha_ = raii; | |
503
77e0eb83ff63
layers are now Observable and emitting LayerEdited messages
amazy
parents:
432
diff
changeset
|
49 |
623
42dadae61fa9
renamed IObservable::EmitMessage() as BroadcastMessage()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
50 BroadcastMessage(RadiographyLayer::LayerEditedMessage(*this)); |
430 | 51 } |
52 | |
53 void RadiographyAlphaLayer::Render(Orthanc::ImageAccessor& buffer, | |
54 const AffineTransform2D& viewTransform, | |
1196
a5f2a6b04a31
RadiographyScene: windowing is now only applied to the Dicom layer
Alain Mazy <alain@mazy.be>
parents:
623
diff
changeset
|
55 ImageInterpolation interpolation, |
a5f2a6b04a31
RadiographyScene: windowing is now only applied to the Dicom layer
Alain Mazy <alain@mazy.be>
parents:
623
diff
changeset
|
56 float windowCenter, |
a5f2a6b04a31
RadiographyScene: windowing is now only applied to the Dicom layer
Alain Mazy <alain@mazy.be>
parents:
623
diff
changeset
|
57 float windowWidth, |
a5f2a6b04a31
RadiographyScene: windowing is now only applied to the Dicom layer
Alain Mazy <alain@mazy.be>
parents:
623
diff
changeset
|
58 bool applyWindowing) const |
430 | 59 { |
60 if (alpha_.get() == NULL) | |
61 { | |
62 return; | |
63 } | |
64 | |
65 if (buffer.GetFormat() != Orthanc::PixelFormat_Float32) | |
66 { | |
67 throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); | |
68 } | |
69 | |
70 unsigned int cropX, cropY, cropWidth, cropHeight; | |
71 GetCrop(cropX, cropY, cropWidth, cropHeight); | |
72 | |
73 const AffineTransform2D t = AffineTransform2D::Combine( | |
74 viewTransform, GetTransform(), | |
75 AffineTransform2D::CreateOffset(cropX, cropY)); | |
76 | |
77 Orthanc::ImageAccessor cropped; | |
78 alpha_->GetRegion(cropped, cropX, cropY, cropWidth, cropHeight); | |
79 | |
80 Orthanc::Image tmp(Orthanc::PixelFormat_Grayscale8, buffer.GetWidth(), buffer.GetHeight(), false); | |
81 | |
1201 | 82 unsigned int x1, y1, x2, y2; |
430 | 83 |
1201 | 84 if (!OrthancStone::GetProjectiveTransformExtent(x1, y1, x2, y2, |
85 t.GetHomogeneousMatrix(), | |
86 cropped.GetWidth(), | |
87 cropped.GetHeight(), | |
88 buffer.GetWidth(), | |
89 buffer.GetHeight())) | |
90 { | |
91 return; // layer is outside the buffer | |
92 } | |
93 | |
94 t.Apply(tmp, cropped, interpolation, true /* clear */); | |
430 | 95 |
96 float value = foreground_; | |
97 | |
1196
a5f2a6b04a31
RadiographyScene: windowing is now only applied to the Dicom layer
Alain Mazy <alain@mazy.be>
parents:
623
diff
changeset
|
98 if (!applyWindowing) // if applying the windowing, it means we are ie rendering the image for a realtime visualization -> the foreground_ value is the value we want to see on the screen -> don't change it |
430 | 99 { |
1196
a5f2a6b04a31
RadiographyScene: windowing is now only applied to the Dicom layer
Alain Mazy <alain@mazy.be>
parents:
623
diff
changeset
|
100 // if not applying the windowing, it means ie that we are saving a dicom image to file and the windowing will be applied by a viewer later on -> we want the "foreground" value to be correct once the windowing will be applied |
a5f2a6b04a31
RadiographyScene: windowing is now only applied to the Dicom layer
Alain Mazy <alain@mazy.be>
parents:
623
diff
changeset
|
101 value = windowCenter - windowWidth/2 + (foreground_ / 65535.0f) * windowWidth; |
a5f2a6b04a31
RadiographyScene: windowing is now only applied to the Dicom layer
Alain Mazy <alain@mazy.be>
parents:
623
diff
changeset
|
102 |
a5f2a6b04a31
RadiographyScene: windowing is now only applied to the Dicom layer
Alain Mazy <alain@mazy.be>
parents:
623
diff
changeset
|
103 if (value < 0.0f) |
430 | 104 { |
1196
a5f2a6b04a31
RadiographyScene: windowing is now only applied to the Dicom layer
Alain Mazy <alain@mazy.be>
parents:
623
diff
changeset
|
105 value = 0.0f; |
a5f2a6b04a31
RadiographyScene: windowing is now only applied to the Dicom layer
Alain Mazy <alain@mazy.be>
parents:
623
diff
changeset
|
106 } |
a5f2a6b04a31
RadiographyScene: windowing is now only applied to the Dicom layer
Alain Mazy <alain@mazy.be>
parents:
623
diff
changeset
|
107 if (value > 65535.0f) |
a5f2a6b04a31
RadiographyScene: windowing is now only applied to the Dicom layer
Alain Mazy <alain@mazy.be>
parents:
623
diff
changeset
|
108 { |
a5f2a6b04a31
RadiographyScene: windowing is now only applied to the Dicom layer
Alain Mazy <alain@mazy.be>
parents:
623
diff
changeset
|
109 value = 65535.0f; |
430 | 110 } |
111 } | |
112 | |
1196
a5f2a6b04a31
RadiographyScene: windowing is now only applied to the Dicom layer
Alain Mazy <alain@mazy.be>
parents:
623
diff
changeset
|
113 for (unsigned int y = y1; y <= y2; y++) |
430 | 114 { |
1196
a5f2a6b04a31
RadiographyScene: windowing is now only applied to the Dicom layer
Alain Mazy <alain@mazy.be>
parents:
623
diff
changeset
|
115 float *q = reinterpret_cast<float*>(buffer.GetRow(y)) + x1; |
a5f2a6b04a31
RadiographyScene: windowing is now only applied to the Dicom layer
Alain Mazy <alain@mazy.be>
parents:
623
diff
changeset
|
116 const uint8_t *p = reinterpret_cast<uint8_t*>(tmp.GetRow(y)) + x1; |
430 | 117 |
1196
a5f2a6b04a31
RadiographyScene: windowing is now only applied to the Dicom layer
Alain Mazy <alain@mazy.be>
parents:
623
diff
changeset
|
118 for (unsigned int x = x1; x <= x2; x++, p++, q++) |
430 | 119 { |
120 float a = static_cast<float>(*p) / 255.0f; | |
121 | |
122 *q = (a * value + (1.0f - a) * (*q)); | |
123 } | |
124 } | |
125 } | |
126 | |
127 bool RadiographyAlphaLayer::GetRange(float& minValue, | |
128 float& maxValue) const | |
129 { | |
1196
a5f2a6b04a31
RadiographyScene: windowing is now only applied to the Dicom layer
Alain Mazy <alain@mazy.be>
parents:
623
diff
changeset
|
130 minValue = 0; |
a5f2a6b04a31
RadiographyScene: windowing is now only applied to the Dicom layer
Alain Mazy <alain@mazy.be>
parents:
623
diff
changeset
|
131 maxValue = 0; |
430 | 132 |
1196
a5f2a6b04a31
RadiographyScene: windowing is now only applied to the Dicom layer
Alain Mazy <alain@mazy.be>
parents:
623
diff
changeset
|
133 if (foreground_ < 0) |
a5f2a6b04a31
RadiographyScene: windowing is now only applied to the Dicom layer
Alain Mazy <alain@mazy.be>
parents:
623
diff
changeset
|
134 { |
a5f2a6b04a31
RadiographyScene: windowing is now only applied to the Dicom layer
Alain Mazy <alain@mazy.be>
parents:
623
diff
changeset
|
135 minValue = foreground_; |
a5f2a6b04a31
RadiographyScene: windowing is now only applied to the Dicom layer
Alain Mazy <alain@mazy.be>
parents:
623
diff
changeset
|
136 } |
430 | 137 |
1196
a5f2a6b04a31
RadiographyScene: windowing is now only applied to the Dicom layer
Alain Mazy <alain@mazy.be>
parents:
623
diff
changeset
|
138 if (foreground_ > 0) |
a5f2a6b04a31
RadiographyScene: windowing is now only applied to the Dicom layer
Alain Mazy <alain@mazy.be>
parents:
623
diff
changeset
|
139 { |
a5f2a6b04a31
RadiographyScene: windowing is now only applied to the Dicom layer
Alain Mazy <alain@mazy.be>
parents:
623
diff
changeset
|
140 maxValue = foreground_; |
a5f2a6b04a31
RadiographyScene: windowing is now only applied to the Dicom layer
Alain Mazy <alain@mazy.be>
parents:
623
diff
changeset
|
141 } |
430 | 142 |
1196
a5f2a6b04a31
RadiographyScene: windowing is now only applied to the Dicom layer
Alain Mazy <alain@mazy.be>
parents:
623
diff
changeset
|
143 return true; |
430 | 144 } |
145 } |