Mercurial > hg > orthanc-stone
annotate Framework/Radiography/RadiographyAlphaLayer.cpp @ 1299:c38c89684d83 broker
replacing std::auto_ptr by std::unique_ptr
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Mon, 02 Mar 2020 17:21:24 +0100 |
parents | 1c7ae79c426d |
children | 257f2c9a02ac |
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 | |
1280
1c7ae79c426d
fix copyright years
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1238
diff
changeset
|
5 * Copyright (C) 2017-2020 Osimis S.A., Belgium |
430 | 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 { | |
1299
c38c89684d83
replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1280
diff
changeset
|
35 std::unique_ptr<Orthanc::ImageAccessor> raii(image); |
430 | 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()); | |
1299
c38c89684d83
replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1280
diff
changeset
|
48 |
c38c89684d83
replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1280
diff
changeset
|
49 #if __cplusplus < 201103L |
c38c89684d83
replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1280
diff
changeset
|
50 alpha_.reset(raii.release()); |
c38c89684d83
replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1280
diff
changeset
|
51 #else |
c38c89684d83
replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1280
diff
changeset
|
52 alpha_ = std::move(raii); |
c38c89684d83
replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1280
diff
changeset
|
53 #endif |
503
77e0eb83ff63
layers are now Observable and emitting LayerEdited messages
amazy
parents:
432
diff
changeset
|
54 |
623
42dadae61fa9
renamed IObservable::EmitMessage() as BroadcastMessage()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
55 BroadcastMessage(RadiographyLayer::LayerEditedMessage(*this)); |
430 | 56 } |
57 | |
58 void RadiographyAlphaLayer::Render(Orthanc::ImageAccessor& buffer, | |
59 const AffineTransform2D& viewTransform, | |
1196
a5f2a6b04a31
RadiographyScene: windowing is now only applied to the Dicom layer
Alain Mazy <alain@mazy.be>
parents:
623
diff
changeset
|
60 ImageInterpolation interpolation, |
a5f2a6b04a31
RadiographyScene: windowing is now only applied to the Dicom layer
Alain Mazy <alain@mazy.be>
parents:
623
diff
changeset
|
61 float windowCenter, |
a5f2a6b04a31
RadiographyScene: windowing is now only applied to the Dicom layer
Alain Mazy <alain@mazy.be>
parents:
623
diff
changeset
|
62 float windowWidth, |
a5f2a6b04a31
RadiographyScene: windowing is now only applied to the Dicom layer
Alain Mazy <alain@mazy.be>
parents:
623
diff
changeset
|
63 bool applyWindowing) const |
430 | 64 { |
65 if (alpha_.get() == NULL) | |
66 { | |
67 return; | |
68 } | |
69 | |
70 if (buffer.GetFormat() != Orthanc::PixelFormat_Float32) | |
71 { | |
72 throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); | |
73 } | |
74 | |
75 unsigned int cropX, cropY, cropWidth, cropHeight; | |
76 GetCrop(cropX, cropY, cropWidth, cropHeight); | |
77 | |
78 const AffineTransform2D t = AffineTransform2D::Combine( | |
79 viewTransform, GetTransform(), | |
80 AffineTransform2D::CreateOffset(cropX, cropY)); | |
81 | |
82 Orthanc::ImageAccessor cropped; | |
83 alpha_->GetRegion(cropped, cropX, cropY, cropWidth, cropHeight); | |
84 | |
85 Orthanc::Image tmp(Orthanc::PixelFormat_Grayscale8, buffer.GetWidth(), buffer.GetHeight(), false); | |
86 | |
1201 | 87 unsigned int x1, y1, x2, y2; |
430 | 88 |
1201 | 89 if (!OrthancStone::GetProjectiveTransformExtent(x1, y1, x2, y2, |
90 t.GetHomogeneousMatrix(), | |
91 cropped.GetWidth(), | |
92 cropped.GetHeight(), | |
93 buffer.GetWidth(), | |
94 buffer.GetHeight())) | |
95 { | |
96 return; // layer is outside the buffer | |
97 } | |
98 | |
99 t.Apply(tmp, cropped, interpolation, true /* clear */); | |
430 | 100 |
101 float value = foreground_; | |
102 | |
1196
a5f2a6b04a31
RadiographyScene: windowing is now only applied to the Dicom layer
Alain Mazy <alain@mazy.be>
parents:
623
diff
changeset
|
103 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 | 104 { |
1196
a5f2a6b04a31
RadiographyScene: windowing is now only applied to the Dicom layer
Alain Mazy <alain@mazy.be>
parents:
623
diff
changeset
|
105 // 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
|
106 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
|
107 |
a5f2a6b04a31
RadiographyScene: windowing is now only applied to the Dicom layer
Alain Mazy <alain@mazy.be>
parents:
623
diff
changeset
|
108 if (value < 0.0f) |
430 | 109 { |
1196
a5f2a6b04a31
RadiographyScene: windowing is now only applied to the Dicom layer
Alain Mazy <alain@mazy.be>
parents:
623
diff
changeset
|
110 value = 0.0f; |
a5f2a6b04a31
RadiographyScene: windowing is now only applied to the Dicom layer
Alain Mazy <alain@mazy.be>
parents:
623
diff
changeset
|
111 } |
a5f2a6b04a31
RadiographyScene: windowing is now only applied to the Dicom layer
Alain Mazy <alain@mazy.be>
parents:
623
diff
changeset
|
112 if (value > 65535.0f) |
a5f2a6b04a31
RadiographyScene: windowing is now only applied to the Dicom layer
Alain Mazy <alain@mazy.be>
parents:
623
diff
changeset
|
113 { |
a5f2a6b04a31
RadiographyScene: windowing is now only applied to the Dicom layer
Alain Mazy <alain@mazy.be>
parents:
623
diff
changeset
|
114 value = 65535.0f; |
430 | 115 } |
116 } | |
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 y = y1; y <= y2; y++) |
430 | 119 { |
1196
a5f2a6b04a31
RadiographyScene: windowing is now only applied to the Dicom layer
Alain Mazy <alain@mazy.be>
parents:
623
diff
changeset
|
120 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
|
121 const uint8_t *p = reinterpret_cast<uint8_t*>(tmp.GetRow(y)) + x1; |
430 | 122 |
1196
a5f2a6b04a31
RadiographyScene: windowing is now only applied to the Dicom layer
Alain Mazy <alain@mazy.be>
parents:
623
diff
changeset
|
123 for (unsigned int x = x1; x <= x2; x++, p++, q++) |
430 | 124 { |
125 float a = static_cast<float>(*p) / 255.0f; | |
126 | |
127 *q = (a * value + (1.0f - a) * (*q)); | |
128 } | |
129 } | |
130 } | |
131 | |
132 bool RadiographyAlphaLayer::GetRange(float& minValue, | |
133 float& maxValue) const | |
134 { | |
1196
a5f2a6b04a31
RadiographyScene: windowing is now only applied to the Dicom layer
Alain Mazy <alain@mazy.be>
parents:
623
diff
changeset
|
135 minValue = 0; |
a5f2a6b04a31
RadiographyScene: windowing is now only applied to the Dicom layer
Alain Mazy <alain@mazy.be>
parents:
623
diff
changeset
|
136 maxValue = 0; |
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 minValue = 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 if (foreground_ > 0) |
a5f2a6b04a31
RadiographyScene: windowing is now only applied to the Dicom layer
Alain Mazy <alain@mazy.be>
parents:
623
diff
changeset
|
144 { |
a5f2a6b04a31
RadiographyScene: windowing is now only applied to the Dicom layer
Alain Mazy <alain@mazy.be>
parents:
623
diff
changeset
|
145 maxValue = foreground_; |
a5f2a6b04a31
RadiographyScene: windowing is now only applied to the Dicom layer
Alain Mazy <alain@mazy.be>
parents:
623
diff
changeset
|
146 } |
430 | 147 |
1196
a5f2a6b04a31
RadiographyScene: windowing is now only applied to the Dicom layer
Alain Mazy <alain@mazy.be>
parents:
623
diff
changeset
|
148 return true; |
430 | 149 } |
150 } |