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
128 register unsigned int
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)
161 significand&=(~SignificandMask);
171 if (significand != 0)
181 map.fixed_point=value;
182 return(map.single_precision);
186 unsigned char *pixels)
193 const unsigned int pixel,
unsigned char *pixels)
195 register unsigned int
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);
215 const unsigned short pixel,
unsigned char *pixels)
217 register unsigned int
223 *pixels++=(
unsigned char) (quantum);
224 *pixels++=(
unsigned char) (quantum >> 8);
227 *pixels++=(
unsigned char) (quantum >> 8);
228 *pixels++=(
unsigned char) (quantum);
232 static inline const unsigned char *
PushCharPixel(
const unsigned char *pixels,
233 unsigned char *pixel)
240 const unsigned char *pixels,
unsigned int *pixel)
242 register unsigned int
247 quantum=((
unsigned int) *pixels++);
248 quantum|=((
unsigned int) *pixels++ << 8);
249 quantum|=((
unsigned int) *pixels++ << 16);
250 quantum|=((
unsigned int) *pixels++ << 24);
254 quantum=((
unsigned int) *pixels++ << 24);
255 quantum|=((
unsigned int) *pixels++ << 16);
256 quantum|=((
unsigned int) *pixels++ << 8);
257 quantum|=((
unsigned int) *pixels++);
263 const unsigned char *pixels,
unsigned short *pixel)
265 register unsigned int
270 quantum=(
unsigned int) *pixels++;
271 quantum|=(
unsigned int) (*pixels++ << 8);
272 *pixel=(
unsigned short) (quantum & 0xffff);
275 quantum=(
unsigned int) (*pixels++ << 8);
276 quantum|=(
unsigned int) *pixels++;
277 *pixel=(
unsigned short) (quantum & 0xffff);
295 quantum.unsigned_value=((
unsigned int) *pixels++);
296 quantum.unsigned_value|=((
unsigned int) *pixels++ << 8);
297 quantum.unsigned_value|=((
unsigned int) *pixels++ << 16);
298 quantum.unsigned_value|=((
unsigned int) *pixels++ << 24);
299 *pixel=quantum.float_value;
302 quantum.unsigned_value=((
unsigned int) *pixels++ << 24);
303 quantum.unsigned_value|=((
unsigned int) *pixels++ << 16);
304 quantum.unsigned_value|=((
unsigned int) *pixels++ << 8);
305 quantum.unsigned_value|=((
unsigned int) *pixels++);
306 *pixel=quantum.float_value;
315 #if !defined(MAGICKCORE_HDRI_SUPPORT)
327 #if !defined(MAGICKCORE_HDRI_SUPPORT)
332 if (((
double) range*quantum/
QuantumRange) >= 18446744073709551615.0)
338 #if (MAGICKCORE_QUANTUM_DEPTH == 8)
339 static inline Quantum ScaleCharToQuantum(
const unsigned char value)
344 static inline Quantum ScaleLongToQuantum(
const unsigned int value)
346 #if !defined(MAGICKCORE_HDRI_SUPPORT)
347 return((
Quantum) ((value)/16843009UL));
349 return((
Quantum) (value/16843009.0));
355 #if !defined(MAGICKCORE_HDRI_SUPPORT)
358 return((
Quantum) (value/72340172838076673.0));
368 #if !defined(MAGICKCORE_HDRI_SUPPORT)
375 static inline unsigned int ScaleQuantumToLong(
const Quantum quantum)
377 #if !defined(MAGICKCORE_HDRI_SUPPORT)
378 return((
unsigned int) (16843009UL*quantum));
382 if ((16843009.0*quantum) >= 4294967295.0)
383 return(4294967295UL);
384 return((
unsigned int) (16843009.0*quantum+0.5));
390 #if !defined(MAGICKCORE_HDRI_SUPPORT)
395 if ((72340172838076673.0*quantum) >= 18446744073709551615.0)
401 static inline unsigned int ScaleQuantumToMap(
const Quantum quantum)
404 return((
unsigned int) MaxMap);
405 #if !defined(MAGICKCORE_HDRI_SUPPORT)
406 return((
unsigned int) quantum);
410 return((
unsigned int) (quantum+0.5));
414 static inline unsigned short ScaleQuantumToShort(
const Quantum quantum)
416 #if !defined(MAGICKCORE_HDRI_SUPPORT)
417 return((
unsigned short) (257UL*quantum));
421 if ((257.0*quantum) >= 65535.0)
423 return((
unsigned short) (257.0*quantum+0.5));
427 static inline Quantum ScaleShortToQuantum(
const unsigned short value)
429 #if !defined(MAGICKCORE_HDRI_SUPPORT)
430 return((
Quantum) ((value+128U)/257U));
432 return((
Quantum) (value/257.0));
435 #elif (MAGICKCORE_QUANTUM_DEPTH == 16)
436 static inline Quantum ScaleCharToQuantum(
const unsigned char value)
438 #if !defined(MAGICKCORE_HDRI_SUPPORT)
439 return((
Quantum) (257U*value));
441 return((
Quantum) (257.0*value));
445 static inline Quantum ScaleLongToQuantum(
const unsigned int value)
447 #if !defined(MAGICKCORE_HDRI_SUPPORT)
450 return((
Quantum) (value/65537.0));
456 #if !defined(MAGICKCORE_HDRI_SUPPORT)
459 return((
Quantum) (value/281479271743489.0));
469 #if !defined(MAGICKCORE_HDRI_SUPPORT)
476 static inline unsigned int ScaleQuantumToLong(
const Quantum quantum)
478 #if !defined(MAGICKCORE_HDRI_SUPPORT)
479 return((
unsigned int) (65537UL*quantum));
483 if ((65537.0*quantum) >= 4294967295.0)
485 return((
unsigned int) (65537.0*quantum+0.5));
491 #if !defined(MAGICKCORE_HDRI_SUPPORT)
496 if ((281479271743489.0*quantum) >= 18446744073709551615.0)
502 static inline unsigned int ScaleQuantumToMap(
const Quantum quantum)
504 if (quantum >= (
Quantum) MaxMap)
505 return((
unsigned int) MaxMap);
506 #if !defined(MAGICKCORE_HDRI_SUPPORT)
507 return((
unsigned int) quantum);
511 return((
unsigned int) (quantum+0.5));
515 static inline unsigned short ScaleQuantumToShort(
const Quantum quantum)
517 #if !defined(MAGICKCORE_HDRI_SUPPORT)
518 return((
unsigned short) quantum);
522 if (quantum >= 65535.0)
524 return((
unsigned short) (quantum+0.5));
528 static inline Quantum ScaleShortToQuantum(
const unsigned short value)
532 #elif (MAGICKCORE_QUANTUM_DEPTH == 32)
533 static inline Quantum ScaleCharToQuantum(
const unsigned char value)
535 #if !defined(MAGICKCORE_HDRI_SUPPORT)
536 return((
Quantum) (16843009UL*value));
538 return((
Quantum) (16843009.0*value));
542 static inline Quantum ScaleLongToQuantum(
const unsigned int value)
549 #if !defined(MAGICKCORE_HDRI_SUPPORT)
552 return((
Quantum) (value/4294967297.0));
562 #if !defined(MAGICKCORE_HDRI_SUPPORT)
563 return((
Quantum) (65537.0*value+0.5));
565 return((
Quantum) (65537.0*value));
569 static inline unsigned int ScaleQuantumToLong(
const Quantum quantum)
571 #if !defined(MAGICKCORE_HDRI_SUPPORT)
572 return((
unsigned int) quantum);
576 if ((quantum) >= 4294967295.0)
578 return((
unsigned int) (quantum+0.5));
584 #if !defined(MAGICKCORE_HDRI_SUPPORT)
589 if ((4294967297.0*quantum) >= 18446744073709551615.0)
595 static inline unsigned int ScaleQuantumToMap(
const Quantum quantum)
597 if ((quantum/65537) >= (
Quantum) MaxMap)
598 return((
unsigned int) MaxMap);
599 #if !defined(MAGICKCORE_HDRI_SUPPORT)
605 return((
unsigned int) (quantum/65537.0+0.5));
609 static inline unsigned short ScaleQuantumToShort(
const Quantum quantum)
611 #if !defined(MAGICKCORE_HDRI_SUPPORT)
617 if ((quantum/65537.0) >= 65535.0)
619 return((
unsigned short) (quantum/65537.0+0.5));
623 static inline Quantum ScaleShortToQuantum(
const unsigned short value)
625 #if !defined(MAGICKCORE_HDRI_SUPPORT)
626 return((
Quantum) (65537UL*value));
628 return((
Quantum) (65537.0*value));
631 #elif (MAGICKCORE_QUANTUM_DEPTH == 64)
632 static inline Quantum ScaleCharToQuantum(
const unsigned char value)
634 return((
Quantum) (72340172838076673.0*value));
637 static inline Quantum ScaleLongToQuantum(
const unsigned int value)
639 return((
Quantum) (4294967297.0*value));
653 return((
Quantum) (281479271743489.0*value));
656 static inline unsigned int ScaleQuantumToLong(
const Quantum quantum)
658 return((
unsigned int) (quantum/4294967297.0+0.5));
663 #if !defined(MAGICKCORE_HDRI_SUPPORT)
668 if (quantum >= 18446744073709551615.0)
674 static inline unsigned int ScaleQuantumToMap(
const Quantum quantum)
678 if ((quantum/281479271743489.0) >= MaxMap)
679 return((
unsigned int) MaxMap);
680 return((
unsigned int) (quantum/281479271743489.0+0.5));
683 static inline unsigned short ScaleQuantumToShort(
const Quantum quantum)
687 if ((quantum/281479271743489.0) >= 65535.0)
689 return((
unsigned short) (quantum/281479271743489.0+0.5));
692 static inline Quantum ScaleShortToQuantum(
const unsigned short value)
694 return((
Quantum) (281479271743489.0*value));
700 typedef union _SinglePrecision
712 register unsigned int
729 map.single_precision=value;
730 sign_bit=(map.fixed_point >> 16) & 0x00008000;
732 significand=map.fixed_point & 0x007fffff;
739 return((
unsigned short) sign_bit);
740 significand=significand | 0x00800000;
741 shift=(int) (14-exponent);
742 significand=(
unsigned int) ((significand+((1 << (shift-1))-1)+
743 ((significand >> shift) & 0x01)) >> shift);
744 return((
unsigned short) (sign_bit | significand));
749 if (significand == 0)
754 half=(
unsigned short) (sign_bit | significand |
759 significand=significand+((significand >>
SignificandShift) & 0x01)+0x00000fff;
760 if ((significand & 0x00800000) != 0)
777 for (i=0; i < 10; i++)
781 half=(
unsigned short) (sign_bit | (exponent << 10) |
786 #if defined(__cplusplus) || defined(c_plusplus)
MagickDoubleType MagickRealType
Definition: magick-type.h:120
QuantumFormatType
Definition: quantum.h:43
QuantumFormatType format
Definition: quantum-private.h:52
static MagickSizeType GetQuantumRange(const size_t depth)
Definition: quantum-private.h:94
MemoryInfo ** pixels
Definition: quantum-private.h:73
QuantumAlphaType alpha_type
Definition: quantum-private.h:67
size_t signature
Definition: quantum-private.h:88
#define MagickULLConstant(c)
Definition: magick-type.h:36
MagickPrivate void ResetQuantumState(QuantumInfo *)
Definition: quantum.c:579
QuantumState state
Definition: quantum-private.h:82
size_t depth
Definition: quantum-private.h:48
float MagickFloatType
Definition: magick-type.h:40
double minimum
Definition: quantum-private.h:55
EndianType
Definition: quantum.h:29
size_t quantum
Definition: quantum-private.h:48
EndianType endian
Definition: quantum-private.h:79
static const unsigned char * PushShortPixel(const EndianType endian, const unsigned char *pixels, unsigned short *pixel)
Definition: quantum-private.h:262
MagickBooleanType pack
Definition: quantum-private.h:63
static const unsigned char * PushCharPixel(const unsigned char *pixels, unsigned char *pixel)
Definition: quantum-private.h:232
MagickBooleanType
Definition: magick-type.h:158
static double PerceptibleReciprocal(const double x)
Definition: pixel-accessor.h:224
static Quantum ScaleAnyToQuantum(const QuantumAny quantum, const QuantumAny range)
Definition: quantum-private.h:310
static unsigned char * PopLongPixel(const EndianType endian, const unsigned int pixel, unsigned char *pixels)
Definition: quantum-private.h:192
unsigned int pixel
Definition: quantum-private.h:36
size_t MagickSizeType
Definition: magick-type.h:130
static const unsigned char * PushLongPixel(const EndianType endian, const unsigned char *pixels, unsigned int *pixel)
Definition: quantum-private.h:239
SemaphoreInfo * semaphore
Definition: quantum-private.h:85
#define MaxMap
Definition: magick-type.h:75
Definition: quantum-private.h:45
size_t pad
Definition: quantum-private.h:60
#define IsNaN(a)
Definition: magick-type.h:181
static float HalfToSinglePrecision(const unsigned short half)
Definition: quantum-private.h:110
size_t number_threads
Definition: quantum-private.h:70
double scale
Definition: quantum-private.h:55
Definition: magick-type.h:160
const unsigned int * mask
Definition: quantum-private.h:42
unsigned short Quantum
Definition: magick-type.h:82
size_t bits
Definition: quantum-private.h:39
size_t extent
Definition: quantum-private.h:76
static unsigned char * PopCharPixel(const unsigned char pixel, unsigned char *pixels)
Definition: quantum-private.h:185
static unsigned char * PopShortPixel(const EndianType endian, const unsigned short pixel, unsigned char *pixels)
Definition: quantum-private.h:214
#define MagickMin(x, y)
Definition: image-private.h:27
double inverse_scale
Definition: quantum-private.h:33
static unsigned short SinglePrecisionToHalf(const float value)
Definition: quantum-private.h:698
#define MagickPrivate
Definition: method-attribute.h:81
struct _QuantumState QuantumState
double maximum
Definition: quantum-private.h:55
static QuantumAny ScaleQuantumToAny(const Quantum quantum, const QuantumAny range)
Definition: quantum-private.h:324
MagickBooleanType min_is_white
Definition: quantum-private.h:63
Definition: quantum-private.h:30
MagickSizeType QuantumAny
Definition: magick-type.h:144
QuantumAlphaType
Definition: quantum.h:36
Definition: semaphore.c:59
#define QuantumRange
Definition: magick-type.h:83
static const unsigned char * PushFloatPixel(const EndianType endian, const unsigned char *pixels, MagickFloatType *pixel)
Definition: quantum-private.h:281