18 #ifndef MAGICKCORE_QUANTUM_PRIVATE_H 19 #define MAGICKCORE_QUANTUM_PRIVATE_H 26 #if defined(__cplusplus) || defined(c_plusplus) 107 ((one << (
MagickMin(depth,max_depth)-1))-1)));
112 #define ExponentBias (127-15) 113 #define ExponentMask 0x7c00 114 #define ExponentShift 23 115 #define SignBitShift 31 116 #define SignificandShift 13 117 #define SignificandMask 0x00000400 119 typedef union _SinglePrecision
146 sign_bit=(
unsigned int) ((half >> 15) & 0x00000001);
147 exponent=(
unsigned int) ((half >> 10) & 0x0000001f);
148 significand=(
unsigned int) (half & 0x000003ff);
151 if (significand == 0)
171 if (significand != 0)
181 map.fixed_point=value;
182 return(map.single_precision);
198 quantum=(
unsigned int) pixel;
201 *pixels++=(
unsigned char) (quantum);
202 *pixels++=(
unsigned char) (quantum >> 8);
203 *pixels++=(
unsigned char) (quantum >> 16);
204 *pixels++=(
unsigned char) (quantum >> 24);
207 *pixels++=(
unsigned char) (quantum >> 24);
208 *pixels++=(
unsigned char) (quantum >> 16);
209 *pixels++=(
unsigned char) (quantum >> 8);
210 *pixels++=(
unsigned char) (quantum);
223 *pixels++=(
unsigned char) (quantum);
224 *pixels++=(
unsigned char) (quantum >> 8);
227 *pixels++=(
unsigned char) (quantum >> 8);
228 *pixels++=(
unsigned char) (quantum);
249 quantum=((
unsigned int) *pixels++);
250 quantum|=((
unsigned int) *pixels++ << 8);
251 quantum|=((
unsigned int) *pixels++ << 16);
252 quantum|=((
unsigned int) *pixels++ << 24);
256 quantum=((
unsigned int) *pixels++ << 24);
257 quantum|=((
unsigned int) *pixels++ << 16);
258 quantum|=((
unsigned int) *pixels++ << 8);
259 quantum|=((
unsigned int) *pixels++);
273 quantum=(
unsigned int) *pixels++;
274 quantum|=(
unsigned int) (*pixels++ << 8);
275 *pixel=(
unsigned short) (quantum & 0xffff);
278 quantum=(
unsigned int) (*pixels++ << 8);
279 quantum|=(
unsigned int) *pixels++;
280 *pixel=(
unsigned short) (quantum & 0xffff);
299 quantum.unsigned_value=((
unsigned int) *pixels++);
300 quantum.unsigned_value|=((
unsigned int) *pixels++ << 8);
301 quantum.unsigned_value|=((
unsigned int) *pixels++ << 16);
302 quantum.unsigned_value|=((
unsigned int) *pixels++ << 24);
303 *pixel=quantum.float_value;
306 quantum.unsigned_value=((
unsigned int) *pixels++ << 24);
307 quantum.unsigned_value|=((
unsigned int) *pixels++ << 16);
308 quantum.unsigned_value|=((
unsigned int) *pixels++ << 8);
309 quantum.unsigned_value|=((
unsigned int) *pixels++);
310 *pixel=quantum.float_value;
319 #if !defined(MAGICKCORE_HDRI_SUPPORT) 331 #if !defined(MAGICKCORE_HDRI_SUPPORT) 334 if ((
IsNaN(quantum) != 0) || (quantum <= 0.0))
336 if (((
double) range*quantum/
QuantumRange) >= 18446744073709551615.0)
342 #if (MAGICKCORE_QUANTUM_DEPTH == 8) 343 static inline Quantum ScaleCharToQuantum(
const unsigned char value)
348 static inline Quantum ScaleLongToQuantum(
const unsigned int value)
350 #if !defined(MAGICKCORE_HDRI_SUPPORT) 351 return((
Quantum) ((value)/16843009UL));
353 return((
Quantum) (value/16843009.0));
359 #if !defined(MAGICKCORE_HDRI_SUPPORT) 362 return((
Quantum) (value/72340172838076673.0));
372 #if !defined(MAGICKCORE_HDRI_SUPPORT) 379 static inline unsigned int ScaleQuantumToLong(
const Quantum quantum)
381 #if !defined(MAGICKCORE_HDRI_SUPPORT) 382 return((
unsigned int) (16843009UL*quantum));
384 if ((
IsNaN(quantum) != 0) || (quantum <= 0.0))
386 if ((16843009.0*quantum) >= 4294967295.0)
387 return(4294967295UL);
388 return((
unsigned int) (16843009.0*quantum+0.5));
394 #if !defined(MAGICKCORE_HDRI_SUPPORT) 397 if ((
IsNaN(quantum) != 0) || (quantum <= 0.0))
399 if ((72340172838076673.0*quantum) >= 18446744073709551615.0)
405 static inline unsigned int ScaleQuantumToMap(
const Quantum quantum)
408 return((
unsigned int)
MaxMap);
409 #if !defined(MAGICKCORE_HDRI_SUPPORT) 410 return((
unsigned int) quantum);
412 if ((
IsNaN(quantum) != 0) || (quantum <= 0.0))
414 return((
unsigned int) (quantum+0.5));
418 static inline unsigned short ScaleQuantumToShort(
const Quantum quantum)
420 #if !defined(MAGICKCORE_HDRI_SUPPORT) 421 return((
unsigned short) (257UL*quantum));
423 if ((
IsNaN(quantum) != 0) || (quantum <= 0.0))
425 if ((257.0*quantum) >= 65535.0)
427 return((
unsigned short) (257.0*quantum+0.5));
431 static inline Quantum ScaleShortToQuantum(
const unsigned short value)
433 #if !defined(MAGICKCORE_HDRI_SUPPORT) 434 return((
Quantum) ((value+128U)/257U));
436 return((
Quantum) (value/257.0));
439 #elif (MAGICKCORE_QUANTUM_DEPTH == 16) 440 static inline Quantum ScaleCharToQuantum(
const unsigned char value)
442 #if !defined(MAGICKCORE_HDRI_SUPPORT) 443 return((
Quantum) (257U*value));
445 return((
Quantum) (257.0*value));
449 static inline Quantum ScaleLongToQuantum(
const unsigned int value)
451 #if !defined(MAGICKCORE_HDRI_SUPPORT) 454 return((
Quantum) (value/65537.0));
460 #if !defined(MAGICKCORE_HDRI_SUPPORT) 463 return((
Quantum) (value/281479271743489.0));
473 #if !defined(MAGICKCORE_HDRI_SUPPORT) 480 static inline unsigned int ScaleQuantumToLong(
const Quantum quantum)
482 #if !defined(MAGICKCORE_HDRI_SUPPORT) 483 return((
unsigned int) (65537UL*quantum));
485 if ((
IsNaN(quantum) != 0) || (quantum <= 0.0))
487 if ((65537.0*quantum) >= 4294967295.0)
489 return((
unsigned int) (65537.0*quantum+0.5));
495 #if !defined(MAGICKCORE_HDRI_SUPPORT) 498 if ((
IsNaN(quantum) != 0) || (quantum <= 0.0))
500 if ((281479271743489.0*quantum) >= 18446744073709551615.0)
506 static inline unsigned int ScaleQuantumToMap(
const Quantum quantum)
509 return((
unsigned int)
MaxMap);
510 #if !defined(MAGICKCORE_HDRI_SUPPORT) 511 return((
unsigned int) quantum);
513 if ((
IsNaN(quantum) != 0) || (quantum <= 0.0))
515 return((
unsigned int) (quantum+0.5));
519 static inline unsigned short ScaleQuantumToShort(
const Quantum quantum)
521 #if !defined(MAGICKCORE_HDRI_SUPPORT) 522 return((
unsigned short) quantum);
524 if ((
IsNaN(quantum) != 0) || (quantum <= 0.0))
526 if (quantum >= 65535.0)
528 return((
unsigned short) (quantum+0.5));
532 static inline Quantum ScaleShortToQuantum(
const unsigned short value)
536 #elif (MAGICKCORE_QUANTUM_DEPTH == 32) 537 static inline Quantum ScaleCharToQuantum(
const unsigned char value)
539 #if !defined(MAGICKCORE_HDRI_SUPPORT) 540 return((
Quantum) (16843009UL*value));
542 return((
Quantum) (16843009.0*value));
546 static inline Quantum ScaleLongToQuantum(
const unsigned int value)
553 #if !defined(MAGICKCORE_HDRI_SUPPORT) 556 return((
Quantum) (value/4294967297.0));
566 #if !defined(MAGICKCORE_HDRI_SUPPORT) 567 return((
Quantum) (65537.0*value+0.5));
569 return((
Quantum) (65537.0*value));
573 static inline unsigned int ScaleQuantumToLong(
const Quantum quantum)
575 #if !defined(MAGICKCORE_HDRI_SUPPORT) 576 return((
unsigned int) quantum);
578 if ((
IsNaN(quantum) != 0) || (quantum <= 0.0))
580 if ((quantum) >= 4294967295.0)
582 return((
unsigned int) (quantum+0.5));
588 #if !defined(MAGICKCORE_HDRI_SUPPORT) 591 if ((
IsNaN(quantum) != 0) || (quantum <= 0.0))
593 if ((4294967297.0*quantum) >= 18446744073709551615.0)
599 static inline unsigned int ScaleQuantumToMap(
const Quantum quantum)
602 return((
unsigned int)
MaxMap);
603 #if !defined(MAGICKCORE_HDRI_SUPPORT) 607 if ((
IsNaN(quantum) != 0) || (quantum <= 0.0))
609 return((
unsigned int) (quantum/65537.0+0.5));
613 static inline unsigned short ScaleQuantumToShort(
const Quantum quantum)
615 #if !defined(MAGICKCORE_HDRI_SUPPORT) 619 if ((
IsNaN(quantum) != 0) || (quantum <= 0.0))
621 if ((quantum/65537.0) >= 65535.0)
623 return((
unsigned short) (quantum/65537.0+0.5));
627 static inline Quantum ScaleShortToQuantum(
const unsigned short value)
629 #if !defined(MAGICKCORE_HDRI_SUPPORT) 630 return((
Quantum) (65537UL*value));
632 return((
Quantum) (65537.0*value));
635 #elif (MAGICKCORE_QUANTUM_DEPTH == 64) 636 static inline Quantum ScaleCharToQuantum(
const unsigned char value)
638 return((
Quantum) (72340172838076673.0*value));
641 static inline Quantum ScaleLongToQuantum(
const unsigned int value)
643 return((
Quantum) (4294967297.0*value));
657 return((
Quantum) (281479271743489.0*value));
660 static inline unsigned int ScaleQuantumToLong(
const Quantum quantum)
662 return((
unsigned int) (quantum/4294967297.0+0.5));
667 #if !defined(MAGICKCORE_HDRI_SUPPORT) 670 if ((
IsNaN(quantum) != 0) || (quantum <= 0.0))
672 if (quantum >= 18446744073709551615.0)
678 static inline unsigned int ScaleQuantumToMap(
const Quantum quantum)
680 if ((
IsNaN(quantum) != 0) || (quantum <= 0.0))
682 if ((quantum/281479271743489.0) >=
MaxMap)
683 return((
unsigned int)
MaxMap);
684 return((
unsigned int) (quantum/281479271743489.0+0.5));
687 static inline unsigned short ScaleQuantumToShort(
const Quantum quantum)
689 if ((
IsNaN(quantum) != 0) || (quantum <= 0.0))
691 if ((quantum/281479271743489.0) >= 65535.0)
693 return((
unsigned short) (quantum/281479271743489.0+0.5));
696 static inline Quantum ScaleShortToQuantum(
const unsigned short value)
698 return((
Quantum) (281479271743489.0*value));
704 typedef union _SinglePrecision
733 map.single_precision=value;
734 sign_bit=(map.fixed_point >> 16) & 0x00008000;
736 significand=map.fixed_point & 0x007fffff;
743 return((
unsigned short) sign_bit);
744 significand=significand | 0x00800000;
745 shift=(int) (14-exponent);
746 significand=(
unsigned int) ((significand+((1 << (shift-1))-1)+
747 ((significand >> shift) & 0x01)) >> shift);
748 return((
unsigned short) (sign_bit | significand));
753 if (significand == 0)
758 half=(
unsigned short) (sign_bit | significand |
763 significand=significand+((significand >>
SignificandShift) & 0x01)+0x00000fff;
764 if ((significand & 0x00800000) != 0)
781 for (i=0; i < 10; i++)
785 half=(
unsigned short) (sign_bit | (exponent << 10) |
790 #if defined(__cplusplus) || defined(c_plusplus)
MagickDoubleType MagickRealType
static MagickSizeType GetQuantumRange(const size_t depth)
QuantumAlphaType alpha_type
#define MagickULLConstant(c)
MagickPrivate void ResetQuantumState(QuantumInfo *)
static const unsigned char * PushCharPixel(const unsigned char *magick_restrict pixels, unsigned char *magick_restrict pixel)
static const unsigned char * PushLongPixel(const EndianType endian, const unsigned char *magick_restrict pixels, unsigned int *magick_restrict pixel)
static const unsigned char * PushFloatPixel(const EndianType endian, const unsigned char *magick_restrict pixels, MagickFloatType *magick_restrict pixel)
static double PerceptibleReciprocal(const double x)
static Quantum ScaleAnyToQuantum(const QuantumAny quantum, const QuantumAny range)
static unsigned char * PopLongPixel(const EndianType endian, const unsigned int pixel, unsigned char *magick_restrict pixels)
static const unsigned char * PushShortPixel(const EndianType endian, const unsigned char *magick_restrict pixels, unsigned short *magick_restrict pixel)
SemaphoreInfo * semaphore
static float HalfToSinglePrecision(const unsigned short half)
const unsigned int * mask
static unsigned short SinglePrecisionToHalf(const float value)
struct _QuantumState QuantumState
static unsigned char * PopCharPixel(const unsigned char pixel, unsigned char *magick_restrict pixels)
static unsigned char * PopShortPixel(const EndianType endian, const unsigned short pixel, unsigned char *magick_restrict pixels)
static QuantumAny ScaleQuantumToAny(const Quantum quantum, const QuantumAny range)
MagickBooleanType min_is_white
MagickSizeType QuantumAny