annotate Framework/SmartLoader.cpp @ 381:19bd222283ae

uncoupling LayerReadyMessage from the creation of the renderer
author Sebastien Jodogne <s.jodogne@gmail.com>
date Tue, 06 Nov 2018 15:36:06 +0100
parents ba5ad93f935a
children 20f149669c1f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
260
am@osimis.io
parents:
diff changeset
1 /**
am@osimis.io
parents:
diff changeset
2 * Stone of Orthanc
am@osimis.io
parents:
diff changeset
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics
am@osimis.io
parents:
diff changeset
4 * Department, University Hospital of Liege, Belgium
am@osimis.io
parents:
diff changeset
5 * Copyright (C) 2017-2018 Osimis S.A., Belgium
am@osimis.io
parents:
diff changeset
6 *
am@osimis.io
parents:
diff changeset
7 * This program is free software: you can redistribute it and/or
am@osimis.io
parents:
diff changeset
8 * modify it under the terms of the GNU Affero General Public License
am@osimis.io
parents:
diff changeset
9 * as published by the Free Software Foundation, either version 3 of
am@osimis.io
parents:
diff changeset
10 * the License, or (at your option) any later version.
am@osimis.io
parents:
diff changeset
11 *
am@osimis.io
parents:
diff changeset
12 * This program is distributed in the hope that it will be useful, but
am@osimis.io
parents:
diff changeset
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
am@osimis.io
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
am@osimis.io
parents:
diff changeset
15 * Affero General Public License for more details.
am@osimis.io
parents:
diff changeset
16 *
am@osimis.io
parents:
diff changeset
17 * You should have received a copy of the GNU Affero General Public License
am@osimis.io
parents:
diff changeset
18 * along with this program. If not, see <http://www.gnu.org/licenses/>.
am@osimis.io
parents:
diff changeset
19 **/
am@osimis.io
parents:
diff changeset
20
am@osimis.io
parents:
diff changeset
21
am@osimis.io
parents:
diff changeset
22 #include "SmartLoader.h"
am@osimis.io
parents:
diff changeset
23 #include "Layers/OrthancFrameLayerSource.h"
300
b4abaeb783b1 messaging refactoring almost complete: works fine in native
am@osimis.io
parents: 299
diff changeset
24 #include "Messages/MessageForwarder.h"
318
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
25 #include "Core/Images/Image.h"
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
26 #include "Framework/Widgets/LayerWidget.h"
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
27 #include "Framework/StoneException.h"
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
28 #include "Framework/Layers/FrameRenderer.h"
330
7a364e44fbb4 renamed SetDefaultView in FitContent
am@osimis.io
parents: 322
diff changeset
29 #include "Core/Logging.h"
260
am@osimis.io
parents:
diff changeset
30
am@osimis.io
parents:
diff changeset
31 namespace OrthancStone
am@osimis.io
parents:
diff changeset
32 {
334
c34784e5f299 compatibility fixes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 330
diff changeset
33 enum CachedSliceStatus
c34784e5f299 compatibility fixes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 330
diff changeset
34 {
c34784e5f299 compatibility fixes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 330
diff changeset
35 CachedSliceStatus_ScheduledToLoad,
c34784e5f299 compatibility fixes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 330
diff changeset
36 CachedSliceStatus_GeometryLoaded,
c34784e5f299 compatibility fixes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 330
diff changeset
37 CachedSliceStatus_ImageLoaded
c34784e5f299 compatibility fixes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 330
diff changeset
38 };
318
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
39
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
40 class SmartLoader::CachedSlice : public LayerSourceBase
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
41 {
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
42 public:
381
19bd222283ae uncoupling LayerReadyMessage from the creation of the renderer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 380
diff changeset
43 class RendererFactory : public LayerReadyMessage::IRendererFactory
19bd222283ae uncoupling LayerReadyMessage from the creation of the renderer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 380
diff changeset
44 {
19bd222283ae uncoupling LayerReadyMessage from the creation of the renderer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 380
diff changeset
45 private:
19bd222283ae uncoupling LayerReadyMessage from the creation of the renderer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 380
diff changeset
46 const CachedSlice& that_;
19bd222283ae uncoupling LayerReadyMessage from the creation of the renderer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 380
diff changeset
47
19bd222283ae uncoupling LayerReadyMessage from the creation of the renderer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 380
diff changeset
48 public:
19bd222283ae uncoupling LayerReadyMessage from the creation of the renderer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 380
diff changeset
49 RendererFactory(const CachedSlice& that) :
19bd222283ae uncoupling LayerReadyMessage from the creation of the renderer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 380
diff changeset
50 that_(that)
19bd222283ae uncoupling LayerReadyMessage from the creation of the renderer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 380
diff changeset
51 {
19bd222283ae uncoupling LayerReadyMessage from the creation of the renderer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 380
diff changeset
52 }
19bd222283ae uncoupling LayerReadyMessage from the creation of the renderer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 380
diff changeset
53
19bd222283ae uncoupling LayerReadyMessage from the creation of the renderer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 380
diff changeset
54 virtual ILayerRenderer* CreateRenderer() const
19bd222283ae uncoupling LayerReadyMessage from the creation of the renderer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 380
diff changeset
55 {
19bd222283ae uncoupling LayerReadyMessage from the creation of the renderer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 380
diff changeset
56 bool isFull = (that_.effectiveQuality_ == SliceImageQuality_FullPng ||
19bd222283ae uncoupling LayerReadyMessage from the creation of the renderer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 380
diff changeset
57 that_.effectiveQuality_ == SliceImageQuality_FullPam);
19bd222283ae uncoupling LayerReadyMessage from the creation of the renderer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 380
diff changeset
58
19bd222283ae uncoupling LayerReadyMessage from the creation of the renderer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 380
diff changeset
59 return FrameRenderer::CreateRenderer(*that_.image_, *that_.slice_, isFull);
19bd222283ae uncoupling LayerReadyMessage from the creation of the renderer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 380
diff changeset
60 }
19bd222283ae uncoupling LayerReadyMessage from the creation of the renderer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 380
diff changeset
61 };
19bd222283ae uncoupling LayerReadyMessage from the creation of the renderer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 380
diff changeset
62
318
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
63 unsigned int sliceIndex_;
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
64 std::auto_ptr<Slice> slice_;
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
65 boost::shared_ptr<Orthanc::ImageAccessor> image_;
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
66 SliceImageQuality effectiveQuality_;
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
67 CachedSliceStatus status_;
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
68
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
69 public:
334
c34784e5f299 compatibility fixes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 330
diff changeset
70 CachedSlice(MessageBroker& broker) :
c34784e5f299 compatibility fixes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 330
diff changeset
71 LayerSourceBase(broker)
c34784e5f299 compatibility fixes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 330
diff changeset
72 {
c34784e5f299 compatibility fixes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 330
diff changeset
73 }
318
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
74
334
c34784e5f299 compatibility fixes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 330
diff changeset
75 virtual ~CachedSlice()
c34784e5f299 compatibility fixes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 330
diff changeset
76 {
c34784e5f299 compatibility fixes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 330
diff changeset
77 }
318
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
78
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
79 virtual bool GetExtent(std::vector<Vector>& points,
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
80 const CoordinateSystem3D& viewportSlice)
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
81 {
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
82 // TODO: viewportSlice is not used !!!!
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
83 slice_->GetExtent(points);
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
84 return true;
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
85 }
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
86
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
87 virtual void ScheduleLayerCreation(const CoordinateSystem3D& viewportSlice)
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
88 {
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
89 // TODO: viewportSlice is not used !!!!
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
90
330
7a364e44fbb4 renamed SetDefaultView in FitContent
am@osimis.io
parents: 322
diff changeset
91 // it has already been loaded -> trigger the "layer ready" message immediately otherwise, do nothing now. The LayerReady will be triggered
7a364e44fbb4 renamed SetDefaultView in FitContent
am@osimis.io
parents: 322
diff changeset
92 // once the LayerSource is ready
7a364e44fbb4 renamed SetDefaultView in FitContent
am@osimis.io
parents: 322
diff changeset
93 if (status_ == CachedSliceStatus_ImageLoaded)
7a364e44fbb4 renamed SetDefaultView in FitContent
am@osimis.io
parents: 322
diff changeset
94 {
7a364e44fbb4 renamed SetDefaultView in FitContent
am@osimis.io
parents: 322
diff changeset
95 LOG(WARNING) << "ScheduleLayerCreation for CachedSlice (image is loaded): " << slice_->GetOrthancInstanceId();
381
19bd222283ae uncoupling LayerReadyMessage from the creation of the renderer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 380
diff changeset
96
19bd222283ae uncoupling LayerReadyMessage from the creation of the renderer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 380
diff changeset
97 RendererFactory factory(*this);
19bd222283ae uncoupling LayerReadyMessage from the creation of the renderer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 380
diff changeset
98 LayerSourceBase::NotifyLayerReady(factory, slice_->GetGeometry());
330
7a364e44fbb4 renamed SetDefaultView in FitContent
am@osimis.io
parents: 322
diff changeset
99 }
7a364e44fbb4 renamed SetDefaultView in FitContent
am@osimis.io
parents: 322
diff changeset
100 else
7a364e44fbb4 renamed SetDefaultView in FitContent
am@osimis.io
parents: 322
diff changeset
101 {
7a364e44fbb4 renamed SetDefaultView in FitContent
am@osimis.io
parents: 322
diff changeset
102 LOG(WARNING) << "ScheduleLayerCreation for CachedSlice (image is not loaded yet): " << slice_->GetOrthancInstanceId();
7a364e44fbb4 renamed SetDefaultView in FitContent
am@osimis.io
parents: 322
diff changeset
103 }
318
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
104 }
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
105
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
106 CachedSlice* Clone() const
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
107 {
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
108 CachedSlice* output = new CachedSlice(broker_);
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
109 output->sliceIndex_ = sliceIndex_;
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
110 output->slice_.reset(slice_->Clone());
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
111 output->image_ = image_;
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
112 output->effectiveQuality_ = effectiveQuality_;
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
113 output->status_ = status_;
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
114
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
115 return output;
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
116 }
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
117
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
118 };
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
119
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
120
334
c34784e5f299 compatibility fixes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 330
diff changeset
121 SmartLoader::SmartLoader(MessageBroker& broker,
c34784e5f299 compatibility fixes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 330
diff changeset
122 OrthancApiClient& orthancApiClient) :
260
am@osimis.io
parents:
diff changeset
123 IObservable(broker),
am@osimis.io
parents:
diff changeset
124 IObserver(broker),
am@osimis.io
parents:
diff changeset
125 imageQuality_(SliceImageQuality_FullPam),
317
b66d13708f40 cleanup
am@osimis.io
parents: 300
diff changeset
126 orthancApiClient_(orthancApiClient)
267
89d02de83c03 added declaretion of messages handled/emitted
am@osimis.io
parents: 266
diff changeset
127 {
260
am@osimis.io
parents:
diff changeset
128 }
am@osimis.io
parents:
diff changeset
129
334
c34784e5f299 compatibility fixes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 330
diff changeset
130 void SmartLoader::SetFrameInWidget(LayerWidget& layerWidget,
c34784e5f299 compatibility fixes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 330
diff changeset
131 size_t layerIndex,
c34784e5f299 compatibility fixes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 330
diff changeset
132 const std::string& instanceId,
c34784e5f299 compatibility fixes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 330
diff changeset
133 unsigned int frame)
260
am@osimis.io
parents:
diff changeset
134 {
262
77fdab5b5d6e cleanup + todos
am@osimis.io
parents: 260
diff changeset
135 // TODO: check if this frame has already been loaded or is already being loaded.
77fdab5b5d6e cleanup + todos
am@osimis.io
parents: 260
diff changeset
136 // - if already loaded: create a "clone" that will emit the GeometryReady/ImageReady messages "immediately"
77fdab5b5d6e cleanup + todos
am@osimis.io
parents: 260
diff changeset
137 // (it can not be immediate because Observers needs to register first and this is done after this method returns)
77fdab5b5d6e cleanup + todos
am@osimis.io
parents: 260
diff changeset
138 // - if currently loading, we need to return an object that will observe the existing LayerSource and forward
77fdab5b5d6e cleanup + todos
am@osimis.io
parents: 260
diff changeset
139 // the messages to its observables
77fdab5b5d6e cleanup + todos
am@osimis.io
parents: 260
diff changeset
140 // in both cases, we must be carefull about objects lifecycle !!!
318
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
141
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
142 std::auto_ptr<ILayerSource> layerSource;
334
c34784e5f299 compatibility fixes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 330
diff changeset
143 std::string sliceKeyId = instanceId + ":" + boost::lexical_cast<std::string>(frame);
330
7a364e44fbb4 renamed SetDefaultView in FitContent
am@osimis.io
parents: 322
diff changeset
144 SmartLoader::CachedSlice* cachedSlice = NULL;
318
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
145
322
a902a07769d4 wip: preload slice
am@osimis.io
parents: 318
diff changeset
146 if (cachedSlices_.find(sliceKeyId) != cachedSlices_.end()) // && cachedSlices_[sliceKeyId]->status_ == CachedSliceStatus_Loaded)
318
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
147 {
322
a902a07769d4 wip: preload slice
am@osimis.io
parents: 318
diff changeset
148 layerSource.reset(cachedSlices_[sliceKeyId]->Clone());
330
7a364e44fbb4 renamed SetDefaultView in FitContent
am@osimis.io
parents: 322
diff changeset
149 cachedSlice = dynamic_cast<SmartLoader::CachedSlice*>(layerSource.get());
318
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
150 }
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
151 else
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
152 {
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
153 layerSource.reset(new OrthancFrameLayerSource(IObserver::broker_, orthancApiClient_));
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
154 dynamic_cast<OrthancFrameLayerSource*>(layerSource.get())->SetImageQuality(imageQuality_);
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
155 layerSource->RegisterObserverCallback(new Callable<SmartLoader, ILayerSource::GeometryReadyMessage>(*this, &SmartLoader::OnLayerGeometryReady));
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
156 layerSource->RegisterObserverCallback(new Callable<SmartLoader, ILayerSource::ImageReadyMessage>(*this, &SmartLoader::OnImageReady));
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
157 layerSource->RegisterObserverCallback(new Callable<SmartLoader, ILayerSource::LayerReadyMessage>(*this, &SmartLoader::OnLayerReady));
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
158 dynamic_cast<OrthancFrameLayerSource*>(layerSource.get())->LoadFrame(instanceId, frame);
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
159 }
260
am@osimis.io
parents:
diff changeset
160
318
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
161 // make sure that the widget registers the events before we trigger them
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
162 if (layerWidget.GetLayerCount() == layerIndex)
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
163 {
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
164 layerWidget.AddLayer(layerSource.release());
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
165 }
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
166 else if (layerWidget.GetLayerCount() > layerIndex)
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
167 {
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
168 layerWidget.ReplaceLayer(layerIndex, layerSource.release());
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
169 }
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
170 else
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
171 {
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
172 throw StoneException(ErrorCode_CanOnlyAddOneLayerAtATime);
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
173 }
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
174
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
175 if (cachedSlice != NULL)
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
176 {
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
177 cachedSlice->NotifyGeometryReady();
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
178 }
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
179
260
am@osimis.io
parents:
diff changeset
180 }
am@osimis.io
parents:
diff changeset
181
334
c34784e5f299 compatibility fixes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 330
diff changeset
182 void SmartLoader::PreloadSlice(const std::string instanceId,
c34784e5f299 compatibility fixes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 330
diff changeset
183 unsigned int frame)
322
a902a07769d4 wip: preload slice
am@osimis.io
parents: 318
diff changeset
184 {
330
7a364e44fbb4 renamed SetDefaultView in FitContent
am@osimis.io
parents: 322
diff changeset
185 // TODO: reactivate -> need to be able to ScheduleLayerLoading in ILayerSource without calling ScheduleLayerCreation
7a364e44fbb4 renamed SetDefaultView in FitContent
am@osimis.io
parents: 322
diff changeset
186 return;
322
a902a07769d4 wip: preload slice
am@osimis.io
parents: 318
diff changeset
187 // TODO: check if it is already in the cache
318
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
188
330
7a364e44fbb4 renamed SetDefaultView in FitContent
am@osimis.io
parents: 322
diff changeset
189
7a364e44fbb4 renamed SetDefaultView in FitContent
am@osimis.io
parents: 322
diff changeset
190
322
a902a07769d4 wip: preload slice
am@osimis.io
parents: 318
diff changeset
191 // create the slice in the cache with "empty" data
a902a07769d4 wip: preload slice
am@osimis.io
parents: 318
diff changeset
192 boost::shared_ptr<CachedSlice> cachedSlice(new CachedSlice(IObserver::broker_));
a902a07769d4 wip: preload slice
am@osimis.io
parents: 318
diff changeset
193 cachedSlice->slice_.reset(new Slice(instanceId, frame));
a902a07769d4 wip: preload slice
am@osimis.io
parents: 318
diff changeset
194 cachedSlice->status_ = CachedSliceStatus_ScheduledToLoad;
334
c34784e5f299 compatibility fixes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 330
diff changeset
195 std::string sliceKeyId = instanceId + ":" + boost::lexical_cast<std::string>(frame);
322
a902a07769d4 wip: preload slice
am@osimis.io
parents: 318
diff changeset
196
330
7a364e44fbb4 renamed SetDefaultView in FitContent
am@osimis.io
parents: 322
diff changeset
197 LOG(WARNING) << "Will preload: " << sliceKeyId;
7a364e44fbb4 renamed SetDefaultView in FitContent
am@osimis.io
parents: 322
diff changeset
198
322
a902a07769d4 wip: preload slice
am@osimis.io
parents: 318
diff changeset
199 cachedSlices_[sliceKeyId] = boost::shared_ptr<CachedSlice>(cachedSlice);
a902a07769d4 wip: preload slice
am@osimis.io
parents: 318
diff changeset
200
a902a07769d4 wip: preload slice
am@osimis.io
parents: 318
diff changeset
201 std::auto_ptr<ILayerSource> layerSource(new OrthancFrameLayerSource(IObserver::broker_, orthancApiClient_));
a902a07769d4 wip: preload slice
am@osimis.io
parents: 318
diff changeset
202
a902a07769d4 wip: preload slice
am@osimis.io
parents: 318
diff changeset
203 dynamic_cast<OrthancFrameLayerSource*>(layerSource.get())->SetImageQuality(imageQuality_);
a902a07769d4 wip: preload slice
am@osimis.io
parents: 318
diff changeset
204 layerSource->RegisterObserverCallback(new Callable<SmartLoader, ILayerSource::GeometryReadyMessage>(*this, &SmartLoader::OnLayerGeometryReady));
a902a07769d4 wip: preload slice
am@osimis.io
parents: 318
diff changeset
205 layerSource->RegisterObserverCallback(new Callable<SmartLoader, ILayerSource::ImageReadyMessage>(*this, &SmartLoader::OnImageReady));
a902a07769d4 wip: preload slice
am@osimis.io
parents: 318
diff changeset
206 layerSource->RegisterObserverCallback(new Callable<SmartLoader, ILayerSource::LayerReadyMessage>(*this, &SmartLoader::OnLayerReady));
a902a07769d4 wip: preload slice
am@osimis.io
parents: 318
diff changeset
207 dynamic_cast<OrthancFrameLayerSource*>(layerSource.get())->LoadFrame(instanceId, frame);
a902a07769d4 wip: preload slice
am@osimis.io
parents: 318
diff changeset
208
a902a07769d4 wip: preload slice
am@osimis.io
parents: 318
diff changeset
209 // keep a ref to the LayerSource until the slice is fully loaded and saved to cache
a902a07769d4 wip: preload slice
am@osimis.io
parents: 318
diff changeset
210 preloadingInstances_[sliceKeyId] = boost::shared_ptr<ILayerSource>(layerSource.release());
270
2d64f4d39610 backup (work in progress)
am@osimis.io
parents: 268
diff changeset
211 }
260
am@osimis.io
parents:
diff changeset
212
266
c9cf95b49a86 removed OrthancSlicesLoader::ISliceLoaderObserver; now using standard messages instead
am@osimis.io
parents: 262
diff changeset
213
322
a902a07769d4 wip: preload slice
am@osimis.io
parents: 318
diff changeset
214 // void PreloadStudy(const std::string studyId)
a902a07769d4 wip: preload slice
am@osimis.io
parents: 318
diff changeset
215 // {
a902a07769d4 wip: preload slice
am@osimis.io
parents: 318
diff changeset
216 // /* TODO */
a902a07769d4 wip: preload slice
am@osimis.io
parents: 318
diff changeset
217 // }
a902a07769d4 wip: preload slice
am@osimis.io
parents: 318
diff changeset
218
a902a07769d4 wip: preload slice
am@osimis.io
parents: 318
diff changeset
219 // void PreloadSeries(const std::string seriesId)
a902a07769d4 wip: preload slice
am@osimis.io
parents: 318
diff changeset
220 // {
a902a07769d4 wip: preload slice
am@osimis.io
parents: 318
diff changeset
221 // /* TODO */
a902a07769d4 wip: preload slice
am@osimis.io
parents: 318
diff changeset
222 // }
266
c9cf95b49a86 removed OrthancSlicesLoader::ISliceLoaderObserver; now using standard messages instead
am@osimis.io
parents: 262
diff changeset
223
c9cf95b49a86 removed OrthancSlicesLoader::ISliceLoaderObserver; now using standard messages instead
am@osimis.io
parents: 262
diff changeset
224
318
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
225 void SmartLoader::OnLayerGeometryReady(const ILayerSource::GeometryReadyMessage& message)
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
226 {
377
8eb4fe74000f refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 334
diff changeset
227 OrthancFrameLayerSource& source = dynamic_cast<OrthancFrameLayerSource&>(message.GetOrigin());
322
a902a07769d4 wip: preload slice
am@osimis.io
parents: 318
diff changeset
228
a902a07769d4 wip: preload slice
am@osimis.io
parents: 318
diff changeset
229 // save/replace the slice in cache
318
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
230 const Slice& slice = source.GetSlice(0); // TODO handle GetSliceCount()
334
c34784e5f299 compatibility fixes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 330
diff changeset
231 std::string sliceKeyId = (slice.GetOrthancInstanceId() + ":" +
c34784e5f299 compatibility fixes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 330
diff changeset
232 boost::lexical_cast<std::string>(slice.GetFrame()));
318
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
233
330
7a364e44fbb4 renamed SetDefaultView in FitContent
am@osimis.io
parents: 322
diff changeset
234 LOG(WARNING) << "Geometry ready: " << sliceKeyId;
7a364e44fbb4 renamed SetDefaultView in FitContent
am@osimis.io
parents: 322
diff changeset
235
322
a902a07769d4 wip: preload slice
am@osimis.io
parents: 318
diff changeset
236 boost::shared_ptr<CachedSlice> cachedSlice(new CachedSlice(IObserver::broker_));
318
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
237 cachedSlice->slice_.reset(slice.Clone());
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
238 cachedSlice->effectiveQuality_ = source.GetImageQuality();
322
a902a07769d4 wip: preload slice
am@osimis.io
parents: 318
diff changeset
239 cachedSlice->status_ = CachedSliceStatus_GeometryLoaded;
318
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
240
322
a902a07769d4 wip: preload slice
am@osimis.io
parents: 318
diff changeset
241 cachedSlices_[sliceKeyId] = boost::shared_ptr<CachedSlice>(cachedSlice);
318
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
242
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
243 // re-emit original Layer message to observers
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
244 EmitMessage(message);
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
245 }
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
246
334
c34784e5f299 compatibility fixes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 330
diff changeset
247
318
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
248 void SmartLoader::OnImageReady(const ILayerSource::ImageReadyMessage& message)
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
249 {
377
8eb4fe74000f refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 334
diff changeset
250 OrthancFrameLayerSource& source = dynamic_cast<OrthancFrameLayerSource&>(message.GetOrigin());
318
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
251
322
a902a07769d4 wip: preload slice
am@osimis.io
parents: 318
diff changeset
252 // save/replace the slice in cache
318
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
253 const Slice& slice = source.GetSlice(0); // TODO handle GetSliceCount() ?
334
c34784e5f299 compatibility fixes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 330
diff changeset
254 std::string sliceKeyId = (slice.GetOrthancInstanceId() + ":" +
c34784e5f299 compatibility fixes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 330
diff changeset
255 boost::lexical_cast<std::string>(slice.GetFrame()));
318
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
256
330
7a364e44fbb4 renamed SetDefaultView in FitContent
am@osimis.io
parents: 322
diff changeset
257 LOG(WARNING) << "Image ready: " << sliceKeyId;
7a364e44fbb4 renamed SetDefaultView in FitContent
am@osimis.io
parents: 322
diff changeset
258
318
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
259 boost::shared_ptr<CachedSlice> cachedSlice(new CachedSlice(IObserver::broker_));
378
814fa32e2fcc refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 377
diff changeset
260 cachedSlice->image_.reset(Orthanc::Image::Clone(message.GetImage()));
814fa32e2fcc refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 377
diff changeset
261 cachedSlice->effectiveQuality_ = message.GetImageQuality();
814fa32e2fcc refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 377
diff changeset
262 cachedSlice->slice_.reset(message.GetSlice().Clone());
322
a902a07769d4 wip: preload slice
am@osimis.io
parents: 318
diff changeset
263 cachedSlice->status_ = CachedSliceStatus_ImageLoaded;
318
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
264
322
a902a07769d4 wip: preload slice
am@osimis.io
parents: 318
diff changeset
265 cachedSlices_[sliceKeyId] = cachedSlice;
318
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
266
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
267 // re-emit original Layer message to observers
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
268 EmitMessage(message);
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
269 }
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
270
334
c34784e5f299 compatibility fixes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 330
diff changeset
271
318
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
272 void SmartLoader::OnLayerReady(const ILayerSource::LayerReadyMessage& message)
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
273 {
377
8eb4fe74000f refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 334
diff changeset
274 OrthancFrameLayerSource& source = dynamic_cast<OrthancFrameLayerSource&>(message.GetOrigin());
322
a902a07769d4 wip: preload slice
am@osimis.io
parents: 318
diff changeset
275 const Slice& slice = source.GetSlice(0); // TODO handle GetSliceCount() ?
334
c34784e5f299 compatibility fixes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 330
diff changeset
276 std::string sliceKeyId = (slice.GetOrthancInstanceId() + ":" +
c34784e5f299 compatibility fixes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 330
diff changeset
277 boost::lexical_cast<std::string>(slice.GetFrame()));
322
a902a07769d4 wip: preload slice
am@osimis.io
parents: 318
diff changeset
278
330
7a364e44fbb4 renamed SetDefaultView in FitContent
am@osimis.io
parents: 322
diff changeset
279 LOG(WARNING) << "Layer ready: " << sliceKeyId;
7a364e44fbb4 renamed SetDefaultView in FitContent
am@osimis.io
parents: 322
diff changeset
280
322
a902a07769d4 wip: preload slice
am@osimis.io
parents: 318
diff changeset
281 // remove the slice from the preloading slices now that it has been fully loaded and it is referenced in the cache
a902a07769d4 wip: preload slice
am@osimis.io
parents: 318
diff changeset
282 if (preloadingInstances_.find(sliceKeyId) != preloadingInstances_.end())
a902a07769d4 wip: preload slice
am@osimis.io
parents: 318
diff changeset
283 {
a902a07769d4 wip: preload slice
am@osimis.io
parents: 318
diff changeset
284 preloadingInstances_.erase(sliceKeyId);
a902a07769d4 wip: preload slice
am@osimis.io
parents: 318
diff changeset
285 }
a902a07769d4 wip: preload slice
am@osimis.io
parents: 318
diff changeset
286
318
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
287 // re-emit original Layer message to observers
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
288 EmitMessage(message);
3a4ca166fafa ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents: 317
diff changeset
289 }
260
am@osimis.io
parents:
diff changeset
290 }