1 #include "vvImageMapToWLColors.h"
2 #include "clitkCommon.h"
3 #include "vtkDataArray.h"
4 #include "vtkImageData.h"
5 #include "vtkInformation.h"
6 #include "vtkInformationVector.h"
7 #include "vtkObjectFactory.h"
8 #include "vtkScalarsToColors.h"
9 #include "vtkPointData.h"
10 #include <vtkObjectFactory.h>
12 vtkStandardNewMacro(vvImageMapToWLColors);
14 vvImageMapToWLColors::vvImageMapToWLColors() :
19 void vtkImageMapToWindowLevelClamps ( vtkImageData *data, double w,
20 double l, T& lower, T& upper,
21 unsigned char &lower_val,
22 unsigned char &upper_val)
24 double f_lower, f_upper, f_lower_val, f_upper_val;
25 double adjustedLower, adjustedUpper;
28 data->GetPointData()->GetScalars()->GetDataTypeRange( range );
30 f_lower = l - fabs(w) / 2.0;
31 f_upper = f_lower + fabs(w);
33 // Set the correct lower value
34 if ( f_lower <= range[1])
36 if (f_lower >= range[0])
38 lower = static_cast<T>(f_lower);
39 adjustedLower = f_lower;
43 lower = static_cast<T>(range[0]);
44 adjustedLower = range[0];
49 lower = static_cast<T>(range[1]);
50 adjustedLower = range[1];
53 // Set the correct upper value
54 if ( f_upper >= range[0])
56 if (f_upper <= range[1])
58 upper = static_cast<T>(f_upper);
59 adjustedUpper = f_upper;
63 upper = static_cast<T>(range[1]);
64 adjustedUpper = range[1];
69 upper = static_cast<T>(range[0]);
70 adjustedUpper = range [0];
73 // now compute the lower and upper values
76 f_lower_val = 255.0*(adjustedLower - f_lower)/w;
77 f_upper_val = 255.0*(adjustedUpper - f_lower)/w;
81 f_lower_val = 255.0 + 255.0*(adjustedLower - f_lower)/w;
82 f_upper_val = 255.0 + 255.0*(adjustedUpper - f_lower)/w;
85 if (f_upper_val > 255)
89 else if (f_upper_val < 0)
95 upper_val = static_cast<unsigned char>(f_upper_val);
98 if (f_lower_val > 255)
102 else if (f_lower_val < 0)
108 lower_val = static_cast<unsigned char>(f_lower_val);
113 void vvImageMapToWindowLevelColorsExecute(
114 vtkImageMapToWindowLevelColors *self,
115 vtkImageData *inData, T *inPtr,
116 vtkImageData *outData,
117 unsigned char *outPtr,
118 int outExt[6], int id, bool wl_mode)
120 int idxX, idxY, idxZ;
121 int extX, extY, extZ;
122 vtkIdType inIncX, inIncY, inIncZ;
123 vtkIdType outIncX, outIncY, outIncZ;
124 unsigned long count = 0;
125 unsigned long target;
126 int dataType = inData->GetScalarType();
127 int numberOfComponents,numberOfOutputComponents,outputFormat;
129 vtkScalarsToColors *lookupTable = self->GetLookupTable();
130 unsigned char *outPtr1;
134 double shift = self->GetWindow() / 2.0 - self->GetLevel();
135 double scale = 255.0 / self->GetWindow();
138 unsigned char lower_val, upper_val, result_val;
139 vtkImageMapToWindowLevelClamps( inData, self->GetWindow(),
141 lower, upper, lower_val, upper_val );
143 // find the region to loop over
144 extX = outExt[1] - outExt[0] + 1;
145 extY = outExt[3] - outExt[2] + 1;
146 extZ = outExt[5] - outExt[4] + 1;
148 target = static_cast<unsigned long>(extZ*extY/50.0);
151 // Get increments to march through data
152 inData->GetContinuousIncrements(outExt, inIncX, inIncY, inIncZ);
154 outData->GetContinuousIncrements(outExt, outIncX, outIncY, outIncZ);
155 numberOfComponents = inData->GetNumberOfScalarComponents();
156 numberOfOutputComponents = outData->GetNumberOfScalarComponents();
157 outputFormat = self->GetOutputFormat();
159 rowLength = extX*numberOfComponents;
161 // Loop through output pixels
164 for (idxZ = 0; idxZ < extZ; idxZ++)
166 for (idxY = 0; !self->AbortExecute && idxY < extY; idxY++)
172 self->UpdateProgress(count/(50.0*target));
182 lookupTable->MapScalarsThroughTable2(
184 static_cast<unsigned char *>(outPtr1),
185 dataType,extX,numberOfComponents,
189 unsigned short ushort_val;
190 for (idxX = 0; idxX < extX; idxX++)
194 ushort_val = lower_val;
196 else if (*iptr >= upper)
198 ushort_val = upper_val;
202 ushort_val = static_cast<unsigned char>((*iptr + shift)*scale);
204 *optr = static_cast<unsigned char>((*optr * ushort_val) >> 8);
205 switch (outputFormat)
208 *(optr+1) = static_cast<unsigned char>(
209 (*(optr+1) * ushort_val) >> 8);
210 *(optr+2) = static_cast<unsigned char>(
211 (*(optr+2) * ushort_val) >> 8);
215 *(optr+1) = static_cast<unsigned char>(
216 (*(optr+1) * ushort_val) >> 8);
217 *(optr+2) = static_cast<unsigned char>(
218 (*(optr+2) * ushort_val) >> 8);
220 case VTK_LUMINANCE_ALPHA:
224 iptr += numberOfComponents;
225 optr += numberOfOutputComponents;
231 for (idxX = 0; idxX < extX; idxX++)
235 result_val = lower_val;
237 else if (*iptr >= upper)
239 result_val = upper_val;
243 result_val = static_cast<unsigned char>((*iptr + shift)*scale);
246 switch (outputFormat)
249 *(optr+1) = result_val;
250 *(optr+2) = result_val;
254 *(optr+1) = result_val;
255 *(optr+2) = result_val;
257 case VTK_LUMINANCE_ALPHA:
261 iptr += numberOfComponents;
262 optr += numberOfOutputComponents;
265 outPtr1 += outIncY + extX*numberOfOutputComponents;
266 inPtr1 += inIncY + rowLength;
274 void vvImageMapToWLColors::ThreadedRequestData(
275 vtkInformation *vtkNotUsed(request),
276 vtkInformationVector **vtkNotUsed(inputVector),
277 vtkInformationVector *vtkNotUsed(outputVector),
278 vtkImageData ***inData,
279 vtkImageData **outData,
280 int outExt[6], int id)
282 void *inPtr = inData[0][0]->GetScalarPointerForExtent(outExt);
283 void *outPtr = outData[0]->GetScalarPointerForExtent(outExt);
285 switch (inData[0][0]->GetScalarType())
288 vvImageMapToWindowLevelColorsExecute(this,
290 static_cast<VTK_TT *>(inPtr),
292 static_cast<unsigned char *>(outPtr),
296 vtkErrorMacro(<< "Execute: Unknown ScalarType");