Mercurial > hg > orthanc-wsi
annotate ViewerPlugin/Plugin.cpp @ 290:995dbab2e3dd
fix
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Thu, 13 Jul 2023 16:41:09 +0200 |
parents | ac1508b438b1 |
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:
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 |
260 | 30 #include <Images/Image.h> |
192 | 31 #include <Images/ImageProcessing.h> |
277
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
32 #include <Logging.h> |
192 | 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 { | |
276
ef8a673b5fb9
clarification of RawTile::Answer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
275
diff
changeset
|
154 // NB: Don't call "rawTile" while the Locker is around, as |
ef8a673b5fb9
clarification of RawTile::Answer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
275
diff
changeset
|
155 // "Answer()" can be a costly operation. |
261 | 156 OrthancWSI::DicomPyramidCache::Locker locker(seriesId); |
276
ef8a673b5fb9
clarification of RawTile::Answer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
275
diff
changeset
|
157 |
261 | 158 rawTile.reset(new OrthancWSI::RawTile(locker.GetPyramid(), |
159 static_cast<unsigned int>(level), | |
160 static_cast<unsigned int>(tileX), | |
161 static_cast<unsigned int>(tileY))); | |
0 | 162 } |
163 | |
277
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
164 Orthanc::MimeType mime; |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
165 |
276
ef8a673b5fb9
clarification of RawTile::Answer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
275
diff
changeset
|
166 if (rawTile->GetCompression() == OrthancWSI::ImageCompression_Jpeg) |
ef8a673b5fb9
clarification of RawTile::Answer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
275
diff
changeset
|
167 { |
ef8a673b5fb9
clarification of RawTile::Answer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
275
diff
changeset
|
168 // The tile is already a JPEG image. In such a case, we can |
ef8a673b5fb9
clarification of RawTile::Answer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
275
diff
changeset
|
169 // serve it as such, because any Web browser can handle JPEG. |
277
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
170 mime = Orthanc::MimeType_Jpeg; |
276
ef8a673b5fb9
clarification of RawTile::Answer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
275
diff
changeset
|
171 } |
ef8a673b5fb9
clarification of RawTile::Answer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
275
diff
changeset
|
172 else |
ef8a673b5fb9
clarification of RawTile::Answer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
275
diff
changeset
|
173 { |
277
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
174 // This is a lossless frame (coming from JPEG2000 or uncompressed |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
175 // DICOM instance), not a DICOM-JPEG instance. Decompress the raw |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
176 // tile, then transcode it to PNG to prevent lossy compression and |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
177 // to avoid JPEG2000 that is not supported by all the browsers. |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
178 mime = Orthanc::MimeType_Png; |
276
ef8a673b5fb9
clarification of RawTile::Answer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
275
diff
changeset
|
179 } |
277
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
180 |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
181 // Lookup whether a "Accept" HTTP header is present, to overwrite |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
182 // the default MIME type |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
183 for (uint32_t i = 0; i < request->headersCount; i++) |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
184 { |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
185 std::string key(request->headersKeys[i]); |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
186 Orthanc::Toolbox::ToLowerCase(key); |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
187 |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
188 if (key == "accept") |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
189 { |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
190 std::vector<std::string> tokens; |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
191 Orthanc::Toolbox::TokenizeString(tokens, request->headersValues[i], ','); |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
192 |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
193 bool found = false; |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
194 |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
195 for (size_t j = 0; j < tokens.size(); j++) |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
196 { |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
197 std::string s = Orthanc::Toolbox::StripSpaces(tokens[j]); |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
198 |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
199 if (s == Orthanc::EnumerationToString(Orthanc::MimeType_Png)) |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
200 { |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
201 mime = Orthanc::MimeType_Png; |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
202 found = true; |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
203 } |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
204 else if (s == Orthanc::EnumerationToString(Orthanc::MimeType_Jpeg)) |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
205 { |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
206 mime = Orthanc::MimeType_Jpeg; |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
207 found = true; |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
208 } |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
209 else if (s == Orthanc::EnumerationToString(Orthanc::MimeType_Jpeg2000)) |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
210 { |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
211 mime = Orthanc::MimeType_Jpeg2000; |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
212 found = true; |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
213 } |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
214 else if (s == "*/*" || |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
215 s == "image/*") |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
216 { |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
217 found = true; |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
218 } |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
219 } |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
220 |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
221 if (!found) |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
222 { |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
223 OrthancPluginSendHttpStatusCode(OrthancPlugins::GetGlobalContext(), output, 406 /* Not acceptable */); |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
224 return; |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
225 } |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
226 } |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
227 } |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
228 |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
229 rawTile->Answer(output, mime); |
0 | 230 } |
231 | |
232 | |
233 OrthancPluginErrorCode OnChangeCallback(OrthancPluginChangeType changeType, | |
234 OrthancPluginResourceType resourceType, | |
235 const char *resourceId) | |
236 { | |
237 if (resourceType == OrthancPluginResourceType_Series && | |
238 changeType == OrthancPluginChangeType_NewChildInstance) | |
239 { | |
240 char tmp[1024]; | |
241 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
|
242 OrthancPluginLogInfo(OrthancPlugins::GetGlobalContext(), tmp); |
0 | 243 |
261 | 244 OrthancWSI::DicomPyramidCache::GetInstance().Invalidate(resourceId); |
0 | 245 } |
246 | |
247 return OrthancPluginErrorCode_Success; | |
248 } | |
249 | |
250 | |
251 | |
252 void ServeFile(OrthancPluginRestOutput* output, | |
253 const char* url, | |
254 const OrthancPluginHttpRequest* request) | |
255 { | |
256 Orthanc::EmbeddedResources::FileResourceId resource; | |
257 | |
258 std::string f(request->groups[0]); | |
259 std::string mime; | |
260 | |
261 if (f == "viewer.html") | |
262 { | |
263 resource = Orthanc::EmbeddedResources::VIEWER_HTML; | |
264 mime = "text/html"; | |
265 } | |
266 else if (f == "viewer.js") | |
267 { | |
268 resource = Orthanc::EmbeddedResources::VIEWER_JS; | |
269 mime = "application/javascript"; | |
270 } | |
271 else if (f == "ol.js") | |
272 { | |
273 resource = Orthanc::EmbeddedResources::OPENLAYERS_JS; | |
274 mime = "application/javascript"; | |
275 } | |
276 else if (f == "ol.css") | |
277 { | |
278 resource = Orthanc::EmbeddedResources::OPENLAYERS_CSS; | |
279 mime = "text/css"; | |
280 } | |
262 | 281 else if (f == "mirador.html") |
282 { | |
283 resource = Orthanc::EmbeddedResources::MIRADOR_HTML; | |
284 mime = "text/html"; | |
285 } | |
270
0040ce361d4c
serving openseadragon
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
263
diff
changeset
|
286 else if (f == "openseadragon.html") |
0040ce361d4c
serving openseadragon
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
263
diff
changeset
|
287 { |
0040ce361d4c
serving openseadragon
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
263
diff
changeset
|
288 resource = Orthanc::EmbeddedResources::OPEN_SEADRAGON_HTML; |
0040ce361d4c
serving openseadragon
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
263
diff
changeset
|
289 mime = "text/html"; |
0040ce361d4c
serving openseadragon
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
263
diff
changeset
|
290 } |
0 | 291 else |
292 { | |
293 throw Orthanc::OrthancException(Orthanc::ErrorCode_UnknownResource); | |
294 } | |
295 | |
296 std::string content; | |
297 Orthanc::EmbeddedResources::GetFileResource(content, resource); | |
298 | |
156
dafbb7ebc00f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
155
diff
changeset
|
299 OrthancPluginAnswerBuffer(OrthancPlugins::GetGlobalContext(), output, content.c_str(), content.size(), mime.c_str()); |
0 | 300 } |
301 | |
302 | |
303 extern "C" | |
304 { | |
305 ORTHANC_PLUGINS_API int32_t OrthancPluginInitialize(OrthancPluginContext* context) | |
306 { | |
156
dafbb7ebc00f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
155
diff
changeset
|
307 OrthancPlugins::SetGlobalContext(context); |
0 | 308 assert(DisplayPerformanceWarning()); |
309 | |
310 /* 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
|
311 if (OrthancPluginCheckVersion(OrthancPlugins::GetGlobalContext()) == 0) |
0 | 312 { |
313 char info[1024]; | |
314 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
|
315 OrthancPlugins::GetGlobalContext()->orthancVersion, |
0 | 316 ORTHANC_PLUGINS_MINIMAL_MAJOR_NUMBER, |
317 ORTHANC_PLUGINS_MINIMAL_MINOR_NUMBER, | |
318 ORTHANC_PLUGINS_MINIMAL_REVISION_NUMBER); | |
156
dafbb7ebc00f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
155
diff
changeset
|
319 OrthancPluginLogError(OrthancPlugins::GetGlobalContext(), info); |
0 | 320 return -1; |
321 } | |
322 | |
156
dafbb7ebc00f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
155
diff
changeset
|
323 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
|
324 { |
77b76c1a213f
check the version of the Orthanc core
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
325 // 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
|
326 return -1; |
77b76c1a213f
check the version of the Orthanc core
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
327 } |
77b76c1a213f
check the version of the Orthanc core
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
328 |
206 | 329 #if ORTHANC_FRAMEWORK_VERSION_IS_ABOVE(1, 7, 2) |
191 | 330 Orthanc::Logging::InitializePluginContext(context); |
193 | 331 #else |
332 Orthanc::Logging::Initialize(context); | |
333 #endif | |
151 | 334 |
0 | 335 // Limit the number of PNG transcoders to the number of available |
336 // hardware threads (e.g. number of CPUs or cores or | |
337 // hyperthreading units) | |
153
b798d200ac90
using Semaphore from Orthanc framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
150
diff
changeset
|
338 unsigned int threads = Orthanc::SystemToolbox::GetHardwareConcurrency(); |
261 | 339 OrthancWSI::RawTile::InitializeTranscoderSemaphore(threads); |
0 | 340 |
341 char info[1024]; | |
145 | 342 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
|
343 OrthancPluginLogWarning(OrthancPlugins::GetGlobalContext(), info); |
0 | 344 |
8
62adabb8c122
Provide "--version" in command-line tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5
diff
changeset
|
345 OrthancPluginSetDescription(context, "Provides a Web viewer of whole-slide microscopic images within Orthanc."); |
0 | 346 |
261 | 347 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
|
348 |
156
dafbb7ebc00f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
155
diff
changeset
|
349 OrthancPluginRegisterOnChangeCallback(OrthancPlugins::GetGlobalContext(), OnChangeCallback); |
0 | 350 |
156
dafbb7ebc00f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
155
diff
changeset
|
351 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
|
352 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
|
353 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
|
354 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
|
355 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
|
356 OrthancPlugins::RegisterRestCallback<ServeTile>("/wsi/tiles/([0-9a-f-]+)/([0-9-]+)/([0-9-]+)/([0-9-]+)", true); |
0 | 357 |
275
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
358 OrthancPlugins::OrthancConfiguration mainConfiguration; |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
359 |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
360 OrthancPlugins::OrthancConfiguration wsiConfiguration; |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
361 mainConfiguration.GetSection(wsiConfiguration, "WholeSlideImaging"); |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
362 |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
363 const bool enableIIIF = wsiConfiguration.GetBooleanValue("EnableIIIF", true); |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
364 bool serveMirador = false; |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
365 bool serveOpenSeadragon = false; |
263
14f182958ca7
added button to access IIIF manifest of series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
262
diff
changeset
|
366 std::string iiifPublicUrl; |
262 | 367 |
275
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
368 if (enableIIIF) |
261 | 369 { |
275
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
370 if (!wsiConfiguration.LookupStringValue(iiifPublicUrl, "OrthancPublicURL")) |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
371 { |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
372 unsigned int port = mainConfiguration.GetUnsignedIntegerValue("HttpPort", 8042); |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
373 iiifPublicUrl = "http://localhost:" + boost::lexical_cast<std::string>(port) + "/"; |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
374 } |
261 | 375 |
263
14f182958ca7
added button to access IIIF manifest of series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
262
diff
changeset
|
376 if (iiifPublicUrl.empty() || |
14f182958ca7
added button to access IIIF manifest of series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
262
diff
changeset
|
377 iiifPublicUrl[iiifPublicUrl.size() - 1] != '/') |
261 | 378 { |
263
14f182958ca7
added button to access IIIF manifest of series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
262
diff
changeset
|
379 iiifPublicUrl += "/"; |
261 | 380 } |
381 | |
275
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
382 iiifPublicUrl += "wsi/iiif/"; |
263
14f182958ca7
added button to access IIIF manifest of series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
262
diff
changeset
|
383 |
275
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
384 InitializeIIIF(iiifPublicUrl); |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
385 |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
386 serveMirador = wsiConfiguration.GetBooleanValue("ServeMirador", false); |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
387 serveOpenSeadragon = wsiConfiguration.GetBooleanValue("ServeOpenSeadragon", false); |
263
14f182958ca7
added button to access IIIF manifest of series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
262
diff
changeset
|
388 |
275
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
389 bool value; |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
390 if (wsiConfiguration.LookupBooleanValue(value, "ForcePowersOfTwoScaleFactors")) |
263
14f182958ca7
added button to access IIIF manifest of series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
262
diff
changeset
|
391 { |
275
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
392 SetIIIFForcePowersOfTwoScaleFactors(value); |
263
14f182958ca7
added button to access IIIF manifest of series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
262
diff
changeset
|
393 } |
275
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
394 else |
270
0040ce361d4c
serving openseadragon
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
263
diff
changeset
|
395 { |
275
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
396 /** |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
397 * By default, compatibility mode is disabled. However, if |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
398 * Mirador or OSD are enabled, compatibility mode is |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
399 * automatically enabled to enhance user experience, at least |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
400 * until issue 2379 of OSD is solved: |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
401 * https://github.com/openseadragon/openseadragon/issues/2379 |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
402 **/ |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
403 SetIIIFForcePowersOfTwoScaleFactors(serveMirador || serveOpenSeadragon); |
270
0040ce361d4c
serving openseadragon
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
263
diff
changeset
|
404 } |
263
14f182958ca7
added button to access IIIF manifest of series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
262
diff
changeset
|
405 } |
275
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
406 |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
407 LOG(WARNING) << "Support of IIIF is " << (enableIIIF ? "enabled" : "disabled") << " in the whole-slide imaging plugin"; |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
408 |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
409 if (serveMirador) |
263
14f182958ca7
added button to access IIIF manifest of series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
262
diff
changeset
|
410 { |
275
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
411 OrthancPlugins::RegisterRestCallback<ServeFile>("/wsi/app/(mirador.html)", true); |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
412 } |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
413 |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
414 if (serveOpenSeadragon) |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
415 { |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
416 OrthancPlugins::RegisterRestCallback<ServeFile>("/wsi/app/(openseadragon.html)", true); |
261 | 417 } |
256
7deea131c3c0
implementation of IIIF Image API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
254
diff
changeset
|
418 |
262 | 419 { |
420 // Extend the default Orthanc Explorer with custom JavaScript for WSI | |
421 | |
422 std::string explorer; | |
423 Orthanc::EmbeddedResources::GetFileResource(explorer, Orthanc::EmbeddedResources::ORTHANC_EXPLORER); | |
424 | |
425 std::map<std::string, std::string> dictionary; | |
275
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
426 dictionary["ENABLE_IIIF"] = (enableIIIF ? "true" : "false"); |
262 | 427 dictionary["SERVE_MIRADOR"] = (serveMirador ? "true" : "false"); |
270
0040ce361d4c
serving openseadragon
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
263
diff
changeset
|
428 dictionary["SERVE_OPEN_SEADRAGON"] = (serveOpenSeadragon ? "true" : "false"); |
262 | 429 explorer = Orthanc::Toolbox::SubstituteVariables(explorer, dictionary); |
430 | |
431 OrthancPluginExtendOrthancExplorer(OrthancPlugins::GetGlobalContext(), explorer.c_str()); | |
432 } | |
0 | 433 |
434 return 0; | |
435 } | |
436 | |
437 | |
438 ORTHANC_PLUGINS_API void OrthancPluginFinalize() | |
439 { | |
261 | 440 OrthancWSI::DicomPyramidCache::FinalizeInstance(); |
441 OrthancWSI::RawTile::FinalizeTranscoderSemaphore(); | |
0 | 442 } |
443 | |
444 | |
445 ORTHANC_PLUGINS_API const char* OrthancPluginGetName() | |
446 { | |
447 return "wsi"; | |
448 } | |
449 | |
450 | |
451 ORTHANC_PLUGINS_API const char* OrthancPluginGetVersion() | |
452 { | |
453 return ORTHANC_WSI_VERSION; | |
454 } | |
455 } |