Mercurial > hg > orthanc-wsi
annotate ViewerPlugin/Plugin.cpp @ 262:b9eab260a372 iiif
serving Mirador
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Mon, 10 Jul 2023 09:21:48 +0200 |
parents | c72fbdecdc38 |
children | 14f182958ca7 |
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:
8
diff
changeset
|
23 #include "../Framework/PrecompiledHeadersWSI.h" |
73
a8c90aa32ca6
LRU caching of pyramids, OrthancWSIClearCache script
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
69
diff
changeset
|
24 |
a8c90aa32ca6
LRU caching of pyramids, OrthancWSIClearCache script
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
69
diff
changeset
|
25 #include "DicomPyramidCache.h" |
261 | 26 #include "IIIF.h" |
260 | 27 #include "RawTile.h" |
59
7a3853d51c45
Move "Framework/Orthanc/" as "Resources/Orthanc/"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
57
diff
changeset
|
28 |
199
a1c265cb2174
replacing deprecated std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
196
diff
changeset
|
29 #include <Compatibility.h> // For std::unique_ptr |
192 | 30 #include <Logging.h> |
260 | 31 #include <Images/Image.h> |
192 | 32 #include <Images/ImageProcessing.h> |
33 #include <OrthancException.h> | |
34 #include <SystemToolbox.h> | |
35 | |
194 | 36 #include "../Resources/Orthanc/Plugins/OrthancPluginCppWrapper.h" |
0 | 37 |
38 #include <EmbeddedResources.h> | |
39 | |
40 #include <cassert> | |
57
91fc9583b2de
big refactoring to support sparse tiling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
16
diff
changeset
|
41 |
91fc9583b2de
big refactoring to support sparse tiling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
16
diff
changeset
|
42 static void AnswerSparseTile(OrthancPluginRestOutput* output, |
91fc9583b2de
big refactoring to support sparse tiling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
16
diff
changeset
|
43 unsigned int tileWidth, |
91fc9583b2de
big refactoring to support sparse tiling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
16
diff
changeset
|
44 unsigned int tileHeight) |
91fc9583b2de
big refactoring to support sparse tiling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
16
diff
changeset
|
45 { |
91fc9583b2de
big refactoring to support sparse tiling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
16
diff
changeset
|
46 Orthanc::Image tile(Orthanc::PixelFormat_RGB24, tileWidth, tileHeight, false); |
91fc9583b2de
big refactoring to support sparse tiling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
16
diff
changeset
|
47 |
91fc9583b2de
big refactoring to support sparse tiling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
16
diff
changeset
|
48 // Black (TODO parameter) |
91fc9583b2de
big refactoring to support sparse tiling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
16
diff
changeset
|
49 uint8_t red = 0; |
91fc9583b2de
big refactoring to support sparse tiling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
16
diff
changeset
|
50 uint8_t green = 0; |
91fc9583b2de
big refactoring to support sparse tiling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
16
diff
changeset
|
51 uint8_t blue = 0; |
91fc9583b2de
big refactoring to support sparse tiling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
16
diff
changeset
|
52 Orthanc::ImageProcessing::Set(tile, red, green, blue, 255); |
91fc9583b2de
big refactoring to support sparse tiling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
16
diff
changeset
|
53 |
91fc9583b2de
big refactoring to support sparse tiling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
16
diff
changeset
|
54 // TODO Cache the tile |
156
dafbb7ebc00f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
155
diff
changeset
|
55 OrthancPluginCompressAndAnswerPngImage(OrthancPlugins::GetGlobalContext(), |
dafbb7ebc00f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
155
diff
changeset
|
56 output, OrthancPluginPixelFormat_RGB24, |
57
91fc9583b2de
big refactoring to support sparse tiling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
16
diff
changeset
|
57 tile.GetWidth(), tile.GetHeight(), |
91fc9583b2de
big refactoring to support sparse tiling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
16
diff
changeset
|
58 tile.GetPitch(), tile.GetBuffer()); |
91fc9583b2de
big refactoring to support sparse tiling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
16
diff
changeset
|
59 } |
0 | 60 |
61 | |
62 static bool DisplayPerformanceWarning() | |
63 { | |
64 (void) DisplayPerformanceWarning; // Disable warning about unused function | |
156
dafbb7ebc00f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
155
diff
changeset
|
65 OrthancPluginLogWarning(OrthancPlugins::GetGlobalContext(), "Performance warning in whole-slide imaging: " |
0 | 66 "Non-release build, runtime debug assertions are turned on"); |
67 return true; | |
68 } | |
69 | |
70 | |
71 void ServePyramid(OrthancPluginRestOutput* output, | |
72 const char* url, | |
73 const OrthancPluginHttpRequest* request) | |
74 { | |
75 std::string seriesId(request->groups[0]); | |
76 | |
77 char tmp[1024]; | |
78 sprintf(tmp, "Accessing whole-slide pyramid of series %s", seriesId.c_str()); | |
156
dafbb7ebc00f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
155
diff
changeset
|
79 OrthancPluginLogInfo(OrthancPlugins::GetGlobalContext(), tmp); |
0 | 80 |
81 | |
261 | 82 OrthancWSI::DicomPyramidCache::Locker locker(seriesId); |
0 | 83 |
84 unsigned int totalWidth = locker.GetPyramid().GetLevelWidth(0); | |
85 unsigned int totalHeight = locker.GetPyramid().GetLevelHeight(0); | |
86 | |
73
a8c90aa32ca6
LRU caching of pyramids, OrthancWSIClearCache script
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
69
diff
changeset
|
87 Json::Value sizes = Json::arrayValue; |
0 | 88 Json::Value resolutions = Json::arrayValue; |
73
a8c90aa32ca6
LRU caching of pyramids, OrthancWSIClearCache script
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
69
diff
changeset
|
89 Json::Value tilesCount = Json::arrayValue; |
217
20bc074ec19a
Viewer can display DICOM pyramids whose tile sizes vary across levels
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
90 Json::Value tilesSizes = Json::arrayValue; |
0 | 91 for (unsigned int i = 0; i < locker.GetPyramid().GetLevelCount(); i++) |
92 { | |
217
20bc074ec19a
Viewer can display DICOM pyramids whose tile sizes vary across levels
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
93 const unsigned int levelWidth = locker.GetPyramid().GetLevelWidth(i); |
20bc074ec19a
Viewer can display DICOM pyramids whose tile sizes vary across levels
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
94 const unsigned int levelHeight = locker.GetPyramid().GetLevelHeight(i); |
20bc074ec19a
Viewer can display DICOM pyramids whose tile sizes vary across levels
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
95 const unsigned int tileWidth = locker.GetPyramid().GetTileWidth(i); |
20bc074ec19a
Viewer can display DICOM pyramids whose tile sizes vary across levels
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
96 const unsigned int tileHeight = locker.GetPyramid().GetTileHeight(i); |
20bc074ec19a
Viewer can display DICOM pyramids whose tile sizes vary across levels
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
97 |
73
a8c90aa32ca6
LRU caching of pyramids, OrthancWSIClearCache script
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
69
diff
changeset
|
98 resolutions.append(static_cast<float>(totalWidth) / static_cast<float>(levelWidth)); |
a8c90aa32ca6
LRU caching of pyramids, OrthancWSIClearCache script
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
69
diff
changeset
|
99 |
a8c90aa32ca6
LRU caching of pyramids, OrthancWSIClearCache script
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
69
diff
changeset
|
100 Json::Value s = Json::arrayValue; |
a8c90aa32ca6
LRU caching of pyramids, OrthancWSIClearCache script
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
69
diff
changeset
|
101 s.append(levelWidth); |
a8c90aa32ca6
LRU caching of pyramids, OrthancWSIClearCache script
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
69
diff
changeset
|
102 s.append(levelHeight); |
a8c90aa32ca6
LRU caching of pyramids, OrthancWSIClearCache script
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
69
diff
changeset
|
103 sizes.append(s); |
a8c90aa32ca6
LRU caching of pyramids, OrthancWSIClearCache script
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
69
diff
changeset
|
104 |
a8c90aa32ca6
LRU caching of pyramids, OrthancWSIClearCache script
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
69
diff
changeset
|
105 s = Json::arrayValue; |
a8c90aa32ca6
LRU caching of pyramids, OrthancWSIClearCache script
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
69
diff
changeset
|
106 s.append(OrthancWSI::CeilingDivision(levelWidth, tileWidth)); |
a8c90aa32ca6
LRU caching of pyramids, OrthancWSIClearCache script
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
69
diff
changeset
|
107 s.append(OrthancWSI::CeilingDivision(levelHeight, tileHeight)); |
a8c90aa32ca6
LRU caching of pyramids, OrthancWSIClearCache script
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
69
diff
changeset
|
108 tilesCount.append(s); |
217
20bc074ec19a
Viewer can display DICOM pyramids whose tile sizes vary across levels
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
109 |
20bc074ec19a
Viewer can display DICOM pyramids whose tile sizes vary across levels
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
110 s = Json::arrayValue; |
20bc074ec19a
Viewer can display DICOM pyramids whose tile sizes vary across levels
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
111 s.append(tileWidth); |
20bc074ec19a
Viewer can display DICOM pyramids whose tile sizes vary across levels
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
112 s.append(tileHeight); |
20bc074ec19a
Viewer can display DICOM pyramids whose tile sizes vary across levels
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
113 tilesSizes.append(s); |
0 | 114 } |
115 | |
116 Json::Value result; | |
117 result["ID"] = seriesId; | |
73
a8c90aa32ca6
LRU caching of pyramids, OrthancWSIClearCache script
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
69
diff
changeset
|
118 result["Resolutions"] = resolutions; |
a8c90aa32ca6
LRU caching of pyramids, OrthancWSIClearCache script
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
69
diff
changeset
|
119 result["Sizes"] = sizes; |
a8c90aa32ca6
LRU caching of pyramids, OrthancWSIClearCache script
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
69
diff
changeset
|
120 result["TilesCount"] = tilesCount; |
217
20bc074ec19a
Viewer can display DICOM pyramids whose tile sizes vary across levels
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
121 result["TilesSizes"] = tilesSizes; |
0 | 122 result["TotalHeight"] = totalHeight; |
73
a8c90aa32ca6
LRU caching of pyramids, OrthancWSIClearCache script
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
69
diff
changeset
|
123 result["TotalWidth"] = totalWidth; |
0 | 124 |
125 std::string s = result.toStyledString(); | |
156
dafbb7ebc00f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
155
diff
changeset
|
126 OrthancPluginAnswerBuffer(OrthancPlugins::GetGlobalContext(), output, s.c_str(), s.size(), "application/json"); |
0 | 127 } |
128 | |
129 | |
130 void ServeTile(OrthancPluginRestOutput* output, | |
131 const char* url, | |
132 const OrthancPluginHttpRequest* request) | |
133 { | |
134 std::string seriesId(request->groups[0]); | |
135 int level = boost::lexical_cast<int>(request->groups[1]); | |
136 int tileY = boost::lexical_cast<int>(request->groups[3]); | |
137 int tileX = boost::lexical_cast<int>(request->groups[2]); | |
138 | |
139 char tmp[1024]; | |
140 sprintf(tmp, "Accessing tile in series %s: (%d,%d) at level %d", seriesId.c_str(), tileX, tileY, level); | |
156
dafbb7ebc00f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
155
diff
changeset
|
141 OrthancPluginLogInfo(OrthancPlugins::GetGlobalContext(), tmp); |
0 | 142 |
143 if (level < 0 || | |
144 tileX < 0 || | |
145 tileY < 0) | |
146 { | |
147 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); | |
148 } | |
149 | |
150 // Retrieve the raw tile from the WSI pyramid | |
261 | 151 std::unique_ptr<OrthancWSI::RawTile> rawTile; |
0 | 152 |
153 { | |
261 | 154 OrthancWSI::DicomPyramidCache::Locker locker(seriesId); |
155 rawTile.reset(new OrthancWSI::RawTile(locker.GetPyramid(), | |
156 static_cast<unsigned int>(level), | |
157 static_cast<unsigned int>(tileX), | |
158 static_cast<unsigned int>(tileY))); | |
0 | 159 } |
160 | |
256
7deea131c3c0
implementation of IIIF Image API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
254
diff
changeset
|
161 /** |
7deea131c3c0
implementation of IIIF Image API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
254
diff
changeset
|
162 * In the case the DICOM file doesn't use the JPEG transfer syntax, |
7deea131c3c0
implementation of IIIF Image API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
254
diff
changeset
|
163 * transfer the tile (which is presumably lossless) as a PNG image |
7deea131c3c0
implementation of IIIF Image API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
254
diff
changeset
|
164 * so as to prevent lossy compression. Don't call "rawTile" while |
7deea131c3c0
implementation of IIIF Image API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
254
diff
changeset
|
165 * the Locker is around, as "Answer()" can be a costly operation. |
7deea131c3c0
implementation of IIIF Image API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
254
diff
changeset
|
166 **/ |
7deea131c3c0
implementation of IIIF Image API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
254
diff
changeset
|
167 rawTile->Answer(output, Orthanc::MimeType_Png); |
0 | 168 } |
169 | |
170 | |
171 OrthancPluginErrorCode OnChangeCallback(OrthancPluginChangeType changeType, | |
172 OrthancPluginResourceType resourceType, | |
173 const char *resourceId) | |
174 { | |
175 if (resourceType == OrthancPluginResourceType_Series && | |
176 changeType == OrthancPluginChangeType_NewChildInstance) | |
177 { | |
178 char tmp[1024]; | |
179 sprintf(tmp, "New instance has been added to series %s, invalidating it", resourceId); | |
156
dafbb7ebc00f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
155
diff
changeset
|
180 OrthancPluginLogInfo(OrthancPlugins::GetGlobalContext(), tmp); |
0 | 181 |
261 | 182 OrthancWSI::DicomPyramidCache::GetInstance().Invalidate(resourceId); |
0 | 183 } |
184 | |
185 return OrthancPluginErrorCode_Success; | |
186 } | |
187 | |
188 | |
189 | |
190 void ServeFile(OrthancPluginRestOutput* output, | |
191 const char* url, | |
192 const OrthancPluginHttpRequest* request) | |
193 { | |
194 Orthanc::EmbeddedResources::FileResourceId resource; | |
195 | |
196 std::string f(request->groups[0]); | |
197 std::string mime; | |
198 | |
199 if (f == "viewer.html") | |
200 { | |
201 resource = Orthanc::EmbeddedResources::VIEWER_HTML; | |
202 mime = "text/html"; | |
203 } | |
204 else if (f == "viewer.js") | |
205 { | |
206 resource = Orthanc::EmbeddedResources::VIEWER_JS; | |
207 mime = "application/javascript"; | |
208 } | |
209 else if (f == "ol.js") | |
210 { | |
211 resource = Orthanc::EmbeddedResources::OPENLAYERS_JS; | |
212 mime = "application/javascript"; | |
213 } | |
214 else if (f == "ol.css") | |
215 { | |
216 resource = Orthanc::EmbeddedResources::OPENLAYERS_CSS; | |
217 mime = "text/css"; | |
218 } | |
262 | 219 else if (f == "mirador.html") |
220 { | |
221 resource = Orthanc::EmbeddedResources::MIRADOR_HTML; | |
222 mime = "text/html"; | |
223 } | |
0 | 224 else |
225 { | |
226 throw Orthanc::OrthancException(Orthanc::ErrorCode_UnknownResource); | |
227 } | |
228 | |
229 std::string content; | |
230 Orthanc::EmbeddedResources::GetFileResource(content, resource); | |
231 | |
156
dafbb7ebc00f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
155
diff
changeset
|
232 OrthancPluginAnswerBuffer(OrthancPlugins::GetGlobalContext(), output, content.c_str(), content.size(), mime.c_str()); |
0 | 233 } |
234 | |
235 | |
236 extern "C" | |
237 { | |
238 ORTHANC_PLUGINS_API int32_t OrthancPluginInitialize(OrthancPluginContext* context) | |
239 { | |
156
dafbb7ebc00f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
155
diff
changeset
|
240 OrthancPlugins::SetGlobalContext(context); |
0 | 241 assert(DisplayPerformanceWarning()); |
242 | |
243 /* Check the version of the Orthanc core */ | |
156
dafbb7ebc00f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
155
diff
changeset
|
244 if (OrthancPluginCheckVersion(OrthancPlugins::GetGlobalContext()) == 0) |
0 | 245 { |
246 char info[1024]; | |
247 sprintf(info, "Your version of Orthanc (%s) must be above %d.%d.%d to run this plugin", | |
156
dafbb7ebc00f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
155
diff
changeset
|
248 OrthancPlugins::GetGlobalContext()->orthancVersion, |
0 | 249 ORTHANC_PLUGINS_MINIMAL_MAJOR_NUMBER, |
250 ORTHANC_PLUGINS_MINIMAL_MINOR_NUMBER, | |
251 ORTHANC_PLUGINS_MINIMAL_REVISION_NUMBER); | |
156
dafbb7ebc00f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
155
diff
changeset
|
252 OrthancPluginLogError(OrthancPlugins::GetGlobalContext(), info); |
0 | 253 return -1; |
254 } | |
255 | |
156
dafbb7ebc00f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
155
diff
changeset
|
256 if (!OrthancPlugins::CheckMinimalOrthancVersion(1, 1, 0)) |
5
77b76c1a213f
check the version of the Orthanc core
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
257 { |
77b76c1a213f
check the version of the Orthanc core
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
258 // We need the "/instances/.../frames/.../raw" URI that was introduced in Orthanc 1.1.0 |
77b76c1a213f
check the version of the Orthanc core
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
259 return -1; |
77b76c1a213f
check the version of the Orthanc core
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
260 } |
77b76c1a213f
check the version of the Orthanc core
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
261 |
206 | 262 #if ORTHANC_FRAMEWORK_VERSION_IS_ABOVE(1, 7, 2) |
191 | 263 Orthanc::Logging::InitializePluginContext(context); |
193 | 264 #else |
265 Orthanc::Logging::Initialize(context); | |
266 #endif | |
151 | 267 |
0 | 268 // Limit the number of PNG transcoders to the number of available |
269 // hardware threads (e.g. number of CPUs or cores or | |
270 // hyperthreading units) | |
153
b798d200ac90
using Semaphore from Orthanc framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
150
diff
changeset
|
271 unsigned int threads = Orthanc::SystemToolbox::GetHardwareConcurrency(); |
261 | 272 OrthancWSI::RawTile::InitializeTranscoderSemaphore(threads); |
0 | 273 |
274 char info[1024]; | |
145 | 275 sprintf(info, "The whole-slide imaging plugin will use at most %u threads to transcode the tiles", threads); |
156
dafbb7ebc00f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
155
diff
changeset
|
276 OrthancPluginLogWarning(OrthancPlugins::GetGlobalContext(), info); |
0 | 277 |
8
62adabb8c122
Provide "--version" in command-line tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5
diff
changeset
|
278 OrthancPluginSetDescription(context, "Provides a Web viewer of whole-slide microscopic images within Orthanc."); |
0 | 279 |
261 | 280 OrthancWSI::DicomPyramidCache::InitializeInstance(10 /* Number of pyramids to be cached - TODO parameter */); |
256
7deea131c3c0
implementation of IIIF Image API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
254
diff
changeset
|
281 |
156
dafbb7ebc00f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
155
diff
changeset
|
282 OrthancPluginRegisterOnChangeCallback(OrthancPlugins::GetGlobalContext(), OnChangeCallback); |
0 | 283 |
156
dafbb7ebc00f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
155
diff
changeset
|
284 OrthancPlugins::RegisterRestCallback<ServeFile>("/wsi/app/(ol.css)", true); |
dafbb7ebc00f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
155
diff
changeset
|
285 OrthancPlugins::RegisterRestCallback<ServeFile>("/wsi/app/(ol.js)", true); |
dafbb7ebc00f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
155
diff
changeset
|
286 OrthancPlugins::RegisterRestCallback<ServeFile>("/wsi/app/(viewer.html)", true); |
dafbb7ebc00f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
155
diff
changeset
|
287 OrthancPlugins::RegisterRestCallback<ServeFile>("/wsi/app/(viewer.js)", true); |
dafbb7ebc00f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
155
diff
changeset
|
288 OrthancPlugins::RegisterRestCallback<ServePyramid>("/wsi/pyramids/([0-9a-f-]+)", true); |
dafbb7ebc00f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
155
diff
changeset
|
289 OrthancPlugins::RegisterRestCallback<ServeTile>("/wsi/tiles/([0-9a-f-]+)/([0-9-]+)/([0-9-]+)/([0-9-]+)", true); |
0 | 290 |
262 | 291 bool serveMirador = true; // TODO => CONFIG |
292 | |
293 if (serveMirador) | |
294 { | |
295 OrthancPlugins::RegisterRestCallback<ServeFile>("/wsi/app/(mirador.html)", true); | |
296 } | |
297 | |
261 | 298 { |
299 // TODO => CONFIG | |
300 std::string url = "http://localhost:8042/wsi/iiif"; | |
301 | |
302 if (url.empty() || | |
303 url[url.size() - 1] != '/') | |
304 { | |
305 url += "/"; | |
306 } | |
307 | |
308 InitializeIIIF(url); | |
309 } | |
256
7deea131c3c0
implementation of IIIF Image API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
254
diff
changeset
|
310 |
262 | 311 { |
312 // Extend the default Orthanc Explorer with custom JavaScript for WSI | |
313 | |
314 std::string explorer; | |
315 Orthanc::EmbeddedResources::GetFileResource(explorer, Orthanc::EmbeddedResources::ORTHANC_EXPLORER); | |
316 | |
317 std::map<std::string, std::string> dictionary; | |
318 dictionary["SERVE_MIRADOR"] = (serveMirador ? "true" : "false"); | |
319 explorer = Orthanc::Toolbox::SubstituteVariables(explorer, dictionary); | |
320 | |
321 OrthancPluginExtendOrthancExplorer(OrthancPlugins::GetGlobalContext(), explorer.c_str()); | |
322 } | |
0 | 323 |
324 return 0; | |
325 } | |
326 | |
327 | |
328 ORTHANC_PLUGINS_API void OrthancPluginFinalize() | |
329 { | |
261 | 330 OrthancWSI::DicomPyramidCache::FinalizeInstance(); |
331 OrthancWSI::RawTile::FinalizeTranscoderSemaphore(); | |
0 | 332 } |
333 | |
334 | |
335 ORTHANC_PLUGINS_API const char* OrthancPluginGetName() | |
336 { | |
337 return "wsi"; | |
338 } | |
339 | |
340 | |
341 ORTHANC_PLUGINS_API const char* OrthancPluginGetVersion() | |
342 { | |
343 return ORTHANC_WSI_VERSION; | |
344 } | |
345 } |