00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
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
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
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
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