18 #ifndef __otbImageWidget_txx
19 #define __otbImageWidget_txx
26 template <
class TInputImage>
28 ::ImageWidget() : m_IsotropicZoom(1.0), m_InterpolationMethod(GL_LINEAR),
29 m_OpenGlBuffer(
NULL), m_OpenGlBufferedRegion(),
30 m_Extent(), m_SubsamplingRate(1), m_ImageToScreenTransform(),
31 m_ScreenToImageTransform(), m_GlComponents()
34 m_ImageToScreenTransform = AffineTransformType::New();
35 m_ScreenToImageTransform = AffineTransformType::New();
38 m_GlComponents = GlComponentListType::New();
41 template <
class TInputImage>
48 template <
class TInputImage>
54 Superclass::PrintSelf(os, indent);
56 if (m_OpenGlBuffer ==
NULL)
58 os << indent << indent <<
"OpenGl buffer is not allocated." << std::endl;
62 os << indent << indent <<
"OpenGl buffer is allocated with size " << m_OpenGlBufferedRegion.GetSize() <<
"." <<
65 os << indent << indent <<
"OpenGl isotropic zoom is " << m_IsotropicZoom <<
"." << std::endl;
68 template <
class TInputImage>
75 if (!image->GetBufferedRegion().IsInside(region))
77 itkExceptionMacro(<<
"Region to read is oustside of the buffered region.");
83 m_OpenGlBuffer =
new unsigned char[3 * region.GetNumberOfPixels()];
94 unsigned int index = 0;
95 if (!this->GetUseGlAcceleration())
99 index = ComputeXAxisFlippedBufferIndex(it.
GetIndex(), region);
104 index = ComputeBufferIndex(it.
GetIndex(), region);
108 m_OpenGlBuffer[index] = it.
Get()[0];
109 m_OpenGlBuffer[index + 1] = it.
Get()[1];
110 m_OpenGlBuffer[index + 2] = it.
Get()[2];
114 m_OpenGlBufferedRegion = region;
117 template <
class TInputImage>
123 if (m_OpenGlBuffer !=
NULL)
125 delete[] m_OpenGlBuffer;
126 m_OpenGlBuffer =
NULL;
130 typename RegionType::IndexType index;
131 typename RegionType::SizeType size;
134 region.SetIndex(index);
135 region.SetSize(size);
138 m_OpenGlBufferedRegion = region;
142 template <
class TInputImage>
147 if (m_IsotropicZoom <= 0)
149 itkExceptionMacro(<<
"Internal error: Isotropic zoom should be non null positive.");
152 typename RegionType::IndexType index;
153 typename RegionType::SizeType size;
155 size[0] =
static_cast<unsigned int>(m_IsotropicZoom *
static_cast<double>(m_OpenGlBufferedRegion.GetSize()[0]));
156 size[1] =
static_cast<unsigned int>(m_IsotropicZoom *
static_cast<double>(m_OpenGlBufferedRegion.GetSize()[1]));
157 index[0] = (this->w() - size[0]) / 2;
158 index[1] = (this->h() - size[1]) / 2;
159 m_Extent.SetIndex(index);
160 m_Extent.SetSize(size);
165 const double s2iSpacing = (m_SubsamplingRate) / m_IsotropicZoom;
166 s2iMatrix(0, 0) = s2iSpacing;
167 s2iMatrix(1, 1) = -s2iSpacing;
168 m_ScreenToImageTransform->SetMatrix(s2iMatrix);
172 translation[0] = m_SubsamplingRate * (m_OpenGlBufferedRegion.GetIndex()[0] - m_Extent.GetIndex()[0] / m_IsotropicZoom);
173 translation[1] = m_SubsamplingRate *
174 (((m_Extent.GetIndex()[1] +
175 m_Extent.GetSize()[1]) / m_IsotropicZoom) + m_OpenGlBufferedRegion.GetIndex()[1]);
176 m_ScreenToImageTransform->SetTranslation(translation);
179 bool couldInvert = m_ScreenToImageTransform->GetInverse(m_ImageToScreenTransform);
180 if (couldInvert ==
false)
182 itkExceptionMacro(<<
"Internal error: Could not invert ScreenToImageTransform.");
186 template <
class TInputImage>
196 if (m_OpenGlBuffer ==
NULL)
202 this->UpdateTransforms();
204 if (!this->GetUseGlAcceleration())
207 glRasterPos2f(m_Extent.GetIndex()[0], m_Extent.GetIndex()[1]);
208 glPixelZoom(m_IsotropicZoom, m_IsotropicZoom);
211 glDrawPixels(m_OpenGlBufferedRegion.GetSize()[0],
212 m_OpenGlBufferedRegion.GetSize()[1],
219 glEnable(GL_TEXTURE_2D);
220 glColor4f(1.0, 1.0, 1.0, 0.0);
222 glGenTextures(1, &texture);
223 glBindTexture(GL_TEXTURE_2D, texture);
224 glTexImage2D(GL_TEXTURE_2D, 0, 3, m_OpenGlBufferedRegion.GetSize()[0],
225 m_OpenGlBufferedRegion.GetSize()[1], 0, GL_RGB, GL_UNSIGNED_BYTE, m_OpenGlBuffer);
226 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, m_InterpolationMethod);
227 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, m_InterpolationMethod);
228 glBindTexture (GL_TEXTURE_2D, texture);
230 glTexCoord2f (0.0, 1.0);
231 glVertex3f (m_Extent.GetIndex()[0], m_Extent.GetIndex()[1], 0.0);
232 glTexCoord2f (1.0, 1.0);
233 glVertex3f (m_Extent.GetIndex()[0] + m_Extent.GetSize()[0], m_Extent.GetIndex()[1], 0.0);
234 glTexCoord2f (1.0, 0.0);
235 glVertex3f (m_Extent.GetIndex()[0] + m_Extent.GetSize()[0], m_Extent.GetIndex()[1] + m_Extent.GetSize()[1], 0.0);
236 glTexCoord2f (0.0, 0.0);
237 glVertex3f (m_Extent.GetIndex()[0], m_Extent.GetIndex()[1] + m_Extent.GetSize()[1], 0.0);
239 glDeleteTextures(1, &texture);
240 glDisable(GL_TEXTURE_2D);
245 it != m_GlComponents->ReverseEnd(); ++it)
247 if (it.Get()->GetVisible())
249 it.Get()->Render(m_Extent, m_ImageToScreenTransform);