Mercurial > hg > orthanc-wsi
annotate Framework/Algorithms/ReconstructPyramidCommand.cpp @ 288:a1efc5c39615
fix LSB build
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Wed, 12 Jul 2023 23:37:38 +0200 |
parents | 20a730889ae2 |
children | 7020852a8fa9 |
rev | line source |
---|---|
0 | 1 /** |
2 * Orthanc - A Lightweight, RESTful DICOM Store | |
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics | |
4 * Department, University Hospital of Liege, Belgium | |
254 | 5 * Copyright (C) 2017-2023 Osimis S.A., Belgium |
6 * Copyright (C) 2021-2023 Sebastien Jodogne, ICTEAM UCLouvain, Belgium | |
0 | 7 * |
8 * This program is free software: you can redistribute it and/or | |
9 * modify it under the terms of the GNU Affero General Public License | |
10 * as published by the Free Software Foundation, either version 3 of | |
11 * the License, or (at your option) any later version. | |
12 * | |
13 * This program is distributed in the hope that it will be useful, but | |
14 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
16 * Affero General Public License for more details. | |
17 * | |
18 * You should have received a copy of the GNU Affero General Public License | |
19 * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
20 **/ | |
21 | |
22 | |
16
7a88c614be04
preparing for precompiled headers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
23 #include "../PrecompiledHeadersWSI.h" |
0 | 24 #include "ReconstructPyramidCommand.h" |
25 | |
26 #include "../ImageToolbox.h" | |
199
a1c265cb2174
replacing deprecated std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
192
diff
changeset
|
27 |
a1c265cb2174
replacing deprecated std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
192
diff
changeset
|
28 #include <Compatibility.h> // For std::unique_ptr |
192 | 29 #include <Logging.h> |
30 #include <OrthancException.h> | |
31 #include <Images/Image.h> | |
229
d9bd12e3747a
use Orthanc::ImageProcessing::Halve() instead of ImageToolbox::Halve()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
32 #include <Images/ImageProcessing.h> |
0 | 33 |
34 #include <cassert> | |
35 | |
36 namespace OrthancWSI | |
37 { | |
38 Orthanc::ImageAccessor* ReconstructPyramidCommand::Explore(unsigned int level, | |
39 unsigned int offsetX, | |
40 unsigned int offsetY) | |
41 { | |
42 unsigned int zoom = 1 << level; | |
43 assert(x_ % zoom == 0 && y_ % zoom == 0); | |
44 unsigned int x = x_ / zoom + offsetX; | |
45 unsigned int y = y_ / zoom + offsetY; | |
46 | |
47 if (x >= target_.GetCountTilesX(level + shiftTargetLevel_) || | |
48 y >= target_.GetCountTilesY(level + shiftTargetLevel_)) | |
49 { | |
50 return NULL; | |
51 } | |
52 | |
199
a1c265cb2174
replacing deprecated std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
192
diff
changeset
|
53 std::unique_ptr<Orthanc::ImageAccessor> result; |
0 | 54 |
55 if (level == 0) | |
56 { | |
154 | 57 result.reset(new Orthanc::ImageAccessor); |
58 source_.GetDecodedTile(*result, x, y); | |
0 | 59 |
57
91fc9583b2de
big refactoring to support sparse tiling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
16
diff
changeset
|
60 ImageCompression compression; |
91fc9583b2de
big refactoring to support sparse tiling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
16
diff
changeset
|
61 const std::string* rawTile = source_.GetRawTile(compression, x, y); |
0 | 62 |
63 if (rawTile != NULL) | |
64 { | |
65 // Simple transcoding | |
57
91fc9583b2de
big refactoring to support sparse tiling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
16
diff
changeset
|
66 target_.WriteRawTile(*rawTile, compression, level + shiftTargetLevel_, x, y); |
0 | 67 } |
68 else | |
69 { | |
70 // Re-encoding the file | |
71 target_.EncodeTile(*result, level + shiftTargetLevel_, x, y); | |
72 } | |
73 } | |
74 else | |
75 { | |
199
a1c265cb2174
replacing deprecated std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
192
diff
changeset
|
76 std::unique_ptr<Orthanc::ImageAccessor> mosaic(ImageToolbox::Allocate(source_.GetPixelFormat(), |
0 | 77 2 * target_.GetTileWidth(), |
78 2 * target_.GetTileHeight())); | |
79 ImageToolbox::Set(*mosaic, | |
80 source_.GetParameters().GetBackgroundColorRed(), | |
81 source_.GetParameters().GetBackgroundColorGreen(), | |
82 source_.GetParameters().GetBackgroundColorBlue()); | |
83 | |
84 { | |
199
a1c265cb2174
replacing deprecated std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
192
diff
changeset
|
85 std::unique_ptr<Orthanc::ImageAccessor> subTile(Explore(level - 1, 2 * offsetX, 2 * offsetY)); |
0 | 86 if (subTile.get() != NULL) |
87 { | |
88 ImageToolbox::Embed(*mosaic, *subTile, 0, 0); | |
89 } | |
90 } | |
91 | |
92 { | |
199
a1c265cb2174
replacing deprecated std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
192
diff
changeset
|
93 std::unique_ptr<Orthanc::ImageAccessor> subTile(Explore(level - 1, 2 * offsetX + 1, 2 * offsetY)); |
0 | 94 if (subTile.get() != NULL) |
95 { | |
96 ImageToolbox::Embed(*mosaic, *subTile, target_.GetTileWidth(), 0); | |
97 } | |
98 } | |
99 | |
100 { | |
199
a1c265cb2174
replacing deprecated std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
192
diff
changeset
|
101 std::unique_ptr<Orthanc::ImageAccessor> subTile(Explore(level - 1, 2 * offsetX, 2 * offsetY + 1)); |
0 | 102 if (subTile.get() != NULL) |
103 { | |
104 ImageToolbox::Embed(*mosaic, *subTile, 0, target_.GetTileHeight()); | |
105 } | |
106 } | |
107 | |
108 { | |
199
a1c265cb2174
replacing deprecated std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
192
diff
changeset
|
109 std::unique_ptr<Orthanc::ImageAccessor> subTile(Explore(level - 1, 2 * offsetX + 1, 2 * offsetY + 1)); |
0 | 110 if (subTile.get() != NULL) |
111 { | |
112 ImageToolbox::Embed(*mosaic, *subTile, target_.GetTileWidth(), target_.GetTileHeight()); | |
113 } | |
114 } | |
115 | |
229
d9bd12e3747a
use Orthanc::ImageProcessing::Halve() instead of ImageToolbox::Halve()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
116 if (source_.GetParameters().IsSmoothEnabled()) |
d9bd12e3747a
use Orthanc::ImageProcessing::Halve() instead of ImageToolbox::Halve()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
117 { |
d9bd12e3747a
use Orthanc::ImageProcessing::Halve() instead of ImageToolbox::Halve()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
118 Orthanc::ImageProcessing::SmoothGaussian5x5(*mosaic, false /* don't use accurate rounding */); |
d9bd12e3747a
use Orthanc::ImageProcessing::Halve() instead of ImageToolbox::Halve()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
119 } |
d9bd12e3747a
use Orthanc::ImageProcessing::Halve() instead of ImageToolbox::Halve()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
120 |
d9bd12e3747a
use Orthanc::ImageProcessing::Halve() instead of ImageToolbox::Halve()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
121 result.reset(Orthanc::ImageProcessing::Halve(*mosaic, false /* don't force minimal pitch */)); |
0 | 122 |
123 target_.EncodeTile(*result, level + shiftTargetLevel_, x, y); | |
124 } | |
125 | |
126 return result.release(); | |
127 } | |
128 | |
129 | |
130 ReconstructPyramidCommand::ReconstructPyramidCommand(IPyramidWriter& target, | |
131 ITiledPyramid& source, | |
132 unsigned int upToLevel, | |
133 unsigned int x, | |
134 unsigned int y, | |
135 const DicomizerParameters& parameters) : | |
136 target_(target), | |
137 source_(source, 0, target.GetTileWidth(), target.GetTileHeight(), parameters), | |
138 upToLevel_(upToLevel), | |
139 x_(x), | |
140 y_(y), | |
141 shiftTargetLevel_(0) | |
142 { | |
143 unsigned int zoom = 1 << upToLevel; | |
144 if (x % zoom != 0 || | |
145 y % zoom != 0) | |
146 { | |
147 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); | |
148 } | |
149 | |
150 if (target.GetPixelFormat() != source.GetPixelFormat()) | |
151 { | |
152 throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); | |
153 } | |
154 } | |
155 | |
156 | |
157 bool ReconstructPyramidCommand::Execute() | |
158 { | |
199
a1c265cb2174
replacing deprecated std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
192
diff
changeset
|
159 std::unique_ptr<Orthanc::ImageAccessor> root(Explore(upToLevel_, 0, 0)); |
0 | 160 return true; |
161 } | |
162 | |
163 | |
236
b0ee417b667a
migrating new definitions in namespace Orthanc to namespace OrthancWSI
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
229
diff
changeset
|
164 void ReconstructPyramidCommand::PrepareBagOfTasks(BagOfTasks& tasks, |
0 | 165 IPyramidWriter& target, |
166 ITiledPyramid& source, | |
167 unsigned int countLevels, | |
168 unsigned int shiftTargetLevel, | |
169 const DicomizerParameters& parameters) | |
170 { | |
171 if (countLevels == 0) | |
172 { | |
173 return; | |
174 } | |
175 | |
176 if (shiftTargetLevel + countLevels > target.GetLevelCount()) | |
177 { | |
178 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); | |
179 } | |
180 | |
181 const unsigned int targetCountTilesX = target.GetCountTilesX(shiftTargetLevel); | |
182 const unsigned int targetCountTilesY = target.GetCountTilesY(shiftTargetLevel); | |
183 const unsigned int step = 1 << (countLevels - 1); | |
184 | |
185 for (unsigned int y = 0; y < targetCountTilesY; y += step) | |
186 { | |
187 for (unsigned int x = 0; x < targetCountTilesX; x += step) | |
188 { | |
199
a1c265cb2174
replacing deprecated std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
192
diff
changeset
|
189 std::unique_ptr<ReconstructPyramidCommand> command; |
0 | 190 command.reset(new ReconstructPyramidCommand |
191 (target, source, countLevels - 1, x, y, parameters)); | |
192 command->SetShiftTargetLevel(shiftTargetLevel); | |
193 tasks.Push(command.release()); | |
194 } | |
195 } | |
196 } | |
197 } |