18 #ifndef __otbImageLayerRenderingModel_txx
19 #define __otbImageLayerRenderingModel_txx
28 template <
class TOutputImage,
class TLayer>
31 m_HasQuicklook(false), m_RasterizedExtract(), m_HasExtract(false),
32 m_ExtractRegion(), m_RasterizedScaledExtract(), m_HasScaledExtract(false),
33 m_ScaledExtractRegion(), m_Updating(false), m_QuicklookBlendingFilterList(),
34 m_ExtractBlendingFilterList(), m_ScaledExtractBlendingFilterList()
38 m_QuicklookBlendingFilterList = BlendingFilterListType::New();
39 m_ExtractBlendingFilterList = BlendingFilterListType::New();
40 m_ScaledExtractBlendingFilterList = BlendingFilterListType::New();
43 template <
class TOutputImage,
class TLayer>
48 template <
class TOutputImage,
class TLayer>
58 this->RenderVisibleLayers();
60 this->RasterizeVisibleLayers();
67 template <
class TOutputImage,
class TLayer>
72 m_QuicklookBlendingFilterList = BlendingFilterListType::New();
73 m_ExtractBlendingFilterList = BlendingFilterListType::New();
74 m_ScaledExtractBlendingFilterList = BlendingFilterListType::New();
75 m_RasterizedQuicklook = OutputImageType::New();
76 m_RasterizedExtract = OutputImageType::New();
77 m_RasterizedScaledExtract = OutputImageType::New();
80 template <
class TOutputImage,
class TLayer>
87 it != this->GetLayers()->End(); ++it)
90 if (it.Get()->GetVisible())
93 m_ExtractRegion = this->ConstrainRegion(m_ExtractRegion, it.Get()->GetExtent());
94 it.Get()->SetExtractRegion(m_ExtractRegion);
96 m_ScaledExtractRegion = this->ConstrainRegion(m_ScaledExtractRegion, m_ExtractRegion);
97 it.Get()->SetScaledExtractRegion(m_ScaledExtractRegion);
100 <<
"ImageLayerRenderingModel::RenderVisibleLayers(): Rendering layer " << it.Get()->GetName() <<
101 " with regions (" << m_ExtractRegion.GetIndex() <<
" " << m_ExtractRegion.GetSize() <<
") (" <<
102 m_ScaledExtractRegion.GetIndex() <<
" " << m_ScaledExtractRegion.GetSize() <<
")");
108 template <
class TOutputImage,
class TLayer>
114 if (this->GetNumberOfLayers() == 0)
117 m_HasQuicklook =
false;
118 m_HasExtract =
false;
119 m_HasScaledExtract =
false;
127 bool visible =
false;
129 while (!visible && it != this->GetLayers()->End())
131 visible = it.
Get()->GetVisible();
143 typename LayerType::Pointer baseLayer = it.
Get();
145 otbMsgDevMacro(<<
"ImageLayerRenderingModel::RasterizeVisibleLayers(): Found base layer named " << it.
Get()->GetName());
148 if (baseLayer->GetHasQuicklook())
150 m_HasQuicklook =
true;
151 m_RasterizedQuicklook = baseLayer->GetRenderedQuicklook();
154 if (baseLayer->GetHasExtract())
157 m_RasterizedExtract = baseLayer->GetRenderedExtract();
160 if (baseLayer->GetHasScaledExtract())
162 m_HasScaledExtract =
true;
163 m_RasterizedScaledExtract = baseLayer->GetRenderedScaledExtract();
169 m_QuicklookBlendingFilterList->Clear();
170 m_ExtractBlendingFilterList->Clear();
171 m_ScaledExtractBlendingFilterList->Clear();
173 unsigned int count = 0;
175 while (it != this->GetLayers()->End())
179 m_QuicklookBlendingFilterList->PushBack(BlendingFilterType::New());
180 m_ExtractBlendingFilterList->PushBack(BlendingFilterType::New());
181 m_ScaledExtractBlendingFilterList->PushBack(BlendingFilterType::New());
184 if (it.
Get()->GetVisible())
189 if (m_HasQuicklook && it.
Get()->GetHasQuicklook())
194 blender->SetBlendingFunction(it.
Get()->GetBlendingFunction());
195 blender->SetInput1(m_RasterizedQuicklook);
196 blender->SetInput2(it.
Get()->GetRenderedQuicklook());
199 m_RasterizedQuicklook = blender->GetOutput();
203 if (m_HasExtract && it.
Get()->GetHasExtract())
208 blender->SetBlendingFunction(it.
Get()->GetBlendingFunction());
209 blender->SetInput1(m_RasterizedExtract);
210 blender->SetInput2(it.
Get()->GetRenderedExtract());
211 blender->GetOutput()->SetRequestedRegion(m_ExtractRegion);
214 m_RasterizedExtract = blender->GetOutput();
218 if (m_HasScaledExtract && it.
Get()->GetHasScaledExtract())
223 blender->SetBlendingFunction(it.
Get()->GetBlendingFunction());
224 blender->SetInput1(m_RasterizedScaledExtract);
225 blender->SetInput2(it.
Get()->GetRenderedScaledExtract());
226 blender->GetOutput()->SetRequestedRegion(m_ScaledExtractRegion);
229 m_RasterizedScaledExtract = blender->GetOutput();
233 "ImageLayerRenderingModel::RasterizeVisibleLayers(): Previous layer rasterized with layer " <<
242 template <
class TOutputImage,
class TLayer>
248 otbMsgDevMacro(<<
"ImageLayerRenderingModel::Notify(): Notifying listener");
252 template <
class TOutputImage,
class TLayer>
259 newIndex[0] -= m_ScaledExtractRegion.GetSize()[0] / 2;
260 newIndex[1] -= m_ScaledExtractRegion.GetSize()[1] / 2;
261 m_ScaledExtractRegion.SetIndex(newIndex);
264 template <
class TOutputImage,
class TLayer>
273 this->SetScaledExtractRegionCenter(newIndex);
276 newIndex[0] -= m_ExtractRegion.GetSize()[0] / 2;
277 newIndex[1] -= m_ExtractRegion.GetSize()[1] / 2;
278 m_ExtractRegion.SetIndex(newIndex);
281 template <
class TOutputImage,
class TLayer>
287 lImageRegion = this->GetLayer(0)->GetExtent();
290 lSize[0] = vcl_abs(stopIndex[0] - startIndex[0]);
291 lSize[1] = vcl_abs(stopIndex[1] - startIndex[1]);
294 lIndex[0] = std::min(startIndex[0], stopIndex[0]);
295 lIndex[1] = std::min(startIndex[1], stopIndex[1]);
298 lRegion.SetIndex(lIndex);
299 lRegion.SetSize(lSize);
301 if (lRegion.Crop(lImageRegion))
303 m_ExtractRegion = lRegion;
307 template <
class TOutputImage,
class TLayer>
312 if (this->GetNumberOfLayers() < 1)
319 typename LayerType::Pointer baseLayer = it.
Get();
320 return baseLayer->GetQuicklookSubsamplingRate();
323 template <
class TOutputImage,
class TLayer>
333 typename RegionType::SizeType size = resp.GetSize();
336 if (region.GetSize()[0] > largest.GetSize()[0])
338 size[0] = largest.GetSize()[0];
340 if (region.GetSize()[1] > largest.GetSize()[1])
342 size[1] = largest.GetSize()[1];
347 for (
unsigned int dim = 0; dim < RegionType::ImageDimension; ++dim)
350 if (region.GetIndex()[dim] < largest.GetIndex()[dim])
352 index[dim] = largest.GetIndex()[dim];
355 if (index[dim] + size[dim] >= largest.GetIndex()[dim] + largest.GetSize()[dim])
357 index[dim] = largest.GetIndex()[dim] + largest.GetSize()[dim] - size[dim];
361 resp.SetIndex(index);
365 template <
class TOutputImage,
class TLayer>
371 Superclass::PrintSelf(os, indent);
372 os << indent <<
"Viewer " << m_Name <<
": " << std::endl;
374 it != this->GetLayers()->End(); ++it)
376 os << indent << it.Get() << std::endl;