Mercurial > hg > orthanc-stone
diff Framework/Radiography/RadiographyScene.cpp @ 1279:7ec8fea061b9 broker
integration mainline->broker
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Tue, 04 Feb 2020 15:20:08 +0100 |
parents | 0ca50d275b9a 398ea4259e65 |
children | 6ab03e429f06 |
line wrap: on
line diff
--- a/Framework/Radiography/RadiographyScene.cpp Fri Jan 31 17:34:57 2020 +0100 +++ b/Framework/Radiography/RadiographyScene.cpp Tue Feb 04 15:20:08 2020 +0100 @@ -125,6 +125,17 @@ } } + void RadiographyScene::_RegisterLayer(RadiographyLayer* layer) + { + std::auto_ptr<RadiographyLayer> raii(layer); + + // LOG(INFO) << "Registering layer: " << countLayers_; + + size_t index = nextLayerIndex_++; + raii->SetIndex(index); + layers_[index] = raii.release(); + } + RadiographyLayer& RadiographyScene::RegisterLayer(RadiographyLayer* layer) { if (layer == NULL) @@ -132,11 +143,7 @@ throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); } - std::auto_ptr<RadiographyLayer> raii(layer); - - size_t index = nextLayerIndex_++; - raii->SetIndex(index); - layers_[index] = raii.release(); + _RegisterLayer(layer); BroadcastMessage(GeometryChangedMessage(*this, *layer)); BroadcastMessage(ContentChangedMessage(*this, *layer)); @@ -221,6 +228,8 @@ LOG(INFO) << "Removing layer, there are now : " << layers_.size() << " layers"; + _OnLayerRemoved(); + BroadcastMessage(RadiographyScene::LayerRemovedMessage(*this, layerIndex)); } } @@ -556,11 +565,24 @@ // Render layers in the background-to-foreground order for (size_t index = 0; index < nextLayerIndex_; index++) { - Layers::const_iterator it = layers_.find(index); - if (it != layers_.end()) + try { - assert(it->second != NULL); - it->second->Render(buffer, viewTransform, interpolation, windowingCenter_, windowingWidth_, applyWindowing); + Layers::const_iterator it = layers_.find(index); + if (it != layers_.end()) + { + assert(it->second != NULL); + it->second->Render(buffer, viewTransform, interpolation, windowingCenter_, windowingWidth_, applyWindowing); + } + } + catch (Orthanc::OrthancException& ex) + { + LOG(ERROR) << "RadiographyScene::Render: " << index << ", OrthancException: " << ex.GetDetails(); + throw ex; // rethrow because we want it to crash to see there's a problem ! + } + catch (...) + { + LOG(ERROR) << "RadiographyScene::Render: " << index << ", unkown exception: "; + throw; // rethrow because we want it to crash to see there's a problem ! } } } @@ -637,6 +659,28 @@ } } + void RadiographyScene::ExtractLayerFromRenderedScene(Orthanc::ImageAccessor& layer, + const Orthanc::ImageAccessor& renderedScene, + size_t layerIndex, + ImageInterpolation interpolation) + { + Extent2D sceneExtent = GetSceneExtent(); + + double pixelSpacingX = sceneExtent.GetWidth() / renderedScene.GetWidth(); + double pixelSpacingY = sceneExtent.GetHeight() / renderedScene.GetHeight(); + + AffineTransform2D view = AffineTransform2D::Combine( + AffineTransform2D::CreateScaling(1.0 / pixelSpacingX, 1.0 / pixelSpacingY), + AffineTransform2D::CreateOffset(-sceneExtent.GetX1(), -sceneExtent.GetY1())); + + AffineTransform2D layerToSceneTransform = AffineTransform2D::Combine( + view, + GetLayer(layerIndex).GetTransform()); + + AffineTransform2D sceneToLayerTransform = AffineTransform2D::Invert(layerToSceneTransform); + sceneToLayerTransform.Apply(layer, renderedScene, interpolation, false); + } + Orthanc::Image* RadiographyScene::ExportToImage(double pixelSpacingX, double pixelSpacingY, ImageInterpolation interpolation, @@ -669,7 +713,14 @@ AffineTransform2D::CreateOffset(-extent.GetX1(), -extent.GetY1())); // wipe background before rendering - Orthanc::ImageProcessing::Set(layers, 0); + if (GetPreferredPhotomotricDisplayMode() == RadiographyPhotometricDisplayMode_Monochrome1) + { + Orthanc::ImageProcessing::Set(layers, 65535.0f); + } + else + { + Orthanc::ImageProcessing::Set(layers, 0); + } Render(layers, view, interpolation, applyWindowing);