Mercurial > hg > orthanc-wsi
annotate ViewerPlugin/Plugin.cpp @ 334:f011fc199b6a default tip
back to mainline
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Fri, 18 Oct 2024 15:44:18 +0200 |
parents | cf828b381bc9 |
children |
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 | |
312
0683312e21ba
updated copyright, as Orthanc Team now replaces Osimis
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
310
diff
changeset
|
5 * Copyright (C) 2017-2023 Osimis S.A., Belgium |
0683312e21ba
updated copyright, as Orthanc Team now replaces Osimis
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
310
diff
changeset
|
6 * Copyright (C) 2024-2024 Orthanc Team SRL, Belgium |
309
7020852a8fa9
updated year to 2024
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
277
diff
changeset
|
7 * Copyright (C) 2021-2024 Sebastien Jodogne, ICTEAM UCLouvain, Belgium |
0 | 8 * |
9 * This program is free software: you can redistribute it and/or | |
10 * modify it under the terms of the GNU Affero General Public License | |
11 * as published by the Free Software Foundation, either version 3 of | |
12 * the License, or (at your option) any later version. | |
13 * | |
14 * This program is distributed in the hope that it will be useful, but | |
15 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
17 * Affero General Public License for more details. | |
18 * | |
19 * You should have received a copy of the GNU Affero General Public License | |
20 * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
21 **/ | |
22 | |
23 | |
16
7a88c614be04
preparing for precompiled headers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
8
diff
changeset
|
24 #include "../Framework/PrecompiledHeadersWSI.h" |
73
a8c90aa32ca6
LRU caching of pyramids, OrthancWSIClearCache script
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
69
diff
changeset
|
25 |
a8c90aa32ca6
LRU caching of pyramids, OrthancWSIClearCache script
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
69
diff
changeset
|
26 #include "DicomPyramidCache.h" |
261 | 27 #include "IIIF.h" |
260 | 28 #include "RawTile.h" |
59
7a3853d51c45
Move "Framework/Orthanc/" as "Resources/Orthanc/"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
57
diff
changeset
|
29 |
199
a1c265cb2174
replacing deprecated std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
196
diff
changeset
|
30 #include <Compatibility.h> // For std::unique_ptr |
260 | 31 #include <Images/Image.h> |
192 | 32 #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
|
33 #include <Logging.h> |
192 | 34 #include <OrthancException.h> |
35 #include <SystemToolbox.h> | |
36 | |
194 | 37 #include "../Resources/Orthanc/Plugins/OrthancPluginCppWrapper.h" |
0 | 38 |
39 #include <EmbeddedResources.h> | |
40 | |
41 #include <cassert> | |
57
91fc9583b2de
big refactoring to support sparse tiling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
16
diff
changeset
|
42 |
310
d374cb2a2277
fix deprecated calls
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
309
diff
changeset
|
43 #define ORTHANC_PLUGIN_NAME "wsi" |
d374cb2a2277
fix deprecated calls
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
309
diff
changeset
|
44 |
d374cb2a2277
fix deprecated calls
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
309
diff
changeset
|
45 |
0 | 46 static bool DisplayPerformanceWarning() |
47 { | |
48 (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
|
49 OrthancPluginLogWarning(OrthancPlugins::GetGlobalContext(), "Performance warning in whole-slide imaging: " |
0 | 50 "Non-release build, runtime debug assertions are turned on"); |
51 return true; | |
52 } | |
53 | |
54 | |
55 void ServePyramid(OrthancPluginRestOutput* output, | |
56 const char* url, | |
57 const OrthancPluginHttpRequest* request) | |
58 { | |
59 std::string seriesId(request->groups[0]); | |
60 | |
61 char tmp[1024]; | |
62 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
|
63 OrthancPluginLogInfo(OrthancPlugins::GetGlobalContext(), tmp); |
0 | 64 |
65 | |
261 | 66 OrthancWSI::DicomPyramidCache::Locker locker(seriesId); |
0 | 67 |
68 unsigned int totalWidth = locker.GetPyramid().GetLevelWidth(0); | |
69 unsigned int totalHeight = locker.GetPyramid().GetLevelHeight(0); | |
70 | |
73
a8c90aa32ca6
LRU caching of pyramids, OrthancWSIClearCache script
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
69
diff
changeset
|
71 Json::Value sizes = Json::arrayValue; |
0 | 72 Json::Value resolutions = Json::arrayValue; |
73
a8c90aa32ca6
LRU caching of pyramids, OrthancWSIClearCache script
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
69
diff
changeset
|
73 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
|
74 Json::Value tilesSizes = Json::arrayValue; |
0 | 75 for (unsigned int i = 0; i < locker.GetPyramid().GetLevelCount(); i++) |
76 { | |
217
20bc074ec19a
Viewer can display DICOM pyramids whose tile sizes vary across levels
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
77 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
|
78 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
|
79 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
|
80 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
|
81 |
73
a8c90aa32ca6
LRU caching of pyramids, OrthancWSIClearCache script
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
69
diff
changeset
|
82 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
|
83 |
a8c90aa32ca6
LRU caching of pyramids, OrthancWSIClearCache script
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
69
diff
changeset
|
84 Json::Value s = Json::arrayValue; |
a8c90aa32ca6
LRU caching of pyramids, OrthancWSIClearCache script
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
69
diff
changeset
|
85 s.append(levelWidth); |
a8c90aa32ca6
LRU caching of pyramids, OrthancWSIClearCache script
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
69
diff
changeset
|
86 s.append(levelHeight); |
a8c90aa32ca6
LRU caching of pyramids, OrthancWSIClearCache script
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
69
diff
changeset
|
87 sizes.append(s); |
a8c90aa32ca6
LRU caching of pyramids, OrthancWSIClearCache script
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
69
diff
changeset
|
88 |
a8c90aa32ca6
LRU caching of pyramids, OrthancWSIClearCache script
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
69
diff
changeset
|
89 s = Json::arrayValue; |
a8c90aa32ca6
LRU caching of pyramids, OrthancWSIClearCache script
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
69
diff
changeset
|
90 s.append(OrthancWSI::CeilingDivision(levelWidth, tileWidth)); |
a8c90aa32ca6
LRU caching of pyramids, OrthancWSIClearCache script
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
69
diff
changeset
|
91 s.append(OrthancWSI::CeilingDivision(levelHeight, tileHeight)); |
a8c90aa32ca6
LRU caching of pyramids, OrthancWSIClearCache script
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
69
diff
changeset
|
92 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
|
93 |
20bc074ec19a
Viewer can display DICOM pyramids whose tile sizes vary across levels
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
94 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
|
95 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
|
96 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
|
97 tilesSizes.append(s); |
0 | 98 } |
99 | |
100 Json::Value result; | |
101 result["ID"] = seriesId; | |
73
a8c90aa32ca6
LRU caching of pyramids, OrthancWSIClearCache script
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
69
diff
changeset
|
102 result["Resolutions"] = resolutions; |
a8c90aa32ca6
LRU caching of pyramids, OrthancWSIClearCache script
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
69
diff
changeset
|
103 result["Sizes"] = sizes; |
a8c90aa32ca6
LRU caching of pyramids, OrthancWSIClearCache script
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
69
diff
changeset
|
104 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
|
105 result["TilesSizes"] = tilesSizes; |
0 | 106 result["TotalHeight"] = totalHeight; |
73
a8c90aa32ca6
LRU caching of pyramids, OrthancWSIClearCache script
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
69
diff
changeset
|
107 result["TotalWidth"] = totalWidth; |
0 | 108 |
330
c42083d50ddf
Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
318
diff
changeset
|
109 { |
c42083d50ddf
Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
318
diff
changeset
|
110 // New in WSI 2.1 |
c42083d50ddf
Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
318
diff
changeset
|
111 sprintf(tmp, "#%02x%02x%02x", locker.GetPyramid().GetBackgroundRed(), |
c42083d50ddf
Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
318
diff
changeset
|
112 locker.GetPyramid().GetBackgroundGreen(), |
c42083d50ddf
Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
318
diff
changeset
|
113 locker.GetPyramid().GetBackgroundBlue()); |
c42083d50ddf
Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
318
diff
changeset
|
114 result["BackgroundColor"] = tmp; |
c42083d50ddf
Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
318
diff
changeset
|
115 } |
c42083d50ddf
Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
318
diff
changeset
|
116 |
0 | 117 std::string s = result.toStyledString(); |
156
dafbb7ebc00f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
155
diff
changeset
|
118 OrthancPluginAnswerBuffer(OrthancPlugins::GetGlobalContext(), output, s.c_str(), s.size(), "application/json"); |
0 | 119 } |
120 | |
121 | |
122 void ServeTile(OrthancPluginRestOutput* output, | |
123 const char* url, | |
124 const OrthancPluginHttpRequest* request) | |
125 { | |
126 std::string seriesId(request->groups[0]); | |
127 int level = boost::lexical_cast<int>(request->groups[1]); | |
128 int tileY = boost::lexical_cast<int>(request->groups[3]); | |
129 int tileX = boost::lexical_cast<int>(request->groups[2]); | |
130 | |
131 char tmp[1024]; | |
132 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
|
133 OrthancPluginLogInfo(OrthancPlugins::GetGlobalContext(), tmp); |
0 | 134 |
135 if (level < 0 || | |
136 tileX < 0 || | |
137 tileY < 0) | |
138 { | |
139 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); | |
140 } | |
141 | |
142 // Retrieve the raw tile from the WSI pyramid | |
261 | 143 std::unique_ptr<OrthancWSI::RawTile> rawTile; |
0 | 144 |
145 { | |
276
ef8a673b5fb9
clarification of RawTile::Answer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
275
diff
changeset
|
146 // 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
|
147 // "Answer()" can be a costly operation. |
261 | 148 OrthancWSI::DicomPyramidCache::Locker locker(seriesId); |
276
ef8a673b5fb9
clarification of RawTile::Answer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
275
diff
changeset
|
149 |
261 | 150 rawTile.reset(new OrthancWSI::RawTile(locker.GetPyramid(), |
151 static_cast<unsigned int>(level), | |
152 static_cast<unsigned int>(tileX), | |
153 static_cast<unsigned int>(tileY))); | |
0 | 154 } |
155 | |
318
8ad12abde290
sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
312
diff
changeset
|
156 if (rawTile->IsEmpty()) |
8ad12abde290
sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
312
diff
changeset
|
157 { |
8ad12abde290
sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
312
diff
changeset
|
158 OrthancWSI::RawTile::AnswerBackgroundTile(output, rawTile->GetTileWidth(), rawTile->GetTileHeight()); |
8ad12abde290
sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
312
diff
changeset
|
159 return; |
8ad12abde290
sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
312
diff
changeset
|
160 } |
8ad12abde290
sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
312
diff
changeset
|
161 |
277
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
162 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
|
163 |
276
ef8a673b5fb9
clarification of RawTile::Answer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
275
diff
changeset
|
164 if (rawTile->GetCompression() == OrthancWSI::ImageCompression_Jpeg) |
ef8a673b5fb9
clarification of RawTile::Answer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
275
diff
changeset
|
165 { |
ef8a673b5fb9
clarification of RawTile::Answer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
275
diff
changeset
|
166 // 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
|
167 // 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
|
168 mime = Orthanc::MimeType_Jpeg; |
276
ef8a673b5fb9
clarification of RawTile::Answer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
275
diff
changeset
|
169 } |
ef8a673b5fb9
clarification of RawTile::Answer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
275
diff
changeset
|
170 else |
ef8a673b5fb9
clarification of RawTile::Answer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
275
diff
changeset
|
171 { |
277
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
172 // 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
|
173 // 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
|
174 // 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
|
175 // 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
|
176 mime = Orthanc::MimeType_Png; |
276
ef8a673b5fb9
clarification of RawTile::Answer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
275
diff
changeset
|
177 } |
277
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
178 |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
179 // 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
|
180 // 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
|
181 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
|
182 { |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
183 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
|
184 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
|
185 |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
186 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
|
187 { |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
188 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
|
189 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
|
190 |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
191 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
|
192 |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
193 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
|
194 { |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
195 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
|
196 |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
197 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
|
198 { |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
199 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
|
200 found = true; |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
201 } |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
202 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
|
203 { |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
204 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
|
205 found = true; |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
206 } |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
207 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
|
208 { |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
209 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
|
210 found = true; |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
211 } |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
212 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
|
213 s == "image/*") |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
214 { |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
215 found = true; |
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 } |
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 if (!found) |
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 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
|
222 return; |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
223 } |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
224 } |
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 rawTile->Answer(output, mime); |
0 | 228 } |
229 | |
230 | |
231 OrthancPluginErrorCode OnChangeCallback(OrthancPluginChangeType changeType, | |
232 OrthancPluginResourceType resourceType, | |
233 const char *resourceId) | |
234 { | |
235 if (resourceType == OrthancPluginResourceType_Series && | |
236 changeType == OrthancPluginChangeType_NewChildInstance) | |
237 { | |
238 char tmp[1024]; | |
239 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
|
240 OrthancPluginLogInfo(OrthancPlugins::GetGlobalContext(), tmp); |
0 | 241 |
261 | 242 OrthancWSI::DicomPyramidCache::GetInstance().Invalidate(resourceId); |
0 | 243 } |
244 | |
245 return OrthancPluginErrorCode_Success; | |
246 } | |
247 | |
248 | |
249 | |
250 void ServeFile(OrthancPluginRestOutput* output, | |
251 const char* url, | |
252 const OrthancPluginHttpRequest* request) | |
253 { | |
254 Orthanc::EmbeddedResources::FileResourceId resource; | |
255 | |
256 std::string f(request->groups[0]); | |
257 std::string mime; | |
258 | |
259 if (f == "viewer.html") | |
260 { | |
261 resource = Orthanc::EmbeddedResources::VIEWER_HTML; | |
262 mime = "text/html"; | |
263 } | |
264 else if (f == "viewer.js") | |
265 { | |
266 resource = Orthanc::EmbeddedResources::VIEWER_JS; | |
267 mime = "application/javascript"; | |
268 } | |
269 else if (f == "ol.js") | |
270 { | |
271 resource = Orthanc::EmbeddedResources::OPENLAYERS_JS; | |
272 mime = "application/javascript"; | |
273 } | |
274 else if (f == "ol.css") | |
275 { | |
276 resource = Orthanc::EmbeddedResources::OPENLAYERS_CSS; | |
277 mime = "text/css"; | |
278 } | |
262 | 279 else if (f == "mirador.html") |
280 { | |
281 resource = Orthanc::EmbeddedResources::MIRADOR_HTML; | |
282 mime = "text/html"; | |
283 } | |
270
0040ce361d4c
serving openseadragon
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
263
diff
changeset
|
284 else if (f == "openseadragon.html") |
0040ce361d4c
serving openseadragon
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
263
diff
changeset
|
285 { |
0040ce361d4c
serving openseadragon
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
263
diff
changeset
|
286 resource = Orthanc::EmbeddedResources::OPEN_SEADRAGON_HTML; |
0040ce361d4c
serving openseadragon
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
263
diff
changeset
|
287 mime = "text/html"; |
0040ce361d4c
serving openseadragon
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
263
diff
changeset
|
288 } |
0 | 289 else |
290 { | |
291 throw Orthanc::OrthancException(Orthanc::ErrorCode_UnknownResource); | |
292 } | |
293 | |
294 std::string content; | |
295 Orthanc::EmbeddedResources::GetFileResource(content, resource); | |
296 | |
156
dafbb7ebc00f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
155
diff
changeset
|
297 OrthancPluginAnswerBuffer(OrthancPlugins::GetGlobalContext(), output, content.c_str(), content.size(), mime.c_str()); |
0 | 298 } |
299 | |
300 | |
301 extern "C" | |
302 { | |
303 ORTHANC_PLUGINS_API int32_t OrthancPluginInitialize(OrthancPluginContext* context) | |
304 { | |
156
dafbb7ebc00f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
155
diff
changeset
|
305 OrthancPlugins::SetGlobalContext(context); |
0 | 306 assert(DisplayPerformanceWarning()); |
307 | |
308 /* 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
|
309 if (OrthancPluginCheckVersion(OrthancPlugins::GetGlobalContext()) == 0) |
0 | 310 { |
311 char info[1024]; | |
312 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
|
313 OrthancPlugins::GetGlobalContext()->orthancVersion, |
0 | 314 ORTHANC_PLUGINS_MINIMAL_MAJOR_NUMBER, |
315 ORTHANC_PLUGINS_MINIMAL_MINOR_NUMBER, | |
316 ORTHANC_PLUGINS_MINIMAL_REVISION_NUMBER); | |
156
dafbb7ebc00f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
155
diff
changeset
|
317 OrthancPluginLogError(OrthancPlugins::GetGlobalContext(), info); |
0 | 318 return -1; |
319 } | |
320 | |
156
dafbb7ebc00f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
155
diff
changeset
|
321 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
|
322 { |
77b76c1a213f
check the version of the Orthanc core
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
323 // 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
|
324 return -1; |
77b76c1a213f
check the version of the Orthanc core
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
325 } |
77b76c1a213f
check the version of the Orthanc core
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
326 |
206 | 327 #if ORTHANC_FRAMEWORK_VERSION_IS_ABOVE(1, 7, 2) |
191 | 328 Orthanc::Logging::InitializePluginContext(context); |
193 | 329 #else |
330 Orthanc::Logging::Initialize(context); | |
331 #endif | |
151 | 332 |
0 | 333 // Limit the number of PNG transcoders to the number of available |
334 // hardware threads (e.g. number of CPUs or cores or | |
335 // hyperthreading units) | |
153
b798d200ac90
using Semaphore from Orthanc framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
150
diff
changeset
|
336 unsigned int threads = Orthanc::SystemToolbox::GetHardwareConcurrency(); |
261 | 337 OrthancWSI::RawTile::InitializeTranscoderSemaphore(threads); |
0 | 338 |
339 char info[1024]; | |
145 | 340 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
|
341 OrthancPluginLogWarning(OrthancPlugins::GetGlobalContext(), info); |
0 | 342 |
310
d374cb2a2277
fix deprecated calls
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
309
diff
changeset
|
343 OrthancPlugins::SetDescription(ORTHANC_PLUGIN_NAME, "Provides a Web viewer of whole-slide microscopic images within Orthanc."); |
0 | 344 |
261 | 345 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
|
346 |
156
dafbb7ebc00f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
155
diff
changeset
|
347 OrthancPluginRegisterOnChangeCallback(OrthancPlugins::GetGlobalContext(), OnChangeCallback); |
0 | 348 |
156
dafbb7ebc00f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
155
diff
changeset
|
349 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
|
350 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
|
351 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
|
352 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
|
353 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
|
354 OrthancPlugins::RegisterRestCallback<ServeTile>("/wsi/tiles/([0-9a-f-]+)/([0-9-]+)/([0-9-]+)/([0-9-]+)", true); |
0 | 355 |
275
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
356 OrthancPlugins::OrthancConfiguration mainConfiguration; |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
357 |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
358 OrthancPlugins::OrthancConfiguration wsiConfiguration; |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
359 mainConfiguration.GetSection(wsiConfiguration, "WholeSlideImaging"); |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
360 |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
361 const bool enableIIIF = wsiConfiguration.GetBooleanValue("EnableIIIF", true); |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
362 bool serveMirador = false; |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
363 bool serveOpenSeadragon = false; |
263
14f182958ca7
added button to access IIIF manifest of series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
262
diff
changeset
|
364 std::string iiifPublicUrl; |
262 | 365 |
275
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
366 if (enableIIIF) |
261 | 367 { |
275
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
368 if (!wsiConfiguration.LookupStringValue(iiifPublicUrl, "OrthancPublicURL")) |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
369 { |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
370 unsigned int port = mainConfiguration.GetUnsignedIntegerValue("HttpPort", 8042); |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
371 iiifPublicUrl = "http://localhost:" + boost::lexical_cast<std::string>(port) + "/"; |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
372 } |
261 | 373 |
263
14f182958ca7
added button to access IIIF manifest of series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
262
diff
changeset
|
374 if (iiifPublicUrl.empty() || |
14f182958ca7
added button to access IIIF manifest of series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
262
diff
changeset
|
375 iiifPublicUrl[iiifPublicUrl.size() - 1] != '/') |
261 | 376 { |
263
14f182958ca7
added button to access IIIF manifest of series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
262
diff
changeset
|
377 iiifPublicUrl += "/"; |
261 | 378 } |
379 | |
275
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
380 iiifPublicUrl += "wsi/iiif/"; |
263
14f182958ca7
added button to access IIIF manifest of series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
262
diff
changeset
|
381 |
275
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
382 InitializeIIIF(iiifPublicUrl); |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
383 |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
384 serveMirador = wsiConfiguration.GetBooleanValue("ServeMirador", false); |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
385 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
|
386 |
275
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
387 bool value; |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
388 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
|
389 { |
275
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
390 SetIIIFForcePowersOfTwoScaleFactors(value); |
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 else |
270
0040ce361d4c
serving openseadragon
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
263
diff
changeset
|
393 { |
275
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
394 /** |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
395 * By default, compatibility mode is disabled. However, if |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
396 * Mirador or OSD are enabled, compatibility mode is |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
397 * automatically enabled to enhance user experience, at least |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
398 * until issue 2379 of OSD is solved: |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
399 * https://github.com/openseadragon/openseadragon/issues/2379 |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
400 **/ |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
401 SetIIIFForcePowersOfTwoScaleFactors(serveMirador || serveOpenSeadragon); |
270
0040ce361d4c
serving openseadragon
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
263
diff
changeset
|
402 } |
263
14f182958ca7
added button to access IIIF manifest of series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
262
diff
changeset
|
403 } |
275
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
404 |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
405 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
|
406 |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
407 if (serveMirador) |
263
14f182958ca7
added button to access IIIF manifest of series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
262
diff
changeset
|
408 { |
275
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
409 OrthancPlugins::RegisterRestCallback<ServeFile>("/wsi/app/(mirador.html)", true); |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
410 } |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
411 |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
412 if (serveOpenSeadragon) |
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 OrthancPlugins::RegisterRestCallback<ServeFile>("/wsi/app/(openseadragon.html)", true); |
261 | 415 } |
256
7deea131c3c0
implementation of IIIF Image API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
254
diff
changeset
|
416 |
262 | 417 { |
418 // Extend the default Orthanc Explorer with custom JavaScript for WSI | |
419 | |
420 std::string explorer; | |
421 Orthanc::EmbeddedResources::GetFileResource(explorer, Orthanc::EmbeddedResources::ORTHANC_EXPLORER); | |
422 | |
423 std::map<std::string, std::string> dictionary; | |
275
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
424 dictionary["ENABLE_IIIF"] = (enableIIIF ? "true" : "false"); |
262 | 425 dictionary["SERVE_MIRADOR"] = (serveMirador ? "true" : "false"); |
270
0040ce361d4c
serving openseadragon
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
263
diff
changeset
|
426 dictionary["SERVE_OPEN_SEADRAGON"] = (serveOpenSeadragon ? "true" : "false"); |
262 | 427 explorer = Orthanc::Toolbox::SubstituteVariables(explorer, dictionary); |
428 | |
310
d374cb2a2277
fix deprecated calls
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
309
diff
changeset
|
429 OrthancPlugins::ExtendOrthancExplorer(ORTHANC_PLUGIN_NAME, explorer); |
262 | 430 } |
0 | 431 |
432 return 0; | |
433 } | |
434 | |
435 | |
436 ORTHANC_PLUGINS_API void OrthancPluginFinalize() | |
437 { | |
261 | 438 OrthancWSI::DicomPyramidCache::FinalizeInstance(); |
439 OrthancWSI::RawTile::FinalizeTranscoderSemaphore(); | |
0 | 440 } |
441 | |
442 | |
443 ORTHANC_PLUGINS_API const char* OrthancPluginGetName() | |
444 { | |
310
d374cb2a2277
fix deprecated calls
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
309
diff
changeset
|
445 return ORTHANC_PLUGIN_NAME; |
0 | 446 } |
447 | |
448 | |
449 ORTHANC_PLUGINS_API const char* OrthancPluginGetVersion() | |
450 { | |
451 return ORTHANC_WSI_VERSION; | |
452 } | |
453 } |