18 #ifndef __otbImageWidgetBase_txx
19 #define __otbImageWidgetBase_txx
21 #include "otbConfigure.h"
31 template <
class TPixel>
34 : Fl_Gl_Window(0, 0, 0, 0, 0)
37 m_OpenGlIsotropicZoom = 1.0;
45 m_BufferedRegion = region;
46 m_ViewedRegion = region;
48 m_RedChannelIndex = 0;
49 m_GreenChannelIndex = 1;
50 m_BlueChannelIndex = 2;
51 m_OpenGlBuffer =
NULL;
52 m_FormOverlayVisible =
false;
53 m_ImageOverlayVisible =
false;
54 m_BlackTransparency =
false;
55 m_FormList = FormListType::New();
56 m_ImageOverlay =
NULL;
57 m_OpenGlImageOverlayBuffer =
NULL;
58 m_ImageOverlayOpacity = 128;
59 m_TransferFunctionList = TransferFunctionListType::New();
60 m_TransferFunctionList->PushBack(AffineTransferFunctionType::New());
61 m_SubSamplingRate = 1;
66 template <
class TPixel>
70 if (m_OpenGlBuffer !=
NULL)
72 delete[] m_OpenGlBuffer;
74 if (m_OpenGlImageOverlayBuffer !=
NULL)
76 delete[] m_OpenGlImageOverlayBuffer;
82 template <
class TPixel>
91 const char * label = this->label();
92 ClearBufferedRegion();
93 Init(x, y, w, h, label);
96 template <
class TPixel>
103 m_BufferedRegion.SetSize(size);
106 template <
class TPixel>
109 ::Init(
int ,
int ,
int ,
int ,
const char * )
111 for (
unsigned int i = 0; i < m_Image->GetNumberOfComponentsPerPixel(); ++i)
113 if (i >= m_TransferFunctionList->Size())
115 m_TransferFunctionList->PushBack(AffineTransferFunctionType::New());
126 template <
class TPixel>
134 IndexType origin = this->GetViewedRegion().GetIndex();
135 x =
static_cast<double>(index[0]) / m_OpenGlIsotropicZoom
136 + static_cast<double>(origin[0]);
137 y =
static_cast<double>(origin[1])
138 + static_cast<double>(index[1]) / m_OpenGlIsotropicZoom;
140 SizeType maxSize = this->GetInput()->GetLargestPossibleRegion().
GetSize();
141 IndexType maxIndex = this->GetInput()->GetLargestPossibleRegion().GetIndex();
145 resp[0] = maxIndex[0];
147 else if (x > maxIndex[0] + maxSize[0])
149 resp[0] = maxIndex[0] + maxSize[0];
153 resp[0] =
static_cast<int>(x);
158 resp[1] = maxIndex[1];
161 else if (y > maxIndex[1] + maxSize[1])
163 resp[1] = maxIndex[1] + maxSize[1];
167 resp[1] =
static_cast<int>(y);
175 template <
class TPixel>
184 m_BufferedRegion.SetSize(size);
186 displaySize[0] = this->w();
187 displaySize[1] = this->h();
188 m_ViewedRegion.SetSize(displaySize);
189 m_ViewedRegion.Crop(m_Image->GetLargestPossibleRegion());
194 template <
class TPixel>
206 template <
class TPixel>
211 m_ImageOverlay = image;
217 template <
class TPixel>
222 m_FormList = formList;
228 template <
class TPixel>
233 m_TransferFunctionList = list;
239 template <
class TPixel>
245 return m_ImageOverlay;
251 template <
class TPixel>
258 itkExceptionMacro(<<
"No input image !");
270 template <
class TPixel>
275 return m_TransferFunctionList->GetNthElement(channelIndex)->Map(value);
281 template <
class TPixel>
289 if (this->UpdateOpenGlBufferedRegionRequested())
291 UpdateOpenGlBufferedRegion();
292 m_Image->SetRequestedRegion(m_BufferedRegion);
293 m_Image->PropagateRequestedRegion();
294 m_Image->UpdateOutputData();
295 RebuildOpenGlBuffer();
296 if (m_ImageOverlayVisible)
298 m_ImageOverlay->SetRequestedRegion(m_BufferedRegion);
299 m_ImageOverlay->PropagateRequestedRegion();
300 m_ImageOverlay->UpdateOutputData();
304 if (m_ImageOverlayVisible)
306 RebuildOpenGlImageOverlayBuffer();
313 glViewport(0, 0, w(), h());
314 glClearColor((
float) 0.0, (
float) 0.0, (
float) 0.0, (
float) 0.0);
315 glShadeModel(GL_FLAT);
316 glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
319 glClear(GL_COLOR_BUFFER_BIT);
320 glMatrixMode(GL_MODELVIEW);
322 glMatrixMode(GL_PROJECTION);
327 int displayHeight =
static_cast<int>(vcl_ceil(m_BufferedRegion.GetSize()[1] * m_OpenGlIsotropicZoom));
328 int viewPortOffset = 0;
329 viewPortOffset = h() - displayHeight;
330 glRasterPos2i(0, viewPortOffset);
332 glPixelZoom(m_OpenGlIsotropicZoom, m_OpenGlIsotropicZoom);
335 glDrawPixels(m_BufferedRegion.GetSize()[0],
336 m_BufferedRegion.GetSize()[1],
345 glEnable(GL_TEXTURE_2D);
346 glColor4f(1.0, 1.0, 1.0, 0.0);
348 glGenTextures(1, &texture);
349 glBindTexture(GL_TEXTURE_2D, texture);
350 glTexImage2D(GL_TEXTURE_2D, 0, 3, m_BufferedRegion.GetSize()[0],
351 m_BufferedRegion.GetSize()[1], 0, GL_RGBA, GL_UNSIGNED_BYTE, m_OpenGlBuffer);
352 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
353 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
357 glBindTexture (GL_TEXTURE_2D, texture);
359 int hOffset = this->h() - this->hDisplayed();
360 glTexCoord2f (0.0, 1.0);
361 glVertex3f (0.0, 0.0 + hOffset, 0.0);
362 glTexCoord2f (1.0, 1.0);
363 glVertex3f (this->wDisplayed(), 0.0 + hOffset, 0.0);
364 glTexCoord2f (1.0, 0.0);
365 glVertex3f (this->wDisplayed(), this->hDisplayed() + hOffset, 0.0);
366 glTexCoord2f (0.0, 0.0);
367 glVertex3f (0.0, this->hDisplayed() + hOffset, 0.0);
370 glDisable(GL_TEXTURE_2D);
374 if (m_ImageOverlayVisible)
377 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
378 glDrawPixels(m_BufferedRegion.GetSize()[0],
379 m_BufferedRegion.GetSize()[1],
382 m_OpenGlImageOverlayBuffer);
390 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
391 glEnable(GL_TEXTURE_2D);
392 glColor4f(1.0, 1.0, 1.0, 1.0);
393 GLuint textureOverlay;
394 glGenTextures(1, &textureOverlay);
395 glBindTexture(GL_TEXTURE_2D, textureOverlay);
396 glTexImage2D(GL_TEXTURE_2D, 0, 4, m_BufferedRegion.GetSize()[0],
397 m_BufferedRegion.GetSize()[1], 0, GL_RGBA, GL_UNSIGNED_BYTE, m_OpenGlImageOverlayBuffer);
398 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
399 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
401 glBindTexture (GL_TEXTURE_2D, textureOverlay);
403 int hOffset = this->h() - this->hDisplayed();
404 glTexCoord2f (0.0, 1.0);
405 glVertex3f (0.0, 0.0 + hOffset, 1.0);
406 glTexCoord2f (1.0, 1.0);
407 glVertex3f (this->wDisplayed(), 0.0 + hOffset, 1.0);
408 glTexCoord2f (1.0, 0.0);
409 glVertex3f (this->wDisplayed(), this->hDisplayed() + hOffset, 1.0);
410 glTexCoord2f (0.0, 0.0);
411 glVertex3f (0.0, this->hDisplayed() + hOffset, 1.0);
413 glDisable(GL_TEXTURE_2D);
419 if (m_FormOverlayVisible)
423 for (; it != m_FormList->ReverseEnd(); ++it)
425 it.
Get()->Draw(m_OpenGlIsotropicZoom,
426 m_ViewedRegion.GetIndex()[0],
427 m_ViewedRegion.GetIndex()[1],
428 this->h(), m_SubSamplingRate);
437 template <
class TPixel>
443 if (m_RedChannelIndex >= m_Image->GetNumberOfComponentsPerPixel())
445 itkExceptionMacro(<<
"Red channel index out of bound.");
447 if (m_ViewModel != GRAYSCALE && m_GreenChannelIndex >= m_Image->GetNumberOfComponentsPerPixel())
449 itkExceptionMacro(<<
"Green channel index out of bound.");
451 if (m_ViewModel == RGB && m_BlueChannelIndex >= m_Image->GetNumberOfComponentsPerPixel())
453 itkExceptionMacro(<<
"Blue channel index out of bound.");
457 if (m_OpenGlBuffer !=
NULL)
460 delete[] m_OpenGlBuffer;
463 unsigned int bufferLength = 4 * m_BufferedRegion.GetNumberOfPixels();
465 m_OpenGlBuffer =
new unsigned char[bufferLength];
468 IteratorType it(m_Image, m_BufferedRegion);
469 unsigned int index = 0;
470 for (it.GoToBegin(); !it.IsAtEnd(); ++it)
472 index = GetRevertedBufferIndex(it.GetIndex());
475 index = GetBufferIndex(it.GetIndex());
482 m_OpenGlBuffer[index] = Normalize(it.
Get()[m_RedChannelIndex], m_RedChannelIndex);
483 m_OpenGlBuffer[index + 1] = Normalize(it.
Get()[m_GreenChannelIndex], m_GreenChannelIndex);
484 m_OpenGlBuffer[index + 2] = Normalize(it.
Get()[m_BlueChannelIndex], m_BlueChannelIndex);
485 m_OpenGlBuffer[index + 3] = 255;
490 unsigned char gray = Normalize(it.
Get()[m_RedChannelIndex], m_RedChannelIndex);
491 m_OpenGlBuffer[index] = gray;
492 m_OpenGlBuffer[index + 1] = gray;
493 m_OpenGlBuffer[index + 2] = gray;
494 m_OpenGlBuffer[index + 3] = 255;
497 case COMPLEX_MODULUS:
499 double re =
static_cast<double>(it.
Get()[m_RedChannelIndex]);
500 double im =
static_cast<double>(it.
Get()[m_GreenChannelIndex]);
502 unsigned char modulus = Normalize(static_cast<PixelType>(vcl_sqrt(static_cast<double>(im * im + re * re))), 0);
504 m_OpenGlBuffer[index] = modulus;
505 m_OpenGlBuffer[index + 1] = modulus;
506 m_OpenGlBuffer[index + 2] = modulus;
507 m_OpenGlBuffer[index + 3] = 255;
512 unsigned char phase =
513 Normalize(static_cast<PixelType>(vcl_atan2(static_cast<double>(it.
Get()[m_GreenChannelIndex]),
514 static_cast<double>(it.
Get()[m_RedChannelIndex]))), 0);
515 m_OpenGlBuffer[index] = phase;
516 m_OpenGlBuffer[index + 1] = phase;
517 m_OpenGlBuffer[index + 2] = phase;
518 m_OpenGlBuffer[index + 3] = 255;
527 template <
class TPixel>
532 if (m_ImageOverlay->GetNumberOfComponentsPerPixel() < 3)
534 itkExceptionMacro(<<
"Image overlay should have at least 3 channels.");
538 if (m_OpenGlImageOverlayBuffer !=
NULL)
541 delete[] m_OpenGlImageOverlayBuffer;
544 unsigned int bufferLength = 4 * m_BufferedRegion.GetNumberOfPixels();
546 m_OpenGlImageOverlayBuffer =
new unsigned char[bufferLength];
549 IteratorType it(m_ImageOverlay, m_BufferedRegion);
550 unsigned int index = 0;
551 if (m_BlackTransparency)
553 for (it.GoToBegin(); !it.IsAtEnd(); ++it)
555 index = GetRevertedBufferIndex(it.GetIndex());
558 index = GetBufferIndex(it.GetIndex());
560 if ((it.
Get()[0] == 0) && (it.
Get()[1] == 0) && (it.
Get()[2] == 0))
562 m_OpenGlImageOverlayBuffer[index] = 0;
563 m_OpenGlImageOverlayBuffer[index + 1] = 0;
564 m_OpenGlImageOverlayBuffer[index + 2] = 0;
565 m_OpenGlImageOverlayBuffer[index + 3] = 0;
569 m_OpenGlImageOverlayBuffer[index] =
static_cast<unsigned char>(it.
Get()[0]);
570 m_OpenGlImageOverlayBuffer[index + 1] =
static_cast<unsigned char>(it.
Get()[1]);
571 m_OpenGlImageOverlayBuffer[index + 2] =
static_cast<unsigned char>(it.
Get()[2]);
572 m_OpenGlImageOverlayBuffer[index + 3] = m_ImageOverlayOpacity;
578 for (it.GoToBegin(); !it.IsAtEnd(); ++it)
580 index = GetRevertedBufferIndex(it.GetIndex());
583 index = GetBufferIndex(it.GetIndex());
585 m_OpenGlImageOverlayBuffer[index] =
static_cast<unsigned char>(it.
Get()[0]);
586 m_OpenGlImageOverlayBuffer[index + 1] =
static_cast<unsigned char>(it.
Get()[1]);
587 m_OpenGlImageOverlayBuffer[index + 2] =
static_cast<unsigned char>(it.
Get()[2]);
588 m_OpenGlImageOverlayBuffer[index + 3] = m_ImageOverlayOpacity;