blob: 08c82c5d15a2431586a9996408a5b11bb6e71013 [file] [log] [blame]
cristy3ed852e2009-09-05 21:47:34 +00001/*
2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3% %
4% %
5% %
6% QQQ U U AAA N N TTTTT U U M M %
7% Q Q U U A A NN N T U U MM MM %
8% Q Q U U AAAAA N N N T U U M M M %
9% Q QQ U U A A N NN T U U M M %
10% QQQQ UUU A A N N T UUU M M %
11% %
12% EEEEE X X PPPP OOO RRRR TTTTT %
13% E X X P P O O R R T %
14% EEE X PPPP O O RRRR T %
15% E X X P O O R R T %
16% EEEEE X X P OOO R R T %
17% %
18% MagickCore Methods to Export Quantum Pixels %
19% %
20% Software Design %
21% John Cristy %
22% October 1998 %
23% %
24% %
25% Copyright 1999-2008 ImageMagick Studio LLC, a non-profit organization %
26% dedicated to making software imaging solutions freely available. %
27% %
28% You may not use this file except in compliance with the License. You may %
29% obtain a copy of the License at %
30% %
31% http://www.imagemagick.org/script/license.php %
32% %
33% Unless required by applicable law or agreed to in writing, software %
34% distributed under the License is distributed on an "AS IS" BASIS, %
35% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %
36% See the License for the specific language governing permissions and %
37% limitations under the License. %
38% %
39%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
40%
41%
42*/
43
44/*
45 Include declarations.
46*/
47#include "magick/studio.h"
48#include "magick/property.h"
49#include "magick/blob.h"
50#include "magick/blob-private.h"
51#include "magick/color-private.h"
52#include "magick/exception.h"
53#include "magick/exception-private.h"
54#include "magick/cache.h"
55#include "magick/constitute.h"
56#include "magick/delegate.h"
57#include "magick/geometry.h"
58#include "magick/list.h"
59#include "magick/magick.h"
60#include "magick/memory_.h"
61#include "magick/monitor.h"
62#include "magick/option.h"
63#include "magick/pixel.h"
64#include "magick/pixel-private.h"
65#include "magick/quantum.h"
66#include "magick/quantum-private.h"
67#include "magick/resource_.h"
68#include "magick/semaphore.h"
69#include "magick/statistic.h"
70#include "magick/stream.h"
71#include "magick/string_.h"
72#include "magick/utility.h"
73
74/*
75%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
76% %
77% %
78% %
79+ E x p o r t Q u a n t u m P i x e l s %
80% %
81% %
82% %
83%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
84%
85% ExportQuantumPixels() transfers one or more pixel components from the image
86% pixel cache to a user supplied buffer. The pixels are returned in network
87% byte order. MagickTrue is returned if the pixels are successfully
88% transferred, otherwise MagickFalse.
89%
90% The format of the ExportQuantumPixels method is:
91%
92% size_t ExportQuantumPixels(const Image *image,const CacheView *image_view,
93% const QuantumInfo *quantum_info,const QuantumType quantum_type,
94% unsigned char *pixels,ExceptionInfo *exception)
95%
96% A description of each parameter follows:
97%
98% o image: the image.
99%
100% o image_view: the image cache view.
101%
102% o quantum_info: the quantum info.
103%
104% o quantum_type: Declare which pixel components to transfer (RGB, RGBA,
105% etc).
106%
107% o pixels: The components are transferred to this buffer.
108%
109% o exception: return any errors or warnings in this structure.
110%
111*/
112
113static inline unsigned char *PopDoublePixel(const QuantumState *quantum_state,
114 const double pixel,unsigned char *pixels)
115{
116 double
117 *p;
118
119 unsigned char
120 quantum[8];
121
122 p=(double *) quantum;
cristy82b15832009-10-06 19:17:37 +0000123 *p=(double) (pixel*quantum_state->inverse_scale+quantum_state->minimum);
cristy3ed852e2009-09-05 21:47:34 +0000124 if (quantum_state->endian != LSBEndian)
125 {
126 *pixels++=quantum[7];
127 *pixels++=quantum[6];
128 *pixels++=quantum[5];
129 *pixels++=quantum[4];
130 *pixels++=quantum[3];
131 *pixels++=quantum[2];
132 *pixels++=quantum[1];
133 *pixels++=quantum[0];
134 return(pixels);
135 }
136 *pixels++=quantum[0];
137 *pixels++=quantum[1];
138 *pixels++=quantum[2];
139 *pixels++=quantum[3];
140 *pixels++=quantum[4];
141 *pixels++=quantum[5];
142 *pixels++=quantum[6];
143 *pixels++=quantum[7];
144 return(pixels);
145}
146
147static inline unsigned char *PopFloatPixel(const QuantumState *quantum_state,
148 const float pixel,unsigned char *pixels)
149{
150 float
151 *p;
152
153 unsigned char
154 quantum[4];
155
156 p=(float *) quantum;
157 *p=(float) ((double) pixel*quantum_state->inverse_scale+
cristy82b15832009-10-06 19:17:37 +0000158 quantum_state->minimum);
cristy3ed852e2009-09-05 21:47:34 +0000159 if (quantum_state->endian != LSBEndian)
160 {
161 *pixels++=quantum[3];
162 *pixels++=quantum[2];
163 *pixels++=quantum[1];
164 *pixels++=quantum[0];
165 return(pixels);
166 }
167 *pixels++=quantum[0];
168 *pixels++=quantum[1];
169 *pixels++=quantum[2];
170 *pixels++=quantum[3];
171 return(pixels);
172}
173
174static inline unsigned char *PopQuantumPixel(QuantumState *quantum_state,
175 const unsigned long depth,const QuantumAny pixel,unsigned char *pixels)
176{
177 register long
178 i;
179
180 register unsigned long
181 quantum_bits;
182
183 if (quantum_state->bits == 0UL)
184 quantum_state->bits=8UL;
185 for (i=(long) depth; i > 0L; )
186 {
187 quantum_bits=(unsigned long) i;
188 if (quantum_bits > quantum_state->bits)
189 quantum_bits=quantum_state->bits;
190 i-=quantum_bits;
191 if (quantum_state->bits == 8)
192 *pixels='\0';
193 quantum_state->bits-=quantum_bits;
194 *pixels|=(((pixel >> i) &~ ((~0UL) << quantum_bits)) <<
195 quantum_state->bits);
196 if (quantum_state->bits == 0UL)
197 {
198 pixels++;
199 quantum_state->bits=8UL;
200 }
201 }
202 return(pixels);
203}
204
205static inline unsigned char *PopQuantumLongPixel(QuantumState *quantum_state,
206 const unsigned long depth,const unsigned long pixel,unsigned char *pixels)
207{
208 register long
209 i;
210
211 unsigned long
212 quantum_bits;
213
214 if (quantum_state->bits == 0UL)
215 quantum_state->bits=32UL;
216 for (i=(long) depth; i > 0; )
217 {
218 quantum_bits=(unsigned long) i;
219 if (quantum_bits > quantum_state->bits)
220 quantum_bits=quantum_state->bits;
221 quantum_state->pixel|=(((pixel >> (depth-i)) &
222 quantum_state->mask[quantum_bits]) << (32UL-quantum_state->bits));
223 i-=quantum_bits;
224 quantum_state->bits-=quantum_bits;
225 if (quantum_state->bits == 0U)
226 {
227 pixels=PopLongPixel(quantum_state->endian,quantum_state->pixel,pixels);
228 quantum_state->pixel=0U;
229 quantum_state->bits=32UL;
230 }
231 }
232 return(pixels);
233}
234
235MagickExport size_t ExportQuantumPixels(const Image *image,
236 const CacheView *image_view,const QuantumInfo *quantum_info,
237 const QuantumType quantum_type,unsigned char *pixels,ExceptionInfo *exception)
238{
239 EndianType
240 endian;
241
242 long
243 bit;
244
245 MagickRealType
246 alpha;
247
248 MagickSizeType
249 number_pixels;
250
251 QuantumAny
252 range;
253
254 QuantumState
255 quantum_state;
256
257 register const IndexPacket
cristyaebafa22009-11-26 01:48:56 +0000258 *restrict indexes;
cristy3ed852e2009-09-05 21:47:34 +0000259
260 register const PixelPacket
cristyaebafa22009-11-26 01:48:56 +0000261 *restrict p;
cristy3ed852e2009-09-05 21:47:34 +0000262
263 register long
264 x;
265
266 register unsigned char
cristyaebafa22009-11-26 01:48:56 +0000267 *restrict q;
cristy3ed852e2009-09-05 21:47:34 +0000268
269 size_t
270 extent;
271
272 assert(image != (Image *) NULL);
273 assert(image->signature == MagickSignature);
274 if (image->debug != MagickFalse)
275 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
276 assert(quantum_info != (QuantumInfo *) NULL);
277 assert(quantum_info->signature == MagickSignature);
278 if (pixels == (unsigned char *) NULL)
279 pixels=GetQuantumPixels(quantum_info);
280 number_pixels=GetImageExtent(image);
281 p=GetVirtualPixelQueue(image);
282 indexes=GetVirtualIndexQueue(image);
283 if (image_view != (CacheView *) NULL)
284 {
285 number_pixels=GetCacheViewExtent(image_view);
286 p=GetCacheViewVirtualPixelQueue(image_view);
287 indexes=GetCacheViewVirtualIndexQueue(image_view);
288 }
289 if (quantum_info->alpha_type == AssociatedQuantumAlpha)
290 {
291 register PixelPacket
cristyc47d1f82009-11-26 01:44:43 +0000292 *restrict q;
cristy3ed852e2009-09-05 21:47:34 +0000293
294 /*
295 Associate alpha.
296 */
297 q=GetAuthenticPixelQueue(image);
298 if (image_view != (CacheView *) NULL)
299 q=(PixelPacket *) GetCacheViewVirtualPixelQueue(image_view);
300 for (x=0; x < (long) image->columns; x++)
301 {
302 alpha=QuantumScale*((double) QuantumRange-q->opacity);
cristyce70c172010-01-07 17:15:30 +0000303 q->red=ClampToQuantum(alpha*q->red);
304 q->green=ClampToQuantum(alpha*q->green);
305 q->blue=ClampToQuantum(alpha*q->blue);
cristy3ed852e2009-09-05 21:47:34 +0000306 q++;
307 }
308 }
309 if ((quantum_type == RGBOQuantum) || (quantum_type == CMYKOQuantum))
310 {
311 register PixelPacket
cristyc47d1f82009-11-26 01:44:43 +0000312 *restrict q;
cristy3ed852e2009-09-05 21:47:34 +0000313
314 q=GetAuthenticPixelQueue(image);
315 if (image_view != (CacheView *) NULL)
316 q=(PixelPacket *) GetCacheViewVirtualPixelQueue(image_view);
317 for (x=0; x < (long) number_pixels; x++)
318 {
cristy46f08202010-01-10 04:04:21 +0000319 q->opacity=(Quantum) GetAlphaPixelComponent(q);
cristy3ed852e2009-09-05 21:47:34 +0000320 q++;
321 }
322 }
323 if ((quantum_type == CbYCrQuantum) || (quantum_type == CbYCrAQuantum))
324 {
325 Quantum
326 quantum;
327
328 register PixelPacket
cristyc47d1f82009-11-26 01:44:43 +0000329 *restrict q;
cristy3ed852e2009-09-05 21:47:34 +0000330
331 q=GetAuthenticPixelQueue(image);
332 if (image_view != (CacheView *) NULL)
333 q=GetAuthenticPixelQueue(image);
334 for (x=0; x < (long) number_pixels; x++)
335 {
336 quantum=q->red;
337 q->red=q->green;
338 q->green=quantum;
339 q++;
340 }
341 }
342 x=0;
343 q=pixels;
344 InitializeQuantumState(quantum_info,image->endian,&quantum_state);
345 extent=GetQuantumExtent(image,quantum_info,quantum_type);
346 endian=quantum_state.endian;
347 switch (quantum_type)
348 {
349 case IndexQuantum:
350 {
351 if (image->storage_class != PseudoClass)
352 {
353 (void) ThrowMagickException(exception,GetMagickModule(),ImageError,
354 "ColormappedImageRequired","`%s'",image->filename);
355 return(extent);
356 }
357 switch (quantum_info->depth)
358 {
359 case 1:
360 {
361 register unsigned char
362 pixel;
363
364 for (x=((long) number_pixels-7); x > 0; x-=8)
365 {
366 pixel=(unsigned char) *indexes++;
367 *q=((pixel & 0x01) << 7);
368 pixel=(unsigned char) *indexes++;
369 *q|=((pixel & 0x01) << 6);
370 pixel=(unsigned char) *indexes++;
371 *q|=((pixel & 0x01) << 5);
372 pixel=(unsigned char) *indexes++;
373 *q|=((pixel & 0x01) << 4);
374 pixel=(unsigned char) *indexes++;
375 *q|=((pixel & 0x01) << 3);
376 pixel=(unsigned char) *indexes++;
377 *q|=((pixel & 0x01) << 2);
378 pixel=(unsigned char) *indexes++;
379 *q|=((pixel & 0x01) << 1);
380 pixel=(unsigned char) *indexes++;
381 *q|=((pixel & 0x01) << 0);
382 q++;
383 }
384 if ((number_pixels % 8) != 0)
385 {
386 *q='\0';
387 for (bit=7; bit >= (long) (8-(number_pixels % 8)); bit--)
388 {
389 pixel=(unsigned char) *indexes++;
390 *q|=((pixel & 0x01) << (unsigned char) bit);
391 }
392 q++;
393 }
394 break;
395 }
396 case 4:
397 {
398 register unsigned char
399 pixel;
400
401 for (x=0; x < (long) (number_pixels-1) ; x+=2)
402 {
403 pixel=(unsigned char) *indexes++;
404 *q=((pixel & 0xf) << 4);
405 pixel=(unsigned char) *indexes++;
406 *q|=((pixel & 0xf) << 0);
407 q++;
408 }
409 if ((number_pixels % 2) != 0)
410 {
411 pixel=(unsigned char) *indexes++;
412 *q=((pixel & 0xf) << 4);
413 q++;
414 }
415 break;
416 }
417 case 8:
418 {
419 for (x=0; x < (long) number_pixels; x++)
420 {
421 q=PopCharPixel((unsigned char) indexes[x],q);
422 q+=quantum_info->pad;
423 }
424 break;
425 }
426 case 16:
427 {
cristyc9672a92010-01-06 00:57:45 +0000428 if (quantum_info->format == FloatingPointQuantumFormat)
429 {
430 for (x=0; x < (long) number_pixels; x++)
431 {
cristy2a4d01c2010-01-10 21:14:51 +0000432 q=PopShortPixel(endian,SinglePrecisionToHalf(QuantumScale*
cristyc9672a92010-01-06 00:57:45 +0000433 indexes[x]),q);
434 q+=quantum_info->pad;
435 }
436 break;
437 }
cristy3ed852e2009-09-05 21:47:34 +0000438 for (x=0; x < (long) number_pixels; x++)
439 {
440 q=PopShortPixel(endian,(unsigned short) indexes[x],q);
441 q+=quantum_info->pad;
442 }
443 break;
444 }
445 case 32:
446 {
447 if (quantum_info->format == FloatingPointQuantumFormat)
448 {
449 for (x=0; x < (long) number_pixels; x++)
450 {
451 q=PopFloatPixel(&quantum_state,(float) indexes[x],q);
452 p++;
453 q+=quantum_info->pad;
454 }
455 break;
456 }
457 for (x=0; x < (long) number_pixels; x++)
458 {
459 q=PopLongPixel(endian,(unsigned long) indexes[x],q);
460 q+=quantum_info->pad;
461 }
462 break;
463 }
464 case 64:
465 {
466 if (quantum_info->format == FloatingPointQuantumFormat)
467 {
468 for (x=0; x < (long) number_pixels; x++)
469 {
470 q=PopDoublePixel(&quantum_state,(double) indexes[x],q);
471 p++;
472 q+=quantum_info->pad;
473 }
474 break;
475 }
476 }
477 default:
478 {
479 for (x=0; x < (long) number_pixels; x++)
480 {
481 q=PopQuantumPixel(&quantum_state,image->depth,indexes[x],q);
482 p++;
483 q+=quantum_info->pad;
484 }
485 break;
486 }
487 }
488 break;
489 }
490 case IndexAlphaQuantum:
491 {
492 if (image->storage_class != PseudoClass)
493 {
494 (void) ThrowMagickException(exception,GetMagickModule(),ImageError,
495 "ColormappedImageRequired","`%s'",image->filename);
496 return(extent);
497 }
498 switch (quantum_info->depth)
499 {
500 case 1:
501 {
502 register unsigned char
503 pixel;
504
505 for (x=((long) number_pixels-3); x > 0; x-=4)
506 {
507 pixel=(unsigned char) *indexes++;
508 *q=((pixel & 0x01) << 7);
509 pixel=(unsigned char) (p->opacity == (Quantum) TransparentOpacity ?
510 1 : 0);
511 *q|=((pixel & 0x01) << 6);
512 p++;
513 pixel=(unsigned char) *indexes++;
514 *q|=((pixel & 0x01) << 5);
515 pixel=(unsigned char) (p->opacity == (Quantum) TransparentOpacity ?
516 1 : 0);
517 *q|=((pixel & 0x01) << 4);
518 p++;
519 pixel=(unsigned char) *indexes++;
520 *q|=((pixel & 0x01) << 3);
521 pixel=(unsigned char) (p->opacity == (Quantum) TransparentOpacity ?
522 1 : 0);
523 *q|=((pixel & 0x01) << 2);
524 p++;
525 pixel=(unsigned char) *indexes++;
526 *q|=((pixel & 0x01) << 1);
527 pixel=(unsigned char) (p->opacity == (Quantum) TransparentOpacity ?
528 1 : 0);
529 *q|=((pixel & 0x01) << 0);
530 p++;
531 q++;
532 }
533 if ((number_pixels % 4) != 0)
534 {
535 *q='\0';
536 for (bit=3; bit >= (long) (4-(number_pixels % 4)); bit-=2)
537 {
538 pixel=(unsigned char) *indexes++;
cristyb32b90a2009-09-07 21:45:48 +0000539 *q|=((pixel & 0x01) << (unsigned char) (bit+4));
cristy3ed852e2009-09-05 21:47:34 +0000540 pixel=(unsigned char) (p->opacity == (Quantum)
541 TransparentOpacity ? 1 : 0);
cristyb32b90a2009-09-07 21:45:48 +0000542 *q|=((pixel & 0x01) << (unsigned char) (bit+4-1));
cristy3ed852e2009-09-05 21:47:34 +0000543 p++;
544 }
545 q++;
546 }
547 break;
548 }
549 case 4:
550 {
551 register unsigned char
552 pixel;
553
554 for (x=0; x < (long) number_pixels ; x++)
555 {
556 pixel=(unsigned char) *indexes++;
557 *q=((pixel & 0xf) << 4);
558 pixel=(unsigned char) (16*QuantumScale*((Quantum) (QuantumRange-
cristyce70c172010-01-07 17:15:30 +0000559 GetOpacityPixelComponent(p)))+0.5);
cristy3ed852e2009-09-05 21:47:34 +0000560 *q|=((pixel & 0xf) << 0);
561 p++;
562 q++;
563 }
564 break;
565 }
566 case 8:
567 {
568 register unsigned char
569 pixel;
570
571 for (x=0; x < (long) number_pixels; x++)
572 {
573 q=PopCharPixel((unsigned char) indexes[x],q);
cristyce70c172010-01-07 17:15:30 +0000574 pixel=ScaleQuantumToChar((Quantum) (QuantumRange-
575 GetOpacityPixelComponent(p)));
cristy3ed852e2009-09-05 21:47:34 +0000576 q=PopCharPixel(pixel,q);
577 p++;
578 q+=quantum_info->pad;
579 }
580 break;
581 }
582 case 16:
583 {
584 register unsigned short
585 pixel;
586
cristyc9672a92010-01-06 00:57:45 +0000587 if (quantum_info->format == FloatingPointQuantumFormat)
588 {
589 for (x=0; x < (long) number_pixels; x++)
590 {
591 q=PopShortPixel(endian,(unsigned short) indexes[x],q);
cristy2a4d01c2010-01-10 21:14:51 +0000592 pixel=SinglePrecisionToHalf(QuantumScale*
cristy24fb7dc2010-01-10 20:15:51 +0000593 GetAlphaPixelComponent(p));
cristyc9672a92010-01-06 00:57:45 +0000594 q=PopShortPixel(endian,pixel,q);
595 p++;
596 q+=quantum_info->pad;
597 }
598 break;
599 }
cristy3ed852e2009-09-05 21:47:34 +0000600 for (x=0; x < (long) number_pixels; x++)
601 {
602 q=PopShortPixel(endian,(unsigned short) indexes[x],q);
cristyce70c172010-01-07 17:15:30 +0000603 pixel=ScaleQuantumToShort((Quantum) (QuantumRange-
604 GetOpacityPixelComponent(p)));
cristy3ed852e2009-09-05 21:47:34 +0000605 q=PopShortPixel(endian,pixel,q);
606 p++;
607 q+=quantum_info->pad;
608 }
609 break;
610 }
611 case 32:
612 {
613 register unsigned long
614 pixel;
615
616 if (quantum_info->format == FloatingPointQuantumFormat)
617 {
618 for (x=0; x < (long) number_pixels; x++)
619 {
620 float
621 pixel;
622
623 q=PopFloatPixel(&quantum_state,(float) indexes[x],q);
cristy46f08202010-01-10 04:04:21 +0000624 pixel=(float) (GetAlphaPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +0000625 q=PopFloatPixel(&quantum_state,pixel,q);
626 p++;
627 q+=quantum_info->pad;
628 }
629 break;
630 }
631 for (x=0; x < (long) number_pixels; x++)
632 {
633 q=PopLongPixel(endian,(unsigned long) indexes[x],q);
cristyce70c172010-01-07 17:15:30 +0000634 pixel=ScaleQuantumToLong((Quantum) (QuantumRange-
635 GetOpacityPixelComponent(p)));
cristy3ed852e2009-09-05 21:47:34 +0000636 q=PopLongPixel(endian,pixel,q);
637 p++;
638 q+=quantum_info->pad;
639 }
640 break;
641 }
642 case 64:
643 {
644 if (quantum_info->format == FloatingPointQuantumFormat)
645 {
646 for (x=0; x < (long) number_pixels; x++)
647 {
648 double
649 pixel;
650
651 q=PopDoublePixel(&quantum_state,(double) indexes[x],q);
cristy46f08202010-01-10 04:04:21 +0000652 pixel=(double) (GetAlphaPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +0000653 q=PopDoublePixel(&quantum_state,pixel,q);
654 p++;
655 q+=quantum_info->pad;
656 }
657 break;
658 }
659 }
660 default:
661 {
662 range=GetQuantumRange(image->depth);
663 for (x=0; x < (long) number_pixels; x++)
664 {
665 q=PopQuantumPixel(&quantum_state,image->depth,indexes[x],q);
666 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
cristy46f08202010-01-10 04:04:21 +0000667 (Quantum) (GetAlphaPixelComponent(p)),range),q);
cristy3ed852e2009-09-05 21:47:34 +0000668 p++;
669 q+=quantum_info->pad;
670 }
671 break;
672 }
673 }
674 break;
675 }
676 case GrayQuantum:
677 {
678 switch (quantum_info->depth)
679 {
680 case 1:
681 {
682 register Quantum
683 threshold;
684
685 register unsigned char
686 black,
687 white;
688
689 black=0x00;
690 white=0x01;
691 if (quantum_info->min_is_white != MagickFalse)
692 {
693 black=0x01;
694 white=0x00;
695 }
696 threshold=(Quantum) (QuantumRange/2);
697 for (x=((long) number_pixels-7); x > 0; x-=8)
698 {
699 *q='\0';
700 *q|=(PixelIntensityToQuantum(p) < threshold ? black : white) << 7;
701 p++;
702 *q|=(PixelIntensityToQuantum(p) < threshold ? black : white) << 6;
703 p++;
704 *q|=(PixelIntensityToQuantum(p) < threshold ? black : white) << 5;
705 p++;
706 *q|=(PixelIntensityToQuantum(p) < threshold ? black : white) << 4;
707 p++;
708 *q|=(PixelIntensityToQuantum(p) < threshold ? black : white) << 3;
709 p++;
710 *q|=(PixelIntensityToQuantum(p) < threshold ? black : white) << 2;
711 p++;
712 *q|=(PixelIntensityToQuantum(p) < threshold ? black : white) << 1;
713 p++;
714 *q|=(PixelIntensityToQuantum(p) < threshold ? black : white) << 0;
715 p++;
716 q++;
717 }
718 if ((number_pixels % 8) != 0)
719 {
720 *q='\0';
721 for (bit=7; bit >= (long) (8-(number_pixels % 8)); bit--)
722 {
723 *q|=(PixelIntensityToQuantum(p) < threshold ? black : white) <<
724 bit;
725 p++;
726 }
727 q++;
728 }
729 break;
730 }
731 case 4:
732 {
733 register unsigned char
734 pixel;
735
736 for (x=0; x < (long) (number_pixels-1) ; x+=2)
737 {
738 pixel=ScaleQuantumToChar(PixelIntensityToQuantum(p));
739 *q=(((pixel >> 4) & 0xf) << 4);
740 p++;
741 pixel=ScaleQuantumToChar(PixelIntensityToQuantum(p));
742 *q|=pixel >> 4;
743 p++;
744 q++;
745 }
746 if ((number_pixels % 2) != 0)
747 {
748 pixel=ScaleQuantumToChar(PixelIntensityToQuantum(p));
749 *q=(((pixel >> 4) & 0xf) << 4);
750 p++;
751 q++;
752 }
753 break;
754 }
755 case 8:
756 {
757 register unsigned char
758 pixel;
759
760 for (x=0; x < (long) number_pixels; x++)
761 {
762 pixel=ScaleQuantumToChar(PixelIntensityToQuantum(p));
763 q=PopCharPixel(pixel,q);
764 p++;
765 q+=quantum_info->pad;
766 }
767 break;
768 }
769 case 10:
770 {
cristy3ed852e2009-09-05 21:47:34 +0000771 range=GetQuantumRange(image->depth);
772 if (quantum_info->pack == MagickFalse)
773 {
cristyff024b42010-02-21 22:55:09 +0000774 register unsigned long
775 pixel;
776
cristy69702dd2010-02-22 15:26:39 +0000777 for (x=0; x < (long) (number_pixels-2); x+=3)
cristy3ed852e2009-09-05 21:47:34 +0000778 {
cristyff024b42010-02-21 22:55:09 +0000779 pixel=(unsigned long) (
780 ScaleQuantumToAny(PixelIntensityToQuantum(p+2),range) << 22 |
781 ScaleQuantumToAny(PixelIntensityToQuantum(p+1),range) << 12 |
782 ScaleQuantumToAny(PixelIntensityToQuantum(p+0),range) << 2);
783 q=PopLongPixel(endian,pixel,q);
784 p+=3;
cristy3ed852e2009-09-05 21:47:34 +0000785 q+=quantum_info->pad;
786 }
cristy69702dd2010-02-22 15:26:39 +0000787 pixel=0UL;
cristyff024b42010-02-21 22:55:09 +0000788 if (x++ < (long) (number_pixels-1))
cristy69702dd2010-02-22 15:26:39 +0000789 pixel|=ScaleQuantumToAny(PixelIntensityToQuantum(p+1),
790 range) << 12;
cristyff024b42010-02-21 22:55:09 +0000791 if (x++ < (long) number_pixels)
cristy69702dd2010-02-22 15:26:39 +0000792 pixel|=ScaleQuantumToAny(PixelIntensityToQuantum(p+0),
793 range) << 2;
794 q=PopLongPixel(endian,pixel,q);
cristy3ed852e2009-09-05 21:47:34 +0000795 break;
796 }
797 for (x=0; x < (long) number_pixels; x++)
798 {
799 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
800 PixelIntensityToQuantum(p),range),q);
801 p++;
802 q+=quantum_info->pad;
803 }
804 break;
805 }
806 case 12:
807 {
808 register unsigned short
809 pixel;
810
811 range=GetQuantumRange(image->depth);
812 if (quantum_info->pack == MagickFalse)
813 {
814 for (x=0; x < (long) number_pixels; x++)
815 {
816 pixel=ScaleQuantumToShort(PixelIntensityToQuantum(p));
817 q=PopShortPixel(endian,(unsigned short) (pixel >> 4),q);
818 p++;
819 q+=quantum_info->pad;
820 }
821 break;
822 }
823 for (x=0; x < (long) number_pixels; x++)
824 {
825 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
826 PixelIntensityToQuantum(p),range),q);
827 p++;
828 q+=quantum_info->pad;
829 }
830 break;
831 }
832 case 16:
833 {
834 register unsigned short
835 pixel;
836
cristyc9672a92010-01-06 00:57:45 +0000837 if (quantum_info->format == FloatingPointQuantumFormat)
838 {
839 for (x=0; x < (long) number_pixels; x++)
840 {
cristy2a4d01c2010-01-10 21:14:51 +0000841 pixel=SinglePrecisionToHalf(QuantumScale*
cristy24fb7dc2010-01-10 20:15:51 +0000842 PixelIntensityToQuantum(p));
cristyc9672a92010-01-06 00:57:45 +0000843 q=PopShortPixel(endian,pixel,q);
844 p++;
845 q+=quantum_info->pad;
846 }
847 break;
848 }
cristy3ed852e2009-09-05 21:47:34 +0000849 for (x=0; x < (long) number_pixels; x++)
850 {
851 pixel=ScaleQuantumToShort(PixelIntensityToQuantum(p));
852 q=PopShortPixel(endian,pixel,q);
853 p++;
854 q+=quantum_info->pad;
855 }
856 break;
857 }
858 case 32:
859 {
860 register unsigned long
861 pixel;
862
863 if (quantum_info->format == FloatingPointQuantumFormat)
864 {
865 for (x=0; x < (long) number_pixels; x++)
866 {
867 float
868 pixel;
869
870 pixel=(float) PixelIntensityToQuantum(p);
871 q=PopFloatPixel(&quantum_state,pixel,q);
872 p++;
873 q+=quantum_info->pad;
874 }
875 break;
876 }
877 for (x=0; x < (long) number_pixels; x++)
878 {
879 pixel=ScaleQuantumToLong(PixelIntensityToQuantum(p));
880 q=PopLongPixel(endian,pixel,q);
881 p++;
882 q+=quantum_info->pad;
883 }
884 break;
885 }
886 case 64:
887 {
888 if (quantum_info->format == FloatingPointQuantumFormat)
889 {
890 for (x=0; x < (long) number_pixels; x++)
891 {
892 double
893 pixel;
894
895 pixel=(double) PixelIntensityToQuantum(p);
896 q=PopDoublePixel(&quantum_state,pixel,q);
897 p++;
898 q+=quantum_info->pad;
899 }
900 break;
901 }
902 }
903 default:
904 {
905 range=GetQuantumRange(image->depth);
906 for (x=0; x < (long) number_pixels; x++)
907 {
908 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
909 PixelIntensityToQuantum(p),range),q);
910 p++;
911 q+=quantum_info->pad;
912 }
913 break;
914 }
915 }
916 break;
917 }
918 case GrayAlphaQuantum:
919 {
920 switch (quantum_info->depth)
921 {
922 case 1:
923 {
924 register Quantum
925 threshold;
926
927 register unsigned char
928 black,
929 pixel,
930 white;
931
932 black=0x00;
933 white=0x01;
934 if (quantum_info->min_is_white == MagickFalse)
935 {
936 black=0x01;
937 white=0x00;
938 }
939 threshold=(Quantum) (QuantumRange/2);
940 for (x=((long) number_pixels-3); x > 0; x-=4)
941 {
942 *q='\0';
943 *q|=(PixelIntensityToQuantum(p) < threshold ? black : white) << 7;
944 pixel=(unsigned char) (p->opacity == OpaqueOpacity ? 0x00 : 0x01);
945 *q|=(((int) pixel != 0 ? 0x00 : 0x01) << 6);
946 p++;
947 *q|=(PixelIntensityToQuantum(p) < threshold ? black : white) << 5;
948 pixel=(unsigned char) (p->opacity == OpaqueOpacity ? 0x00 : 0x01);
949 *q|=(((int) pixel != 0 ? 0x00 : 0x01) << 4);
950 p++;
951 *q|=(PixelIntensityToQuantum(p) < threshold ? black : white) << 3;
952 pixel=(unsigned char) (p->opacity == OpaqueOpacity ? 0x00 : 0x01);
953 *q|=(((int) pixel != 0 ? 0x00 : 0x01) << 2);
954 p++;
955 *q|=(PixelIntensityToQuantum(p) < threshold ? black : white) << 1;
956 pixel=(unsigned char) (p->opacity == OpaqueOpacity ? 0x00 : 0x01);
957 *q|=(((int) pixel != 0 ? 0x00 : 0x01) << 0);
958 p++;
959 q++;
960 }
961 if ((number_pixels % 4) != 0)
962 {
963 *q='\0';
964 for (bit=3; bit >= (long) (4-(number_pixels % 4)); bit-=2)
965 {
966 *q|=(PixelIntensityToQuantum(p) < threshold ? black : white) <<
cristyb32b90a2009-09-07 21:45:48 +0000967 (bit+4);
cristy3ed852e2009-09-05 21:47:34 +0000968 pixel=(unsigned char) (p->opacity == OpaqueOpacity ? 0x00 :
969 0x01);
970 *q|=(((int) pixel != 0 ? 0x00 : 0x01) << (unsigned char)
cristyb32b90a2009-09-07 21:45:48 +0000971 (bit+4-1));
cristy3ed852e2009-09-05 21:47:34 +0000972 p++;
973 }
974 q++;
975 }
976 break;
977 }
978 case 4:
979 {
980 register unsigned char
981 pixel;
982
983 for (x=0; x < (long) number_pixels ; x++)
984 {
985 pixel=ScaleQuantumToChar(PixelIntensityToQuantum(p));
986 *q=(((pixel >> 4) & 0xf) << 4);
987 pixel=(unsigned char) (16*QuantumScale*((Quantum) (QuantumRange-
cristyce70c172010-01-07 17:15:30 +0000988 GetOpacityPixelComponent(p)))+0.5);
cristy3ed852e2009-09-05 21:47:34 +0000989 *q|=pixel & 0xf;
990 p++;
991 q++;
992 }
993 break;
994 }
995 case 8:
996 {
997 register unsigned char
998 pixel;
999
1000 for (x=0; x < (long) number_pixels; x++)
1001 {
1002 pixel=ScaleQuantumToChar(PixelIntensityToQuantum(p));
1003 q=PopCharPixel(pixel,q);
cristyce70c172010-01-07 17:15:30 +00001004 pixel=ScaleQuantumToChar((Quantum) (QuantumRange-
1005 GetOpacityPixelComponent(p)));
cristy3ed852e2009-09-05 21:47:34 +00001006 q=PopCharPixel(pixel,q);
1007 p++;
1008 q+=quantum_info->pad;
1009 }
1010 break;
1011 }
1012 case 16:
1013 {
1014 register unsigned short
1015 pixel;
1016
cristyc9672a92010-01-06 00:57:45 +00001017 if (quantum_info->format == FloatingPointQuantumFormat)
1018 {
1019 for (x=0; x < (long) number_pixels; x++)
1020 {
cristy2a4d01c2010-01-10 21:14:51 +00001021 pixel=SinglePrecisionToHalf(QuantumScale*
cristy24fb7dc2010-01-10 20:15:51 +00001022 PixelIntensityToQuantum(p));
cristyc9672a92010-01-06 00:57:45 +00001023 q=PopShortPixel(endian,pixel,q);
cristy2a4d01c2010-01-10 21:14:51 +00001024 pixel=SinglePrecisionToHalf(QuantumScale*
cristy24fb7dc2010-01-10 20:15:51 +00001025 GetAlphaPixelComponent(p));
cristyc9672a92010-01-06 00:57:45 +00001026 q=PopShortPixel(endian,pixel,q);
1027 p++;
1028 q+=quantum_info->pad;
1029 }
1030 break;
1031 }
cristy3ed852e2009-09-05 21:47:34 +00001032 for (x=0; x < (long) number_pixels; x++)
1033 {
1034 pixel=ScaleQuantumToShort(PixelIntensityToQuantum(p));
1035 q=PopShortPixel(endian,pixel,q);
cristyce70c172010-01-07 17:15:30 +00001036 pixel=ScaleQuantumToShort((Quantum) (QuantumRange-
1037 GetOpacityPixelComponent(p)));
cristy3ed852e2009-09-05 21:47:34 +00001038 q=PopShortPixel(endian,pixel,q);
1039 p++;
1040 q+=quantum_info->pad;
1041 }
1042 break;
1043 }
1044 case 32:
1045 {
1046 register unsigned long
1047 pixel;
1048
1049 if (quantum_info->format == FloatingPointQuantumFormat)
1050 {
1051 for (x=0; x < (long) number_pixels; x++)
1052 {
1053 float
1054 pixel;
1055
1056 pixel=(float) PixelIntensityToQuantum(p);
1057 q=PopFloatPixel(&quantum_state,pixel,q);
cristy46f08202010-01-10 04:04:21 +00001058 pixel=(float) (GetAlphaPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00001059 q=PopFloatPixel(&quantum_state,pixel,q);
1060 p++;
1061 q+=quantum_info->pad;
1062 }
1063 break;
1064 }
1065 for (x=0; x < (long) number_pixels; x++)
1066 {
1067 pixel=ScaleQuantumToLong(PixelIntensityToQuantum(p));
1068 q=PopLongPixel(endian,pixel,q);
cristyce70c172010-01-07 17:15:30 +00001069 pixel=ScaleQuantumToLong((Quantum) (QuantumRange-
1070 GetOpacityPixelComponent(p)));
cristy3ed852e2009-09-05 21:47:34 +00001071 q=PopLongPixel(endian,pixel,q);
1072 p++;
1073 q+=quantum_info->pad;
1074 }
1075 break;
1076 }
1077 case 64:
1078 {
1079 if (quantum_info->format == FloatingPointQuantumFormat)
1080 {
1081 for (x=0; x < (long) number_pixels; x++)
1082 {
1083 double
1084 pixel;
1085
1086 pixel=(double) PixelIntensityToQuantum(p);
1087 q=PopDoublePixel(&quantum_state,pixel,q);
cristy46f08202010-01-10 04:04:21 +00001088 pixel=(double) (GetAlphaPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00001089 q=PopDoublePixel(&quantum_state,pixel,q);
1090 p++;
1091 q+=quantum_info->pad;
1092 }
1093 break;
1094 }
1095 }
1096 default:
1097 {
1098 range=GetQuantumRange(image->depth);
1099 for (x=0; x < (long) number_pixels; x++)
1100 {
1101 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
1102 PixelIntensityToQuantum(p),range),q);
1103 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
cristy46f08202010-01-10 04:04:21 +00001104 (Quantum) (GetAlphaPixelComponent(p)),range),q);
cristy3ed852e2009-09-05 21:47:34 +00001105 p++;
1106 q+=quantum_info->pad;
1107 }
1108 break;
1109 }
1110 }
1111 break;
1112 }
1113 case RedQuantum:
1114 case CyanQuantum:
1115 {
1116 switch (quantum_info->depth)
1117 {
1118 case 8:
1119 {
1120 register unsigned char
1121 pixel;
1122
1123 for (x=0; x < (long) number_pixels; x++)
1124 {
cristyce70c172010-01-07 17:15:30 +00001125 pixel=ScaleQuantumToChar(GetRedPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00001126 q=PopCharPixel(pixel,q);
1127 p++;
1128 q+=quantum_info->pad;
1129 }
1130 break;
1131 }
1132 case 16:
1133 {
1134 register unsigned short
1135 pixel;
1136
cristyc9672a92010-01-06 00:57:45 +00001137 if (quantum_info->format == FloatingPointQuantumFormat)
1138 {
1139 for (x=0; x < (long) number_pixels; x++)
1140 {
cristy2a4d01c2010-01-10 21:14:51 +00001141 pixel=SinglePrecisionToHalf(QuantumScale*
cristy24fb7dc2010-01-10 20:15:51 +00001142 GetRedPixelComponent(p));
cristyc9672a92010-01-06 00:57:45 +00001143 q=PopShortPixel(endian,pixel,q);
1144 p++;
1145 q+=quantum_info->pad;
1146 }
1147 break;
1148 }
cristy3ed852e2009-09-05 21:47:34 +00001149 for (x=0; x < (long) number_pixels; x++)
1150 {
cristyce70c172010-01-07 17:15:30 +00001151 pixel=ScaleQuantumToShort(GetRedPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00001152 q=PopShortPixel(endian,pixel,q);
1153 p++;
1154 q+=quantum_info->pad;
1155 }
1156 break;
1157 }
1158 case 32:
1159 {
1160 register unsigned long
1161 pixel;
1162
1163 if (quantum_info->format == FloatingPointQuantumFormat)
1164 {
1165 for (x=0; x < (long) number_pixels; x++)
1166 {
1167 q=PopFloatPixel(&quantum_state,(float) p->red,q);
1168 p++;
1169 q+=quantum_info->pad;
1170 }
1171 break;
1172 }
1173 for (x=0; x < (long) number_pixels; x++)
1174 {
cristyce70c172010-01-07 17:15:30 +00001175 pixel=ScaleQuantumToLong(GetRedPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00001176 q=PopLongPixel(endian,pixel,q);
1177 p++;
1178 q+=quantum_info->pad;
1179 }
1180 break;
1181 }
1182 case 64:
1183 {
1184 if (quantum_info->format == FloatingPointQuantumFormat)
1185 {
1186 for (x=0; x < (long) number_pixels; x++)
1187 {
1188 q=PopDoublePixel(&quantum_state,(double) p->red,q);
1189 p++;
1190 q+=quantum_info->pad;
1191 }
1192 break;
1193 }
1194 }
1195 default:
1196 {
1197 range=GetQuantumRange(image->depth);
1198 for (x=0; x < (long) number_pixels; x++)
1199 {
1200 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
1201 p->red,range),q);
1202 p++;
1203 q+=quantum_info->pad;
1204 }
1205 break;
1206 }
1207 }
1208 break;
1209 }
1210 case GreenQuantum:
1211 case MagentaQuantum:
1212 {
1213 switch (quantum_info->depth)
1214 {
1215 case 8:
1216 {
1217 register unsigned char
1218 pixel;
1219
1220 for (x=0; x < (long) number_pixels; x++)
1221 {
cristyce70c172010-01-07 17:15:30 +00001222 pixel=ScaleQuantumToChar(GetGreenPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00001223 q=PopCharPixel(pixel,q);
1224 p++;
1225 q+=quantum_info->pad;
1226 }
1227 break;
1228 }
1229 case 16:
1230 {
1231 register unsigned short
1232 pixel;
1233
cristyc9672a92010-01-06 00:57:45 +00001234 if (quantum_info->format == FloatingPointQuantumFormat)
1235 {
1236 for (x=0; x < (long) number_pixels; x++)
1237 {
cristy2a4d01c2010-01-10 21:14:51 +00001238 pixel=SinglePrecisionToHalf(QuantumScale*
cristy24fb7dc2010-01-10 20:15:51 +00001239 GetGreenPixelComponent(p));
cristyc9672a92010-01-06 00:57:45 +00001240 q=PopShortPixel(endian,pixel,q);
1241 p++;
1242 q+=quantum_info->pad;
1243 }
1244 break;
1245 }
cristy3ed852e2009-09-05 21:47:34 +00001246 for (x=0; x < (long) number_pixels; x++)
1247 {
cristyce70c172010-01-07 17:15:30 +00001248 pixel=ScaleQuantumToShort(GetGreenPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00001249 q=PopShortPixel(endian,pixel,q);
1250 p++;
1251 q+=quantum_info->pad;
1252 }
1253 break;
1254 }
1255 case 32:
1256 {
1257 register unsigned long
1258 pixel;
1259
1260 if (quantum_info->format == FloatingPointQuantumFormat)
1261 {
1262 for (x=0; x < (long) number_pixels; x++)
1263 {
1264 q=PopFloatPixel(&quantum_state,(float) p->green,q);
1265 p++;
1266 q+=quantum_info->pad;
1267 }
1268 break;
1269 }
1270 for (x=0; x < (long) number_pixels; x++)
1271 {
cristyce70c172010-01-07 17:15:30 +00001272 pixel=ScaleQuantumToLong(GetGreenPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00001273 q=PopLongPixel(endian,pixel,q);
1274 p++;
1275 q+=quantum_info->pad;
1276 }
1277 break;
1278 }
1279 case 64:
1280 {
1281 if (quantum_info->format == FloatingPointQuantumFormat)
1282 {
1283 for (x=0; x < (long) number_pixels; x++)
1284 {
1285 q=PopDoublePixel(&quantum_state,(double) p->green,q);
1286 p++;
1287 q+=quantum_info->pad;
1288 }
1289 break;
1290 }
1291 }
1292 default:
1293 {
1294 range=GetQuantumRange(image->depth);
1295 for (x=0; x < (long) number_pixels; x++)
1296 {
1297 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
1298 p->green,range),q);
1299 p++;
1300 q+=quantum_info->pad;
1301 }
1302 break;
1303 }
1304 }
1305 break;
1306 }
1307 case BlueQuantum:
1308 case YellowQuantum:
1309 {
1310 switch (quantum_info->depth)
1311 {
1312 case 8:
1313 {
1314 register unsigned char
1315 pixel;
1316
1317 for (x=0; x < (long) number_pixels; x++)
1318 {
cristyce70c172010-01-07 17:15:30 +00001319 pixel=ScaleQuantumToChar(GetBluePixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00001320 q=PopCharPixel(pixel,q);
1321 p++;
1322 q+=quantum_info->pad;
1323 }
1324 break;
1325 }
1326 case 16:
1327 {
1328 register unsigned short
1329 pixel;
1330
cristyc9672a92010-01-06 00:57:45 +00001331 if (quantum_info->format == FloatingPointQuantumFormat)
1332 {
1333 for (x=0; x < (long) number_pixels; x++)
1334 {
cristy2a4d01c2010-01-10 21:14:51 +00001335 pixel=SinglePrecisionToHalf(QuantumScale*
cristy24fb7dc2010-01-10 20:15:51 +00001336 GetBluePixelComponent(p));
cristyc9672a92010-01-06 00:57:45 +00001337 q=PopShortPixel(endian,pixel,q);
1338 p++;
1339 q+=quantum_info->pad;
1340 }
1341 break;
1342 }
cristy3ed852e2009-09-05 21:47:34 +00001343 for (x=0; x < (long) number_pixels; x++)
1344 {
cristyce70c172010-01-07 17:15:30 +00001345 pixel=ScaleQuantumToShort(GetBluePixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00001346 q=PopShortPixel(endian,pixel,q);
1347 p++;
1348 q+=quantum_info->pad;
1349 }
1350 break;
1351 }
1352 case 32:
1353 {
1354 register unsigned long
1355 pixel;
1356
1357 if (quantum_info->format == FloatingPointQuantumFormat)
1358 {
1359 for (x=0; x < (long) number_pixels; x++)
1360 {
1361 q=PopFloatPixel(&quantum_state,(float) p->blue,q);
1362 p++;
1363 q+=quantum_info->pad;
1364 }
1365 break;
1366 }
1367 for (x=0; x < (long) number_pixels; x++)
1368 {
cristyce70c172010-01-07 17:15:30 +00001369 pixel=ScaleQuantumToLong(GetBluePixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00001370 q=PopLongPixel(endian,pixel,q);
1371 p++;
1372 q+=quantum_info->pad;
1373 }
1374 break;
1375 }
1376 case 64:
1377 {
1378 if (quantum_info->format == FloatingPointQuantumFormat)
1379 {
1380 for (x=0; x < (long) number_pixels; x++)
1381 {
1382 q=PopDoublePixel(&quantum_state,(double) p->blue,q);
1383 p++;
1384 q+=quantum_info->pad;
1385 }
1386 break;
1387 }
1388 }
1389 default:
1390 {
1391 range=GetQuantumRange(image->depth);
1392 for (x=0; x < (long) number_pixels; x++)
1393 {
1394 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
1395 p->blue,range),q);
1396 p++;
1397 q+=quantum_info->pad;
1398 }
1399 break;
1400 }
1401 }
1402 break;
1403 }
1404 case AlphaQuantum:
1405 {
1406 switch (quantum_info->depth)
1407 {
1408 case 8:
1409 {
1410 register unsigned char
1411 pixel;
1412
1413 for (x=0; x < (long) number_pixels; x++)
1414 {
cristyce70c172010-01-07 17:15:30 +00001415 pixel=ScaleQuantumToChar((Quantum) (QuantumRange-
1416 GetOpacityPixelComponent(p)));
cristy3ed852e2009-09-05 21:47:34 +00001417 q=PopCharPixel(pixel,q);
1418 p++;
1419 q+=quantum_info->pad;
1420 }
1421 break;
1422 }
1423 case 16:
1424 {
1425 register unsigned short
1426 pixel;
1427
cristyc9672a92010-01-06 00:57:45 +00001428 if (quantum_info->format == FloatingPointQuantumFormat)
1429 {
1430 for (x=0; x < (long) number_pixels; x++)
1431 {
cristy2a4d01c2010-01-10 21:14:51 +00001432 pixel=SinglePrecisionToHalf(QuantumScale*
cristy24fb7dc2010-01-10 20:15:51 +00001433 GetAlphaPixelComponent(p));
cristyc9672a92010-01-06 00:57:45 +00001434 q=PopShortPixel(endian,pixel,q);
1435 p++;
1436 q+=quantum_info->pad;
1437 }
1438 break;
1439 }
cristy3ed852e2009-09-05 21:47:34 +00001440 for (x=0; x < (long) number_pixels; x++)
1441 {
cristyce70c172010-01-07 17:15:30 +00001442 pixel=ScaleQuantumToShort((Quantum) (QuantumRange-
1443 GetOpacityPixelComponent(p)));
cristy3ed852e2009-09-05 21:47:34 +00001444 q=PopShortPixel(endian,pixel,q);
1445 p++;
1446 q+=quantum_info->pad;
1447 }
1448 break;
1449 }
1450 case 32:
1451 {
1452 register unsigned long
1453 pixel;
1454
1455 if (quantum_info->format == FloatingPointQuantumFormat)
1456 {
1457 for (x=0; x < (long) number_pixels; x++)
1458 {
1459 float
1460 pixel;
1461
cristy46f08202010-01-10 04:04:21 +00001462 pixel=(float) (GetAlphaPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00001463 q=PopFloatPixel(&quantum_state,pixel,q);
1464 p++;
1465 q+=quantum_info->pad;
1466 }
1467 break;
1468 }
1469 for (x=0; x < (long) number_pixels; x++)
1470 {
cristyce70c172010-01-07 17:15:30 +00001471 pixel=ScaleQuantumToLong((Quantum) (QuantumRange-
1472 GetOpacityPixelComponent(p)));
cristy3ed852e2009-09-05 21:47:34 +00001473 q=PopLongPixel(endian,pixel,q);
1474 p++;
1475 q+=quantum_info->pad;
1476 }
1477 break;
1478 }
1479 case 64:
1480 {
1481 if (quantum_info->format == FloatingPointQuantumFormat)
1482 {
1483 for (x=0; x < (long) number_pixels; x++)
1484 {
1485 double
1486 pixel;
1487
cristy46f08202010-01-10 04:04:21 +00001488 pixel=(double) (GetAlphaPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00001489 q=PopDoublePixel(&quantum_state,pixel,q);
1490 p++;
1491 q+=quantum_info->pad;
1492 }
1493 break;
1494 }
1495 }
1496 default:
1497 {
1498 range=GetQuantumRange(image->depth);
1499 for (x=0; x < (long) number_pixels; x++)
1500 {
1501 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
cristy46f08202010-01-10 04:04:21 +00001502 (Quantum) (GetAlphaPixelComponent(p)),range),q);
cristy3ed852e2009-09-05 21:47:34 +00001503 p++;
1504 q+=quantum_info->pad;
1505 }
1506 break;
1507 }
1508 }
1509 break;
1510 }
1511 case OpacityQuantum:
1512 {
1513 switch (quantum_info->depth)
1514 {
1515 case 8:
1516 {
1517 register unsigned char
1518 pixel;
1519
1520 for (x=0; x < (long) number_pixels; x++)
1521 {
cristyce70c172010-01-07 17:15:30 +00001522 pixel=ScaleQuantumToChar(GetOpacityPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00001523 q=PopCharPixel(pixel,q);
1524 p++;
1525 q+=quantum_info->pad;
1526 }
1527 break;
1528 }
1529 case 16:
1530 {
1531 register unsigned short
1532 pixel;
1533
cristyc9672a92010-01-06 00:57:45 +00001534 if (quantum_info->format == FloatingPointQuantumFormat)
1535 {
1536 for (x=0; x < (long) number_pixels; x++)
1537 {
cristy2a4d01c2010-01-10 21:14:51 +00001538 pixel=SinglePrecisionToHalf(QuantumScale*
cristy24fb7dc2010-01-10 20:15:51 +00001539 GetOpacityPixelComponent(p));
cristyc9672a92010-01-06 00:57:45 +00001540 q=PopShortPixel(endian,pixel,q);
1541 p++;
1542 q+=quantum_info->pad;
1543 }
1544 break;
1545 }
cristy3ed852e2009-09-05 21:47:34 +00001546 for (x=0; x < (long) number_pixels; x++)
1547 {
cristyce70c172010-01-07 17:15:30 +00001548 pixel=ScaleQuantumToShort(GetOpacityPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00001549 q=PopShortPixel(endian,pixel,q);
1550 p++;
1551 q+=quantum_info->pad;
1552 }
1553 break;
1554 }
1555 case 32:
1556 {
1557 register unsigned long
1558 pixel;
1559
1560 if (quantum_info->format == FloatingPointQuantumFormat)
1561 {
1562 for (x=0; x < (long) number_pixels; x++)
1563 {
1564 q=PopFloatPixel(&quantum_state,(float) p->opacity,q);
1565 p++;
1566 q+=quantum_info->pad;
1567 }
1568 break;
1569 }
1570 for (x=0; x < (long) number_pixels; x++)
1571 {
cristyce70c172010-01-07 17:15:30 +00001572 pixel=ScaleQuantumToLong(GetOpacityPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00001573 q=PopLongPixel(endian,pixel,q);
1574 p++;
1575 q+=quantum_info->pad;
1576 }
1577 break;
1578 }
1579 case 64:
1580 {
1581 if (quantum_info->format == FloatingPointQuantumFormat)
1582 {
1583 for (x=0; x < (long) number_pixels; x++)
1584 {
1585 q=PopDoublePixel(&quantum_state,(double) p->opacity,q);
1586 p++;
1587 q+=quantum_info->pad;
1588 }
1589 break;
1590 }
1591 }
1592 default:
1593 {
1594 range=GetQuantumRange(image->depth);
1595 for (x=0; x < (long) number_pixels; x++)
1596 {
1597 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
1598 p->opacity,range),q);
1599 p++;
1600 q+=quantum_info->pad;
1601 }
1602 break;
1603 }
1604 }
1605 break;
1606 }
1607 case BlackQuantum:
1608 {
1609 if (image->colorspace != CMYKColorspace)
1610 {
1611 (void) ThrowMagickException(exception,GetMagickModule(),ImageError,
1612 "ColorSeparatedImageRequired","`%s'",image->filename);
1613 return(extent);
1614 }
1615 switch (quantum_info->depth)
1616 {
1617 case 8:
1618 {
1619 register unsigned char
1620 pixel;
1621
1622 for (x=0; x < (long) number_pixels; x++)
1623 {
1624 pixel=ScaleQuantumToChar(indexes[x]);
1625 q=PopCharPixel(pixel,q);
1626 p++;
1627 q+=quantum_info->pad;
1628 }
1629 break;
1630 }
1631 case 16:
1632 {
1633 register unsigned short
1634 pixel;
1635
cristyc9672a92010-01-06 00:57:45 +00001636 if (quantum_info->format == FloatingPointQuantumFormat)
1637 {
1638 for (x=0; x < (long) number_pixels; x++)
1639 {
cristy2a4d01c2010-01-10 21:14:51 +00001640 pixel=SinglePrecisionToHalf(QuantumScale*indexes[x]);
cristyc9672a92010-01-06 00:57:45 +00001641 q=PopShortPixel(endian,pixel,q);
1642 p++;
1643 q+=quantum_info->pad;
1644 }
1645 break;
1646 }
cristy3ed852e2009-09-05 21:47:34 +00001647 for (x=0; x < (long) number_pixels; x++)
1648 {
1649 pixel=ScaleQuantumToShort(indexes[x]);
1650 q=PopShortPixel(endian,pixel,q);
1651 p++;
1652 q+=quantum_info->pad;
1653 }
1654 break;
1655 }
1656 case 32:
1657 {
1658 register unsigned long
1659 pixel;
1660
1661 if (quantum_info->format == FloatingPointQuantumFormat)
1662 {
1663 for (x=0; x < (long) number_pixels; x++)
1664 {
1665 q=PopFloatPixel(&quantum_state,(float) indexes[x],q);
1666 p++;
1667 q+=quantum_info->pad;
1668 }
1669 break;
1670 }
1671 for (x=0; x < (long) number_pixels; x++)
1672 {
1673 pixel=ScaleQuantumToLong(indexes[x]);
1674 q=PopLongPixel(endian,pixel,q);
1675 p++;
1676 q+=quantum_info->pad;
1677 }
1678 break;
1679 }
1680 case 64:
1681 {
1682 if (quantum_info->format == FloatingPointQuantumFormat)
1683 {
1684 for (x=0; x < (long) number_pixels; x++)
1685 {
1686 q=PopDoublePixel(&quantum_state,(double) indexes[x],q);
1687 p++;
1688 q+=quantum_info->pad;
1689 }
1690 break;
1691 }
1692 }
1693 default:
1694 {
1695 range=GetQuantumRange(image->depth);
1696 for (x=0; x < (long) number_pixels; x++)
1697 {
1698 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
1699 (Quantum) indexes[x],range),q);
1700 p++;
1701 q+=quantum_info->pad;
1702 }
1703 break;
1704 }
1705 }
1706 break;
1707 }
1708 case RGBQuantum:
1709 case CbYCrQuantum:
1710 {
1711 switch (quantum_info->depth)
1712 {
1713 case 8:
1714 {
1715 for (x=0; x < (long) number_pixels; x++)
1716 {
cristyce70c172010-01-07 17:15:30 +00001717 q=PopCharPixel(ScaleQuantumToChar(GetRedPixelComponent(p)),q);
1718 q=PopCharPixel(ScaleQuantumToChar(GetGreenPixelComponent(p)),q);
1719 q=PopCharPixel(ScaleQuantumToChar(GetBluePixelComponent(p)),q);
cristy3ed852e2009-09-05 21:47:34 +00001720 p++;
1721 q+=quantum_info->pad;
1722 }
1723 break;
1724 }
1725 case 10:
1726 {
1727 register unsigned long
1728 pixel;
1729
1730 range=GetQuantumRange(image->depth);
1731 if (quantum_info->pack == MagickFalse)
1732 {
1733 for (x=0; x < (long) number_pixels; x++)
1734 {
1735 pixel=(unsigned long) (ScaleQuantumToAny(p->red,range) << 22 |
cristyff024b42010-02-21 22:55:09 +00001736 ScaleQuantumToAny(p->green,range) << 12 |
cristy3ed852e2009-09-05 21:47:34 +00001737 ScaleQuantumToAny(p->blue,range) << 2);
1738 q=PopLongPixel(endian,pixel,q);
1739 p++;
1740 q+=quantum_info->pad;
1741 }
1742 break;
1743 }
1744 if (quantum_info->quantum == 32UL)
1745 {
1746 for (x=0; x < (long) number_pixels; x++)
1747 {
1748 pixel=(unsigned long) ScaleQuantumToAny(p->red,range);
1749 q=PopQuantumLongPixel(&quantum_state,image->depth,pixel,q);
1750 pixel=(unsigned long) ScaleQuantumToAny(p->green,range);
1751 q=PopQuantumLongPixel(&quantum_state,image->depth,pixel,q);
1752 pixel=(unsigned long) ScaleQuantumToAny(p->blue,range);
1753 q=PopQuantumLongPixel(&quantum_state,image->depth,pixel,q);
1754 p++;
1755 q+=quantum_info->pad;
1756 }
1757 break;
1758 }
1759 for (x=0; x < (long) number_pixels; x++)
1760 {
1761 pixel=(unsigned long) ScaleQuantumToAny(p->red,range);
1762 q=PopQuantumPixel(&quantum_state,image->depth,pixel,q);
1763 pixel=(unsigned long) ScaleQuantumToAny(p->green,range);
1764 q=PopQuantumPixel(&quantum_state,image->depth,pixel,q);
1765 pixel=(unsigned long) ScaleQuantumToAny(p->blue,range);
1766 q=PopQuantumPixel(&quantum_state,image->depth,pixel,q);
1767 p++;
1768 q+=quantum_info->pad;
1769 }
1770 break;
1771 }
1772 case 12:
1773 {
1774 register unsigned long
1775 pixel;
1776
1777 range=GetQuantumRange(image->depth);
1778 if (quantum_info->pack == MagickFalse)
1779 {
1780 for (x=0; x < (long) (3*number_pixels-1); x+=2)
1781 {
1782 switch (x % 3)
1783 {
1784 default:
1785 case 0:
1786 {
1787 pixel=(unsigned long) ScaleQuantumToAny(p->red,range);
1788 break;
1789 }
1790 case 1:
1791 {
1792 pixel=(unsigned long) ScaleQuantumToAny(p->green,range);
1793 break;
1794 }
1795 case 2:
1796 {
1797 pixel=(unsigned long) ScaleQuantumToAny(p->blue,range);
1798 p++;
1799 break;
1800 }
1801 }
1802 q=PopShortPixel(endian,(unsigned short) (pixel << 4),q);
1803 switch ((x+1) % 3)
1804 {
1805 default:
1806 case 0:
1807 {
1808 pixel=(unsigned long) ScaleQuantumToAny(p->red,range);
1809 break;
1810 }
1811 case 1:
1812 {
1813 pixel=(unsigned long) ScaleQuantumToAny(p->green,range);
1814 break;
1815 }
1816 case 2:
1817 {
1818 pixel=(unsigned long) ScaleQuantumToAny(p->blue,range);
1819 p++;
1820 break;
1821 }
1822 }
1823 q=PopShortPixel(endian,(unsigned short) (pixel << 4),q);
1824 q+=quantum_info->pad;
1825 }
1826 for (bit=0; bit < (long) (3*number_pixels % 2); bit++)
1827 {
1828 switch ((x+bit) % 3)
1829 {
1830 default:
1831 case 0:
1832 {
1833 pixel=(unsigned long) ScaleQuantumToAny(p->red,range);
1834 break;
1835 }
1836 case 1:
1837 {
1838 pixel=(unsigned long) ScaleQuantumToAny(p->green,range);
1839 break;
1840 }
1841 case 2:
1842 {
1843 pixel=(unsigned long) ScaleQuantumToAny(p->blue,range);
1844 p++;
1845 break;
1846 }
1847 }
1848 q=PopShortPixel(endian,(unsigned short) (pixel << 4),q);
1849 q+=quantum_info->pad;
1850 }
1851 if (bit != 0)
1852 p++;
1853 break;
1854 }
1855 if (quantum_info->quantum == 32UL)
1856 {
1857 for (x=0; x < (long) number_pixels; x++)
1858 {
1859 pixel=(unsigned long) ScaleQuantumToAny(p->red,range);
1860 q=PopQuantumLongPixel(&quantum_state,image->depth,pixel,q);
1861 pixel=(unsigned long) ScaleQuantumToAny(p->green,range);
1862 q=PopQuantumLongPixel(&quantum_state,image->depth,pixel,q);
1863 pixel=(unsigned long) ScaleQuantumToAny(p->blue,range);
1864 q=PopQuantumLongPixel(&quantum_state,image->depth,pixel,q);
1865 p++;
1866 q+=quantum_info->pad;
1867 }
1868 break;
1869 }
1870 for (x=0; x < (long) number_pixels; x++)
1871 {
1872 pixel=(unsigned long) ScaleQuantumToAny(p->red,range);
1873 q=PopQuantumPixel(&quantum_state,image->depth,pixel,q);
1874 pixel=(unsigned long) ScaleQuantumToAny(p->green,range);
1875 q=PopQuantumPixel(&quantum_state,image->depth,pixel,q);
1876 pixel=(unsigned long) ScaleQuantumToAny(p->blue,range);
1877 q=PopQuantumPixel(&quantum_state,image->depth,pixel,q);
1878 p++;
1879 q+=quantum_info->pad;
1880 }
1881 break;
1882 }
1883 case 16:
1884 {
1885 register unsigned short
1886 pixel;
1887
cristyc9672a92010-01-06 00:57:45 +00001888 if (quantum_info->format == FloatingPointQuantumFormat)
1889 {
1890 for (x=0; x < (long) number_pixels; x++)
1891 {
cristy2a4d01c2010-01-10 21:14:51 +00001892 pixel=SinglePrecisionToHalf(QuantumScale*
cristy24fb7dc2010-01-10 20:15:51 +00001893 GetRedPixelComponent(p));
cristyc9672a92010-01-06 00:57:45 +00001894 q=PopShortPixel(endian,pixel,q);
cristy2a4d01c2010-01-10 21:14:51 +00001895 pixel=SinglePrecisionToHalf(QuantumScale*
cristy24fb7dc2010-01-10 20:15:51 +00001896 GetGreenPixelComponent(p));
cristyc9672a92010-01-06 00:57:45 +00001897 q=PopShortPixel(endian,pixel,q);
cristy2a4d01c2010-01-10 21:14:51 +00001898 pixel=SinglePrecisionToHalf(QuantumScale*
cristy24fb7dc2010-01-10 20:15:51 +00001899 GetBluePixelComponent(p));
cristyc9672a92010-01-06 00:57:45 +00001900 q=PopShortPixel(endian,pixel,q);
1901 p++;
1902 q+=quantum_info->pad;
1903 }
1904 break;
1905 }
cristy3ed852e2009-09-05 21:47:34 +00001906 for (x=0; x < (long) number_pixels; x++)
1907 {
cristyce70c172010-01-07 17:15:30 +00001908 pixel=ScaleQuantumToShort(GetRedPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00001909 q=PopShortPixel(endian,pixel,q);
cristyce70c172010-01-07 17:15:30 +00001910 pixel=ScaleQuantumToShort(GetGreenPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00001911 q=PopShortPixel(endian,pixel,q);
cristyce70c172010-01-07 17:15:30 +00001912 pixel=ScaleQuantumToShort(GetBluePixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00001913 q=PopShortPixel(endian,pixel,q);
1914 p++;
1915 q+=quantum_info->pad;
1916 }
1917 break;
1918 }
1919 case 32:
1920 {
1921 register unsigned long
1922 pixel;
1923
1924 if (quantum_info->format == FloatingPointQuantumFormat)
1925 {
1926 for (x=0; x < (long) number_pixels; x++)
1927 {
1928 q=PopFloatPixel(&quantum_state,(float) p->red,q);
1929 q=PopFloatPixel(&quantum_state,(float) p->green,q);
1930 q=PopFloatPixel(&quantum_state,(float) p->blue,q);
1931 p++;
1932 q+=quantum_info->pad;
1933 }
1934 break;
1935 }
1936 for (x=0; x < (long) number_pixels; x++)
1937 {
cristyce70c172010-01-07 17:15:30 +00001938 pixel=ScaleQuantumToLong(GetRedPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00001939 q=PopLongPixel(endian,pixel,q);
cristyce70c172010-01-07 17:15:30 +00001940 pixel=ScaleQuantumToLong(GetGreenPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00001941 q=PopLongPixel(endian,pixel,q);
cristyce70c172010-01-07 17:15:30 +00001942 pixel=ScaleQuantumToLong(GetBluePixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00001943 q=PopLongPixel(endian,pixel,q);
1944 p++;
1945 q+=quantum_info->pad;
1946 }
1947 break;
1948 }
1949 case 64:
1950 {
1951 if (quantum_info->format == FloatingPointQuantumFormat)
1952 {
1953 for (x=0; x < (long) number_pixels; x++)
1954 {
1955 q=PopDoublePixel(&quantum_state,(double) p->red,q);
1956 q=PopDoublePixel(&quantum_state,(double) p->green,q);
1957 q=PopDoublePixel(&quantum_state,(double) p->blue,q);
1958 p++;
1959 q+=quantum_info->pad;
1960 }
1961 break;
1962 }
1963 }
1964 default:
1965 {
1966 range=GetQuantumRange(image->depth);
1967 for (x=0; x < (long) number_pixels; x++)
1968 {
1969 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
1970 p->red,range),q);
1971 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
1972 p->green,range),q);
1973 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
1974 p->blue,range),q);
1975 p++;
1976 q+=quantum_info->pad;
1977 }
1978 break;
1979 }
1980 }
1981 break;
1982 }
1983 case RGBAQuantum:
1984 case RGBOQuantum:
1985 case CbYCrAQuantum:
1986 {
1987 switch (quantum_info->depth)
1988 {
1989 case 8:
1990 {
1991 register unsigned char
1992 pixel;
1993
1994 for (x=0; x < (long) number_pixels; x++)
1995 {
cristyce70c172010-01-07 17:15:30 +00001996 pixel=ScaleQuantumToChar(GetRedPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00001997 q=PopCharPixel(pixel,q);
cristyce70c172010-01-07 17:15:30 +00001998 pixel=ScaleQuantumToChar(GetGreenPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00001999 q=PopCharPixel(pixel,q);
cristyce70c172010-01-07 17:15:30 +00002000 pixel=ScaleQuantumToChar(GetBluePixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00002001 q=PopCharPixel(pixel,q);
cristyce70c172010-01-07 17:15:30 +00002002 pixel=ScaleQuantumToChar((Quantum) (QuantumRange-
2003 GetOpacityPixelComponent(p)));
cristy3ed852e2009-09-05 21:47:34 +00002004 q=PopCharPixel(pixel,q);
2005 p++;
2006 q+=quantum_info->pad;
2007 }
2008 break;
2009 }
2010 case 16:
2011 {
2012 register unsigned short
2013 pixel;
2014
cristyc9672a92010-01-06 00:57:45 +00002015 if (quantum_info->format == FloatingPointQuantumFormat)
2016 {
2017 for (x=0; x < (long) number_pixels; x++)
2018 {
cristy2a4d01c2010-01-10 21:14:51 +00002019 pixel=SinglePrecisionToHalf(QuantumScale*
cristy24fb7dc2010-01-10 20:15:51 +00002020 GetRedPixelComponent(p));
cristyc9672a92010-01-06 00:57:45 +00002021 q=PopShortPixel(endian,pixel,q);
cristy2a4d01c2010-01-10 21:14:51 +00002022 pixel=SinglePrecisionToHalf(QuantumScale*
cristy24fb7dc2010-01-10 20:15:51 +00002023 GetGreenPixelComponent(p));
cristyc9672a92010-01-06 00:57:45 +00002024 q=PopShortPixel(endian,pixel,q);
cristy2a4d01c2010-01-10 21:14:51 +00002025 pixel=SinglePrecisionToHalf(QuantumScale*
cristy24fb7dc2010-01-10 20:15:51 +00002026 GetBluePixelComponent(p));
cristyc9672a92010-01-06 00:57:45 +00002027 q=PopShortPixel(endian,pixel,q);
cristy2a4d01c2010-01-10 21:14:51 +00002028 pixel=SinglePrecisionToHalf(QuantumScale*
cristy24fb7dc2010-01-10 20:15:51 +00002029 GetAlphaPixelComponent(p));
cristyc9672a92010-01-06 00:57:45 +00002030 q=PopShortPixel(endian,pixel,q);
2031 p++;
2032 q+=quantum_info->pad;
2033 }
2034 break;
2035 }
cristy3ed852e2009-09-05 21:47:34 +00002036 for (x=0; x < (long) number_pixels; x++)
2037 {
cristyce70c172010-01-07 17:15:30 +00002038 pixel=ScaleQuantumToShort(GetRedPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00002039 q=PopShortPixel(endian,pixel,q);
cristyce70c172010-01-07 17:15:30 +00002040 pixel=ScaleQuantumToShort(GetGreenPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00002041 q=PopShortPixel(endian,pixel,q);
cristyce70c172010-01-07 17:15:30 +00002042 pixel=ScaleQuantumToShort(GetBluePixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00002043 q=PopShortPixel(endian,pixel,q);
cristyce70c172010-01-07 17:15:30 +00002044 pixel=ScaleQuantumToShort((Quantum) (QuantumRange-
2045 GetOpacityPixelComponent(p)));
cristy3ed852e2009-09-05 21:47:34 +00002046 q=PopShortPixel(endian,pixel,q);
2047 p++;
2048 q+=quantum_info->pad;
2049 }
2050 break;
2051 }
2052 case 32:
2053 {
2054 register unsigned long
2055 pixel;
2056
2057 if (quantum_info->format == FloatingPointQuantumFormat)
2058 {
2059 for (x=0; x < (long) number_pixels; x++)
2060 {
2061 float
2062 pixel;
2063
2064 q=PopFloatPixel(&quantum_state,(float) p->red,q);
2065 q=PopFloatPixel(&quantum_state,(float) p->green,q);
2066 q=PopFloatPixel(&quantum_state,(float) p->blue,q);
cristy46f08202010-01-10 04:04:21 +00002067 pixel=(float) (GetAlphaPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00002068 q=PopFloatPixel(&quantum_state,pixel,q);
2069 p++;
2070 q+=quantum_info->pad;
2071 }
2072 break;
2073 }
2074 for (x=0; x < (long) number_pixels; x++)
2075 {
cristyce70c172010-01-07 17:15:30 +00002076 pixel=ScaleQuantumToLong(GetRedPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00002077 q=PopLongPixel(endian,pixel,q);
cristyce70c172010-01-07 17:15:30 +00002078 pixel=ScaleQuantumToLong(GetGreenPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00002079 q=PopLongPixel(endian,pixel,q);
cristyce70c172010-01-07 17:15:30 +00002080 pixel=ScaleQuantumToLong(GetBluePixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00002081 q=PopLongPixel(endian,pixel,q);
cristyce70c172010-01-07 17:15:30 +00002082 pixel=ScaleQuantumToLong((Quantum) (QuantumRange-
2083 GetOpacityPixelComponent(p)));
cristy3ed852e2009-09-05 21:47:34 +00002084 q=PopLongPixel(endian,pixel,q);
2085 p++;
2086 q+=quantum_info->pad;
2087 }
2088 break;
2089 }
2090 case 64:
2091 {
2092 if (quantum_info->format == FloatingPointQuantumFormat)
2093 {
2094 double
2095 pixel;
2096
2097 for (x=0; x < (long) number_pixels; x++)
2098 {
2099 q=PopDoublePixel(&quantum_state,(double) p->red,q);
2100 q=PopDoublePixel(&quantum_state,(double) p->green,q);
2101 q=PopDoublePixel(&quantum_state,(double) p->blue,q);
cristy46f08202010-01-10 04:04:21 +00002102 pixel=(double) (GetAlphaPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00002103 q=PopDoublePixel(&quantum_state,pixel,q);
2104 p++;
2105 q+=quantum_info->pad;
2106 }
2107 break;
2108 }
2109 }
2110 default:
2111 {
2112 range=GetQuantumRange(image->depth);
2113 for (x=0; x < (long) number_pixels; x++)
2114 {
2115 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
2116 p->red,range),q);
2117 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
2118 p->green,range),q);
2119 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
2120 p->blue,range),q);
2121 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
cristy46f08202010-01-10 04:04:21 +00002122 (Quantum) (GetAlphaPixelComponent(p)),range),q);
cristy3ed852e2009-09-05 21:47:34 +00002123 p++;
2124 q+=quantum_info->pad;
2125 }
2126 break;
2127 }
2128 }
2129 break;
2130 }
2131 case CMYKQuantum:
2132 {
2133 if (image->colorspace != CMYKColorspace)
2134 {
2135 (void) ThrowMagickException(exception,GetMagickModule(),ImageError,
2136 "ColorSeparatedImageRequired","`%s'",image->filename);
2137 return(extent);
2138 }
2139 switch (quantum_info->depth)
2140 {
2141 case 8:
2142 {
2143 register unsigned char
2144 pixel;
2145
2146 for (x=0; x < (long) number_pixels; x++)
2147 {
cristyce70c172010-01-07 17:15:30 +00002148 pixel=ScaleQuantumToChar(GetRedPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00002149 q=PopCharPixel(pixel,q);
cristyce70c172010-01-07 17:15:30 +00002150 pixel=ScaleQuantumToChar(GetGreenPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00002151 q=PopCharPixel(pixel,q);
cristyce70c172010-01-07 17:15:30 +00002152 pixel=ScaleQuantumToChar(GetBluePixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00002153 q=PopCharPixel(pixel,q);
2154 pixel=ScaleQuantumToChar(indexes[x]);
2155 q=PopCharPixel(pixel,q);
2156 p++;
2157 q+=quantum_info->pad;
2158 }
2159 break;
2160 }
2161 case 16:
2162 {
2163 register unsigned short
2164 pixel;
2165
cristyc9672a92010-01-06 00:57:45 +00002166 if (quantum_info->format == FloatingPointQuantumFormat)
2167 {
2168 for (x=0; x < (long) number_pixels; x++)
2169 {
cristy2a4d01c2010-01-10 21:14:51 +00002170 pixel=SinglePrecisionToHalf(QuantumScale*
cristy24fb7dc2010-01-10 20:15:51 +00002171 GetRedPixelComponent(p));
cristyc9672a92010-01-06 00:57:45 +00002172 q=PopShortPixel(endian,pixel,q);
cristy2a4d01c2010-01-10 21:14:51 +00002173 pixel=SinglePrecisionToHalf(QuantumScale*
cristy24fb7dc2010-01-10 20:15:51 +00002174 GetGreenPixelComponent(p));
cristyc9672a92010-01-06 00:57:45 +00002175 q=PopShortPixel(endian,pixel,q);
cristy2a4d01c2010-01-10 21:14:51 +00002176 pixel=SinglePrecisionToHalf(QuantumScale*
cristy24fb7dc2010-01-10 20:15:51 +00002177 GetBluePixelComponent(p));
cristyc9672a92010-01-06 00:57:45 +00002178 q=PopShortPixel(endian,pixel,q);
cristy2a4d01c2010-01-10 21:14:51 +00002179 pixel=SinglePrecisionToHalf(QuantumScale*indexes[x]);
cristyc9672a92010-01-06 00:57:45 +00002180 q=PopShortPixel(endian,pixel,q);
2181 p++;
2182 q+=quantum_info->pad;
2183 }
2184 break;
2185 }
cristy3ed852e2009-09-05 21:47:34 +00002186 for (x=0; x < (long) number_pixels; x++)
2187 {
cristyce70c172010-01-07 17:15:30 +00002188 pixel=ScaleQuantumToShort(GetRedPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00002189 q=PopShortPixel(endian,pixel,q);
cristyce70c172010-01-07 17:15:30 +00002190 pixel=ScaleQuantumToShort(GetGreenPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00002191 q=PopShortPixel(endian,pixel,q);
cristyce70c172010-01-07 17:15:30 +00002192 pixel=ScaleQuantumToShort(GetBluePixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00002193 q=PopShortPixel(endian,pixel,q);
2194 pixel=ScaleQuantumToShort(indexes[x]);
2195 q=PopShortPixel(endian,pixel,q);
2196 p++;
2197 q+=quantum_info->pad;
2198 }
2199 break;
2200 }
2201 case 32:
2202 {
2203 register unsigned long
2204 pixel;
2205
2206 if (quantum_info->format == FloatingPointQuantumFormat)
2207 {
2208 for (x=0; x < (long) number_pixels; x++)
2209 {
2210 q=PopFloatPixel(&quantum_state,(float) p->red,q);
2211 q=PopFloatPixel(&quantum_state,(float) p->green,q);
2212 q=PopFloatPixel(&quantum_state,(float) p->blue,q);
2213 q=PopFloatPixel(&quantum_state,(float) indexes[x],q);
2214 p++;
2215 q+=quantum_info->pad;
2216 }
2217 break;
2218 }
2219 for (x=0; x < (long) number_pixels; x++)
2220 {
cristyce70c172010-01-07 17:15:30 +00002221 pixel=ScaleQuantumToLong(GetRedPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00002222 q=PopLongPixel(endian,pixel,q);
cristyce70c172010-01-07 17:15:30 +00002223 pixel=ScaleQuantumToLong(GetGreenPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00002224 q=PopLongPixel(endian,pixel,q);
cristyce70c172010-01-07 17:15:30 +00002225 pixel=ScaleQuantumToLong(GetBluePixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00002226 q=PopLongPixel(endian,pixel,q);
2227 pixel=ScaleQuantumToLong(indexes[x]);
2228 q=PopLongPixel(endian,pixel,q);
2229 p++;
2230 q+=quantum_info->pad;
2231 }
2232 break;
2233 }
2234 case 64:
2235 {
2236 if (quantum_info->format == FloatingPointQuantumFormat)
2237 {
2238 for (x=0; x < (long) number_pixels; x++)
2239 {
2240 q=PopDoublePixel(&quantum_state,(double) p->red,q);
2241 q=PopDoublePixel(&quantum_state,(double) p->green,q);
2242 q=PopDoublePixel(&quantum_state,(double) p->blue,q);
2243 q=PopDoublePixel(&quantum_state,(double) indexes[x],q);
2244 p++;
2245 q+=quantum_info->pad;
2246 }
2247 break;
2248 }
2249 }
2250 default:
2251 {
2252 range=GetQuantumRange(image->depth);
2253 for (x=0; x < (long) number_pixels; x++)
2254 {
2255 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
2256 p->red,range),q);
2257 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
2258 p->green,range),q);
2259 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
2260 p->blue,range),q);
2261 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
2262 indexes[x],range),q);
2263 p++;
2264 q+=quantum_info->pad;
2265 }
2266 break;
2267 }
2268 }
2269 break;
2270 }
2271 case CMYKAQuantum:
2272 case CMYKOQuantum:
2273 {
2274 if (image->colorspace != CMYKColorspace)
2275 {
2276 (void) ThrowMagickException(exception,GetMagickModule(),ImageError,
2277 "ColorSeparatedImageRequired","`%s'",image->filename);
2278 return(extent);
2279 }
2280 switch (quantum_info->depth)
2281 {
2282 case 8:
2283 {
2284 register unsigned char
2285 pixel;
2286
2287 for (x=0; x < (long) number_pixels; x++)
2288 {
cristyce70c172010-01-07 17:15:30 +00002289 pixel=ScaleQuantumToChar(GetRedPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00002290 q=PopCharPixel(pixel,q);
cristyce70c172010-01-07 17:15:30 +00002291 pixel=ScaleQuantumToChar(GetGreenPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00002292 q=PopCharPixel(pixel,q);
cristyce70c172010-01-07 17:15:30 +00002293 pixel=ScaleQuantumToChar(GetBluePixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00002294 q=PopCharPixel(pixel,q);
2295 pixel=ScaleQuantumToChar(indexes[x]);
2296 q=PopCharPixel(pixel,q);
cristyce70c172010-01-07 17:15:30 +00002297 pixel=ScaleQuantumToChar((Quantum) (QuantumRange-
2298 GetOpacityPixelComponent(p)));
cristy3ed852e2009-09-05 21:47:34 +00002299 q=PopCharPixel(pixel,q);
2300 p++;
2301 q+=quantum_info->pad;
2302 }
2303 break;
2304 }
2305 case 16:
2306 {
2307 register unsigned short
2308 pixel;
2309
cristyc9672a92010-01-06 00:57:45 +00002310 if (quantum_info->format == FloatingPointQuantumFormat)
2311 {
2312 for (x=0; x < (long) number_pixels; x++)
2313 {
cristy2a4d01c2010-01-10 21:14:51 +00002314 pixel=SinglePrecisionToHalf(QuantumScale*
cristy24fb7dc2010-01-10 20:15:51 +00002315 GetRedPixelComponent(p));
cristyc9672a92010-01-06 00:57:45 +00002316 q=PopShortPixel(endian,pixel,q);
cristy2a4d01c2010-01-10 21:14:51 +00002317 pixel=SinglePrecisionToHalf(QuantumScale*
cristy24fb7dc2010-01-10 20:15:51 +00002318 GetGreenPixelComponent(p));
cristyc9672a92010-01-06 00:57:45 +00002319 q=PopShortPixel(endian,pixel,q);
cristy2a4d01c2010-01-10 21:14:51 +00002320 pixel=SinglePrecisionToHalf(QuantumScale*
cristy24fb7dc2010-01-10 20:15:51 +00002321 GetBluePixelComponent(p));
cristyc9672a92010-01-06 00:57:45 +00002322 q=PopShortPixel(endian,pixel,q);
cristy2a4d01c2010-01-10 21:14:51 +00002323 pixel=SinglePrecisionToHalf(QuantumScale*indexes[x]);
cristyc9672a92010-01-06 00:57:45 +00002324 q=PopShortPixel(endian,pixel,q);
cristy2a4d01c2010-01-10 21:14:51 +00002325 pixel=SinglePrecisionToHalf(QuantumScale*
cristy24fb7dc2010-01-10 20:15:51 +00002326 GetAlphaPixelComponent(p));
cristyc9672a92010-01-06 00:57:45 +00002327 q=PopShortPixel(endian,pixel,q);
2328 p++;
2329 q+=quantum_info->pad;
2330 }
2331 break;
2332 }
cristy3ed852e2009-09-05 21:47:34 +00002333 for (x=0; x < (long) number_pixels; x++)
2334 {
cristyce70c172010-01-07 17:15:30 +00002335 pixel=ScaleQuantumToShort(GetRedPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00002336 q=PopShortPixel(endian,pixel,q);
cristyce70c172010-01-07 17:15:30 +00002337 pixel=ScaleQuantumToShort(GetGreenPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00002338 q=PopShortPixel(endian,pixel,q);
cristyce70c172010-01-07 17:15:30 +00002339 pixel=ScaleQuantumToShort(GetBluePixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00002340 q=PopShortPixel(endian,pixel,q);
2341 pixel=ScaleQuantumToShort(indexes[x]);
2342 q=PopShortPixel(endian,pixel,q);
cristyce70c172010-01-07 17:15:30 +00002343 pixel=ScaleQuantumToShort((Quantum) (QuantumRange-
2344 GetOpacityPixelComponent(p)));
cristy3ed852e2009-09-05 21:47:34 +00002345 q=PopShortPixel(endian,pixel,q);
2346 p++;
2347 q+=quantum_info->pad;
2348 }
2349 break;
2350 }
2351 case 32:
2352 {
2353 register unsigned long
2354 pixel;
2355
2356 if (quantum_info->format == FloatingPointQuantumFormat)
2357 {
2358 for (x=0; x < (long) number_pixels; x++)
2359 {
2360 float
2361 pixel;
2362
2363 q=PopFloatPixel(&quantum_state,(float) p->red,q);
2364 q=PopFloatPixel(&quantum_state,(float) p->green,q);
2365 q=PopFloatPixel(&quantum_state,(float) p->blue,q);
2366 q=PopFloatPixel(&quantum_state,(float) indexes[x],q);
cristy46f08202010-01-10 04:04:21 +00002367 pixel=(float) (GetAlphaPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00002368 q=PopFloatPixel(&quantum_state,pixel,q);
2369 p++;
2370 q+=quantum_info->pad;
2371 }
2372 break;
2373 }
2374 for (x=0; x < (long) number_pixels; x++)
2375 {
cristyce70c172010-01-07 17:15:30 +00002376 pixel=ScaleQuantumToLong(GetRedPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00002377 q=PopLongPixel(endian,pixel,q);
cristyce70c172010-01-07 17:15:30 +00002378 pixel=ScaleQuantumToLong(GetGreenPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00002379 q=PopLongPixel(endian,pixel,q);
cristyce70c172010-01-07 17:15:30 +00002380 pixel=ScaleQuantumToLong(GetBluePixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00002381 q=PopLongPixel(endian,pixel,q);
2382 pixel=ScaleQuantumToLong(indexes[x]);
2383 q=PopLongPixel(endian,pixel,q);
cristyce70c172010-01-07 17:15:30 +00002384 pixel=ScaleQuantumToLong((Quantum) (QuantumRange-
2385 GetOpacityPixelComponent(p)));
cristy3ed852e2009-09-05 21:47:34 +00002386 q=PopLongPixel(endian,pixel,q);
2387 p++;
2388 q+=quantum_info->pad;
2389 }
2390 break;
2391 }
2392 case 64:
2393 {
2394 if (quantum_info->format == FloatingPointQuantumFormat)
2395 {
2396 double
2397 pixel;
2398
2399 for (x=0; x < (long) number_pixels; x++)
2400 {
2401 q=PopDoublePixel(&quantum_state,(double) p->red,q);
2402 q=PopDoublePixel(&quantum_state,(double) p->green,q);
2403 q=PopDoublePixel(&quantum_state,(double) p->blue,q);
2404 q=PopDoublePixel(&quantum_state,(double) indexes[x],q);
cristy46f08202010-01-10 04:04:21 +00002405 pixel=(double) (GetAlphaPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00002406 q=PopDoublePixel(&quantum_state,pixel,q);
2407 p++;
2408 q+=quantum_info->pad;
2409 }
2410 break;
2411 }
2412 }
2413 default:
2414 {
2415 range=GetQuantumRange(image->depth);
2416 for (x=0; x < (long) number_pixels; x++)
2417 {
2418 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
2419 p->red,range),q);
2420 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
2421 p->green,range),q);
2422 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
2423 p->blue,range),q);
2424 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
2425 indexes[x],range),q);
2426 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
2427 p->opacity,range),q);
2428 p++;
2429 q+=quantum_info->pad;
2430 }
2431 break;
2432 }
2433 }
2434 break;
2435 }
2436 case CbYCrYQuantum:
2437 {
2438 long
2439 n;
2440
2441 Quantum
2442 cbcr[4];
2443
2444 register long
2445 i;
2446
2447 register unsigned long
2448 pixel;
2449
2450 unsigned long
2451 quantum;
2452
2453 n=0;
2454 quantum=0;
2455 range=GetQuantumRange(image->depth);
2456 switch (quantum_info->depth)
2457 {
2458 case 10:
2459 {
2460 if (quantum_info->pack == MagickFalse)
2461 {
2462 for (x=0; x < (long) number_pixels; x+=2)
2463 {
2464 for (i=0; i < 4; i++)
2465 {
2466 switch (n % 3)
2467 {
2468 case 0:
2469 {
cristyce70c172010-01-07 17:15:30 +00002470 quantum=GetRedPixelComponent(p);
cristy3ed852e2009-09-05 21:47:34 +00002471 break;
2472 }
2473 case 1:
2474 {
cristyce70c172010-01-07 17:15:30 +00002475 quantum=GetGreenPixelComponent(p);
cristy3ed852e2009-09-05 21:47:34 +00002476 break;
2477 }
2478 case 2:
2479 {
cristyce70c172010-01-07 17:15:30 +00002480 quantum=GetBluePixelComponent(p);
cristy3ed852e2009-09-05 21:47:34 +00002481 break;
2482 }
2483 }
2484 cbcr[i]=(Quantum) quantum;
2485 n++;
2486 }
2487 pixel=(unsigned long) ((unsigned long) (cbcr[1]) << 22 |
cristyff024b42010-02-21 22:55:09 +00002488 (unsigned long) (cbcr[0]) << 12 |
cristy3ed852e2009-09-05 21:47:34 +00002489 (unsigned long) (cbcr[2]) << 2);
2490 q=PopLongPixel(endian,pixel,q);
2491 p++;
2492 pixel=(unsigned long) ((unsigned long) (cbcr[3]) << 22 |
cristyff024b42010-02-21 22:55:09 +00002493 (unsigned long) (cbcr[0]) << 12 |
cristy3ed852e2009-09-05 21:47:34 +00002494 (unsigned long) (cbcr[2]) << 2);
2495 q=PopLongPixel(endian,pixel,q);
2496 p++;
2497 q+=quantum_info->pad;
2498 }
2499 break;
2500 }
2501 break;
2502 }
2503 default:
2504 {
2505 for (x=0; x < (long) number_pixels; x+=2)
2506 {
2507 for (i=0; i < 4; i++)
2508 {
2509 switch (n % 3)
2510 {
2511 case 0:
2512 {
cristyce70c172010-01-07 17:15:30 +00002513 quantum=GetRedPixelComponent(p);
cristy3ed852e2009-09-05 21:47:34 +00002514 break;
2515 }
2516 case 1:
2517 {
cristyce70c172010-01-07 17:15:30 +00002518 quantum=GetGreenPixelComponent(p);
cristy3ed852e2009-09-05 21:47:34 +00002519 break;
2520 }
2521 case 2:
2522 {
cristyce70c172010-01-07 17:15:30 +00002523 quantum=GetBluePixelComponent(p);
cristy3ed852e2009-09-05 21:47:34 +00002524 break;
2525 }
2526 }
2527 cbcr[i]=(Quantum) quantum;
2528 n++;
2529 }
2530 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
2531 cbcr[1],range),q);
2532 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
2533 cbcr[0],range),q);
2534 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
2535 cbcr[2],range),q);
2536 p++;
2537 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
2538 cbcr[3],range),q);
2539 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
2540 cbcr[0],range),q);
2541 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
2542 cbcr[2],range),q);
2543 p++;
2544 q+=quantum_info->pad;
2545 }
2546 break;
2547 }
2548 }
2549 break;
2550 }
2551 default:
2552 break;
2553 }
2554 if ((quantum_type == CbYCrQuantum) || (quantum_type == CbYCrAQuantum))
2555 {
2556 Quantum
2557 quantum;
2558
2559 register PixelPacket
cristyc47d1f82009-11-26 01:44:43 +00002560 *restrict q;
cristy3ed852e2009-09-05 21:47:34 +00002561
2562 q=GetAuthenticPixelQueue(image);
2563 if (image_view != (CacheView *) NULL)
2564 q=(PixelPacket *) GetCacheViewVirtualPixelQueue(image_view);
2565 for (x=0; x < (long) number_pixels; x++)
2566 {
2567 quantum=q->red;
2568 q->red=q->green;
2569 q->green=quantum;
2570 q++;
2571 }
2572 }
2573 if ((quantum_type == RGBOQuantum) || (quantum_type == CMYKOQuantum))
2574 {
2575 register PixelPacket
cristyc47d1f82009-11-26 01:44:43 +00002576 *restrict q;
cristy3ed852e2009-09-05 21:47:34 +00002577
2578 q=GetAuthenticPixelQueue(image);
2579 if (image_view != (CacheView *) NULL)
2580 q=(PixelPacket *) GetCacheViewVirtualPixelQueue(image_view);
2581 for (x=0; x < (long) number_pixels; x++)
2582 {
cristy46f08202010-01-10 04:04:21 +00002583 q->opacity=(Quantum) GetAlphaPixelComponent(q);
cristy3ed852e2009-09-05 21:47:34 +00002584 q++;
2585 }
2586 }
2587 return(extent);
2588}