quantum-private.h

Go to the documentation of this file.
00001 /*
00002   Copyright 1999-2010 ImageMagick Studio LLC, a non-profit organization
00003   dedicated to making software imaging solutions freely available.
00004 
00005   You may not use this file except in compliance with the License.
00006   obtain a copy of the License at
00007 
00008     http://www.imagemagick.org/script/license.php
00009 
00010   Unless required by applicable law or agreed to in writing, software
00011   distributed under the License is distributed on an "AS IS" BASIS,
00012   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00013   See the License for the specific language governing permissions and
00014   limitations under the License.
00015 
00016   MagickCore quantum inline methods.
00017 */
00018 #ifndef _MAGICKCORE_QUANTUM_PRIVATE_H
00019 #define _MAGICKCORE_QUANTUM_PRIVATE_H
00020 
00021 #if defined(__cplusplus) || defined(c_plusplus)
00022 extern "C" {
00023 #endif
00024 
00025 typedef struct _QuantumState
00026 {
00027   EndianType
00028     endian;
00029 
00030   double
00031     minimum,
00032     scale;
00033 
00034   unsigned long
00035     pixel,
00036     bits;
00037 
00038   const unsigned long
00039     *mask;
00040 } QuantumState;
00041 
00042 static inline MagickRealType ClipToQuantum(const MagickRealType value)
00043 {
00044   if (value <= 0.0)
00045     return(0.0);
00046   if (value >= QuantumRange)
00047     return((MagickRealType) QuantumRange);
00048   return(value);
00049 }
00050 
00051 static inline void InitializeQuantumState(const QuantumInfo *quantum_info,
00052   const EndianType endian,QuantumState *quantum_state)
00053 {
00054   static const unsigned long mask[32] =
00055   {
00056     0x00000000UL, 0x00000001UL, 0x00000003UL, 0x00000007UL, 0x0000000fUL,
00057     0x0000001fUL, 0x0000003fUL, 0x0000007fUL, 0x000000ffUL, 0x000001ffUL,
00058     0x000003ffUL, 0x000007ffUL, 0x00000fffUL, 0x00001fffUL, 0x00003fffUL,
00059     0x00007fffUL, 0x0000ffffUL, 0x0001ffffUL, 0x0003ffffUL, 0x0007ffffUL,
00060     0x000fffffUL, 0x001fffffUL, 0x003fffffUL, 0x007fffffUL, 0x00ffffffUL,
00061     0x01ffffffUL, 0x03ffffffUL, 0x07ffffffUL, 0x0fffffffUL, 0x1fffffffUL,
00062     0x3fffffffUL, 0x7fffffffUL
00063   };
00064 
00065   (void) ResetMagickMemory(quantum_state,0,sizeof(&quantum_state));
00066   quantum_state->endian=endian;
00067   quantum_state->minimum=quantum_info->minimum;
00068   quantum_state->scale=quantum_info->scale;
00069   quantum_state->bits=0;
00070   quantum_state->mask=mask;
00071 }
00072 
00073 static inline void PopCharPixel(const unsigned char pixel,
00074   unsigned char **pixels)
00075 {
00076   *(*pixels)++=(unsigned char) (pixel);
00077 }
00078 
00079 static inline void PopDoublePixel(const QuantumState *quantum_state,
00080   const double pixel,unsigned char **pixels)
00081 {
00082   unsigned char
00083     quantum[8];
00084 
00085   *((double *) quantum)=(double) (pixel*quantum_state->scale+
00086     quantum_state->minimum); 
00087   if (quantum_state->endian != LSBEndian)
00088     {
00089       *(*pixels)++=quantum[7];
00090       *(*pixels)++=quantum[6];
00091       *(*pixels)++=quantum[5];
00092       *(*pixels)++=quantum[4];
00093       *(*pixels)++=quantum[3];
00094       *(*pixels)++=quantum[2];
00095       *(*pixels)++=quantum[1];
00096       *(*pixels)++=quantum[0];
00097       return;
00098     }
00099   *(*pixels)++=quantum[0];
00100   *(*pixels)++=quantum[1];
00101   *(*pixels)++=quantum[2];
00102   *(*pixels)++=quantum[3];
00103   *(*pixels)++=quantum[4];
00104   *(*pixels)++=quantum[5];
00105   *(*pixels)++=quantum[6];
00106   *(*pixels)++=quantum[7];
00107 }
00108 
00109 static inline void PopFloatPixel(const QuantumState *quantum_state,
00110   const float pixel,unsigned char **pixels)
00111 {
00112   unsigned char
00113     quantum[4];
00114 
00115   *((float *) quantum)=(float) ((double) pixel*quantum_state->scale+
00116     quantum_state->minimum); 
00117   if (quantum_state->endian != LSBEndian)
00118     {
00119       *(*pixels)++=quantum[3];
00120       *(*pixels)++=quantum[2];
00121       *(*pixels)++=quantum[1];
00122       *(*pixels)++=quantum[0];
00123       return;
00124     }
00125   *(*pixels)++=quantum[0];
00126   *(*pixels)++=quantum[1];
00127   *(*pixels)++=quantum[2];
00128   *(*pixels)++=quantum[3];
00129 }
00130 
00131 static inline void PopLongPixel(const QuantumState *quantum_state,
00132   const unsigned long pixel,unsigned char **pixels)
00133 {
00134   if (quantum_state->endian != LSBEndian)
00135     {
00136       *(*pixels)++=(unsigned char) ((pixel) >> 24);
00137       *(*pixels)++=(unsigned char) ((pixel) >> 16);
00138       *(*pixels)++=(unsigned char) ((pixel) >> 8);
00139       *(*pixels)++=(unsigned char) (pixel);
00140       return;
00141     }
00142   *(*pixels)++=(unsigned char) (pixel);
00143   *(*pixels)++=(unsigned char) ((pixel) >> 8);
00144   *(*pixels)++=(unsigned char) ((pixel) >> 16);
00145   *(*pixels)++=(unsigned char) ((pixel) >> 24);
00146 }
00147 
00148 static inline void PopQuantumPixel(QuantumState *quantum_state,
00149   const unsigned long depth,const unsigned long pixel,unsigned char **pixels)
00150 {
00151   register long
00152     i;
00153 
00154   register unsigned long
00155     quantum_bits;
00156 
00157   if (quantum_state->bits == 0UL)
00158     quantum_state->bits=8UL;
00159   for (i=(long) depth; i > 0L; )
00160   {
00161     quantum_bits=(unsigned long) i;
00162     if (quantum_bits > quantum_state->bits)
00163       quantum_bits=quantum_state->bits;
00164     i-=quantum_bits;
00165     if (quantum_state->bits == 8)
00166       *(*pixels)='\0';
00167     quantum_state->bits-=quantum_bits;
00168     *(*pixels)|=(((pixel >> i) &~ ((~0UL) << quantum_bits)) <<
00169       quantum_state->bits);
00170     if (quantum_state->bits == 0UL)
00171       {
00172         (*pixels)++;
00173         quantum_state->bits=8UL;
00174       }
00175   }
00176 }
00177 
00178 static inline void PopQuantumLongPixel(QuantumState *quantum_state,
00179   const unsigned long depth,const unsigned long pixel,unsigned char **pixels)
00180 {
00181   register long
00182     i;
00183 
00184   unsigned long
00185     quantum_bits;
00186 
00187   if (quantum_state->bits == 0UL)
00188     quantum_state->bits=32UL;
00189   for (i=(long) depth; i > 0; )
00190   {
00191     quantum_bits=(unsigned long) i;
00192     if (quantum_bits > quantum_state->bits)
00193       quantum_bits=quantum_state->bits;
00194     quantum_state->pixel|=(((pixel >> (depth-i)) &
00195       quantum_state->mask[quantum_bits]) << (32UL-quantum_state->bits));
00196     i-=quantum_bits;
00197     quantum_state->bits-=quantum_bits;
00198     if (quantum_state->bits == 0U)
00199       {
00200         PopLongPixel(quantum_state,quantum_state->pixel,pixels);
00201         quantum_state->pixel=0U;
00202         quantum_state->bits=32UL;
00203       }
00204   }
00205 }
00206 
00207 static inline void PopShortPixel(const QuantumState *quantum_state,
00208   const unsigned short pixel,unsigned char **pixels)
00209 {
00210   if (quantum_state->endian != LSBEndian)
00211     {
00212       *(*pixels)++=(unsigned char) ((pixel) >> 8);
00213       *(*pixels)++=(unsigned char) (pixel);
00214       return;
00215     }
00216   *(*pixels)++=(unsigned char) (pixel);
00217   *(*pixels)++=(unsigned char) ((pixel) >> 8);
00218 }
00219 
00220 static inline unsigned char PushCharPixel(const unsigned char **pixels)
00221 {
00222   unsigned char
00223     pixel;
00224 
00225   pixel=(unsigned char) *(*pixels)++;
00226   return(pixel);
00227 }
00228 
00229 static inline IndexPacket PushColormapIndex(Image *image,
00230   const unsigned long index)
00231 {
00232   assert(image != (Image *) NULL);
00233   assert(image->signature == MagickSignature);
00234   if (index < image->colors)
00235     return((IndexPacket) index);
00236   (void) ThrowMagickException(&image->exception,GetMagickModule(),
00237     CorruptImageError,"InvalidColormapIndex","`%s'",image->filename);
00238   return((IndexPacket) 0);
00239 }
00240 
00241 static inline double PushDoublePixel(const QuantumState *quantum_state,
00242   const unsigned char **pixels)
00243 {
00244   double
00245     pixel;
00246 
00247   unsigned char
00248     quantum[8];
00249 
00250   if (quantum_state->endian != LSBEndian)
00251     {
00252       quantum[7]=(*(*pixels)++);
00253       quantum[6]=(*(*pixels)++);
00254       quantum[5]=(*(*pixels)++);
00255       quantum[5]=(*(*pixels)++);
00256       quantum[3]=(*(*pixels)++);
00257       quantum[2]=(*(*pixels)++);
00258       quantum[1]=(*(*pixels)++);
00259       quantum[0]=(*(*pixels)++);
00260       pixel=(*((double *) quantum));
00261       pixel-=quantum_state->minimum;
00262       pixel*=quantum_state->scale;
00263       return(pixel);
00264     }
00265   quantum[0]=(*(*pixels)++);
00266   quantum[1]=(*(*pixels)++);
00267   quantum[2]=(*(*pixels)++);
00268   quantum[3]=(*(*pixels)++);
00269   quantum[4]=(*(*pixels)++);
00270   quantum[5]=(*(*pixels)++);
00271   quantum[6]=(*(*pixels)++);
00272   quantum[7]=(*(*pixels)++);
00273   pixel=(*((double *) quantum));
00274   pixel-=quantum_state->minimum;
00275   pixel*=quantum_state->scale;
00276   return(pixel);
00277 }
00278 
00279 static inline float PushFloatPixel(const QuantumState *quantum_state,
00280   const unsigned char **pixels)
00281 {
00282   float
00283     pixel;
00284 
00285   unsigned char
00286     quantum[4];
00287 
00288   if (quantum_state->endian != LSBEndian)
00289     {
00290       quantum[3]=(*(*pixels)++);
00291       quantum[2]=(*(*pixels)++);
00292       quantum[1]=(*(*pixels)++);
00293       quantum[0]=(*(*pixels)++);
00294       pixel=(*((float *) quantum));
00295       pixel-=quantum_state->minimum;
00296       pixel*=quantum_state->scale;
00297       return(pixel);
00298     }
00299   quantum[0]=(*(*pixels)++);
00300   quantum[1]=(*(*pixels)++);
00301   quantum[2]=(*(*pixels)++);
00302   quantum[3]=(*(*pixels)++);
00303   pixel=(*((float *) quantum));
00304   pixel-=quantum_state->minimum;
00305   pixel*=quantum_state->scale;
00306   return(pixel);
00307 }
00308 
00309 static inline unsigned long PushLongPixel(const QuantumState *quantum_state,
00310   const unsigned char **pixels)
00311 {
00312   unsigned long
00313     pixel;
00314 
00315   if (quantum_state->endian != LSBEndian)
00316     {
00317       pixel=(unsigned long) (*(*pixels)++ << 24);
00318       pixel|=(unsigned long) (*(*pixels)++ << 16);
00319       pixel|=(unsigned long) (*(*pixels)++ << 8);
00320       pixel|=(unsigned long) (*(*pixels)++);
00321       return(pixel);
00322     }
00323   pixel=(unsigned long) (*(*pixels)++);
00324   pixel|=(unsigned long) (*(*pixels)++ << 8);
00325   pixel|=(unsigned long) (*(*pixels)++ << 16);
00326   pixel|=(unsigned long) (*(*pixels)++ << 24);
00327   return(pixel);
00328 }
00329 
00330 static inline unsigned long PushQuantumPixel(QuantumState *quantum_state,
00331   const unsigned long depth,const unsigned char **pixels)
00332 {
00333   register long
00334     i;
00335 
00336   register unsigned long
00337     quantum_bits,
00338     quantum;
00339 
00340   quantum=0UL;
00341   for (i=(long) depth; i > 0L; )
00342   {
00343     if (quantum_state->bits == 0UL)
00344       {
00345         quantum_state->pixel=(*(*pixels)++);
00346         quantum_state->bits=8UL;
00347       }
00348     quantum_bits=(unsigned long) i;
00349     if (quantum_bits > quantum_state->bits)
00350       quantum_bits=quantum_state->bits;
00351     i-=quantum_bits;
00352     quantum_state->bits-=quantum_bits;
00353     quantum=(quantum << quantum_bits) | ((quantum_state->pixel >>
00354       quantum_state->bits) &~ ((~0UL) << quantum_bits));
00355   }
00356   return(quantum);
00357 }
00358 
00359 static inline unsigned long PushQuantumLongPixel(QuantumState *quantum_state,
00360   const unsigned long depth,const unsigned char **pixels)
00361 {
00362   register long
00363     i;
00364 
00365   register unsigned long
00366     quantum,
00367     quantum_bits;
00368       
00369   quantum=0UL;
00370   for (i=(long) depth; i > 0; )
00371   {
00372     if (quantum_state->bits == 0)
00373       {
00374         quantum_state->pixel=PushLongPixel(quantum_state,pixels);
00375         quantum_state->bits=32UL;
00376       }
00377     quantum_bits=(unsigned long) i;
00378     if (quantum_bits > quantum_state->bits)
00379       quantum_bits=quantum_state->bits;
00380     quantum|=(((quantum_state->pixel >> (32UL-quantum_state->bits)) &
00381       quantum_state->mask[quantum_bits]) << (depth-i));
00382     i-=quantum_bits;
00383     quantum_state->bits-=quantum_bits;
00384   }
00385   return(quantum);
00386 }
00387 
00388 static inline unsigned short PushShortPixel(const QuantumState *quantum_state,
00389   const unsigned char **pixels)
00390 {
00391   unsigned short
00392     pixel;
00393 
00394   if (quantum_state->endian != LSBEndian)
00395     {
00396       pixel=(unsigned short) (*(*pixels)++ << 8);
00397       pixel|=(unsigned short) (*(*pixels)++);
00398       return(pixel);
00399     }
00400   pixel=(unsigned short) (*(*pixels)++);
00401   pixel|=(unsigned short) (*(*pixels)++ << 8);
00402   return(pixel);
00403 }
00404 
00405 static inline Quantum ScaleAnyToQuantum(const QuantumAny quantum,
00406   const unsigned long depth)
00407 {
00408   QuantumAny
00409     scale;
00410 
00411   if ((depth == 0) || (depth > MAGICKCORE_QUANTUM_DEPTH))
00412     return(0);
00413   scale=(QuantumAny) QuantumRange/((QuantumAny) QuantumRange >>
00414     (QuantumAny) (MAGICKCORE_QUANTUM_DEPTH-depth));
00415   return((Quantum) (scale*quantum));
00416 }
00417 
00418 static inline QuantumAny ScaleQuantumToAny(const Quantum quantum,
00419   const unsigned long depth)
00420 {
00421   QuantumAny
00422     scale;
00423 
00424   if ((depth == 0) || (depth > MAGICKCORE_QUANTUM_DEPTH))
00425     return(0);
00426   scale=(QuantumAny) QuantumRange/((QuantumAny) QuantumRange >>
00427     (QuantumAny) (MAGICKCORE_QUANTUM_DEPTH-depth));
00428   return((QuantumAny) quantum/scale);
00429 }
00430 
00431 #if (MAGICKCORE_QUANTUM_DEPTH == 8)
00432 static inline Quantum ScaleCharToQuantum(const unsigned char value)
00433 {
00434   return((Quantum) value);
00435 }
00436 
00437 static inline Quantum ScaleLongToQuantum(const unsigned long value)
00438 {
00439 #if !defined(MAGICKCORE_HDRI_SUPPORT)
00440   return((Quantum) ((value+8421504UL)/16843009UL));
00441 #else
00442   return((Quantum) (value/16843008.0));
00443 #endif
00444 }
00445 
00446 static inline Quantum ScaleMapToQuantum(const MagickRealType value)
00447 {
00448 #if defined(MAGICKCORE_HDRI_SUPPORT)
00449   return((Quantum) value);
00450 #else
00451   if (value <= 0.0)
00452     return(0);
00453   if (value >= MaxMap)
00454     return((Quantum) QuantumRange);
00455   return((Quantum) (value+0.5));
00456 #endif
00457 }
00458 
00459 static inline unsigned long ScaleQuantumToLong(const Quantum quantum)
00460 {
00461 #if !defined(MAGICKCORE_HDRI_SUPPORT)
00462   return((unsigned long) (16843009UL*quantum));
00463 #else
00464   if (quantum <= 0.0)
00465     return(0UL);
00466   if ((16843008.0*quantum) >= 4294967295.0)
00467     return(4294967295UL);
00468   return((unsigned long) (16843008.0*quantum));
00469 #endif
00470 }
00471 
00472 static inline unsigned long ScaleQuantumToMap(const Quantum quantum)
00473 {
00474   if (quantum <= 0)
00475     return(0UL);
00476   if (quantum >= (Quantum) MaxMap)
00477     return((unsigned long) MaxMap);
00478 #if !defined(MAGICKCORE_HDRI_SUPPORT)
00479   return((unsigned long) quantum);
00480 #else
00481   return((unsigned long) (quantum+0.5));
00482 #endif
00483 }
00484 
00485 static inline unsigned short ScaleQuantumToShort(const Quantum quantum)
00486 {
00487 #if !defined(MAGICKCORE_HDRI_SUPPORT)
00488   return((unsigned short) (257UL*quantum));
00489 #else
00490   if (quantum <= 0.0)
00491     return(0);
00492   if ((257.0*quantum) >= 65535.0)
00493     return(65535);
00494   return((unsigned short) (257.0*quantum));
00495 #endif
00496 }
00497 
00498 static inline Quantum ScaleShortToQuantum(const unsigned short value)
00499 {
00500 #if !defined(MAGICKCORE_HDRI_SUPPORT)
00501   return((Quantum) ((value+128UL)/257UL));
00502 #else
00503   return((Quantum) (value/257.0));
00504 #endif
00505 }
00506 #elif (MAGICKCORE_QUANTUM_DEPTH == 16)
00507 static inline Quantum ScaleCharToQuantum(const unsigned char value)
00508 {
00509 #if !defined(MAGICKCORE_HDRI_SUPPORT)
00510   return((Quantum) (257UL*value));
00511 #else
00512   return((Quantum) (257.0*value));
00513 #endif
00514 }
00515 
00516 static inline Quantum ScaleLongToQuantum(const unsigned long value)
00517 {
00518 #if !defined(MAGICKCORE_HDRI_SUPPORT)
00519   return((Quantum) ((value+32768UL)/65537UL));
00520 #else
00521   return((Quantum) (value/65537.0));
00522 #endif
00523 }
00524 
00525 static inline Quantum ScaleMapToQuantum(const MagickRealType value)
00526 {
00527 #if defined(MAGICKCORE_HDRI_SUPPORT)
00528   return((Quantum) value);
00529 #else
00530   if (value <= 0.0)
00531     return(0);
00532   if (value >= MaxMap)
00533     return((Quantum) QuantumRange);
00534   return((Quantum) (value+0.5));
00535 #endif
00536 }
00537 
00538 static inline unsigned long ScaleQuantumToLong(const Quantum quantum)
00539 {
00540 #if !defined(MAGICKCORE_HDRI_SUPPORT)
00541   return((unsigned long) (65537UL*quantum));
00542 #else
00543   if (quantum <= 0.0)
00544     return(0UL);
00545   if ((65537.0*quantum) >= 4294967295.0)
00546     return(4294967295UL);
00547   return((unsigned long) (65537.0*quantum));
00548 #endif
00549 }
00550 
00551 static inline unsigned long ScaleQuantumToMap(const Quantum quantum)
00552 {
00553   if (quantum <= 0)
00554     return(0);
00555   if ((1UL*quantum) >= MaxMap)
00556     return((unsigned long) MaxMap);
00557 #if !defined(MAGICKCORE_HDRI_SUPPORT)
00558   return((unsigned long) quantum);
00559 #else
00560   return((unsigned long) (quantum+0.5));
00561 #endif
00562 }
00563 
00564 static inline unsigned short ScaleQuantumToShort(const Quantum quantum)
00565 {
00566 #if !defined(MAGICKCORE_HDRI_SUPPORT)
00567   return((unsigned short) quantum);
00568 #else
00569   if (quantum <= 0.0)
00570     return(0);
00571   if (quantum >= 65535.0)
00572     return(65535);
00573   return((unsigned short) (quantum+0.5));
00574 #endif
00575 }
00576 
00577 static inline Quantum ScaleShortToQuantum(const unsigned short value)
00578 {
00579   return((Quantum) value);
00580 }
00581 #elif (MAGICKCORE_QUANTUM_DEPTH == 32)
00582 static inline Quantum ScaleCharToQuantum(const unsigned char value)
00583 {
00584 #if !defined(MAGICKCORE_HDRI_SUPPORT)
00585   return((Quantum) (16843009UL*value));
00586 #else
00587   return((Quantum) (16843009.0*value));
00588 #endif
00589 }
00590 
00591 static inline Quantum ScaleLongToQuantum(const unsigned long value)
00592 {
00593   return((Quantum) value);
00594 }
00595 
00596 static inline Quantum ScaleMapToQuantum(const MagickRealType value)
00597 {
00598 #if defined(MAGICKCORE_HDRI_SUPPORT)
00599   return((Quantum) (65537.0*value));
00600 #else
00601   if (value <= 0.0)
00602     return(0);
00603   if (value >= MaxMap)
00604     return(QuantumRange);
00605   return((Quantum) (65537UL*value));
00606 #endif
00607 }
00608 
00609 static inline unsigned long ScaleQuantumToLong(const Quantum quantum)
00610 {
00611   return((unsigned long) quantum);
00612 }
00613 
00614 static inline unsigned long ScaleQuantumToMap(const Quantum quantum)
00615 {
00616   if (quantum <= 0.0)
00617     return(0);
00618   if ((quantum/65537.0) >= (MagickRealType) MaxMap)
00619     return((unsigned long) MaxMap);
00620 #if !defined(MAGICKCORE_HDRI_SUPPORT)
00621   {
00622     unsigned long
00623       pixel;
00624 
00625     pixel=(unsigned long) ((quantum+MagickULLConstant(32768))/
00626       MagickULLConstant(65537));
00627     return(pixel);
00628   }
00629 #else
00630   return((unsigned long) (quantum/65537.0));
00631 #endif
00632 }
00633 
00634 static inline unsigned short ScaleQuantumToShort(const Quantum quantum)
00635 {
00636 #if !defined(MAGICKCORE_HDRI_SUPPORT)
00637   unsigned short
00638     pixel;
00639 
00640   pixel=(unsigned short) ((quantum+MagickULLConstant(32768))/
00641     MagickULLConstant(65537));
00642   return(pixel);
00643 #else
00644   if (quantum <= 0.0)
00645     return(0);
00646   if ((quantum/65537.0) >= 65535.0)
00647     return(65535);
00648   return((unsigned short) (quantum/65537.0));
00649 #endif
00650 }
00651 
00652 static inline Quantum ScaleShortToQuantum(const unsigned short value)
00653 {
00654 #if !defined(MAGICKCORE_HDRI_SUPPORT)
00655   return((Quantum) (65537UL*value));
00656 #else
00657   return((Quantum) (65537.0*value));
00658 #endif
00659 }
00660 #elif (MAGICKCORE_QUANTUM_DEPTH == 64)
00661 static inline Quantum ScaleCharToQuantum(const unsigned char value)
00662 {
00663 #if !defined(MAGICKCORE_HDRI_SUPPORT)
00664   return((Quantum) (MagickULLConstant(71777214294589695)*value));
00665 #else
00666   return((Quantum) (71777214294589695.0*value));
00667 #endif
00668 }
00669 
00670 static inline Quantum ScaleLongToQuantum(const unsigned long value)
00671 {
00672 #if !defined(MAGICKCORE_HDRI_SUPPORT)
00673   return((Quantum) (4294967295UL*value));
00674 #else
00675   return((Quantum) (4294967295.0*value));
00676 #endif
00677 }
00678 
00679 static inline Quantum ScaleMapToQuantum(const MagickRealType value)
00680 {
00681 #if defined(MAGICKCORE_HDRI_SUPPORT)
00682   return((Quantum) (281479271612415.0*value));
00683 #else
00684   if (value <= 0.0)
00685     return(0);
00686   if (value >= MaxMap)
00687     return(QuantumRange);
00688   return((Quantum) (MagickULLConstant(281479271612415)*value));
00689 #endif
00690 }
00691 
00692 static inline unsigned long ScaleQuantumToLong(const Quantum quantum)
00693 {
00694 #if !defined(MAGICKCORE_HDRI_SUPPORT)
00695   return((unsigned long) ((quantum+2147483648.0)/4294967297.0));
00696 #else
00697   return((unsigned long) (quantum/4294967297.0));
00698 #endif
00699 }
00700 
00701 static inline unsigned long ScaleQuantumToMap(const Quantum quantum)
00702 {
00703   if (quantum <= 0.0)
00704     return(0);
00705   if ((quantum/281479271612415.0) >= (MagickRealType) MaxMap)
00706     return((unsigned long) MaxMap);
00707 #if !defined(MAGICKCORE_HDRI_SUPPORT)
00708   return((unsigned long) ((quantum+2147450879.0)/281479271612415.0));
00709 #else
00710   return((unsigned long) (quantum/281479271612415.0));
00711 #endif
00712 }
00713 
00714 static inline unsigned short ScaleQuantumToShort(const Quantum quantum)
00715 {
00716 #if !defined(MAGICKCORE_HDRI_SUPPORT)
00717   return((unsigned short) ((quantum+2147450879.0)/281479271612415.0));
00718 #else
00719   return((unsigned short) (quantum/281479271612415.0));
00720 #endif
00721 }
00722 
00723 static inline Quantum ScaleShortToQuantum(const unsigned short value)
00724 {
00725 #if !defined(MAGICKCORE_HDRI_SUPPORT)
00726   return((Quantum) (MagickULLConstant(281479271612415)*value));
00727 #else
00728   return((Quantum) (281479271612415.0*value));
00729 #endif
00730 }
00731 #endif
00732 
00733 #if defined(__cplusplus) || defined(c_plusplus)
00734 }
00735 #endif
00736 
00737 #endif

Generated on Sat Jan 26 14:50:29 2008 for MagickCore by  doxygen 1.5.4