quantum-export.c

Go to the documentation of this file.
00001 /*
00002 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00003 %                                                                             %
00004 %                                                                             %
00005 %                                                                             %
00006 %                QQQ   U   U   AAA   N   N  TTTTT  U   U  M   M               %
00007 %               Q   Q  U   U  A   A  NN  N    T    U   U  MM MM               %
00008 %               Q   Q  U   U  AAAAA  N N N    T    U   U  M M M               %
00009 %               Q  QQ  U   U  A   A  N  NN    T    U   U  M   M               %
00010 %                QQQQ   UUU   A   A  N   N    T     UUU   M   M               %
00011 %                                                                             %
00012 %                   EEEEE  X   X  PPPP    OOO   RRRR   TTTTT                  %
00013 %                   E       X X   P   P  O   O  R   R    T                    %
00014 %                   EEE      X    PPPP   O   O  RRRR     T                    %
00015 %                   E       X X   P      O   O  R R      T                    %
00016 %                   EEEEE  X   X  P       OOO   R  R     T                    %
00017 %                                                                             %
00018 %                 MagickCore Methods to Export Quantum Pixels                 %
00019 %                                                                             %
00020 %                             Software Design                                 %
00021 %                               John Cristy                                   %
00022 %                               October 1998                                  %
00023 %                                                                             %
00024 %                                                                             %
00025 %  Copyright 1999-2008 ImageMagick Studio LLC, a non-profit organization      %
00026 %  dedicated to making software imaging solutions freely available.           %
00027 %                                                                             %
00028 %  You may not use this file except in compliance with the License.  You may  %
00029 %  obtain a copy of the License at                                            %
00030 %                                                                             %
00031 %    http://www.imagemagick.org/script/license.php                            %
00032 %                                                                             %
00033 %  Unless required by applicable law or agreed to in writing, software        %
00034 %  distributed under the License is distributed on an "AS IS" BASIS,          %
00035 %  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   %
00036 %  See the License for the specific language governing permissions and        %
00037 %  limitations under the License.                                             %
00038 %                                                                             %
00039 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00040 %
00041 %
00042 */
00043 
00044 /*
00045   Include declarations.
00046 */
00047 #include "magick/studio.h"
00048 #include "magick/property.h"
00049 #include "magick/blob.h"
00050 #include "magick/blob-private.h"
00051 #include "magick/color-private.h"
00052 #include "magick/exception.h"
00053 #include "magick/exception-private.h"
00054 #include "magick/cache.h"
00055 #include "magick/constitute.h"
00056 #include "magick/delegate.h"
00057 #include "magick/geometry.h"
00058 #include "magick/list.h"
00059 #include "magick/magick.h"
00060 #include "magick/memory_.h"
00061 #include "magick/monitor.h"
00062 #include "magick/option.h"
00063 #include "magick/pixel.h"
00064 #include "magick/pixel-private.h"
00065 #include "magick/quantum.h"
00066 #include "magick/quantum-private.h"
00067 #include "magick/resource_.h"
00068 #include "magick/semaphore.h"
00069 #include "magick/statistic.h"
00070 #include "magick/stream.h"
00071 #include "magick/string_.h"
00072 #include "magick/utility.h"
00073 
00074 /*
00075 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00076 %                                                                             %
00077 %                                                                             %
00078 %                                                                             %
00079 +   E x p o r t Q u a n t u m P i x e l s                                     %
00080 %                                                                             %
00081 %                                                                             %
00082 %                                                                             %
00083 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00084 %
00085 %  ExportQuantumPixels() transfers one or more pixel components from the image
00086 %  pixel cache to a user supplied buffer.  The pixels are returned in network
00087 %  byte order.  MagickTrue is returned if the pixels are successfully
00088 %  transferred, otherwise MagickFalse.
00089 %
00090 %  The format of the ExportQuantumPixels method is:
00091 %
00092 %      size_t ExportQuantumPixels(const Image *image,const ViewInfo *cache_view,
00093 %        const QuantumInfo *quantum_info,const QuantumType quantum_type,
00094 %        unsigned char *pixels,ExceptionInfo *exception)
00095 %
00096 %  A description of each parameter follows:
00097 %
00098 %    o image: the image.
00099 %
00100 %    o cache_view: the image cache view.
00101 %
00102 %    o quantum_info: the quantum info.
00103 %
00104 %    o quantum_type: Declare which pixel components to transfer (RGB, RGBA,
00105 %      etc).
00106 %
00107 %    o pixels:  The components are transferred to this buffer.
00108 %
00109 %    o exception: return any errors or warnings in this structure.
00110 %
00111 */
00112 
00113 static inline unsigned char *PopDoublePixel(const QuantumState *quantum_state,
00114   const double pixel,unsigned char *pixels)
00115 {
00116   unsigned char
00117     quantum[8];
00118 
00119   *((double *) quantum)=(double) (pixel*quantum_state->inverse_scale+
00120     quantum_state->minimum); 
00121   if (quantum_state->endian != LSBEndian)
00122     {
00123       *pixels++=quantum[7];
00124       *pixels++=quantum[6];
00125       *pixels++=quantum[5];
00126       *pixels++=quantum[4];
00127       *pixels++=quantum[3];
00128       *pixels++=quantum[2];
00129       *pixels++=quantum[1];
00130       *pixels++=quantum[0];
00131       return(pixels);
00132     }
00133   *pixels++=quantum[0];
00134   *pixels++=quantum[1];
00135   *pixels++=quantum[2];
00136   *pixels++=quantum[3];
00137   *pixels++=quantum[4];
00138   *pixels++=quantum[5];
00139   *pixels++=quantum[6];
00140   *pixels++=quantum[7];
00141   return(pixels);
00142 }
00143 
00144 static inline unsigned char *PopFloatPixel(const QuantumState *quantum_state,
00145   const float pixel,unsigned char *pixels)
00146 {
00147   unsigned char
00148     quantum[4];
00149 
00150   *((float *) quantum)=(float) ((double) pixel*quantum_state->inverse_scale+
00151     quantum_state->minimum); 
00152   if (quantum_state->endian != LSBEndian)
00153     {
00154       *pixels++=quantum[3];
00155       *pixels++=quantum[2];
00156       *pixels++=quantum[1];
00157       *pixels++=quantum[0];
00158       return(pixels);
00159     }
00160   *pixels++=quantum[0];
00161   *pixels++=quantum[1];
00162   *pixels++=quantum[2];
00163   *pixels++=quantum[3];
00164   return(pixels);
00165 }
00166 
00167 static inline unsigned char *PopQuantumPixel(QuantumState *quantum_state,
00168   const unsigned long depth,const QuantumAny pixel,unsigned char *pixels)
00169 {
00170   register long
00171     i;
00172 
00173   register unsigned long
00174     quantum_bits;
00175 
00176   if (quantum_state->bits == 0UL)
00177     quantum_state->bits=8UL;
00178   for (i=(long) depth; i > 0L; )
00179   {
00180     quantum_bits=(unsigned long) i;
00181     if (quantum_bits > quantum_state->bits)
00182       quantum_bits=quantum_state->bits;
00183     i-=quantum_bits;
00184     if (quantum_state->bits == 8)
00185       *pixels='\0';
00186     quantum_state->bits-=quantum_bits;
00187     *pixels|=(((pixel >> i) &~ ((~0UL) << quantum_bits)) <<
00188       quantum_state->bits);
00189     if (quantum_state->bits == 0UL)
00190       {
00191         pixels++;
00192         quantum_state->bits=8UL;
00193       }
00194   }
00195   return(pixels);
00196 }
00197 
00198 static inline unsigned char *PopQuantumLongPixel(QuantumState *quantum_state,
00199   const unsigned long depth,const unsigned long pixel,unsigned char *pixels)
00200 {
00201   register long
00202     i;
00203 
00204   unsigned long
00205     quantum_bits;
00206 
00207   if (quantum_state->bits == 0UL)
00208     quantum_state->bits=32UL;
00209   for (i=(long) depth; i > 0; )
00210   {
00211     quantum_bits=(unsigned long) i;
00212     if (quantum_bits > quantum_state->bits)
00213       quantum_bits=quantum_state->bits;
00214     quantum_state->pixel|=(((pixel >> (depth-i)) &
00215       quantum_state->mask[quantum_bits]) << (32UL-quantum_state->bits));
00216     i-=quantum_bits;
00217     quantum_state->bits-=quantum_bits;
00218     if (quantum_state->bits == 0U)
00219       {
00220         pixels=PopLongPixel(quantum_state->endian,quantum_state->pixel,pixels);
00221         quantum_state->pixel=0U;
00222         quantum_state->bits=32UL;
00223       }
00224   }
00225   return(pixels);
00226 }
00227 
00228 MagickExport size_t ExportQuantumPixels(const Image *image,
00229   const ViewInfo *cache_view,const QuantumInfo *quantum_info,
00230   const QuantumType quantum_type,unsigned char *pixels,ExceptionInfo *exception)
00231 {
00232   EndianType
00233     endian;
00234 
00235   long
00236     bit;
00237 
00238   MagickRealType
00239     alpha;
00240 
00241   MagickSizeType
00242     number_pixels;
00243 
00244   QuantumAny
00245     scale;
00246 
00247   QuantumState
00248     quantum_state;
00249 
00250   register const IndexPacket
00251     *indexes;
00252 
00253   register const PixelPacket
00254     *p;
00255 
00256   register long
00257     x;
00258 
00259   register unsigned char
00260     *q;
00261 
00262   size_t
00263     extent;
00264 
00265   assert(image != (Image *) NULL);
00266   assert(image->signature == MagickSignature);
00267   if (image->debug != MagickFalse)
00268     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
00269   assert(quantum_info != (QuantumInfo *) NULL);
00270   assert(quantum_info->signature == MagickSignature);
00271   if (pixels == (unsigned char *) NULL)
00272     pixels=GetQuantumPixels(quantum_info);
00273   number_pixels=GetImageExtent(image);
00274   p=GetVirtualPixelQueue(image);
00275   indexes=GetVirtualIndexQueue(image);
00276   if (cache_view != (ViewInfo *) NULL)
00277     {
00278       number_pixels=GetCacheViewExtent(cache_view);
00279       p=GetCacheViewVirtualPixelQueue(cache_view);
00280       indexes=GetCacheViewVirtualIndexQueue(cache_view);
00281     }
00282   if (quantum_info->alpha_type == AssociatedQuantumAlpha)
00283     {
00284       register PixelPacket
00285         *q;
00286 
00287       /*
00288         Associate alpha.
00289       */
00290       q=GetAuthenticPixelQueue(image);
00291       if (cache_view != (ViewInfo *) NULL)
00292         q=GetAuthenticPixelQueue(image);
00293       for (x=0; x < (long) image->columns; x++)
00294       {
00295         alpha=QuantumScale*((double) QuantumRange-q->opacity);
00296         q->red=RoundToQuantum(alpha*q->red);
00297         q->green=RoundToQuantum(alpha*q->green);
00298         q->blue=RoundToQuantum(alpha*q->blue);
00299         q++;
00300       }
00301     }
00302   x=0;
00303   q=pixels;
00304   InitializeQuantumState(quantum_info,image->endian,&quantum_state);
00305   extent=GetQuantumExtent(image,quantum_info,quantum_type);
00306   endian=quantum_state.endian;
00307   switch (quantum_type)
00308   {
00309     case IndexQuantum:
00310     {
00311       if (image->storage_class != PseudoClass)
00312         {
00313           (void) ThrowMagickException(exception,GetMagickModule(),ImageError,
00314             "ColormappedImageRequired","`%s'",image->filename);
00315           return(extent);
00316         }
00317       switch (quantum_info->depth)
00318       {
00319         case 1:
00320         {
00321           register unsigned char
00322             pixel;
00323 
00324           for (x=((long) number_pixels-7); x > 0; x-=8)
00325           {
00326             pixel=(unsigned char) *indexes++;
00327             *q=((pixel & 0x01) << 7);
00328             pixel=(unsigned char) *indexes++;
00329             *q|=((pixel & 0x01) << 6);
00330             pixel=(unsigned char) *indexes++;
00331             *q|=((pixel & 0x01) << 5);
00332             pixel=(unsigned char) *indexes++;
00333             *q|=((pixel & 0x01) << 4);
00334             pixel=(unsigned char) *indexes++;
00335             *q|=((pixel & 0x01) << 3);
00336             pixel=(unsigned char) *indexes++;
00337             *q|=((pixel & 0x01) << 2);
00338             pixel=(unsigned char) *indexes++;
00339             *q|=((pixel & 0x01) << 1);
00340             pixel=(unsigned char) *indexes++;
00341             *q|=((pixel & 0x01) << 0);
00342             q++;
00343           }
00344           if ((number_pixels % 8) != 0)
00345             {
00346               *q='\0';
00347               for (bit=7; bit >= (long) (8-(number_pixels % 8)); bit--)
00348               {
00349                 pixel=(unsigned char) *indexes++;
00350                 *q|=((pixel & 0x01) << (unsigned char) bit);
00351               }
00352               q++;
00353             }
00354           break;
00355         }
00356         case 4:
00357         {
00358           register unsigned char
00359             pixel;
00360 
00361           for (x=0; x < (long) (number_pixels-1) ; x+=2)
00362           {
00363             pixel=(unsigned char) *indexes++;
00364             *q=((pixel & 0xf) << 4);
00365             pixel=(unsigned char) *indexes++;
00366             *q|=((pixel & 0xf) << 0);
00367             q++;
00368           }
00369           if ((number_pixels % 2) != 0)
00370             {
00371               pixel=(unsigned char) *indexes++;
00372               *q=((pixel & 0xf) << 4);
00373               q++;
00374             }
00375           break;
00376         }
00377         case 8:
00378         {
00379           for (x=0; x < (long) number_pixels; x++)
00380           {
00381             q=PopCharPixel((unsigned char) indexes[x],q);
00382             q+=quantum_info->pad;
00383           }
00384           break;
00385         }
00386         case 16:
00387         {
00388           for (x=0; x < (long) number_pixels; x++)
00389           {
00390             q=PopShortPixel(endian,(unsigned short) indexes[x],q);
00391             q+=quantum_info->pad;
00392           }
00393           break;
00394         }
00395         case 32:
00396         {
00397           if (quantum_info->format == FloatingPointQuantumFormat)
00398             {
00399               for (x=0; x < (long) number_pixels; x++)
00400               {
00401                 q=PopFloatPixel(&quantum_state,(float) indexes[x],q);
00402                 p++;
00403                 q+=quantum_info->pad;
00404               }
00405               break;
00406             }
00407           for (x=0; x < (long) number_pixels; x++)
00408           {
00409             q=PopLongPixel(endian,(unsigned long) indexes[x],q);
00410             q+=quantum_info->pad;
00411           }
00412           break;
00413         }
00414         case 64:
00415         {
00416           if (quantum_info->format == FloatingPointQuantumFormat)
00417             {
00418               for (x=0; x < (long) number_pixels; x++)
00419               {
00420                 q=PopDoublePixel(&quantum_state,(double) indexes[x],q);
00421                 p++;
00422                 q+=quantum_info->pad;
00423               }
00424               break;
00425             }
00426         }
00427         default:
00428         {
00429           for (x=0; x < (long) number_pixels; x++)
00430           {
00431             q=PopQuantumPixel(&quantum_state,image->depth,indexes[x],q);
00432             p++;
00433             q+=quantum_info->pad;
00434           }
00435           break;
00436         }
00437       }
00438       break;
00439     }
00440     case IndexAlphaQuantum:
00441     {
00442       if (image->storage_class != PseudoClass)
00443         {
00444           (void) ThrowMagickException(exception,GetMagickModule(),ImageError,
00445             "ColormappedImageRequired","`%s'",image->filename);
00446           return(extent);
00447         }
00448       switch (quantum_info->depth)
00449       {
00450         case 1:
00451         {
00452           register unsigned char
00453             pixel;
00454 
00455           for (x=((long) number_pixels-3); x > 0; x-=4)
00456           {
00457             pixel=(unsigned char) *indexes++;
00458             *q=((pixel & 0x01) << 7);
00459             pixel=(unsigned char) (p->opacity == (Quantum) TransparentOpacity ?
00460               1 : 0);
00461             *q|=((pixel & 0x01) << 6);
00462             p++;
00463             pixel=(unsigned char) *indexes++;
00464             *q|=((pixel & 0x01) << 5);
00465             pixel=(unsigned char) (p->opacity == (Quantum) TransparentOpacity ?
00466               1 : 0);
00467             *q|=((pixel & 0x01) << 4);
00468             p++;
00469             pixel=(unsigned char) *indexes++;
00470             *q|=((pixel & 0x01) << 3);
00471             pixel=(unsigned char) (p->opacity == (Quantum) TransparentOpacity ?
00472               1 : 0);
00473             *q|=((pixel & 0x01) << 2);
00474             p++;
00475             pixel=(unsigned char) *indexes++;
00476             *q|=((pixel & 0x01) << 1);
00477             pixel=(unsigned char) (p->opacity == (Quantum) TransparentOpacity ?
00478               1 : 0);
00479             *q|=((pixel & 0x01) << 0);
00480             p++;
00481             q++;
00482           }
00483           if ((number_pixels % 4) != 0)
00484             {
00485               *q='\0';
00486               for (bit=3; bit >= (long) (4-(number_pixels % 4)); bit-=2)
00487               {
00488                 pixel=(unsigned char) *indexes++;
00489                 *q|=((pixel & 0x01) << (unsigned char) bit);
00490                 pixel=(unsigned char) (p->opacity == (Quantum)
00491                   TransparentOpacity ? 1 : 0);
00492                 *q|=((pixel & 0x01) << (unsigned char) (bit-1));
00493                 p++;
00494               }
00495               q++;
00496             }
00497           break;
00498         }
00499         case 4:
00500         {
00501           register unsigned char
00502             pixel;
00503 
00504           for (x=0; x < (long) number_pixels ; x++)
00505           {
00506             pixel=(unsigned char) *indexes++;
00507             *q=((pixel & 0xf) << 4);
00508             pixel=(unsigned char) (16*QuantumScale*((Quantum) (QuantumRange-
00509               p->opacity))+0.5);
00510             *q|=((pixel & 0xf) << 0);
00511             p++;
00512             q++;
00513           }
00514           break;
00515         }
00516         case 8:
00517         {
00518           register unsigned char
00519             pixel;
00520 
00521           for (x=0; x < (long) number_pixels; x++)
00522           {
00523             q=PopCharPixel((unsigned char) indexes[x],q);
00524             pixel=ScaleQuantumToChar((Quantum) (QuantumRange-p->opacity));
00525             q=PopCharPixel(pixel,q);
00526             p++;
00527             q+=quantum_info->pad;
00528           }
00529           break;
00530         }
00531         case 16:
00532         {
00533           register unsigned short
00534             pixel;
00535 
00536           for (x=0; x < (long) number_pixels; x++)
00537           {
00538             q=PopShortPixel(endian,(unsigned short) indexes[x],q);
00539             pixel=ScaleQuantumToShort((Quantum) (QuantumRange-p->opacity));
00540             q=PopShortPixel(endian,pixel,q);
00541             p++;
00542             q+=quantum_info->pad;
00543           }
00544           break;
00545         }
00546         case 32:
00547         {
00548           register unsigned long
00549             pixel;
00550 
00551           if (quantum_info->format == FloatingPointQuantumFormat)
00552             {
00553               for (x=0; x < (long) number_pixels; x++)
00554               {
00555                 float
00556                   pixel;
00557 
00558                 q=PopFloatPixel(&quantum_state,(float) indexes[x],q);
00559                 pixel=(float)  (QuantumRange-p->opacity);
00560                 q=PopFloatPixel(&quantum_state,pixel,q);
00561                 p++;
00562                 q+=quantum_info->pad;
00563               }
00564               break;
00565             }
00566           for (x=0; x < (long) number_pixels; x++)
00567           {
00568             q=PopLongPixel(endian,(unsigned long) indexes[x],q);
00569             pixel=ScaleQuantumToLong((Quantum) (QuantumRange-p->opacity));
00570             q=PopLongPixel(endian,pixel,q);
00571             p++;
00572             q+=quantum_info->pad;
00573           }
00574           break;
00575         }
00576         case 64:
00577         {
00578           if (quantum_info->format == FloatingPointQuantumFormat)
00579             {
00580               for (x=0; x < (long) number_pixels; x++)
00581               {
00582                 double
00583                   pixel;
00584 
00585                 q=PopDoublePixel(&quantum_state,(double) indexes[x],q);
00586                 pixel=(double) (QuantumRange-p->opacity);
00587                 q=PopDoublePixel(&quantum_state,pixel,q);
00588                 p++;
00589                 q+=quantum_info->pad;
00590               }
00591               break;
00592             }
00593         }
00594         default:
00595         {
00596           scale=GetQuantumScale(image->depth);
00597           for (x=0; x < (long) number_pixels; x++)
00598           {
00599             q=PopQuantumPixel(&quantum_state,image->depth,indexes[x],q);
00600             q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
00601               (Quantum) (QuantumRange-p->opacity),image->depth,scale),q);
00602             p++;
00603             q+=quantum_info->pad;
00604           }
00605           break;
00606         }
00607       }
00608       break;
00609     }
00610     case GrayQuantum:
00611     {
00612       switch (quantum_info->depth)
00613       {
00614         case 1:
00615         {
00616           register Quantum
00617             threshold;
00618 
00619           register unsigned char
00620             black,
00621             white;
00622 
00623           black=0x00;
00624           white=0x01;
00625           if (quantum_info->min_is_white != MagickFalse)
00626             {
00627               black=0x01;
00628               white=0x00;
00629             }
00630           threshold=(Quantum) (QuantumRange/2);
00631           for (x=((long) number_pixels-7); x > 0; x-=8)
00632           {
00633             *q='\0';
00634             *q|=(PixelIntensityToQuantum(p) < threshold ? black : white) << 7;
00635             p++;
00636             *q|=(PixelIntensityToQuantum(p) < threshold ? black : white) << 6;
00637             p++;
00638             *q|=(PixelIntensityToQuantum(p) < threshold ? black : white) << 5;
00639             p++;
00640             *q|=(PixelIntensityToQuantum(p) < threshold ? black : white) << 4;
00641             p++;
00642             *q|=(PixelIntensityToQuantum(p) < threshold ? black : white) << 3;
00643             p++;
00644             *q|=(PixelIntensityToQuantum(p) < threshold ? black : white) << 2;
00645             p++;
00646             *q|=(PixelIntensityToQuantum(p) < threshold ? black : white) << 1;
00647             p++;
00648             *q|=(PixelIntensityToQuantum(p) < threshold ? black : white) << 0;
00649             p++;
00650             q++;
00651           }
00652           if ((number_pixels % 8) != 0)
00653             {
00654               *q='\0';
00655               for (bit=7; bit >= (long) (8-(number_pixels % 8)); bit--)
00656               {
00657                 *q|=(PixelIntensityToQuantum(p) < threshold ? black : white) <<
00658                   bit;
00659                 p++;
00660               }
00661               q++;
00662             }
00663           break;
00664         }
00665         case 4:
00666         {
00667           register unsigned char
00668             pixel;
00669 
00670           for (x=0; x < (long) (number_pixels-1) ; x+=2)
00671           {
00672             pixel=ScaleQuantumToChar(PixelIntensityToQuantum(p));
00673             *q=(((pixel >> 4) & 0xf) << 4);
00674             p++;
00675             pixel=ScaleQuantumToChar(PixelIntensityToQuantum(p));
00676             *q|=pixel >> 4;
00677             p++;
00678             q++;
00679           }
00680           if ((number_pixels % 2) != 0)
00681             {
00682               pixel=ScaleQuantumToChar(PixelIntensityToQuantum(p));
00683               *q=(((pixel >> 4) & 0xf) << 4);
00684               p++;
00685               q++;
00686             }
00687           break;
00688         }
00689         case 8:
00690         {
00691           register unsigned char
00692             pixel;
00693 
00694           for (x=0; x < (long) number_pixels; x++)
00695           {
00696             pixel=ScaleQuantumToChar(PixelIntensityToQuantum(p));
00697             q=PopCharPixel(pixel,q);
00698             p++;
00699             q+=quantum_info->pad;
00700           }
00701           break;
00702         }
00703         case 10:
00704         {
00705           register unsigned short
00706             pixel;
00707 
00708           scale=GetQuantumScale(image->depth);
00709           if (quantum_info->pack == MagickFalse)
00710             {
00711               for (x=0; x < (long) number_pixels; x++)
00712               {
00713                 pixel=ScaleQuantumToShort(PixelIntensityToQuantum(p));
00714                 q=PopShortPixel(endian,(unsigned short) ScaleQuantumToAny(
00715                   (Quantum) pixel,image->depth,scale),q);
00716                 p++;
00717                 q+=quantum_info->pad;
00718               }
00719               break;
00720             }
00721           for (x=0; x < (long) number_pixels; x++)
00722           {
00723             q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
00724               PixelIntensityToQuantum(p),image->depth,scale),q);
00725             p++;
00726             q+=quantum_info->pad;
00727           }
00728           break;
00729         }
00730         case 12:
00731         {
00732           register unsigned short
00733             pixel;
00734 
00735           scale=GetQuantumScale(image->depth);
00736           if (quantum_info->pack == MagickFalse)
00737             {
00738               for (x=0; x < (long) number_pixels; x++)
00739               {
00740                 pixel=ScaleQuantumToShort(PixelIntensityToQuantum(p));
00741                 q=PopShortPixel(endian,(unsigned short) (pixel >> 4),q);
00742                 p++;
00743                 q+=quantum_info->pad;
00744               }
00745               break;
00746             }
00747           for (x=0; x < (long) number_pixels; x++)
00748           {
00749             q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
00750               PixelIntensityToQuantum(p),image->depth,scale),q);
00751             p++;
00752             q+=quantum_info->pad;
00753           }
00754           break;
00755         }
00756         case 16:
00757         {
00758           register unsigned short
00759             pixel;
00760 
00761           for (x=0; x < (long) number_pixels; x++)
00762           {
00763             pixel=ScaleQuantumToShort(PixelIntensityToQuantum(p));
00764             q=PopShortPixel(endian,pixel,q);
00765             p++;
00766             q+=quantum_info->pad;
00767           }
00768           break;
00769         }
00770         case 32:
00771         {
00772           register unsigned long
00773             pixel;
00774 
00775           if (quantum_info->format == FloatingPointQuantumFormat)
00776             {
00777               for (x=0; x < (long) number_pixels; x++)
00778               {
00779                 float
00780                   pixel;
00781 
00782                 pixel=(float) PixelIntensityToQuantum(p);
00783                 q=PopFloatPixel(&quantum_state,pixel,q);
00784                 p++;
00785                 q+=quantum_info->pad;
00786               }
00787               break;
00788             }
00789           for (x=0; x < (long) number_pixels; x++)
00790           {
00791             pixel=ScaleQuantumToLong(PixelIntensityToQuantum(p));
00792             q=PopLongPixel(endian,pixel,q);
00793             p++;
00794             q+=quantum_info->pad;
00795           }
00796           break;
00797         }
00798         case 64:
00799         {
00800           if (quantum_info->format == FloatingPointQuantumFormat)
00801             {
00802               for (x=0; x < (long) number_pixels; x++)
00803               {
00804                 double
00805                   pixel;
00806 
00807                 pixel=(double) PixelIntensityToQuantum(p);
00808                 q=PopDoublePixel(&quantum_state,pixel,q);
00809                 p++;
00810                 q+=quantum_info->pad;
00811               }
00812               break;
00813             }
00814         }
00815         default:
00816         {
00817           scale=GetQuantumScale(image->depth);
00818           for (x=0; x < (long) number_pixels; x++)
00819           {
00820             q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
00821               PixelIntensityToQuantum(p),image->depth,scale),q);
00822             p++;
00823             q+=quantum_info->pad;
00824           }
00825           break;
00826         }
00827       }
00828       break;
00829     }
00830     case GrayAlphaQuantum:
00831     {
00832       switch (quantum_info->depth)
00833       {
00834         case 1:
00835         {
00836           register unsigned char
00837             pixel;
00838 
00839           for (x=((long) number_pixels-3); x > 0; x-=4)
00840           {
00841             pixel=ScaleQuantumToChar(PixelIntensityToQuantum(p));
00842             *q=(unsigned char) (((int) pixel != 0 ? 0x00 : 0x01) << 7);
00843             pixel=(unsigned char) (p->opacity == OpaqueOpacity ? 0x00 : 0x01);
00844             *q|=(((int) pixel != 0 ? 0x00 : 0x01) << 6);
00845             p++;
00846             pixel=ScaleQuantumToChar(PixelIntensityToQuantum(p));
00847             *q|=(((int) pixel != 0 ? 0x00 : 0x01) << 5);
00848             pixel=(unsigned char) (p->opacity == OpaqueOpacity ? 0x00 : 0x01);
00849             *q|=(((int) pixel != 0 ? 0x00 : 0x01) << 4);
00850             p++;
00851             pixel=ScaleQuantumToChar(PixelIntensityToQuantum(p));
00852             *q|=(((int) pixel != 0 ? 0x00 : 0x01) << 3);
00853             pixel=(unsigned char) (p->opacity == OpaqueOpacity ? 0x00 : 0x01);
00854             *q|=(((int) pixel != 0 ? 0x00 : 0x01) << 2);
00855             p++;
00856             pixel=ScaleQuantumToChar(PixelIntensityToQuantum(p));
00857             *q|=(((int) pixel != 0 ? 0x00 : 0x01) << 1);
00858             pixel=(unsigned char) (p->opacity == OpaqueOpacity ? 0x00 : 0x01);
00859             *q|=(((int) pixel != 0 ? 0x00 : 0x01) << 0);
00860             p++;
00861             q++;
00862           }
00863           if ((number_pixels % 4) != 0)
00864             {
00865               *q='\0';
00866               for (bit=3; bit >= (long) (4-(number_pixels % 4)); bit-=2)
00867               {
00868                 pixel=ScaleQuantumToChar(PixelIntensityToQuantum(p));
00869                 *q|=(((int) pixel != 0 ? 0x00 : 0x01) << (unsigned char) bit);
00870                 pixel=(unsigned char) (p->opacity == OpaqueOpacity ?
00871                   0x00 : 0x01);
00872                 *q|=(((int) pixel != 0 ? 0x00 : 0x01) <<
00873                   (unsigned char) (bit-1));
00874                 p++;
00875               }
00876               q++;
00877             }
00878           break;
00879         }
00880         case 4:
00881         {
00882           register unsigned char
00883             pixel;
00884 
00885           for (x=0; x < (long) number_pixels ; x++)
00886           {
00887             pixel=ScaleQuantumToChar(PixelIntensityToQuantum(p));
00888             *q=(((pixel >> 4) & 0xf) << 4);
00889             pixel=(unsigned char) (16*QuantumScale*((Quantum) (QuantumRange-
00890               p->opacity))+0.5);
00891             *q|=pixel & 0xf;
00892             p++;
00893             q++;
00894           }
00895           break;
00896         }
00897         case 8:
00898         {
00899           register unsigned char
00900             pixel;
00901 
00902           for (x=0; x < (long) number_pixels; x++)
00903           {
00904             pixel=ScaleQuantumToChar(PixelIntensityToQuantum(p));
00905             q=PopCharPixel(pixel,q);
00906             pixel=ScaleQuantumToChar((Quantum) (QuantumRange-p->opacity));
00907             q=PopCharPixel(pixel,q);
00908             p++;
00909             q+=quantum_info->pad;
00910           }
00911           break;
00912         }
00913         case 16:
00914         {
00915           register unsigned short
00916             pixel;
00917 
00918           for (x=0; x < (long) number_pixels; x++)
00919           {
00920             pixel=ScaleQuantumToShort(PixelIntensityToQuantum(p));
00921             q=PopShortPixel(endian,pixel,q);
00922             pixel=ScaleQuantumToShort((Quantum) (QuantumRange-p->opacity));
00923             q=PopShortPixel(endian,pixel,q);
00924             p++;
00925             q+=quantum_info->pad;
00926           }
00927           break;
00928         }
00929         case 32:
00930         {
00931           register unsigned long
00932             pixel;
00933 
00934           if (quantum_info->format == FloatingPointQuantumFormat)
00935             {
00936               for (x=0; x < (long) number_pixels; x++)
00937               {
00938                 float
00939                   pixel;
00940 
00941                 pixel=(float) PixelIntensityToQuantum(p);
00942                 q=PopFloatPixel(&quantum_state,pixel,q);
00943                 pixel=(float) (QuantumRange-p->opacity);
00944                 q=PopFloatPixel(&quantum_state,pixel,q);
00945                 p++;
00946                 q+=quantum_info->pad;
00947               }
00948               break;
00949             }
00950           for (x=0; x < (long) number_pixels; x++)
00951           {
00952             pixel=ScaleQuantumToLong(PixelIntensityToQuantum(p));
00953             q=PopLongPixel(endian,pixel,q);
00954             pixel=ScaleQuantumToLong((Quantum) (QuantumRange-p->opacity));
00955             q=PopLongPixel(endian,pixel,q);
00956             p++;
00957             q+=quantum_info->pad;
00958           }
00959           break;
00960         }
00961         case 64:
00962         {
00963           if (quantum_info->format == FloatingPointQuantumFormat)
00964             {
00965               for (x=0; x < (long) number_pixels; x++)
00966               {
00967                 double
00968                   pixel;
00969 
00970                 pixel=(double) PixelIntensityToQuantum(p);
00971                 q=PopDoublePixel(&quantum_state,pixel,q);
00972                 pixel=(double) (QuantumRange-p->opacity);
00973                 q=PopDoublePixel(&quantum_state,pixel,q);
00974                 p++;
00975                 q+=quantum_info->pad;
00976               }
00977               break;
00978             }
00979         }
00980         default:
00981         {
00982           scale=GetQuantumScale(image->depth);
00983           for (x=0; x < (long) number_pixels; x++)
00984           {
00985             q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
00986               PixelIntensityToQuantum(p),image->depth,scale),q);
00987             q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
00988               (Quantum) (QuantumRange-p->opacity),image->depth,scale),q);
00989             p++;
00990             q+=quantum_info->pad;
00991           }
00992           break;
00993         }
00994       }
00995       break;
00996     }
00997     case RedQuantum:
00998     case CyanQuantum:
00999     {
01000       switch (quantum_info->depth)
01001       {
01002         case 8:
01003         {
01004           register unsigned char
01005             pixel;
01006 
01007           for (x=0; x < (long) number_pixels; x++)
01008           {
01009             pixel=ScaleQuantumToChar(p->red);
01010             q=PopCharPixel(pixel,q);
01011             p++;
01012             q+=quantum_info->pad;
01013           }
01014           break;
01015         }
01016         case 16:
01017         {
01018           register unsigned short
01019             pixel;
01020 
01021           for (x=0; x < (long) number_pixels; x++)
01022           {
01023             pixel=ScaleQuantumToShort(p->red);
01024             q=PopShortPixel(endian,pixel,q);
01025             p++;
01026             q+=quantum_info->pad;
01027           }
01028           break;
01029         }
01030         case 32:
01031         {
01032           register unsigned long
01033             pixel;
01034 
01035           if (quantum_info->format == FloatingPointQuantumFormat)
01036             {
01037               for (x=0; x < (long) number_pixels; x++)
01038               {
01039                 q=PopFloatPixel(&quantum_state,(float) p->red,q);
01040                 p++;
01041                 q+=quantum_info->pad;
01042               }
01043               break;
01044             }
01045           for (x=0; x < (long) number_pixels; x++)
01046           {
01047             pixel=ScaleQuantumToLong(p->red);
01048             q=PopLongPixel(endian,pixel,q);
01049             p++;
01050             q+=quantum_info->pad;
01051           }
01052           break;
01053         }
01054         case 64:
01055         {
01056           if (quantum_info->format == FloatingPointQuantumFormat)
01057             {
01058               for (x=0; x < (long) number_pixels; x++)
01059               {
01060                 q=PopDoublePixel(&quantum_state,(double) p->red,q);
01061                 p++;
01062                 q+=quantum_info->pad;
01063               }
01064               break;
01065             }
01066         }
01067         default:
01068         {
01069           scale=GetQuantumScale(image->depth);
01070           for (x=0; x < (long) number_pixels; x++)
01071           {
01072             q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
01073               p->red,image->depth,scale),q);
01074             p++;
01075             q+=quantum_info->pad;
01076           }
01077           break;
01078         }
01079       }
01080       break;
01081     }
01082     case GreenQuantum:
01083     case MagentaQuantum:
01084     {
01085       switch (quantum_info->depth)
01086       {
01087         case 8:
01088         {
01089           register unsigned char
01090             pixel;
01091 
01092           for (x=0; x < (long) number_pixels; x++)
01093           {
01094             pixel=ScaleQuantumToChar(p->green);
01095             q=PopCharPixel(pixel,q);
01096             p++;
01097             q+=quantum_info->pad;
01098           }
01099           break;
01100         }
01101         case 16:
01102         {
01103           register unsigned short
01104             pixel;
01105 
01106           for (x=0; x < (long) number_pixels; x++)
01107           {
01108             pixel=ScaleQuantumToShort(p->green);
01109             q=PopShortPixel(endian,pixel,q);
01110             p++;
01111             q+=quantum_info->pad;
01112           }
01113           break;
01114         }
01115         case 32:
01116         {
01117           register unsigned long
01118             pixel;
01119 
01120           if (quantum_info->format == FloatingPointQuantumFormat)
01121             {
01122               for (x=0; x < (long) number_pixels; x++)
01123               {
01124                 q=PopFloatPixel(&quantum_state,(float) p->green,q);
01125                 p++;
01126                 q+=quantum_info->pad;
01127               }
01128               break;
01129             }
01130           for (x=0; x < (long) number_pixels; x++)
01131           {
01132             pixel=ScaleQuantumToLong(p->green);
01133             q=PopLongPixel(endian,pixel,q);
01134             p++;
01135             q+=quantum_info->pad;
01136           }
01137           break;
01138         }
01139         case 64:
01140         {
01141           if (quantum_info->format == FloatingPointQuantumFormat)
01142             {
01143               for (x=0; x < (long) number_pixels; x++)
01144               {
01145                 q=PopDoublePixel(&quantum_state,(double) p->green,q);
01146                 p++;
01147                 q+=quantum_info->pad;
01148               }
01149               break;
01150             }
01151         }
01152         default:
01153         {
01154           scale=GetQuantumScale(image->depth);
01155           for (x=0; x < (long) number_pixels; x++)
01156           {
01157             q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
01158               p->green,image->depth,scale),q);
01159             p++;
01160             q+=quantum_info->pad;
01161           }
01162           break;
01163         }
01164       }
01165       break;
01166     }
01167     case BlueQuantum:
01168     case YellowQuantum:
01169     {
01170       switch (quantum_info->depth)
01171       {
01172         case 8:
01173         {
01174           register unsigned char
01175             pixel;
01176 
01177           for (x=0; x < (long) number_pixels; x++)
01178           {
01179             pixel=ScaleQuantumToChar(p->blue);
01180             q=PopCharPixel(pixel,q);
01181             p++;
01182             q+=quantum_info->pad;
01183           }
01184           break;
01185         }
01186         case 16:
01187         {
01188           register unsigned short
01189             pixel;
01190 
01191           for (x=0; x < (long) number_pixels; x++)
01192           {
01193             pixel=ScaleQuantumToShort(p->blue);
01194             q=PopShortPixel(endian,pixel,q);
01195             p++;
01196             q+=quantum_info->pad;
01197           }
01198           break;
01199         }
01200         case 32:
01201         {
01202           register unsigned long
01203             pixel;
01204 
01205           if (quantum_info->format == FloatingPointQuantumFormat)
01206             {
01207               for (x=0; x < (long) number_pixels; x++)
01208               {
01209                 q=PopFloatPixel(&quantum_state,(float) p->blue,q);
01210                 p++;
01211                 q+=quantum_info->pad;
01212               }
01213               break;
01214             }
01215           for (x=0; x < (long) number_pixels; x++)
01216           {
01217             pixel=ScaleQuantumToLong(p->blue);
01218             q=PopLongPixel(endian,pixel,q);
01219             p++;
01220             q+=quantum_info->pad;
01221           }
01222           break;
01223         }
01224         case 64:
01225         {
01226           if (quantum_info->format == FloatingPointQuantumFormat)
01227             {
01228               for (x=0; x < (long) number_pixels; x++)
01229               {
01230                 q=PopDoublePixel(&quantum_state,(double) p->blue,q);
01231                 p++;
01232                 q+=quantum_info->pad;
01233               }
01234               break;
01235             }
01236         }
01237         default:
01238         {
01239           scale=GetQuantumScale(image->depth);
01240           for (x=0; x < (long) number_pixels; x++)
01241           {
01242             q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
01243               p->blue,image->depth,scale),q);
01244             p++;
01245             q+=quantum_info->pad;
01246           }
01247           break;
01248         }
01249       }
01250       break;
01251     }
01252     case AlphaQuantum:
01253