18#ifndef MAGICKCORE_QUANTUM_PRIVATE_H
19#define MAGICKCORE_QUANTUM_PRIVATE_H
21#include "magick/memory_.h"
22#include "magick/cache.h"
23#include "magick/image-private.h"
24#include "magick/pixel-accessor.h"
25#include "magick/statistic-private.h"
27#if defined(__cplusplus) || defined(c_plusplus)
92extern MagickPrivate
void
93 ResetQuantumState(QuantumInfo *);
95static inline MagickSizeType GetQuantumRange(
const size_t depth)
106 max_depth=8*
sizeof(MagickSizeType);
107 return((MagickSizeType) ((one << (MagickMin(depth,max_depth)-1))+
108 ((one << (MagickMin(depth,max_depth)-1))-1)));
111static inline float HalfToSinglePrecision(
const unsigned short half)
113#define ExponentBias (127-15)
114#define ExponentMask (0x7c00U)
115#define ExponentShift 23
116#define SignBitShift 31
117#define SignificandShift 13
118#define SignificandMask (0x00000400U)
120 typedef union _SinglePrecision
147 sign_bit=(
unsigned int) ((half >> 15) & 0x00000001);
148 exponent=(
unsigned int) ((half >> 10) & 0x0000001f);
149 significand=(
unsigned int) (half & 0x000003ff);
152 if (significand == 0)
153 value=sign_bit << SignBitShift;
156 while ((significand & SignificandMask) == 0)
162 significand&=(~SignificandMask);
163 exponent+=ExponentBias;
164 value=(sign_bit << SignBitShift) | (exponent << ExponentShift) |
165 (significand << SignificandShift);
169 if (exponent == SignBitShift)
171 value=(sign_bit << SignBitShift) | 0x7f800000;
172 if (significand != 0)
173 value|=(significand << SignificandShift);
177 exponent+=ExponentBias;
178 significand<<=SignificandShift;
179 value=(sign_bit << SignBitShift) | (exponent << ExponentShift) |
182 map.fixed_point=value;
183 return(map.single_precision);
186static inline unsigned char *PopCharPixel(
const unsigned char pixel,
187 unsigned char *magick_restrict pixels)
193static inline unsigned char *PopLongPixel(
const EndianType endian,
194 const unsigned int pixel,
unsigned char *magick_restrict pixels)
199 quantum=(
unsigned int) pixel;
200 if (endian == LSBEndian)
202 *pixels++=(
unsigned char) (quantum);
203 *pixels++=(
unsigned char) (quantum >> 8);
204 *pixels++=(
unsigned char) (quantum >> 16);
205 *pixels++=(
unsigned char) (quantum >> 24);
208 *pixels++=(
unsigned char) (quantum >> 24);
209 *pixels++=(
unsigned char) (quantum >> 16);
210 *pixels++=(
unsigned char) (quantum >> 8);
211 *pixels++=(
unsigned char) (quantum);
215static inline unsigned char *PopShortPixel(
const EndianType endian,
216 const unsigned short pixel,
unsigned char *magick_restrict pixels)
222 if (endian == LSBEndian)
224 *pixels++=(
unsigned char) (quantum);
225 *pixels++=(
unsigned char) (quantum >> 8);
228 *pixels++=(
unsigned char) (quantum >> 8);
229 *pixels++=(
unsigned char) (quantum);
233static inline const unsigned char *PushCharPixel(
234 const unsigned char *magick_restrict pixels,
235 unsigned char *magick_restrict pixel)
241static inline const unsigned char *PushLongPixel(
const EndianType endian,
242 const unsigned char *magick_restrict pixels,
243 unsigned int *magick_restrict pixel)
248 if (endian == LSBEndian)
250 quantum=((
unsigned int) *pixels++);
251 quantum|=((
unsigned int) *pixels++ << 8);
252 quantum|=((
unsigned int) *pixels++ << 16);
253 quantum|=((
unsigned int) *pixels++ << 24);
257 quantum=((
unsigned int) *pixels++ << 24);
258 quantum|=((
unsigned int) *pixels++ << 16);
259 quantum|=((
unsigned int) *pixels++ << 8);
260 quantum|=((
unsigned int) *pixels++);
265static inline const unsigned char *PushShortPixel(
const EndianType endian,
266 const unsigned char *magick_restrict pixels,
267 unsigned short *magick_restrict pixel)
272 if (endian == LSBEndian)
274 quantum=(
unsigned int) *pixels++;
275 quantum|=(
unsigned int) (*pixels++ << 8);
276 *pixel=(
unsigned short) (quantum & 0xffff);
279 quantum=(
unsigned int) (*pixels++ << 8);
280 quantum|=(
unsigned int) *pixels++;
281 *pixel=(
unsigned short) (quantum & 0xffff);
285static inline const unsigned char *PushFloatPixel(
const EndianType endian,
286 const unsigned char *magick_restrict pixels,
287 MagickFloatType *magick_restrict pixel)
298 if (endian == LSBEndian)
300 quantum.unsigned_value=((
unsigned int) *pixels++);
301 quantum.unsigned_value|=((
unsigned int) *pixels++ << 8);
302 quantum.unsigned_value|=((
unsigned int) *pixels++ << 16);
303 quantum.unsigned_value|=((
unsigned int) *pixels++ << 24);
304 *pixel=quantum.float_value;
307 quantum.unsigned_value=((
unsigned int) *pixels++ << 24);
308 quantum.unsigned_value|=((
unsigned int) *pixels++ << 16);
309 quantum.unsigned_value|=((
unsigned int) *pixels++ << 8);
310 quantum.unsigned_value|=((
unsigned int) *pixels++);
311 *pixel=quantum.float_value;
315static inline Quantum ScaleAnyToQuantum(
const QuantumAny quantum,
316 const QuantumAny range)
319 return(QuantumRange);
320#if !defined(MAGICKCORE_HDRI_SUPPORT)
321 return((Quantum) ((
double) QuantumRange*(quantum*
322 MagickSafeReciprocal((
double) range))+0.5));
324 return((Quantum) ((
double) QuantumRange*(quantum*
325 MagickSafeReciprocal((
double) range))));
329static inline QuantumAny ScaleQuantumToAny(
const Quantum quantum,
330 const QuantumAny range)
332#if !defined(MAGICKCORE_HDRI_SUPPORT)
333 return((QuantumAny) ((MagickRealType) range*quantum/QuantumRange));
335 if ((IsNaN(quantum) != 0) || (quantum <= 0.0f))
336 return((QuantumAny) 0UL);
337 if ((range*(MagickRealType) quantum/(MagickRealType) QuantumRange) >= 18446744073709551615.0)
338 return((QuantumAny) MagickULLConstant(18446744073709551615));
339 return((QuantumAny) (range*(MagickRealType) quantum/(MagickRealType) QuantumRange+0.5));
343#if (MAGICKCORE_QUANTUM_DEPTH == 8)
344static inline Quantum ScaleCharToQuantum(
const unsigned char value)
346 return((Quantum) value);
349static inline Quantum ScaleLongToQuantum(
const unsigned int value)
351#if !defined(MAGICKCORE_HDRI_SUPPORT)
352 return((Quantum) ((value)/16843009UL));
354 return((Quantum) (value/16843009.0));
358static inline Quantum ScaleMapToQuantum(
const MagickRealType value)
363 return(QuantumRange);
364#if !defined(MAGICKCORE_HDRI_SUPPORT)
365 return((Quantum) (value+0.5));
367 return((Quantum) value);
371static inline unsigned int ScaleQuantumToLong(
const Quantum quantum)
373#if !defined(MAGICKCORE_HDRI_SUPPORT)
374 return((
unsigned int) (16843009UL*quantum));
376 if ((IsNaN(quantum) != 0) || (quantum <= 0.0))
378 if ((16843009.0*quantum) >= 4294967295.0)
379 return(4294967295UL);
380 return((
unsigned int) (16843009.0*quantum+0.5));
384static inline unsigned int ScaleQuantumToMap(
const Quantum quantum)
386 if (quantum >= (Quantum) MaxMap)
387 return((
unsigned int) MaxMap);
388#if !defined(MAGICKCORE_HDRI_SUPPORT)
389 return((
unsigned int) quantum);
391 if ((IsNaN(quantum) != 0) || (quantum <= 0.0))
393 return((
unsigned int) (quantum+0.5));
397static inline unsigned short ScaleQuantumToShort(
const Quantum quantum)
399#if !defined(MAGICKCORE_HDRI_SUPPORT)
400 return((
unsigned short) (257UL*quantum));
402 if ((IsNaN(quantum) != 0) || (quantum <= 0.0))
404 if ((257.0*quantum) >= 65535.0)
406 return((
unsigned short) (257.0*quantum+0.5));
410static inline Quantum ScaleShortToQuantum(
const unsigned short value)
412#if !defined(MAGICKCORE_HDRI_SUPPORT)
413 return((Quantum) ((value+128U)/257U));
415 return((Quantum) (value/257.0));
418#elif (MAGICKCORE_QUANTUM_DEPTH == 16)
419static inline Quantum ScaleCharToQuantum(
const unsigned char value)
421#if !defined(MAGICKCORE_HDRI_SUPPORT)
422 return((Quantum) (257U*value));
424 return((Quantum) (257.0*value));
428static inline Quantum ScaleLongToQuantum(
const unsigned int value)
430#if !defined(MAGICKCORE_HDRI_SUPPORT)
431 return((Quantum) ((value)/MagickULLConstant(65537)));
433 return((Quantum) (value/65537.0));
437static inline Quantum ScaleMapToQuantum(
const MagickRealType value)
442 return(QuantumRange);
443#if !defined(MAGICKCORE_HDRI_SUPPORT)
444 return((Quantum) (value+0.5));
446 return((Quantum) value);
450static inline unsigned int ScaleQuantumToLong(
const Quantum quantum)
452#if !defined(MAGICKCORE_HDRI_SUPPORT)
453 return((
unsigned int) (65537UL*quantum));
455 if ((IsNaN(quantum) != 0) || (quantum <= 0.0f))
457 if ((65537.0f*quantum) >= 4294967295.0f)
459 return((
unsigned int) (65537.0f*quantum+0.5f));
463static inline unsigned int ScaleQuantumToMap(
const Quantum quantum)
465 if (quantum >= (Quantum) MaxMap)
466 return((
unsigned int) MaxMap);
467#if !defined(MAGICKCORE_HDRI_SUPPORT)
468 return((
unsigned int) quantum);
470 if ((IsNaN(quantum) != 0) || (quantum <= 0.0f))
472 return((
unsigned int) (quantum+0.5f));
476static inline unsigned short ScaleQuantumToShort(
const Quantum quantum)
478#if !defined(MAGICKCORE_HDRI_SUPPORT)
479 return((
unsigned short) quantum);
481 if ((IsNaN(quantum) != 0) || (quantum <= 0.0f))
483 if (quantum >= 65535.0f)
485 return((
unsigned short) (quantum+0.5f));
489static inline Quantum ScaleShortToQuantum(
const unsigned short value)
491 return((Quantum) value);
493#elif (MAGICKCORE_QUANTUM_DEPTH == 32)
494static inline Quantum ScaleCharToQuantum(
const unsigned char value)
496#if !defined(MAGICKCORE_HDRI_SUPPORT)
497 return((Quantum) (16843009UL*value));
499 return((Quantum) (16843009.0*value));
503static inline Quantum ScaleLongToQuantum(
const unsigned int value)
505 return((Quantum) value);
508static inline Quantum ScaleMapToQuantum(
const MagickRealType value)
512 if (value >= (Quantum) MaxMap)
513 return(QuantumRange);
514#if !defined(MAGICKCORE_HDRI_SUPPORT)
515 return((Quantum) (65537.0f*value+0.5f));
517 return((Quantum) (65537.0f*value));
521static inline unsigned int ScaleQuantumToLong(
const Quantum quantum)
523#if !defined(MAGICKCORE_HDRI_SUPPORT)
524 return((
unsigned int) quantum);
526 if ((IsNaN(quantum) != 0) || (quantum <= 0.0))
528 if ((quantum) >= 4294967295.0)
530 return((
unsigned int) (quantum+0.5));
534static inline unsigned int ScaleQuantumToMap(
const Quantum quantum)
536 if ((quantum/65537) >= (Quantum) MaxMap)
537 return((
unsigned int) MaxMap);
538#if !defined(MAGICKCORE_HDRI_SUPPORT)
539 return((
unsigned int) ((quantum+MagickULLConstant(32768))/
540 MagickULLConstant(65537)));
542 if ((IsNaN(quantum) != 0) || (quantum <= 0.0))
544 return((
unsigned int) (quantum/65537.0+0.5));
548static inline unsigned short ScaleQuantumToShort(
const Quantum quantum)
550#if !defined(MAGICKCORE_HDRI_SUPPORT)
551 return((
unsigned short) ((quantum+MagickULLConstant(32768))/
552 MagickULLConstant(65537)));
554 if ((IsNaN(quantum) != 0) || (quantum <= 0.0))
556 if ((quantum/65537.0) >= 65535.0)
558 return((
unsigned short) (quantum/65537.0+0.5));
562static inline Quantum ScaleShortToQuantum(
const unsigned short value)
564#if !defined(MAGICKCORE_HDRI_SUPPORT)
565 return((Quantum) (65537UL*value));
567 return((Quantum) (65537.0*value));
570#elif (MAGICKCORE_QUANTUM_DEPTH == 64)
571static inline Quantum ScaleCharToQuantum(
const unsigned char value)
573 return((Quantum) (72340172838076673.0*value));
576static inline Quantum ScaleLongToQuantum(
const unsigned int value)
578 return((Quantum) (4294967297.0*value));
581static inline Quantum ScaleMapToQuantum(
const MagickRealType value)
586 return(QuantumRange);
587 return((Quantum) (281479271743489.0*value));
590static inline unsigned int ScaleQuantumToLong(
const Quantum quantum)
592 return((
unsigned int) (quantum/4294967297.0+0.5));
595static inline unsigned int ScaleQuantumToMap(
const Quantum quantum)
597 if ((IsNaN(quantum) != 0) || (quantum <= 0.0))
599 if ((quantum/281479271743489.0) >= MaxMap)
600 return((
unsigned int) MaxMap);
601 return((
unsigned int) (quantum/281479271743489.0+0.5));
604static inline unsigned short ScaleQuantumToShort(
const Quantum quantum)
606 if ((IsNaN(quantum) != 0) || (quantum <= 0.0))
608 if ((quantum/281479271743489.0) >= 65535.0)
610 return((
unsigned short) (quantum/281479271743489.0+0.5));
613static inline Quantum ScaleShortToQuantum(
const unsigned short value)
615 return((Quantum) (281479271743489.0*value));
619static inline unsigned short SinglePrecisionToHalf(
const float value)
621 typedef union _SinglePrecision
650 map.single_precision=value;
651 sign_bit=(map.fixed_point >> 16) & 0x00008000;
652 exponent=(int) ((map.fixed_point >> ExponentShift) & 0x000000ff)-ExponentBias;
653 significand=map.fixed_point & 0x007fffff;
660 return((
unsigned short) sign_bit);
661 significand=significand | 0x00800000;
662 shift=(int) (14-exponent);
663 significand=(
unsigned int) ((significand+((1U << (shift-1))-1)+
664 ((significand >> shift) & 0x01)) >> shift);
665 return((
unsigned short) (sign_bit | significand));
668 if (exponent == (0xff-ExponentBias))
670 if (significand == 0)
671 return((
unsigned short) (sign_bit | ExponentMask));
674 significand>>=SignificandShift;
675 half=(
unsigned short) (sign_bit | significand |
676 (significand == 0) | ExponentMask);
680 significand=significand+((significand >> SignificandShift) & 0x01)+0x00000fff;
681 if ((significand & 0x00800000) != 0)
698 for (i=0; i < 10; i++)
700 return((
unsigned short) (sign_bit | ExponentMask));
702 half=(
unsigned short) (sign_bit | ((
unsigned int) exponent << 10) |
703 (significand >> SignificandShift));
707#if defined(__cplusplus) || defined(c_plusplus)