33 #include "dcmtk/config/osconfig.h"
34 #include "dcmtk/ofstd/ofbmanip.h"
36 #include "dcmtk/dcmimage/dicopx.h"
37 #include "dcmtk/dcmimgle/dipxrept.h"
43 inline Uint8 removeSign(
const Uint8 value,
const Uint8)
49 inline Uint16 removeSign(
const Uint16 value,
const Uint16)
55 inline Uint32 removeSign(
const Uint32 value,
const Uint32)
61 inline Uint8 removeSign(
const Sint8 value,
const Sint8 offset)
63 return OFstatic_cast(Uint8, OFstatic_cast(Sint16, value) + OFstatic_cast(Sint16, offset) + 1);
67 inline Uint16 removeSign(
const Sint16 value,
const Sint16 offset)
69 return OFstatic_cast(Uint16, OFstatic_cast(Sint32, value) + OFstatic_cast(Sint32, offset) + 1);
91 inline Uint32 removeSign(
const Sint32 value,
const Uint32 mask)
93 return OFstatic_cast(Uint32, value) ^ mask;
121 const Uint16 samples,
123 const Uint16 sample_rate = 0)
124 :
DiColorPixel(docu, pixel, samples, status, sample_rate)
156 return OFstatic_cast(
const void *,
Data);
166 return OFstatic_cast(
void *,
Data);
176 return OFstatic_cast(
void *,
Data);
190 const unsigned long count,
191 const unsigned long fcount,
192 const unsigned long frames,
193 const int planar)
const
195 OFBool result = OFFalse;
197 if ((data != NULL) && (count >=
Count * 3) && (frames > 0) && (frames * fcount <=
Count) &&
198 (
Data[0] != NULL) && (
Data[1] != NULL) && (
Data[2] != NULL))
200 register T *q = OFstatic_cast(T *, data);
202 register unsigned long k;
203 register unsigned long offset = 0;
207 for (k = 0; k < frames; ++k)
210 for (j = 0; j < 3; ++j)
218 register unsigned long i;
220 for (k = 0; k < frames; ++k)
223 for (i = 0; i < fcount; ++i)
225 for (j = 0; j < 3; ++j)
226 *(q++) =
Data[j][i + offset];
252 const unsigned long size,
255 const unsigned long frame,
259 const int upsideDown,
260 const int padding)
const
262 unsigned long bytes = 0;
263 if ((
Data[0] != NULL) && (
Data[1] != NULL) && (
Data[2] != NULL) && (toBits <= 8))
265 const unsigned long count = OFstatic_cast(
unsigned long, width) * OFstatic_cast(
unsigned long, height);
266 const unsigned long start = count * frame + ((upsideDown) ?
267 OFstatic_cast(
unsigned long, height - 1) * OFstatic_cast(
unsigned long, width) : 0);
268 const signed long nextRow = (upsideDown) ? -2 * OFstatic_cast(
signed long, width) : 0;
269 register const T *r =
Data[0] + start;
270 register const T *g =
Data[1] + start;
271 register const T *b =
Data[2] + start;
276 const unsigned long wid3 = OFstatic_cast(
unsigned long, width) * 3;
278 const int gap = (padding) ? OFstatic_cast(
int, (4 - (wid3 & 0x3)) & 0x3) : 0;
279 unsigned long fsize = (wid3 + gap) * OFstatic_cast(
unsigned long, height);
280 if ((data == NULL) || (size >= fsize))
283 data =
new Uint8[fsize];
286 register Uint8 *q = OFstatic_cast(Uint8 *, data);
287 if (fromBits == toBits)
290 for (y = height; y != 0; y--)
292 for (x = width; x != 0; x--)
295 *(q++) = OFstatic_cast(Uint8, *(b++));
296 *(q++) = OFstatic_cast(Uint8, *(g++));
297 *(q++) = OFstatic_cast(Uint8, *(r++));
299 r += nextRow; g += nextRow; b += nextRow;
303 else if (fromBits < toBits)
308 const Uint8 gradient2 = OFstatic_cast(Uint8, gradient1);
309 if (gradient1 == OFstatic_cast(
double, gradient2))
311 for (y = height; y != 0; y--)
313 for (x = width; x != 0; x--)
316 *(q++) = OFstatic_cast(Uint8, *(b++) * gradient2);
317 *(q++) = OFstatic_cast(Uint8, *(g++) * gradient2);
318 *(q++) = OFstatic_cast(Uint8, *(r++) * gradient2);
320 r += nextRow; g += nextRow; b += nextRow;
324 for (y = height; y != 0; y--)
326 for (x = width; x != 0; x--)
329 *(q++) = OFstatic_cast(Uint8, OFstatic_cast(
double, *(b++)) * gradient1);
330 *(q++) = OFstatic_cast(Uint8, OFstatic_cast(
double, *(g++)) * gradient1);
331 *(q++) = OFstatic_cast(Uint8, OFstatic_cast(
double, *(r++)) * gradient1);
333 r += nextRow; g += nextRow; b += nextRow;
341 const int shift = fromBits - toBits;
342 for (y = height; y != 0; y--)
344 for (x = width; x != 0; x--)
347 *(q++) = OFstatic_cast(Uint8, *(b++) >> shift);
348 *(q++) = OFstatic_cast(Uint8, *(g++) >> shift);
349 *(q++) = OFstatic_cast(Uint8, *(r++) >> shift);
351 r += nextRow; g += nextRow; b += nextRow;
361 const unsigned long fsize = count * 4;
362 if ((data == NULL) || (size >= fsize))
365 data =
new Uint32[count];
368 register Uint32 *q = OFstatic_cast(Uint32 *, data);
369 if (fromBits == toBits)
372 for (y = height; y != 0; y--)
374 for (x = width; x != 0; x--)
377 *(q++) = (OFstatic_cast(Uint32, *(r++)) << 16) |
378 (OFstatic_cast(Uint32, *(g++)) << 8) |
379 OFstatic_cast(Uint32, *(b++));
381 r += nextRow; g += nextRow; b += nextRow;
384 else if (fromBits < toBits)
389 const Uint32 gradient2 = OFstatic_cast(Uint32, gradient1);
390 if (gradient1 == OFstatic_cast(
double, gradient2))
392 for (y = height; y != 0; y--)
394 for (x = width; x != 0; x--)
397 *(q++) = (OFstatic_cast(Uint32, *(r++) * gradient2) << 16) |
398 (OFstatic_cast(Uint32, *(g++) * gradient2) << 8) |
399 OFstatic_cast(Uint32, *(b++) * gradient2);
401 r += nextRow; g += nextRow; b += nextRow;
404 for (y = height; y != 0; y--)
406 for (x = width; x != 0; x--)
409 *(q++) = (OFstatic_cast(Uint32, OFstatic_cast(
double, *(r++)) * gradient1) << 16) |
410 (OFstatic_cast(Uint32, OFstatic_cast(
double, *(g++)) * gradient1) << 8) |
411 OFstatic_cast(Uint32, OFstatic_cast(
double, *(b++)) * gradient1);
413 r += nextRow; g += nextRow; b += nextRow;
420 const int shift = fromBits - toBits;
421 for (y = height; y != 0; y--)
423 for (x = width; x != 0; x--)
426 *(q++) = (OFstatic_cast(Uint32, *(r++) >> shift) << 16) |
427 (OFstatic_cast(Uint32, *(g++) >> shift) << 8) |
428 OFstatic_cast(Uint32, *(b++) >> shift);
430 r += nextRow; g += nextRow; b += nextRow;
455 const unsigned long frame,
457 const int toBits)
const
460 unsigned long bytes = 0;
461 if ((
Data[0] != NULL) && (
Data[1] != NULL) && (
Data[2] != NULL) && (toBits <= 8))
463 const unsigned long count = OFstatic_cast(
unsigned long, width) * OFstatic_cast(
unsigned long, height);
464 data =
new Uint32[count];
467 const unsigned long start = count * frame;
468 register const T *r =
Data[0] + start;
469 register const T *g =
Data[1] + start;
470 register const T *b =
Data[2] + start;
471 register Uint32 *q = OFstatic_cast(Uint32 *, data);
472 register unsigned long i;
473 if (fromBits == toBits)
476 for (i = count; i != 0; --i)
479 *(q++) = (OFstatic_cast(Uint32, *(r++)) << 24) |
480 (OFstatic_cast(Uint32, *(g++)) << 16) |
481 (OFstatic_cast(Uint32, *(b++)) << 8);
484 else if (fromBits < toBits)
489 const Uint32 gradient2 = OFstatic_cast(Uint32, gradient1);
490 if (gradient1 == OFstatic_cast(
double, gradient2))
492 for (i = count; i != 0; --i)
495 *(q++) = (OFstatic_cast(Uint32, *(r++) * gradient2) << 24) |
496 (OFstatic_cast(Uint32, *(g++) * gradient2) << 16) |
497 (OFstatic_cast(Uint32, *(b++) * gradient2) << 8);
500 for (i = count; i != 0; --i)
503 *(q++) = (OFstatic_cast(Uint32, OFstatic_cast(
double, *(r++)) * gradient1) << 24) |
504 (OFstatic_cast(Uint32, OFstatic_cast(
double, *(g++)) * gradient1) << 16) |
505 (OFstatic_cast(Uint32, OFstatic_cast(
double, *(b++)) * gradient1) << 8);
512 const int shift = fromBits - toBits;
513 for (i = count; i != 0; --i)
516 *(q++) = (OFstatic_cast(Uint32, *(r++) >> shift) << 24) |
517 (OFstatic_cast(Uint32, *(g++) >> shift) << 16) |
518 (OFstatic_cast(Uint32, *(b++) >> shift) << 8);
536 const unsigned long count)
550 inline int Init(
const void *pixel)
557 for (
int j = 0; j < 3; j++)