Mercurial > hg > orthanc
comparison Plugins/Engine/OrthancPlugins.cpp @ 1843:d10a8164da5f
ensure images returned to plugins are writable
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Mon, 30 Nov 2015 13:50:21 +0100 |
parents | 697ae8d0e287 |
children | 559956d5ceb2 |
comparison
equal
deleted
inserted
replaced
1842:697ae8d0e287 | 1843:d10a8164da5f |
---|---|
1261 | 1261 |
1262 CopyToMemoryBuffer(*p.target, result); | 1262 CopyToMemoryBuffer(*p.target, result); |
1263 } | 1263 } |
1264 | 1264 |
1265 | 1265 |
1266 static OrthancPluginImage* ReturnImage(std::auto_ptr<ImageAccessor>& image) | |
1267 { | |
1268 // Images returned to plugins are assumed to be writeable. If the | |
1269 // input image is read-only, we return a copy so that it can be modified. | |
1270 | |
1271 if (image->IsReadOnly()) | |
1272 { | |
1273 std::auto_ptr<Image> copy(new Image(image->GetFormat(), image->GetWidth(), image->GetHeight())); | |
1274 ImageProcessing::Copy(*copy, *image); | |
1275 image.reset(NULL); | |
1276 return reinterpret_cast<OrthancPluginImage*>(copy.release()); | |
1277 } | |
1278 else | |
1279 { | |
1280 return reinterpret_cast<OrthancPluginImage*>(image.release()); | |
1281 } | |
1282 } | |
1283 | |
1284 | |
1266 void OrthancPlugins::UncompressImage(const void* parameters) | 1285 void OrthancPlugins::UncompressImage(const void* parameters) |
1267 { | 1286 { |
1268 const _OrthancPluginUncompressImage& p = *reinterpret_cast<const _OrthancPluginUncompressImage*>(parameters); | 1287 const _OrthancPluginUncompressImage& p = *reinterpret_cast<const _OrthancPluginUncompressImage*>(parameters); |
1269 | 1288 |
1270 std::auto_ptr<ImageAccessor> image; | 1289 std::auto_ptr<ImageAccessor> image; |
1294 | 1313 |
1295 default: | 1314 default: |
1296 throw OrthancException(ErrorCode_ParameterOutOfRange); | 1315 throw OrthancException(ErrorCode_ParameterOutOfRange); |
1297 } | 1316 } |
1298 | 1317 |
1299 *(p.target) = reinterpret_cast<OrthancPluginImage*>(image.release()); | 1318 *(p.target) = ReturnImage(image); |
1300 } | 1319 } |
1301 | 1320 |
1302 | 1321 |
1303 void OrthancPlugins::CompressImage(const void* parameters) | 1322 void OrthancPlugins::CompressImage(const void* parameters) |
1304 { | 1323 { |
1384 const ImageAccessor& source = *reinterpret_cast<const ImageAccessor*>(p.source); | 1403 const ImageAccessor& source = *reinterpret_cast<const ImageAccessor*>(p.source); |
1385 | 1404 |
1386 std::auto_ptr<ImageAccessor> target(new Image(Plugins::Convert(p.targetFormat), source.GetWidth(), source.GetHeight())); | 1405 std::auto_ptr<ImageAccessor> target(new Image(Plugins::Convert(p.targetFormat), source.GetWidth(), source.GetHeight())); |
1387 ImageProcessing::Convert(*target, source); | 1406 ImageProcessing::Convert(*target, source); |
1388 | 1407 |
1389 *(p.target) = reinterpret_cast<OrthancPluginImage*>(target.release()); | 1408 *(p.target) = ReturnImage(target); |
1390 } | 1409 } |
1391 | 1410 |
1392 | 1411 |
1393 | 1412 |
1394 void OrthancPlugins::GetFontInfo(const void* parameters) | 1413 void OrthancPlugins::GetFontInfo(const void* parameters) |
1548 | 1567 |
1549 default: | 1568 default: |
1550 throw OrthancException(ErrorCode_InternalError); | 1569 throw OrthancException(ErrorCode_InternalError); |
1551 } | 1570 } |
1552 | 1571 |
1553 *(p.target) = reinterpret_cast<OrthancPluginImage*>(result.release()); | 1572 *(p.target) = ReturnImage(result); |
1554 } | 1573 } |
1555 | 1574 |
1556 | 1575 |
1557 void OrthancPlugins::DatabaseAnswer(const void* parameters) | 1576 void OrthancPlugins::DatabaseAnswer(const void* parameters) |
1558 { | 1577 { |
1962 } | 1981 } |
1963 | 1982 |
1964 case _OrthancPluginService_GetImageBuffer: | 1983 case _OrthancPluginService_GetImageBuffer: |
1965 { | 1984 { |
1966 const _OrthancPluginGetImageInfo& p = *reinterpret_cast<const _OrthancPluginGetImageInfo*>(parameters); | 1985 const _OrthancPluginGetImageInfo& p = *reinterpret_cast<const _OrthancPluginGetImageInfo*>(parameters); |
1967 const ImageAccessor& image = reinterpret_cast<const ImageAccessor&>(p.image); | 1986 *(p.resultBuffer) = reinterpret_cast<const ImageAccessor*>(p.image)->GetBuffer(); |
1968 | |
1969 if (image.IsReadOnly()) | |
1970 { | |
1971 throw OrthancException(ErrorCode_ReadOnly); | |
1972 } | |
1973 | |
1974 *(p.resultBuffer) = image.GetBuffer(); | |
1975 return true; | 1987 return true; |
1976 } | 1988 } |
1977 | 1989 |
1978 case _OrthancPluginService_FreeImage: | 1990 case _OrthancPluginService_FreeImage: |
1979 { | 1991 { |
2291 pluginImage != NULL) | 2303 pluginImage != NULL) |
2292 { | 2304 { |
2293 return reinterpret_cast<ImageAccessor*>(pluginImage); | 2305 return reinterpret_cast<ImageAccessor*>(pluginImage); |
2294 } | 2306 } |
2295 | 2307 |
2296 LOG(WARNING) << "The custom image decoder cannot handle an image, trying with the built-in decoder"; | 2308 LOG(WARNING) << "The custom image decoder cannot handle an image, fallback to the built-in decoder"; |
2297 } | 2309 } |
2298 } | 2310 } |
2299 | 2311 |
2300 DicomImageDecoder defaultDecoder; | 2312 DicomImageDecoder defaultDecoder; |
2301 return defaultDecoder.Decode(dicom, frame); | 2313 return defaultDecoder.Decode(dicom, frame); |