18 #ifndef _MAGICKCORE_QUANTUM_PRIVATE_H
19 #define _MAGICKCORE_QUANTUM_PRIVATE_H
21 #if defined(__cplusplus) || defined(c_plusplus)
97 return((
MagickSizeType) ((one << (depth-1))+((one << (depth-1))-1)));
102 #define ExponentBias (127-15)
103 #define ExponentMask 0x7c00
104 #define ExponentShift 23
105 #define SignBitShift 31
106 #define SignificandShift 13
107 #define SignificandMask 0x00000400
109 typedef union _SinglePrecision
118 register unsigned int
136 sign_bit=(
unsigned int) ((half >> 15) & 0x00000001);
137 exponent=(
unsigned int) ((half >> 10) & 0x0000001f);
138 significand=(
unsigned int) (half & 0x000003ff);
141 if (significand == 0)
151 significand&=(~SignificandMask);
153 value=(sign_bit << SignBitShift) | (exponent <<
ExponentShift) |
161 if (significand != 0)
171 map.fixed_point=value;
172 return(map.single_precision);
176 unsigned char *pixels)
183 const unsigned int pixel,
unsigned char *pixels)
185 register unsigned int
188 quantum=(
unsigned int) pixel;
191 *pixels++=(
unsigned char) (quantum);
192 *pixels++=(
unsigned char) (quantum >> 8);
193 *pixels++=(
unsigned char) (quantum >> 16);
194 *pixels++=(
unsigned char) (quantum >> 24);
197 *pixels++=(
unsigned char) (quantum >> 24);
198 *pixels++=(
unsigned char) (quantum >> 16);
199 *pixels++=(
unsigned char) (quantum >> 8);
200 *pixels++=(
unsigned char) (quantum);
205 const unsigned short pixel,
unsigned char *pixels)
207 register unsigned int
213 *pixels++=(
unsigned char) (quantum);
214 *pixels++=(
unsigned char) (quantum >> 8);
217 *pixels++=(
unsigned char) (quantum >> 8);
218 *pixels++=(
unsigned char) (quantum);
222 static inline const unsigned char *
PushCharPixel(
const unsigned char *pixels,
223 unsigned char *pixel)
230 const unsigned char *pixels,
unsigned int *pixel)
232 register unsigned int
237 quantum=(
unsigned int) (*pixels++);
238 quantum|=(
unsigned int) (*pixels++ << 8);
239 quantum|=(
unsigned int) (*pixels++ << 16);
240 quantum|=(
unsigned int) (*pixels++ << 24);
241 *pixel=(
unsigned int) (quantum & 0xffffffff);
244 quantum=(
unsigned int) (*pixels++ << 24);
245 quantum|=(
unsigned int) (*pixels++ << 16);
246 quantum|=(
unsigned int) (*pixels++ << 8);
247 quantum|=(
unsigned int) (*pixels++);
248 *pixel=(
unsigned int) (quantum & 0xffffffff);
253 const unsigned char *pixels,
unsigned short *pixel)
255 register unsigned int
260 quantum=(
unsigned int) *pixels++;
261 quantum|=(
unsigned int) (*pixels++ << 8);
262 *pixel=(
unsigned short) (quantum & 0xffff);
265 quantum=(
unsigned int) (*pixels++ << 8);
266 quantum|=(
unsigned int) *pixels++;
267 *pixel=(
unsigned short) (quantum & 0xffff);
274 #if !defined(MAGICKCORE_HDRI_SUPPORT)
287 #if (MAGICKCORE_QUANTUM_DEPTH == 8)
288 static inline Quantum ScaleCharToQuantum(
const unsigned char value)
293 static inline Quantum ScaleLongToQuantum(
const unsigned int value)
295 #if !defined(MAGICKCORE_HDRI_SUPPORT)
296 return((
Quantum) ((value+8421504UL)/16843009UL));
298 return((
Quantum) (value/16843009.0));
308 #if !defined(MAGICKCORE_HDRI_SUPPORT)
315 static inline unsigned int ScaleQuantumToLong(
const Quantum quantum)
317 #if !defined(MAGICKCORE_HDRI_SUPPORT)
318 return((
unsigned int) (16843009UL*quantum));
322 if ((16843009.0*quantum) >= 4294967295.0)
323 return(4294967295UL);
324 return((
unsigned int) (16843009.0*quantum+0.5));
328 static inline unsigned int ScaleQuantumToMap(
const Quantum quantum)
331 return((
unsigned int) MaxMap);
332 #if !defined(MAGICKCORE_HDRI_SUPPORT)
333 return((
unsigned int) quantum);
337 return((
unsigned int) (quantum+0.5));
341 static inline unsigned short ScaleQuantumToShort(
const Quantum quantum)
343 #if !defined(MAGICKCORE_HDRI_SUPPORT)
344 return((
unsigned short) (257UL*quantum));
348 if ((257.0*quantum) >= 65535.0)
350 return((
unsigned short) (257.0*quantum+0.5));
354 static inline Quantum ScaleShortToQuantum(
const unsigned short value)
356 #if !defined(MAGICKCORE_HDRI_SUPPORT)
357 return((
Quantum) ((value+128U)/257U));
359 return((
Quantum) (value/257.0));
362 #elif (MAGICKCORE_QUANTUM_DEPTH == 16)
363 static inline Quantum ScaleCharToQuantum(
const unsigned char value)
365 #if !defined(MAGICKCORE_HDRI_SUPPORT)
366 return((
Quantum) (257U*value));
368 return((
Quantum) (257.0*value));
372 static inline Quantum ScaleLongToQuantum(
const unsigned int value)
374 #if !defined(MAGICKCORE_HDRI_SUPPORT)
378 return((
Quantum) (value/65537.0));
388 #if !defined(MAGICKCORE_HDRI_SUPPORT)
395 static inline unsigned int ScaleQuantumToLong(
const Quantum quantum)
397 #if !defined(MAGICKCORE_HDRI_SUPPORT)
398 return((
unsigned int) (65537UL*quantum));
402 if ((65537.0*quantum) >= 4294967295.0)
404 return((
unsigned int) (65537.0*quantum+0.5));
408 static inline unsigned int ScaleQuantumToMap(
const Quantum quantum)
410 if (quantum >= (
Quantum) MaxMap)
411 return((
unsigned int) MaxMap);
412 #if !defined(MAGICKCORE_HDRI_SUPPORT)
413 return((
unsigned int) quantum);
417 return((
unsigned int) (quantum+0.5));
421 static inline unsigned short ScaleQuantumToShort(
const Quantum quantum)
423 #if !defined(MAGICKCORE_HDRI_SUPPORT)
424 return((
unsigned short) quantum);
428 if (quantum >= 65535.0)
430 return((
unsigned short) (quantum+0.5));
434 static inline Quantum ScaleShortToQuantum(
const unsigned short value)
438 #elif (MAGICKCORE_QUANTUM_DEPTH == 32)
439 static inline Quantum ScaleCharToQuantum(
const unsigned char value)
441 #if !defined(MAGICKCORE_HDRI_SUPPORT)
442 return((
Quantum) (16843009UL*value));
444 return((
Quantum) (16843009.0*value));
448 static inline Quantum ScaleLongToQuantum(
const unsigned int value)
459 #if !defined(MAGICKCORE_HDRI_SUPPORT)
460 return((
Quantum) (65537.0*value+0.5));
462 return((
Quantum) (65537.0*value));
466 static inline unsigned int ScaleQuantumToLong(
const Quantum quantum)
468 #if !defined(MAGICKCORE_HDRI_SUPPORT)
469 return((
unsigned int) quantum);
471 return((
unsigned int) (quantum+0.5));
475 static inline unsigned int ScaleQuantumToMap(
const Quantum quantum)
479 if ((quantum/65537) >= (
Quantum) MaxMap)
480 return((
unsigned int) MaxMap);
481 #if !defined(MAGICKCORE_HDRI_SUPPORT)
485 return((
unsigned int) (quantum/65537.0+0.5));
489 static inline unsigned short ScaleQuantumToShort(
const Quantum quantum)
491 #if !defined(MAGICKCORE_HDRI_SUPPORT)
497 if ((quantum/65537.0) >= 65535.0)
499 return((
unsigned short) (quantum/65537.0+0.5));
503 static inline Quantum ScaleShortToQuantum(
const unsigned short value)
505 #if !defined(MAGICKCORE_HDRI_SUPPORT)
506 return((
Quantum) (65537UL*value));
508 return((
Quantum) (65537.0*value));
511 #elif (MAGICKCORE_QUANTUM_DEPTH == 64)
512 static inline Quantum ScaleCharToQuantum(
const unsigned char value)
514 return((
Quantum) (72340172838076673.0*value));
517 static inline Quantum ScaleLongToQuantum(
const unsigned int value)
519 return((
Quantum) (4294967297.0*value));
528 return((
Quantum) (281479271743489.0*value));
531 static inline unsigned int ScaleQuantumToLong(
const Quantum quantum)
533 return((
unsigned int) (quantum/4294967297.0+0.5));
536 static inline unsigned int ScaleQuantumToMap(
const Quantum quantum)
540 if ((quantum/281479271743489.0) >= MaxMap)
541 return((
unsigned int) MaxMap);
542 return((
unsigned int) (quantum/281479271743489.0+0.5));
545 static inline unsigned short ScaleQuantumToShort(
const Quantum quantum)
549 if ((quantum/281479271743489.0) >= 65535.0)
551 return((
unsigned short) (quantum/281479271743489.0+0.5));
554 static inline Quantum ScaleShortToQuantum(
const unsigned short value)
556 return((
Quantum) (281479271743489.0*value));
562 typedef union _SinglePrecision
574 register unsigned int
591 map.single_precision=value;
592 sign_bit=(map.fixed_point >> 16) & 0x00008000;
594 significand=map.fixed_point & 0x007fffff;
601 return((
unsigned short) sign_bit);
602 significand=significand | 0x00800000;
603 shift=(int) (14-exponent);
604 significand=(
unsigned int) ((significand+((1 << (shift-1))-1)+
605 ((significand >> shift) & 0x01)) >> shift);
606 return((
unsigned short) (sign_bit | significand));
611 if (significand == 0)
616 half=(
unsigned short) (sign_bit | significand |
621 significand=significand+((significand >>
SignificandShift) & 0x01)+0x00000fff;
622 if ((significand & 0x00800000) != 0)
639 for (i=0; i < 10; i++)
643 half=(
unsigned short) (sign_bit | (exponent << 10) |
648 #if defined(__cplusplus) || defined(c_plusplus)