Mercurial > hg > orthanc-wsi
annotate ViewerPlugin/Plugin.cpp @ 330:c42083d50ddf
Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Fri, 18 Oct 2024 13:08:55 +0200 |
parents | 8ad12abde290 |
children | cf828b381bc9 |
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 char tmp[16]; |
c42083d50ddf
Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
318
diff
changeset
|
112 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
|
113 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
|
114 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
|
115 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
|
116 } |
c42083d50ddf
Added support for DICOM tag "Recommended Absent Pixel CIELab" (0048,0015)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
318
diff
changeset
|
117 |
0 | 118 std::string s = result.toStyledString(); |
156
dafbb7ebc00f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
155
diff
changeset
|
119 OrthancPluginAnswerBuffer(OrthancPlugins::GetGlobalContext(), output, s.c_str(), s.size(), "application/json"); |
0 | 120 } |
121 | |
122 | |
123 void ServeTile(OrthancPluginRestOutput* output, | |
124 const char* url, | |
125 const OrthancPluginHttpRequest* request) | |
126 { | |
127 std::string seriesId(request->groups[0]); | |
128 int level = boost::lexical_cast<int>(request->groups[1]); | |
129 int tileY = boost::lexical_cast<int>(request->groups[3]); | |
130 int tileX = boost::lexical_cast<int>(request->groups[2]); | |
131 | |
132 char tmp[1024]; | |
133 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
|
134 OrthancPluginLogInfo(OrthancPlugins::GetGlobalContext(), tmp); |
0 | 135 |
136 if (level < 0 || | |
137 tileX < 0 || | |
138 tileY < 0) | |
139 { | |
140 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); | |
141 } | |
142 | |
143 // Retrieve the raw tile from the WSI pyramid | |
261 | 144 std::unique_ptr<OrthancWSI::RawTile> rawTile; |
0 | 145 |
146 { | |
276
ef8a673b5fb9
clarification of RawTile::Answer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
275
diff
changeset
|
147 // 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
|
148 // "Answer()" can be a costly operation. |
261 | 149 OrthancWSI::DicomPyramidCache::Locker locker(seriesId); |
276
ef8a673b5fb9
clarification of RawTile::Answer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
275
diff
changeset
|
150 |
261 | 151 rawTile.reset(new OrthancWSI::RawTile(locker.GetPyramid(), |
152 static_cast<unsigned int>(level), | |
153 static_cast<unsigned int>(tileX), | |
154 static_cast<unsigned int>(tileY))); | |
0 | 155 } |
156 | |
318
8ad12abde290
sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
312
diff
changeset
|
157 if (rawTile->IsEmpty()) |
8ad12abde290
sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
312
diff
changeset
|
158 { |
8ad12abde290
sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
312
diff
changeset
|
159 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
|
160 return; |
8ad12abde290
sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
312
diff
changeset
|
161 } |
8ad12abde290
sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
312
diff
changeset
|
162 |
277
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
163 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
|
164 |
276
ef8a673b5fb9
clarification of RawTile::Answer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
275
diff
changeset
|
165 if (rawTile->GetCompression() == OrthancWSI::ImageCompression_Jpeg) |
ef8a673b5fb9
clarification of RawTile::Answer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
275
diff
changeset
|
166 { |
ef8a673b5fb9
clarification of RawTile::Answer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
275
diff
changeset
|
167 // 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
|
168 // 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
|
169 mime = Orthanc::MimeType_Jpeg; |
276
ef8a673b5fb9
clarification of RawTile::Answer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
275
diff
changeset
|
170 } |
ef8a673b5fb9
clarification of RawTile::Answer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
275
diff
changeset
|
171 else |
ef8a673b5fb9
clarification of RawTile::Answer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
275
diff
changeset
|
172 { |
277
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
173 // 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
|
174 // 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
|
175 // 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
|
176 // 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
|
177 mime = Orthanc::MimeType_Png; |
276
ef8a673b5fb9
clarification of RawTile::Answer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
275
diff
changeset
|
178 } |
277
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
179 |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
180 // 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
|
181 // 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
|
182 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
|
183 { |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
184 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
|
185 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
|
186 |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
187 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
|
188 { |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
189 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
|
190 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
|
191 |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
192 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
|
193 |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
194 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
|
195 { |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
196 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
|
197 |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
198 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
|
199 { |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
200 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
|
201 found = true; |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
202 } |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
203 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
|
204 { |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
205 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
|
206 found = true; |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
207 } |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
208 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
|
209 { |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
210 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
|
211 found = true; |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
212 } |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
213 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
|
214 s == "image/*") |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
215 { |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
216 found = true; |
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 |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
220 if (!found) |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
221 { |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
222 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
|
223 return; |
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 |
ac1508b438b1
support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
276
diff
changeset
|
228 rawTile->Answer(output, mime); |
0 | 229 } |
230 | |
231 | |
232 OrthancPluginErrorCode OnChangeCallback(OrthancPluginChangeType changeType, | |
233 OrthancPluginResourceType resourceType, | |
234 const char *resourceId) | |
235 { | |
236 if (resourceType == OrthancPluginResourceType_Series && | |
237 changeType == OrthancPluginChangeType_NewChildInstance) | |
238 { | |
239 char tmp[1024]; | |
240 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
|
241 OrthancPluginLogInfo(OrthancPlugins::GetGlobalContext(), tmp); |
0 | 242 |
261 | 243 OrthancWSI::DicomPyramidCache::GetInstance().Invalidate(resourceId); |
0 | 244 } |
245 | |
246 return OrthancPluginErrorCode_Success; | |
247 } | |
248 | |
249 | |
250 | |
251 void ServeFile(OrthancPluginRestOutput* output, | |
252 const char* url, | |
253 const OrthancPluginHttpRequest* request) | |
254 { | |
255 Orthanc::EmbeddedResources::FileResourceId resource; | |
256 | |
257 std::string f(request->groups[0]); | |
258 std::string mime; | |
259 | |
260 if (f == "viewer.html") | |
261 { | |
262 resource = Orthanc::EmbeddedResources::VIEWER_HTML; | |
263 mime = "text/html"; | |
264 } | |
265 else if (f == "viewer.js") | |
266 { | |
267 resource = Orthanc::EmbeddedResources::VIEWER_JS; | |
268 mime = "application/javascript"; | |
269 } | |
270 else if (f == "ol.js") | |
271 { | |
272 resource = Orthanc::EmbeddedResources::OPENLAYERS_JS; | |
273 mime = "application/javascript"; | |
274 } | |
275 else if (f == "ol.css") | |
276 { | |
277 resource = Orthanc::EmbeddedResources::OPENLAYERS_CSS; | |
278 mime = "text/css"; | |
279 } | |
262 | 280 else if (f == "mirador.html") |
281 { | |
282 resource = Orthanc::EmbeddedResources::MIRADOR_HTML; | |
283 mime = "text/html"; | |
284 } | |
270
0040ce361d4c
serving openseadragon
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
263
diff
changeset
|
285 else if (f == "openseadragon.html") |
0040ce361d4c
serving openseadragon
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
263
diff
changeset
|
286 { |
0040ce361d4c
serving openseadragon
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
263
diff
changeset
|
287 resource = Orthanc::EmbeddedResources::OPEN_SEADRAGON_HTML; |
0040ce361d4c
serving openseadragon
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
263
diff
changeset
|
288 mime = "text/html"; |
0040ce361d4c
serving openseadragon
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
263
diff
changeset
|
289 } |
0 | 290 else |
291 { | |
292 throw Orthanc::OrthancException(Orthanc::ErrorCode_UnknownResource); | |
293 } | |
294 | |
295 std::string content; | |
296 Orthanc::EmbeddedResources::GetFileResource(content, resource); | |
297 | |
156
dafbb7ebc00f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
155
diff
changeset
|
298 OrthancPluginAnswerBuffer(OrthancPlugins::GetGlobalContext(), output, content.c_str(), content.size(), mime.c_str()); |
0 | 299 } |
300 | |
301 | |
302 extern "C" | |
303 { | |
304 ORTHANC_PLUGINS_API int32_t OrthancPluginInitialize(OrthancPluginContext* context) | |
305 { | |
156
dafbb7ebc00f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
155
diff
changeset
|
306 OrthancPlugins::SetGlobalContext(context); |
0 | 307 assert(DisplayPerformanceWarning()); |
308 | |
309 /* 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
|
310 if (OrthancPluginCheckVersion(OrthancPlugins::GetGlobalContext()) == 0) |
0 | 311 { |
312 char info[1024]; | |
313 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
|
314 OrthancPlugins::GetGlobalContext()->orthancVersion, |
0 | 315 ORTHANC_PLUGINS_MINIMAL_MAJOR_NUMBER, |
316 ORTHANC_PLUGINS_MINIMAL_MINOR_NUMBER, | |
317 ORTHANC_PLUGINS_MINIMAL_REVISION_NUMBER); | |
156
dafbb7ebc00f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
155
diff
changeset
|
318 OrthancPluginLogError(OrthancPlugins::GetGlobalContext(), info); |
0 | 319 return -1; |
320 } | |
321 | |
156
dafbb7ebc00f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
155
diff
changeset
|
322 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
|
323 { |
77b76c1a213f
check the version of the Orthanc core
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
324 // 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
|
325 return -1; |
77b76c1a213f
check the version of the Orthanc core
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
326 } |
77b76c1a213f
check the version of the Orthanc core
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
327 |
206 | 328 #if ORTHANC_FRAMEWORK_VERSION_IS_ABOVE(1, 7, 2) |
191 | 329 Orthanc::Logging::InitializePluginContext(context); |
193 | 330 #else |
331 Orthanc::Logging::Initialize(context); | |
332 #endif | |
151 | 333 |
0 | 334 // Limit the number of PNG transcoders to the number of available |
335 // hardware threads (e.g. number of CPUs or cores or | |
336 // hyperthreading units) | |
153
b798d200ac90
using Semaphore from Orthanc framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
150
diff
changeset
|
337 unsigned int threads = Orthanc::SystemToolbox::GetHardwareConcurrency(); |
261 | 338 OrthancWSI::RawTile::InitializeTranscoderSemaphore(threads); |
0 | 339 |
340 char info[1024]; | |
145 | 341 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
|
342 OrthancPluginLogWarning(OrthancPlugins::GetGlobalContext(), info); |
0 | 343 |
310
d374cb2a2277
fix deprecated calls
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
309
diff
changeset
|
344 OrthancPlugins::SetDescription(ORTHANC_PLUGIN_NAME, "Provides a Web viewer of whole-slide microscopic images within Orthanc."); |
0 | 345 |
261 | 346 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
|
347 |
156
dafbb7ebc00f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
155
diff
changeset
|
348 OrthancPluginRegisterOnChangeCallback(OrthancPlugins::GetGlobalContext(), OnChangeCallback); |
0 | 349 |
156
dafbb7ebc00f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
155
diff
changeset
|
350 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
|
351 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
|
352 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
|
353 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
|
354 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
|
355 OrthancPlugins::RegisterRestCallback<ServeTile>("/wsi/tiles/([0-9a-f-]+)/([0-9-]+)/([0-9-]+)/([0-9-]+)", true); |
0 | 356 |
275
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
357 OrthancPlugins::OrthancConfiguration mainConfiguration; |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
358 |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
359 OrthancPlugins::OrthancConfiguration wsiConfiguration; |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
360 mainConfiguration.GetSection(wsiConfiguration, "WholeSlideImaging"); |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
361 |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
362 const bool enableIIIF = wsiConfiguration.GetBooleanValue("EnableIIIF", true); |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
363 bool serveMirador = false; |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
364 bool serveOpenSeadragon = false; |
263
14f182958ca7
added button to access IIIF manifest of series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
262
diff
changeset
|
365 std::string iiifPublicUrl; |
262 | 366 |
275
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
367 if (enableIIIF) |
261 | 368 { |
275
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
369 if (!wsiConfiguration.LookupStringValue(iiifPublicUrl, "OrthancPublicURL")) |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
370 { |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
371 unsigned int port = mainConfiguration.GetUnsignedIntegerValue("HttpPort", 8042); |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
372 iiifPublicUrl = "http://localhost:" + boost::lexical_cast<std::string>(port) + "/"; |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
373 } |
261 | 374 |
263
14f182958ca7
added button to access IIIF manifest of series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
262
diff
changeset
|
375 if (iiifPublicUrl.empty() || |
14f182958ca7
added button to access IIIF manifest of series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
262
diff
changeset
|
376 iiifPublicUrl[iiifPublicUrl.size() - 1] != '/') |
261 | 377 { |
263
14f182958ca7
added button to access IIIF manifest of series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
262
diff
changeset
|
378 iiifPublicUrl += "/"; |
261 | 379 } |
380 | |
275
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
381 iiifPublicUrl += "wsi/iiif/"; |
263
14f182958ca7
added button to access IIIF manifest of series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
262
diff
changeset
|
382 |
275
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
383 InitializeIIIF(iiifPublicUrl); |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
384 |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
385 serveMirador = wsiConfiguration.GetBooleanValue("ServeMirador", false); |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
386 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
|
387 |
275
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
388 bool value; |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
389 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
|
390 { |
275
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
391 SetIIIFForcePowersOfTwoScaleFactors(value); |
263
14f182958ca7
added button to access IIIF manifest of series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
262
diff
changeset
|
392 } |
275
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
393 else |
270
0040ce361d4c
serving openseadragon
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
263
diff
changeset
|
394 { |
275
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
395 /** |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
396 * By default, compatibility mode is disabled. However, if |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
397 * Mirador or OSD are enabled, compatibility mode is |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
398 * automatically enabled to enhance user experience, at least |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
399 * until issue 2379 of OSD is solved: |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
400 * https://github.com/openseadragon/openseadragon/issues/2379 |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
401 **/ |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
402 SetIIIFForcePowersOfTwoScaleFactors(serveMirador || serveOpenSeadragon); |
270
0040ce361d4c
serving openseadragon
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
263
diff
changeset
|
403 } |
263
14f182958ca7
added button to access IIIF manifest of series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
262
diff
changeset
|
404 } |
275
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
405 |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
406 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
|
407 |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
408 if (serveMirador) |
263
14f182958ca7
added button to access IIIF manifest of series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
262
diff
changeset
|
409 { |
275
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
410 OrthancPlugins::RegisterRestCallback<ServeFile>("/wsi/app/(mirador.html)", true); |
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 |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
413 if (serveOpenSeadragon) |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
414 { |
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
415 OrthancPlugins::RegisterRestCallback<ServeFile>("/wsi/app/(openseadragon.html)", true); |
261 | 416 } |
256
7deea131c3c0
implementation of IIIF Image API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
254
diff
changeset
|
417 |
262 | 418 { |
419 // Extend the default Orthanc Explorer with custom JavaScript for WSI | |
420 | |
421 std::string explorer; | |
422 Orthanc::EmbeddedResources::GetFileResource(explorer, Orthanc::EmbeddedResources::ORTHANC_EXPLORER); | |
423 | |
424 std::map<std::string, std::string> dictionary; | |
275
801790c81f20
configuration options of IIIF
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
274
diff
changeset
|
425 dictionary["ENABLE_IIIF"] = (enableIIIF ? "true" : "false"); |
262 | 426 dictionary["SERVE_MIRADOR"] = (serveMirador ? "true" : "false"); |
270
0040ce361d4c
serving openseadragon
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
263
diff
changeset
|
427 dictionary["SERVE_OPEN_SEADRAGON"] = (serveOpenSeadragon ? "true" : "false"); |
262 | 428 explorer = Orthanc::Toolbox::SubstituteVariables(explorer, dictionary); |
429 | |
310
d374cb2a2277
fix deprecated calls
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
309
diff
changeset
|
430 OrthancPlugins::ExtendOrthancExplorer(ORTHANC_PLUGIN_NAME, explorer); |
262 | 431 } |
0 | 432 |
433 return 0; | |
434 } | |
435 | |
436 | |
437 ORTHANC_PLUGINS_API void OrthancPluginFinalize() | |
438 { | |
261 | 439 OrthancWSI::DicomPyramidCache::FinalizeInstance(); |
440 OrthancWSI::RawTile::FinalizeTranscoderSemaphore(); | |
0 | 441 } |
442 | |
443 | |
444 ORTHANC_PLUGINS_API const char* OrthancPluginGetName() | |
445 { | |
310
d374cb2a2277
fix deprecated calls
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
309
diff
changeset
|
446 return ORTHANC_PLUGIN_NAME; |
0 | 447 } |
448 | |
449 | |
450 ORTHANC_PLUGINS_API const char* OrthancPluginGetVersion() | |
451 { | |
452 return ORTHANC_WSI_VERSION; | |
453 } | |
454 } |