18 #ifndef __otbImageAlternateViewer_txx
19 #define __otbImageAlternateViewer_txx
22 #include <FL/fl_draw.H>
33 template <
class TPixel>
36 : Fl_Gl_Window(0, 0, 0, 0, 0)
39 m_OpenGlIsotropicZoom = 1.0;
40 m_OpenGlBuffer =
NULL;
41 m_ViewModelIsRGB =
true;
42 m_InsightViewModelIsRGB =
true;
43 m_RedChannelIndex = 0;
44 m_GreenChannelIndex = 1;
45 m_BlueChannelIndex = 2;
47 m_MinComponentValues.SetSize(1);
48 m_MaxComponentValues.SetSize(1);
49 m_MinComponentValues.Fill(0);
50 m_MaxComponentValues.Fill(255);
52 m_DecompositionFilter = VectorImageDecompositionFilterType::New();
55 m_ZoomInInterpolator = defaultInterpolator;
56 m_ZoomOutInterpolator = defaultInterpolator;
58 m_SpacingZoomFactor = 1;
61 m_DragEventCounter = 0;
62 m_OldMousePos.Fill(0);
64 m_SubWindowMode =
false;
70 template <
class TPixel>
74 if (m_OpenGlBuffer !=
NULL)
76 delete[] m_OpenGlBuffer;
80 template <
class TPixel>
85 m_OldViewedRegionCenter = m_ViewedRegionCenter;
86 m_ViewedRegionCenter = index;
92 template <
class TPixel>
97 const char * label = this->label();
98 Init(this->x(), this->y(), this->w(), this->h(), label);
101 template <
class TPixel>
104 ::Init(
int x,
int y,
int w,
int h,
const char * l)
117 m_RequestedRegion.SetSize(nullSize);
118 m_RequestedRegion.SetIndex(index);
119 m_BufferedRegion = m_RequestedRegion;
120 m_OldBufferedRegion = m_BufferedRegion;
124 m_DisplayExtent.SetSize(size);
125 m_OldDisplayExtent = m_DisplayExtent;
127 m_OldSpacingZoomFactor = m_SpacingZoomFactor;
129 m_Splitter = SplitterType::New();
131 m_SubWindowRegion.SetIndex(index);
132 m_SubWindowRegion.SetSize(nullSize);
134 m_Image->UpdateOutputInformation();
135 m_DecompositionFilter->SetInput(m_Image);
136 m_OldViewedRegionCenter = m_ViewedRegionCenter;
139 bandList->UpdateOutputInformation();
140 bandList->GetNthElement(m_RedChannelIndex)->SetRequestedRegion(m_RequestedRegion);
142 if (m_ViewModelIsRGB)
144 bandList->GetNthElement(m_GreenChannelIndex)->SetRequestedRegion(m_RequestedRegion);
145 bandList->GetNthElement(m_BlueChannelIndex)->SetRequestedRegion(m_RequestedRegion);
147 bandList->PropagateRequestedRegion();
149 if (!this->GetImage())
151 itkExceptionMacro(
"No input image!");
156 m_DisplayExtent.GetSize()[0],
157 m_DisplayExtent.GetSize()[1]);
159 template <
class TPixel>
164 if (m_Updating)
return;
166 if (w % 2 == 1) w += 1;
167 if (h % 2 == 1) h += 1;
171 m_OldDisplayExtent = m_DisplayExtent;
177 m_DisplayExtent.SetIndex(index);
180 this->Fl_Gl_Window::resize(x, y, w, h);
186 template <
class TPixel>
191 m_ViewModelIsRGB =
true;
196 template <
class TPixel>
201 m_ViewModelIsRGB =
false;
207 template <
class TPixel>
212 m_InsightViewModelIsRGB =
true;
217 template <
class TPixel>
222 m_InsightViewModelIsRGB =
false;
228 template <
class TPixel>
235 itkExceptionMacro(<<
"No input image !");
247 template <
class TPixel>
255 IncrementalOpenGlBufferUpdate();
256 ResetOpenGlContext();
257 this->Draw(m_OpenGlBuffer, m_BufferedRegion);
267 template <
class TPixel>
272 std::vector<unsigned char *> bufferList;
273 std::vector<RegionType> bufferRegionList;
275 if (m_BufferedRegion != m_DisplayExtent)
277 for (
unsigned int i = 0; i < 8; ++i)
279 RegionType additionalBufferRegion = GetAdditionalBufferRegion(i);
280 unsigned char * additionalBuffer = CreateAdditionalBuffer(additionalBufferRegion, m_Image, m_ViewModelIsRGB);
281 this->Draw(additionalBuffer, additionalBufferRegion);
282 bufferList.push_back(additionalBuffer);
283 bufferRegionList.push_back(additionalBufferRegion);
286 MergeBuffersAndFreeMemory(bufferList, bufferRegionList);
290 unsigned char * subWindowBuffer = CreateAdditionalBuffer(m_SubWindowRegion, m_SecondImage, m_InsightViewModelIsRGB);
291 this->Draw(subWindowBuffer, m_SubWindowRegion);
292 delete[] subWindowBuffer;
297 template <
class TPixel>
304 this->DrawRegionBoundary(m_SubWindowRegion);
310 template <
class TPixel>
316 double x = (point[0] - oldUpperLeft[0]) / spacing[0];
317 double y = (point[1] - oldUpperLeft[1]) / spacing[1];
319 if ((vcl_floor(x) != x) || (vcl_floor(y) != y))
323 else if (x < 0 || x > size[0] || y<0 || y> size[1])
329 resp = 3 * (
static_cast<long>(y) * size[0] + static_cast<long>(x));
335 template <
class TPixel>
341 focusOffset[0] =
static_cast<long>(
static_cast<double>(
342 m_ViewedRegionCenter[0] - m_OldViewedRegionCenter[0]) / m_SpacingZoomFactor);
343 focusOffset[1] =
static_cast<long>(
static_cast<double>(
344 m_ViewedRegionCenter[1] - m_OldViewedRegionCenter[1]) / m_SpacingZoomFactor);
350 newBufferedRegionSize[0] =
351 static_cast<unsigned long>(
static_cast<double>((m_BufferedRegion.GetSize()[0]) * m_OldSpacingZoomFactor /
352 m_SpacingZoomFactor));
353 newBufferedRegionSize[1] =
354 static_cast<unsigned long>(
static_cast<double>((m_BufferedRegion.GetSize()[1]) * m_OldSpacingZoomFactor /
355 m_SpacingZoomFactor));
357 m_OldBufferedRegion = m_BufferedRegion;
359 m_BufferedRegion.
SetSize(newBufferedRegionSize);
361 newBufferedRegionIndex[0] = (
static_cast<long>(m_DisplayExtent.GetSize()[0])
362 - static_cast<long>(m_BufferedRegion.GetSize()[0])) / 2;
363 newBufferedRegionIndex[1] = (
static_cast<long>(m_DisplayExtent.GetSize()[1])
364 - static_cast<long>(m_BufferedRegion.GetSize()[1])) / 2;
365 newBufferedRegionIndex[0] -= focusOffset[0];
366 newBufferedRegionIndex[1] -= focusOffset[1];
367 m_BufferedRegion.SetIndex(newBufferedRegionIndex);
370 m_Image->TransformIndexToPhysicalPoint(m_ViewedRegionCenter, center);
372 if (m_SpacingZoomFactor != m_OldSpacingZoomFactor)
374 m_BufferedRegion.Crop(m_DisplayExtent);
376 SpacingType spacing = m_Image->GetSpacing() * m_SpacingZoomFactor;
377 SpacingType oldSpacing = m_Image->GetSpacing() * m_OldSpacingZoomFactor;
380 origin[0] = center[0] - (
static_cast<double>(this->m_DisplayExtent.GetSize()[0]) / 2 - 1) * spacing[0];
381 origin[1] = center[1] - (
static_cast<double>(this->m_DisplayExtent.GetSize()[1]) / 2 - 1) * spacing[1];
384 oldOrigin[0] = center[0] - (
static_cast<double>(this->m_DisplayExtent.GetSize()[0]) / 2 - 1) * oldSpacing[0];
385 oldOrigin[1] = center[1] - (
static_cast<double>(this->m_DisplayExtent.GetSize()[1]) / 2 - 1) * oldSpacing[1];
388 oldBufferedUpperLeft[0] = oldOrigin[0] +
static_cast<double>(m_OldBufferedRegion.GetIndex()[0]) * oldSpacing[0];
389 oldBufferedUpperLeft[1] = oldOrigin[1] +
static_cast<double>(m_OldBufferedRegion.GetIndex()[1]) * oldSpacing[1];
392 bufferedUpperLeft[0] = origin[0] +
static_cast<double>(m_BufferedRegion.GetIndex()[0]) * spacing[0];
393 bufferedUpperLeft[1] = origin[1] +
static_cast<double>(m_BufferedRegion.GetIndex()[1]) * spacing[1];
395 unsigned char * newBuffer =
NULL;
396 unsigned int bufferLength = 3 * m_BufferedRegion.GetSize()[0] * m_BufferedRegion.GetSize()[1];
398 newBuffer =
new unsigned char[bufferLength];
400 unsigned int index = 0;
403 interpolatedPos.Fill(0);
404 unsigned int numberOfSplits = 1;
406 unsigned int optiCount = 0;
408 if (m_SpacingZoomFactor > 1)
411 std::max((static_cast<unsigned int>(m_SpacingZoomFactor)) * (static_cast<unsigned int>(m_SpacingZoomFactor)), 1U);
412 interpolator = m_ZoomOutInterpolator;
416 interpolator = m_ZoomInInterpolator;
419 unsigned int splitterNumberOfSplits = m_Splitter->GetNumberOfSplits(m_BufferedRegion, numberOfSplits);
421 for (
unsigned int splitIndex = 0; splitIndex < splitterNumberOfSplits; ++splitIndex)
423 RegionType splitRegion = m_Splitter->GetSplit(splitIndex, splitterNumberOfSplits, m_BufferedRegion);
424 m_RequestedRegion = ComputeRequestedRegion(splitRegion);
425 if (!m_RequestedRegion.Crop(m_Image->GetLargestPossibleRegion()))
431 m_RequestedRegion.SetSize(nullSize);
432 m_RequestedRegion.SetIndex(nullIndex);
434 m_DecompositionFilter = VectorImageDecompositionFilterType::New();
435 m_DecompositionFilter->SetInput(m_Image);
436 bandList = m_DecompositionFilter->GetOutput();
437 bandList->UpdateOutputInformation();
438 bandList->GetNthElement(m_RedChannelIndex)->SetRequestedRegion(m_RequestedRegion);
439 if (m_ViewModelIsRGB)
441 bandList->GetNthElement(m_GreenChannelIndex)->SetRequestedRegion(m_RequestedRegion);
442 bandList->GetNthElement(m_BlueChannelIndex)->SetRequestedRegion(m_RequestedRegion);
444 bandList->PropagateRequestedRegion();
445 bandList->UpdateOutputData();
448 upperLeft[0] = origin[0] +
static_cast<double>(splitRegion.
GetIndex()[0]) * spacing[0];
449 upperLeft[1] = origin[1] +
static_cast<double>(splitRegion.
GetIndex()[1]) * spacing[1];
451 interpolatedPos[1] = upperLeft[1];
452 for (
unsigned int j = 0; j < splitRegion.
GetSize()[1]; ++j)
454 interpolatedPos[0] = upperLeft[0];
455 for (
unsigned int i = 0; i < splitRegion.
GetSize()[0]; ++i)
458 long indexInOldBuffer = IndexInOldGrid(interpolatedPos,
459 oldBufferedUpperLeft,
461 m_OldBufferedRegion.GetSize());
462 if (indexInOldBuffer > 0)
464 newBuffer[index] = m_OpenGlBuffer[indexInOldBuffer];
465 newBuffer[index + 1] = m_OpenGlBuffer[indexInOldBuffer + 1];
466 newBuffer[index + 2] = m_OpenGlBuffer[indexInOldBuffer + 2];
472 interpolator->SetInputImage(bandList->GetNthElement(m_RedChannelIndex));
473 if (interpolator->IsInsideBuffer(interpolatedPos))
475 interpolatedValue =
static_cast<PixelType>(m_ZoomInInterpolator->Evaluate(interpolatedPos));
479 interpolatedValue = 0;
481 newBuffer[index] = Normalize(interpolatedValue, m_RedChannelIndex);
482 if (m_ViewModelIsRGB)
484 m_ZoomInInterpolator->SetInputImage(bandList->GetNthElement(m_GreenChannelIndex));
485 if (m_ZoomInInterpolator->IsInsideBuffer(interpolatedPos))
487 interpolatedValue =
static_cast<PixelType>(interpolator->Evaluate(interpolatedPos));
491 interpolatedValue = 0;
493 newBuffer[index + 1] = Normalize(interpolatedValue, m_GreenChannelIndex);
494 interpolator->SetInputImage(bandList->GetNthElement(m_BlueChannelIndex));
495 if (interpolator->IsInsideBuffer(interpolatedPos))
497 interpolatedValue =
static_cast<PixelType>(interpolator->Evaluate(interpolatedPos));
501 interpolatedValue = 0;
503 newBuffer[index + 2] = Normalize(interpolatedValue, m_BlueChannelIndex);
508 newBuffer[index + 1] = Normalize(interpolatedValue, m_RedChannelIndex);
509 newBuffer[index + 2] = Normalize(interpolatedValue, m_RedChannelIndex);
513 interpolatedPos[0] += spacing[0];
515 interpolatedPos[1] += spacing[1];
518 if (m_OpenGlBuffer !=
NULL)
520 delete[] m_OpenGlBuffer;
522 m_OpenGlBuffer = newBuffer;
524 m_OldSpacingZoomFactor = m_SpacingZoomFactor;
528 template <
class TPixel>
542 IndexType deUL = m_DisplayExtent.GetIndex();
544 deLR[0] = deSize[0] + deUL[0];
545 deLR[1] = deSize[1] + deUL[1];
548 IndexType bufUL = m_BufferedRegion.GetIndex();
550 bufLR[0] = bufUL[0] + bufSize[0];
551 bufLR[1] = bufUL[1] + bufSize[1];
557 size[0] = std::max(bufUL[0] - deUL[0], 0L);
558 size[1] = std::max(bufUL[1] - deUL[1], 0L);
562 index[0] = std::max(deUL[0], bufUL[0]);
564 size[0] = std::min(bufLR[0] - std::max(bufUL[0], 0L), deLR[0] - index[0]);
565 size[1] = std::max(bufUL[1] - deUL[1], 0L);
569 index[0] = std::min(bufLR[0], deLR[0]);
571 size[0] = std::max(deLR[0] - bufLR[0], 0L);
572 size[1] = std::max(bufUL[1] - deUL[1], 0L);
577 index[1] = std::max(bufUL[1], 0L);
578 size[0] = std::max(bufUL[0] - deUL[0], 0L);
579 size[1] = std::min(bufLR[1] - std::max(bufUL[1], 0L), deLR[1] - index[1]);
583 index[0] = std::min(bufLR[0], deLR[0]);
584 index[1] = std::max(bufUL[1], deUL[0]);
585 size[0] = std::max(deLR[0] - bufLR[0], 0L);
586 size[1] = std::min(bufLR[1] - std::max(bufUL[1], 0L), deLR[1] - index[1]);
591 index[1] = std::min(deLR[1], bufLR[1]);
592 size[0] = std::max(bufUL[0] - deUL[0], 0L);
593 size[1] = std::max(deLR[1] - bufLR[1], 0L);
597 index[0] = std::max(deUL[0], bufUL[0]);
598 index[1] = std::min(deLR[1], bufLR[1]);
599 size[0] = std::min(bufLR[0] - std::max(bufUL[0], 0L), deLR[0] - index[0]);
600 size[1] = std::max(deLR[1] - bufLR[1], 0L);
604 index[0] = std::min(bufLR[0], deLR[0]);
605 index[1] = std::min(deLR[1], bufLR[1]);
606 size[0] = std::max(deLR[0] - bufLR[0], 0L);
607 size[1] = std::max(deLR[1] - bufLR[1], 0L);
614 template <
class TPixel>
622 SpacingType spacing = m_Image->GetSpacing() * m_SpacingZoomFactor;
625 m_Image->TransformIndexToPhysicalPoint(m_ViewedRegionCenter, center);
627 origin[0] = center[0] - (
static_cast<double>(this->m_DisplayExtent.GetSize()[0]) / 2 - 1) * spacing[0];
628 origin[1] = center[1] - (
static_cast<double>(this->m_DisplayExtent.GetSize()[1]) / 2 - 1) * spacing[1];
631 oldOrigin[0] = center[0] - (
static_cast<double>(this->m_OldDisplayExtent.GetSize()[0]) / 2 - 1) * spacing[0];
632 oldOrigin[1] = center[1] - (
static_cast<double>(this->m_OldDisplayExtent.GetSize()[1]) / 2 - 1) * spacing[1];
635 upperLeft[0] = origin[0] + (
static_cast<double>(region.
GetIndex()[0])) * spacing[0];
636 upperLeft[1] = origin[1] + (
static_cast<double>(region.
GetIndex()[1])) * spacing[1];
639 lowerRight[0] = upperLeft[0] + (
static_cast<double>(region.
GetSize()[0]) - 1) * spacing[0];
640 lowerRight[1] = upperLeft[1] + (
static_cast<double>(region.
GetSize()[1]) - 1) * spacing[1];
643 bufferedUpperLeft[0] = origin[0] +
static_cast<double>(m_BufferedRegion.GetIndex()[0]) * spacing[0];
644 bufferedUpperLeft[1] = origin[1] +
static_cast<double>(m_BufferedRegion.GetIndex()[1]) * spacing[1];
647 bufferedLowerRight[0] = bufferedUpperLeft[0] +
static_cast<double>(m_BufferedRegion.GetSize()[0] - 1) * spacing[0];
648 bufferedLowerRight[1] = bufferedUpperLeft[1] +
static_cast<double>(m_BufferedRegion.GetSize()[1] - 1) * spacing[1];
653 m_Image->TransformPhysicalPointToIndex(upperLeft, requestedIndex);
654 m_Image->TransformPhysicalPointToIndex(lowerRight, lowerRightIndex);
655 requestedSize[0] = lowerRightIndex[0] - requestedIndex[0] + 1;
656 requestedSize[1] = lowerRightIndex[1] - requestedIndex[1] + 1;
658 outputRegion.
SetIndex(requestedIndex);
659 outputRegion.
SetSize(requestedSize);
666 template <
class TPixel>
673 unsigned char * result =
NULL;
675 unsigned int bufferLength = 3 * region.
GetSize()[0] * region.
GetSize()[1];
677 if (bufferLength == 0)
682 result =
new unsigned char[bufferLength];
686 bandList->UpdateOutputInformation();
688 unsigned int index = 0;
691 interpolatedPos.Fill(0);
692 unsigned int numberOfSplits = 1;
695 if (m_SpacingZoomFactor > 1)
698 std::max((static_cast<unsigned int>(m_SpacingZoomFactor)) * (static_cast<unsigned int>(m_SpacingZoomFactor)), 1U);
699 interpolator = m_ZoomOutInterpolator;
703 interpolator = m_ZoomInInterpolator;
706 unsigned int splitterNumberOfSplits = m_Splitter->GetNumberOfSplits(region, numberOfSplits);
708 SpacingType spacing = image->GetSpacing() * m_SpacingZoomFactor;
711 image->TransformIndexToPhysicalPoint(m_ViewedRegionCenter, center);
713 origin[0] = center[0] - (
static_cast<double>(this->m_DisplayExtent.GetSize()[0]) / 2 - 1) * spacing[0];
714 origin[1] = center[1] - (
static_cast<double>(this->m_DisplayExtent.GetSize()[1]) / 2 - 1) * spacing[1];
716 for (
unsigned int splitIndex = 0; splitIndex < splitterNumberOfSplits; ++splitIndex)
718 RegionType splitRegion = m_Splitter->GetSplit(splitIndex, splitterNumberOfSplits, region);
721 upperLeft[0] = origin[0] + (
static_cast<double>(splitRegion.
GetIndex()[0])) * spacing[0];
722 upperLeft[1] = origin[1] + (
static_cast<double>(splitRegion.
GetIndex()[1])) * spacing[1];
723 m_RequestedRegion = ComputeRequestedRegion(splitRegion);
724 if (!m_RequestedRegion.Crop(image->GetLargestPossibleRegion()))
730 m_RequestedRegion.SetSize(nullSize);
731 m_RequestedRegion.SetIndex(nullIndex);
733 m_DecompositionFilter = VectorImageDecompositionFilterType::New();
734 m_DecompositionFilter->SetInput(image);
735 bandList = m_DecompositionFilter->GetOutput();
737 bandList->UpdateOutputInformation();
738 bandList->GetNthElement(m_RedChannelIndex)->SetRequestedRegion(m_RequestedRegion);
741 bandList->GetNthElement(m_GreenChannelIndex)->SetRequestedRegion(m_RequestedRegion);
742 bandList->GetNthElement(m_BlueChannelIndex)->SetRequestedRegion(m_RequestedRegion);
744 bandList->PropagateRequestedRegion();
745 bandList->UpdateOutputData();
749 interpolation.
Start();
750 interpolatedPos[1] = upperLeft[1];
751 for (
unsigned int j = 0; j < splitRegion.
GetSize()[1]; ++j)
753 interpolatedPos[0] = upperLeft[0];
754 for (
unsigned int i = 0; i < splitRegion.
GetSize()[0]; ++i)
756 interpolator->SetInputImage(bandList->GetNthElement(m_RedChannelIndex));
757 if (interpolator->IsInsideBuffer(interpolatedPos))
759 interpolatedValue =
static_cast<PixelType>(interpolator->Evaluate(interpolatedPos));
763 interpolatedValue = 0;
765 result[index] = Normalize(interpolatedValue, m_RedChannelIndex);
768 interpolator->SetInputImage(bandList->GetNthElement(m_GreenChannelIndex));
769 if (interpolator->IsInsideBuffer(interpolatedPos))
771 interpolatedValue =
static_cast<PixelType>(interpolator->Evaluate(interpolatedPos));
775 interpolatedValue = 0;
777 result[index + 1] = Normalize(interpolatedValue, m_GreenChannelIndex);
778 interpolator->SetInputImage(bandList->GetNthElement(m_BlueChannelIndex));
779 if (interpolator->IsInsideBuffer(interpolatedPos))
781 interpolatedValue =
static_cast<PixelType>(interpolator->Evaluate(interpolatedPos));
785 interpolatedValue = 0;
787 result[index + 2] = Normalize(interpolatedValue, m_BlueChannelIndex);
792 result[index + 1] = Normalize(interpolatedValue, m_RedChannelIndex);
793 result[index + 2] = Normalize(interpolatedValue, m_RedChannelIndex);
796 interpolatedPos[0] += spacing[0];
798 interpolatedPos[1] += spacing[1];
802 interpolation.
Stop();
807 template <
class TPixel>
812 if (m_Updating)
return 0;
819 m_OldMousePos[0] =
static_cast<long int>(
static_cast<double>(m_DisplayExtent.GetSize()[0] / 2)
820 + (static_cast<double>(Fl::event_x()) -
822 m_DisplayExtent.GetSize()[0] / 2)) / m_OpenGlIsotropicZoom);
823 m_OldMousePos[1] =
static_cast<long int>(
static_cast<double>(m_DisplayExtent.GetSize()[1] / 2)
824 + (static_cast<double>(Fl::event_y()) -
826 m_DisplayExtent.GetSize()[1] / 2)) / m_OpenGlIsotropicZoom);
828 m_DragEventCounter = 0;
830 if (m_SubWindowRegion.IsInside(m_OldMousePos))
832 m_SubWindowMove =
true;
836 m_OldViewedRegionCenter = m_ViewedRegionCenter;
846 int x =
static_cast<int>(
static_cast<double>(m_DisplayExtent.GetSize()[0] / 2)
847 + (Fl::event_x() -
static_cast<double>(
848 m_DisplayExtent.GetSize()[0] / 2)) / m_OpenGlIsotropicZoom);
849 int y =
static_cast<long int>(
static_cast<double>(m_DisplayExtent.GetSize()[1] / 2)
850 + (Fl::event_y() -
static_cast<double>(
851 m_DisplayExtent.GetSize()[1] / 2)) / m_OpenGlIsotropicZoom);
852 if (Fl::event_button() == FL_MIDDLE_MOUSE)
854 if (!m_SubWindowMode) m_SubWindowMode =
true;
858 newIndex[0] = (x > m_OldMousePos[0] ? m_OldMousePos[0] : x);
859 newIndex[1] = (y > m_OldMousePos[1] ? m_OldMousePos[1] : y);
860 newSize[0] = vcl_abs(x - m_OldMousePos[0]);
861 newSize[1] = vcl_abs(y - m_OldMousePos[1]);
862 m_SubWindowRegion.SetIndex(newIndex);
863 m_SubWindowRegion.SetSize(newSize);
865 ++m_DragEventCounter;
867 else if (m_SubWindowMove)
869 IndexType index = m_SubWindowRegion.GetIndex();
870 index[0] += (x - m_OldMousePos[0]);
871 index[1] += (y - m_OldMousePos[1]);
872 m_SubWindowRegion.SetIndex(index);
873 m_OldMousePos[0] = x;
874 m_OldMousePos[1] = y;
876 ++m_DragEventCounter;
881 SpacingType spacing = m_Image->GetSpacing() * m_SpacingZoomFactor;
883 origin[0] =
static_cast<double>(m_OldViewedRegionCenter[0]) - static_cast<double>(
884 this->m_DisplayExtent.GetSize()[0] / 2) * spacing[0];
885 origin[1] =
static_cast<double>(m_OldViewedRegionCenter[1]) - static_cast<double>(
886 this->m_DisplayExtent.GetSize()[1] / 2) * spacing[1];
888 newCenter[0] = origin[0] +
889 static_cast<double>(m_OldMousePos[0] - x +
static_cast<long>(
890 this->m_DisplayExtent.GetSize()[0]) /
892 newCenter[1] = origin[1] +
893 static_cast<double>(m_OldMousePos[1] - y +
static_cast<long>(
894 this->m_DisplayExtent.GetSize()[1]) /
896 m_Image->TransformPhysicalPointToIndex(newCenter, m_ViewedRegionCenter);
898 ++m_DragEventCounter;
907 m_OldViewedRegionCenter = m_ViewedRegionCenter;
910 m_SubWindowMove =
false;
923 if (Fl::event_key() == 116)
925 m_SubWindowMode = !m_SubWindowMode;
934 template <
class TPixel>
939 if (bufferList.size() != 8 || bufferRegionList.size() != 8)
941 itkExceptionMacro(
"Invalid number of additionnal buffers");
944 if (bufferRegionList[0].GetNumberOfPixels() == 0
945 && bufferRegionList[1].GetNumberOfPixels() == 0
946 && bufferRegionList[2].GetNumberOfPixels() == 0
947 && bufferRegionList[3].GetNumberOfPixels() == 0
948 && bufferRegionList[4].GetNumberOfPixels() == 0
949 && bufferRegionList[5].GetNumberOfPixels() == 0
950 && bufferRegionList[6].GetNumberOfPixels() == 0
951 && bufferRegionList[7].GetNumberOfPixels() == 0)
957 unsigned char * newBuffer =
new unsigned char[3 * m_DisplayExtent.GetNumberOfPixels()];
960 unsigned int indexInNewBuffer = 0;
962 unsigned int indexInBuffer1 = 0;
963 unsigned int indexInBuffer2 = 0;
964 unsigned int indexInBuffer3 = 0;
965 unsigned int indexInBuffer4 = 0;
966 unsigned int indexInBuffer5 = 0;
967 unsigned int indexInBuffer6 = 0;
968 unsigned int indexInBuffer7 = 0;
969 unsigned int indexInBuffer8 = 0;
970 unsigned int indexInCentralBuffer = 0;
972 if (bufferRegionList[0].GetSize()[1] != bufferRegionList[1].GetSize()[1]
973 || bufferRegionList[2].GetSize()[1] != bufferRegionList[1].GetSize()[1]
974 || bufferRegionList[2].GetSize()[1] != bufferRegionList[0].GetSize()[1]
975 || bufferRegionList[0].GetIndex()[1] != bufferRegionList[1].GetIndex()[1]
976 || bufferRegionList[2].GetIndex()[1] != bufferRegionList[1].GetIndex()[1]
977 || bufferRegionList[2].GetIndex()[1] != bufferRegionList[0].GetIndex()[1]
980 itkExceptionMacro(
"Additional buffers misaligned.");
985 for (
unsigned int j = 0; j < bufferRegionList[0].GetSize()[1]; ++j)
987 if (bufferList[0] !=
NULL)
989 for (
unsigned int i = 0; i < 3 * bufferRegionList[0].GetSize()[0]; ++i)
991 newBuffer[indexInNewBuffer] = bufferList[0][indexInBuffer1];
997 if (bufferList[1] !=
NULL)
999 for (
unsigned int i = 0; i < 3 * bufferRegionList[1].GetSize()[0]; ++i)
1001 newBuffer[indexInNewBuffer] = bufferList[1][indexInBuffer2];
1007 if (bufferList[2] !=
NULL)
1009 for (
unsigned int i = 0; i < 3 * bufferRegionList[2].GetSize()[0]; ++i)
1011 newBuffer[indexInNewBuffer] = bufferList[2][indexInBuffer3];
1018 unsigned int lineOffset =
static_cast<unsigned int>(-std::min(0L, m_BufferedRegion.GetIndex()[0]));
1019 unsigned int lineOffsetEnd =
1020 static_cast<unsigned int>(-std::min(0L, static_cast<long>(m_DisplayExtent.GetSize()[0]) -
1021 m_BufferedRegion.GetIndex()[0] -
static_cast<long>(m_BufferedRegion.GetSize()[0])));
1022 unsigned int columnOffset =
static_cast<unsigned int>(-std::min(0L, m_BufferedRegion.GetIndex()[1]));
1023 unsigned int offsety = columnOffset * (
static_cast<int>(m_BufferedRegion.GetSize()[0])) * 3;
1024 unsigned int offsetx = lineOffset * 3;
1026 indexInCentralBuffer += offsety;
1029 for (
unsigned int j = 0; j < bufferRegionList[3].GetSize()[1]; ++j)
1032 if (bufferList[3] !=
NULL)
1034 for (
unsigned int i = 0; i < 3 * bufferRegionList[3].GetSize()[0]; ++i)
1036 newBuffer[indexInNewBuffer] = bufferList[3][indexInBuffer4];
1042 if (m_OpenGlBuffer !=
NULL)
1045 indexInCentralBuffer += offsetx;
1046 for (
unsigned int i = 0; i < 3 * bufferRegionList[1].GetSize()[0]; ++i)
1048 newBuffer[indexInNewBuffer] = m_OpenGlBuffer[indexInCentralBuffer];
1050 ++indexInCentralBuffer;
1052 indexInCentralBuffer += lineOffsetEnd * 3;
1055 if (bufferList[4] !=
NULL)
1057 for (
unsigned int i = 0; i < 3 * bufferRegionList[4].GetSize()[0]; ++i)
1059 newBuffer[indexInNewBuffer] = bufferList[4][indexInBuffer5];
1066 if (bufferRegionList[5].GetSize()[1] != bufferRegionList[6].GetSize()[1]
1067 || bufferRegionList[6].GetSize()[1] != bufferRegionList[7].GetSize()[1]
1068 || bufferRegionList[7].GetSize()[1] != bufferRegionList[5].GetSize()[1]
1069 || bufferRegionList[5].GetIndex()[1] != bufferRegionList[6].GetIndex()[1]
1070 || bufferRegionList[6].GetIndex()[1] != bufferRegionList[7].GetIndex()[1]
1071 || bufferRegionList[7].GetIndex()[1] != bufferRegionList[5].GetIndex()[1]
1074 itkExceptionMacro(
"Additional buffers misaligned.");
1079 for (
unsigned int j = 0; j < bufferRegionList[5].GetSize()[1]; ++j)
1081 if (bufferList[5] !=
NULL)
1083 for (
unsigned int i = 0; i < 3 * bufferRegionList[5].GetSize()[0]; ++i)
1085 newBuffer[indexInNewBuffer] = bufferList[5][indexInBuffer6];
1091 if (bufferList[6] !=
NULL)
1093 for (
unsigned int i = 0; i < 3 * bufferRegionList[6].GetSize()[0]; ++i)
1095 newBuffer[indexInNewBuffer] = bufferList[6][indexInBuffer7];
1101 if (bufferList[7] !=
NULL)
1103 for (
unsigned int i = 0; i < 3 * bufferRegionList[7].GetSize()[0]; ++i)
1105 newBuffer[indexInNewBuffer] = bufferList[7][indexInBuffer8];
1113 typename std::vector<unsigned char *>::iterator it;
1114 for (it = bufferList.begin(); it != bufferList.end(); ++it)
1123 m_OldBufferedRegion = m_BufferedRegion;
1124 m_BufferedRegion = m_DisplayExtent;
1126 if (m_OpenGlBuffer !=
NULL)
1128 delete[] m_OpenGlBuffer;
1131 m_OpenGlBuffer = newBuffer;
1136 template <
class TPixel>
1146 glRasterPos3d(0, 0, 0);
1148 double zoomOffsetX = 0;
1149 double zoomOffsetY = 0;
1153 m_OpenGlIsotropicZoom) *
1154 (static_cast<double>(m_DisplayExtent.GetSize()[0] / 2) - static_cast<double>(region.
GetIndex()[0]));
1157 m_OpenGlIsotropicZoom) *
1158 (static_cast<double>(m_DisplayExtent.GetSize()[1] / 2) - static_cast<double>(region.
GetIndex()[1]));
1160 double movex =
static_cast<double>(region.
GetIndex()[0]) + zoomOffsetX;
1161 double movey =
static_cast<double>(m_DisplayExtent.GetSize()[1]) - static_cast<double>(region.
GetIndex()[1]) -
1163 glBitmap(0, 0, 0, 0, movex, movey,
NULL);
1164 glPixelZoom(m_OpenGlIsotropicZoom, -m_OpenGlIsotropicZoom);
1167 glDrawPixels(region.
GetSize()[0],
1179 template <
class TPixel>
1184 double zoomOffsetX = 0;
1185 double zoomOffsetY = 0;
1189 m_OpenGlIsotropicZoom) *
1190 (static_cast<double>(m_DisplayExtent.GetSize()[0] / 2) - static_cast<double>(region.
GetIndex()[0]));
1193 m_OpenGlIsotropicZoom) *
1194 (static_cast<double>(m_DisplayExtent.GetSize()[1] / 2) - static_cast<double>(region.
GetIndex()[1]));
1195 double minx, maxx, miny, maxy;
1197 minx =
static_cast<double>(region.
GetIndex()[0]) + zoomOffsetX;
1198 maxx = minx +
static_cast<double>(region.
GetSize()[0]) * m_OpenGlIsotropicZoom;
1199 miny =
static_cast<double>(m_DisplayExtent.GetSize()[1]) -
1200 static_cast<double>(region.
GetIndex()[1]) - zoomOffsetY;
1201 maxy = miny -
static_cast<double>(region.
GetSize()[1]) * m_OpenGlIsotropicZoom;
1204 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
1206 glBegin(GL_LINE_LOOP);
1207 glVertex2f(minx, miny);
1208 glVertex2f(minx, maxy);
1209 glVertex2f(maxx, maxy);
1210 glVertex2f(maxx, miny);
1212 glDisable(GL_BLEND);
1215 template <
class TPixel>
1224 glViewport(0, 0, m_DisplayExtent.GetSize()[0], m_DisplayExtent.GetSize()[1]);
1225 glClearColor((
float) 0.0, (
float) 0.0, (
float) 0.0, (
float) 0.0);
1226 glShadeModel(GL_SMOOTH);
1227 glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
1230 glClear(GL_COLOR_BUFFER_BIT);
1231 glMatrixMode(GL_PROJECTION);
1233 glMatrixMode(GL_MODELVIEW);
1235 glDisable(GL_BLEND);
1237 glShadeModel(GL_SMOOTH);
1240 template <
class TPixel>
1247 if (channelIndex < m_MaxComponentValues.GetSize())
1249 max = m_MaxComponentValues[channelIndex];
1251 if (channelIndex < m_MinComponentValues.GetSize())
1253 min = m_MinComponentValues[channelIndex];
1260 else if (value <= min)
1266 return static_cast<unsigned char>(255. *
static_cast<double>(value - min)
1267 / static_cast<double>(max - min));
1273 template <
class TPixel>
1278 Superclass::PrintSelf(os, indent);