blob: b97a713ac754363bfef2b174f8df61b5ff267cab [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%
cristy891dc792010-03-04 01:47:16 +000092% size_t ExportQuantumPixels(const Image *image,
93% const CacheView *image_view,const QuantumInfo *quantum_info,
94% const QuantumType quantum_type,unsigned char *pixels,
95% ExceptionInfo *exception)
cristy3ed852e2009-09-05 21:47:34 +000096%
97% A description of each parameter follows:
98%
99% o image: the image.
100%
101% o image_view: the image cache view.
102%
103% o quantum_info: the quantum info.
104%
105% o quantum_type: Declare which pixel components to transfer (RGB, RGBA,
106% etc).
107%
108% o pixels: The components are transferred to this buffer.
109%
110% o exception: return any errors or warnings in this structure.
111%
112*/
113
114static inline unsigned char *PopDoublePixel(const QuantumState *quantum_state,
115 const double pixel,unsigned char *pixels)
116{
117 double
118 *p;
119
120 unsigned char
121 quantum[8];
122
123 p=(double *) quantum;
cristy82b15832009-10-06 19:17:37 +0000124 *p=(double) (pixel*quantum_state->inverse_scale+quantum_state->minimum);
cristy3ed852e2009-09-05 21:47:34 +0000125 if (quantum_state->endian != LSBEndian)
126 {
127 *pixels++=quantum[7];
128 *pixels++=quantum[6];
129 *pixels++=quantum[5];
130 *pixels++=quantum[4];
131 *pixels++=quantum[3];
132 *pixels++=quantum[2];
133 *pixels++=quantum[1];
134 *pixels++=quantum[0];
135 return(pixels);
136 }
137 *pixels++=quantum[0];
138 *pixels++=quantum[1];
139 *pixels++=quantum[2];
140 *pixels++=quantum[3];
141 *pixels++=quantum[4];
142 *pixels++=quantum[5];
143 *pixels++=quantum[6];
144 *pixels++=quantum[7];
145 return(pixels);
146}
147
148static inline unsigned char *PopFloatPixel(const QuantumState *quantum_state,
149 const float pixel,unsigned char *pixels)
150{
151 float
152 *p;
153
154 unsigned char
155 quantum[4];
156
157 p=(float *) quantum;
158 *p=(float) ((double) pixel*quantum_state->inverse_scale+
cristy82b15832009-10-06 19:17:37 +0000159 quantum_state->minimum);
cristy3ed852e2009-09-05 21:47:34 +0000160 if (quantum_state->endian != LSBEndian)
161 {
162 *pixels++=quantum[3];
163 *pixels++=quantum[2];
164 *pixels++=quantum[1];
165 *pixels++=quantum[0];
166 return(pixels);
167 }
168 *pixels++=quantum[0];
169 *pixels++=quantum[1];
170 *pixels++=quantum[2];
171 *pixels++=quantum[3];
172 return(pixels);
173}
174
175static inline unsigned char *PopQuantumPixel(QuantumState *quantum_state,
176 const unsigned long depth,const QuantumAny pixel,unsigned char *pixels)
177{
178 register long
179 i;
180
181 register unsigned long
182 quantum_bits;
183
184 if (quantum_state->bits == 0UL)
185 quantum_state->bits=8UL;
186 for (i=(long) depth; i > 0L; )
187 {
188 quantum_bits=(unsigned long) i;
189 if (quantum_bits > quantum_state->bits)
190 quantum_bits=quantum_state->bits;
191 i-=quantum_bits;
192 if (quantum_state->bits == 8)
193 *pixels='\0';
194 quantum_state->bits-=quantum_bits;
195 *pixels|=(((pixel >> i) &~ ((~0UL) << quantum_bits)) <<
196 quantum_state->bits);
197 if (quantum_state->bits == 0UL)
198 {
199 pixels++;
200 quantum_state->bits=8UL;
201 }
202 }
203 return(pixels);
204}
205
206static inline unsigned char *PopQuantumLongPixel(QuantumState *quantum_state,
207 const unsigned long depth,const unsigned long pixel,unsigned char *pixels)
208{
209 register long
210 i;
211
212 unsigned long
213 quantum_bits;
214
215 if (quantum_state->bits == 0UL)
216 quantum_state->bits=32UL;
217 for (i=(long) depth; i > 0; )
218 {
219 quantum_bits=(unsigned long) i;
220 if (quantum_bits > quantum_state->bits)
221 quantum_bits=quantum_state->bits;
222 quantum_state->pixel|=(((pixel >> (depth-i)) &
223 quantum_state->mask[quantum_bits]) << (32UL-quantum_state->bits));
224 i-=quantum_bits;
225 quantum_state->bits-=quantum_bits;
226 if (quantum_state->bits == 0U)
227 {
228 pixels=PopLongPixel(quantum_state->endian,quantum_state->pixel,pixels);
229 quantum_state->pixel=0U;
230 quantum_state->bits=32UL;
231 }
232 }
233 return(pixels);
234}
235
236MagickExport size_t ExportQuantumPixels(const Image *image,
237 const CacheView *image_view,const QuantumInfo *quantum_info,
238 const QuantumType quantum_type,unsigned char *pixels,ExceptionInfo *exception)
239{
240 EndianType
241 endian;
242
243 long
244 bit;
245
246 MagickRealType
247 alpha;
248
249 MagickSizeType
250 number_pixels;
251
252 QuantumAny
253 range;
254
255 QuantumState
256 quantum_state;
257
258 register const IndexPacket
cristyaebafa22009-11-26 01:48:56 +0000259 *restrict indexes;
cristy3ed852e2009-09-05 21:47:34 +0000260
261 register const PixelPacket
cristyaebafa22009-11-26 01:48:56 +0000262 *restrict p;
cristy3ed852e2009-09-05 21:47:34 +0000263
264 register long
265 x;
266
267 register unsigned char
cristyaebafa22009-11-26 01:48:56 +0000268 *restrict q;
cristy3ed852e2009-09-05 21:47:34 +0000269
270 size_t
271 extent;
272
273 assert(image != (Image *) NULL);
274 assert(image->signature == MagickSignature);
275 if (image->debug != MagickFalse)
276 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
277 assert(quantum_info != (QuantumInfo *) NULL);
278 assert(quantum_info->signature == MagickSignature);
279 if (pixels == (unsigned char *) NULL)
280 pixels=GetQuantumPixels(quantum_info);
281 number_pixels=GetImageExtent(image);
282 p=GetVirtualPixelQueue(image);
283 indexes=GetVirtualIndexQueue(image);
284 if (image_view != (CacheView *) NULL)
285 {
286 number_pixels=GetCacheViewExtent(image_view);
287 p=GetCacheViewVirtualPixelQueue(image_view);
288 indexes=GetCacheViewVirtualIndexQueue(image_view);
289 }
290 if (quantum_info->alpha_type == AssociatedQuantumAlpha)
291 {
292 register PixelPacket
cristyc47d1f82009-11-26 01:44:43 +0000293 *restrict q;
cristy3ed852e2009-09-05 21:47:34 +0000294
295 /*
296 Associate alpha.
297 */
298 q=GetAuthenticPixelQueue(image);
299 if (image_view != (CacheView *) NULL)
300 q=(PixelPacket *) GetCacheViewVirtualPixelQueue(image_view);
301 for (x=0; x < (long) image->columns; x++)
302 {
303 alpha=QuantumScale*((double) QuantumRange-q->opacity);
cristyce70c172010-01-07 17:15:30 +0000304 q->red=ClampToQuantum(alpha*q->red);
305 q->green=ClampToQuantum(alpha*q->green);
306 q->blue=ClampToQuantum(alpha*q->blue);
cristy3ed852e2009-09-05 21:47:34 +0000307 q++;
308 }
309 }
310 if ((quantum_type == RGBOQuantum) || (quantum_type == CMYKOQuantum))
311 {
312 register PixelPacket
cristyc47d1f82009-11-26 01:44:43 +0000313 *restrict q;
cristy3ed852e2009-09-05 21:47:34 +0000314
315 q=GetAuthenticPixelQueue(image);
316 if (image_view != (CacheView *) NULL)
317 q=(PixelPacket *) GetCacheViewVirtualPixelQueue(image_view);
318 for (x=0; x < (long) number_pixels; x++)
319 {
cristy46f08202010-01-10 04:04:21 +0000320 q->opacity=(Quantum) GetAlphaPixelComponent(q);
cristy3ed852e2009-09-05 21:47:34 +0000321 q++;
322 }
323 }
324 if ((quantum_type == CbYCrQuantum) || (quantum_type == CbYCrAQuantum))
325 {
326 Quantum
327 quantum;
328
329 register PixelPacket
cristyc47d1f82009-11-26 01:44:43 +0000330 *restrict q;
cristy3ed852e2009-09-05 21:47:34 +0000331
332 q=GetAuthenticPixelQueue(image);
333 if (image_view != (CacheView *) NULL)
334 q=GetAuthenticPixelQueue(image);
335 for (x=0; x < (long) number_pixels; x++)
336 {
337 quantum=q->red;
338 q->red=q->green;
339 q->green=quantum;
340 q++;
341 }
342 }
343 x=0;
344 q=pixels;
345 InitializeQuantumState(quantum_info,image->endian,&quantum_state);
346 extent=GetQuantumExtent(image,quantum_info,quantum_type);
347 endian=quantum_state.endian;
348 switch (quantum_type)
349 {
350 case IndexQuantum:
351 {
352 if (image->storage_class != PseudoClass)
353 {
354 (void) ThrowMagickException(exception,GetMagickModule(),ImageError,
355 "ColormappedImageRequired","`%s'",image->filename);
356 return(extent);
357 }
358 switch (quantum_info->depth)
359 {
360 case 1:
361 {
362 register unsigned char
363 pixel;
364
365 for (x=((long) number_pixels-7); x > 0; x-=8)
366 {
367 pixel=(unsigned char) *indexes++;
368 *q=((pixel & 0x01) << 7);
369 pixel=(unsigned char) *indexes++;
370 *q|=((pixel & 0x01) << 6);
371 pixel=(unsigned char) *indexes++;
372 *q|=((pixel & 0x01) << 5);
373 pixel=(unsigned char) *indexes++;
374 *q|=((pixel & 0x01) << 4);
375 pixel=(unsigned char) *indexes++;
376 *q|=((pixel & 0x01) << 3);
377 pixel=(unsigned char) *indexes++;
378 *q|=((pixel & 0x01) << 2);
379 pixel=(unsigned char) *indexes++;
380 *q|=((pixel & 0x01) << 1);
381 pixel=(unsigned char) *indexes++;
382 *q|=((pixel & 0x01) << 0);
383 q++;
384 }
385 if ((number_pixels % 8) != 0)
386 {
387 *q='\0';
388 for (bit=7; bit >= (long) (8-(number_pixels % 8)); bit--)
389 {
390 pixel=(unsigned char) *indexes++;
391 *q|=((pixel & 0x01) << (unsigned char) bit);
392 }
393 q++;
394 }
395 break;
396 }
397 case 4:
398 {
399 register unsigned char
400 pixel;
401
402 for (x=0; x < (long) (number_pixels-1) ; x+=2)
403 {
404 pixel=(unsigned char) *indexes++;
405 *q=((pixel & 0xf) << 4);
406 pixel=(unsigned char) *indexes++;
407 *q|=((pixel & 0xf) << 0);
408 q++;
409 }
410 if ((number_pixels % 2) != 0)
411 {
412 pixel=(unsigned char) *indexes++;
413 *q=((pixel & 0xf) << 4);
414 q++;
415 }
416 break;
417 }
418 case 8:
419 {
420 for (x=0; x < (long) number_pixels; x++)
421 {
422 q=PopCharPixel((unsigned char) indexes[x],q);
423 q+=quantum_info->pad;
424 }
425 break;
426 }
427 case 16:
428 {
cristyc9672a92010-01-06 00:57:45 +0000429 if (quantum_info->format == FloatingPointQuantumFormat)
430 {
431 for (x=0; x < (long) number_pixels; x++)
432 {
cristy2a4d01c2010-01-10 21:14:51 +0000433 q=PopShortPixel(endian,SinglePrecisionToHalf(QuantumScale*
cristyc9672a92010-01-06 00:57:45 +0000434 indexes[x]),q);
435 q+=quantum_info->pad;
436 }
437 break;
438 }
cristy3ed852e2009-09-05 21:47:34 +0000439 for (x=0; x < (long) number_pixels; x++)
440 {
441 q=PopShortPixel(endian,(unsigned short) indexes[x],q);
442 q+=quantum_info->pad;
443 }
444 break;
445 }
446 case 32:
447 {
448 if (quantum_info->format == FloatingPointQuantumFormat)
449 {
450 for (x=0; x < (long) number_pixels; x++)
451 {
452 q=PopFloatPixel(&quantum_state,(float) indexes[x],q);
453 p++;
454 q+=quantum_info->pad;
455 }
456 break;
457 }
458 for (x=0; x < (long) number_pixels; x++)
459 {
460 q=PopLongPixel(endian,(unsigned long) indexes[x],q);
461 q+=quantum_info->pad;
462 }
463 break;
464 }
465 case 64:
466 {
467 if (quantum_info->format == FloatingPointQuantumFormat)
468 {
469 for (x=0; x < (long) number_pixels; x++)
470 {
471 q=PopDoublePixel(&quantum_state,(double) indexes[x],q);
472 p++;
473 q+=quantum_info->pad;
474 }
475 break;
476 }
477 }
478 default:
479 {
480 for (x=0; x < (long) number_pixels; x++)
481 {
482 q=PopQuantumPixel(&quantum_state,image->depth,indexes[x],q);
483 p++;
484 q+=quantum_info->pad;
485 }
486 break;
487 }
488 }
489 break;
490 }
491 case IndexAlphaQuantum:
492 {
493 if (image->storage_class != PseudoClass)
494 {
495 (void) ThrowMagickException(exception,GetMagickModule(),ImageError,
496 "ColormappedImageRequired","`%s'",image->filename);
497 return(extent);
498 }
499 switch (quantum_info->depth)
500 {
501 case 1:
502 {
503 register unsigned char
504 pixel;
505
506 for (x=((long) number_pixels-3); x > 0; x-=4)
507 {
508 pixel=(unsigned char) *indexes++;
509 *q=((pixel & 0x01) << 7);
510 pixel=(unsigned char) (p->opacity == (Quantum) TransparentOpacity ?
511 1 : 0);
512 *q|=((pixel & 0x01) << 6);
513 p++;
514 pixel=(unsigned char) *indexes++;
515 *q|=((pixel & 0x01) << 5);
516 pixel=(unsigned char) (p->opacity == (Quantum) TransparentOpacity ?
517 1 : 0);
518 *q|=((pixel & 0x01) << 4);
519 p++;
520 pixel=(unsigned char) *indexes++;
521 *q|=((pixel & 0x01) << 3);
522 pixel=(unsigned char) (p->opacity == (Quantum) TransparentOpacity ?
523 1 : 0);
524 *q|=((pixel & 0x01) << 2);
525 p++;
526 pixel=(unsigned char) *indexes++;
527 *q|=((pixel & 0x01) << 1);
528 pixel=(unsigned char) (p->opacity == (Quantum) TransparentOpacity ?
529 1 : 0);
530 *q|=((pixel & 0x01) << 0);
531 p++;
532 q++;
533 }
534 if ((number_pixels % 4) != 0)
535 {
536 *q='\0';
537 for (bit=3; bit >= (long) (4-(number_pixels % 4)); bit-=2)
538 {
539 pixel=(unsigned char) *indexes++;
cristyb32b90a2009-09-07 21:45:48 +0000540 *q|=((pixel & 0x01) << (unsigned char) (bit+4));
cristy3ed852e2009-09-05 21:47:34 +0000541 pixel=(unsigned char) (p->opacity == (Quantum)
542 TransparentOpacity ? 1 : 0);
cristyb32b90a2009-09-07 21:45:48 +0000543 *q|=((pixel & 0x01) << (unsigned char) (bit+4-1));
cristy3ed852e2009-09-05 21:47:34 +0000544 p++;
545 }
546 q++;
547 }
548 break;
549 }
550 case 4:
551 {
552 register unsigned char
553 pixel;
554
555 for (x=0; x < (long) number_pixels ; x++)
556 {
557 pixel=(unsigned char) *indexes++;
558 *q=((pixel & 0xf) << 4);
559 pixel=(unsigned char) (16*QuantumScale*((Quantum) (QuantumRange-
cristyce70c172010-01-07 17:15:30 +0000560 GetOpacityPixelComponent(p)))+0.5);
cristy3ed852e2009-09-05 21:47:34 +0000561 *q|=((pixel & 0xf) << 0);
562 p++;
563 q++;
564 }
565 break;
566 }
567 case 8:
568 {
569 register unsigned char
570 pixel;
571
572 for (x=0; x < (long) number_pixels; x++)
573 {
574 q=PopCharPixel((unsigned char) indexes[x],q);
cristyce70c172010-01-07 17:15:30 +0000575 pixel=ScaleQuantumToChar((Quantum) (QuantumRange-
576 GetOpacityPixelComponent(p)));
cristy3ed852e2009-09-05 21:47:34 +0000577 q=PopCharPixel(pixel,q);
578 p++;
579 q+=quantum_info->pad;
580 }
581 break;
582 }
583 case 16:
584 {
585 register unsigned short
586 pixel;
587
cristyc9672a92010-01-06 00:57:45 +0000588 if (quantum_info->format == FloatingPointQuantumFormat)
589 {
590 for (x=0; x < (long) number_pixels; x++)
591 {
592 q=PopShortPixel(endian,(unsigned short) indexes[x],q);
cristy2a4d01c2010-01-10 21:14:51 +0000593 pixel=SinglePrecisionToHalf(QuantumScale*
cristy24fb7dc2010-01-10 20:15:51 +0000594 GetAlphaPixelComponent(p));
cristyc9672a92010-01-06 00:57:45 +0000595 q=PopShortPixel(endian,pixel,q);
596 p++;
597 q+=quantum_info->pad;
598 }
599 break;
600 }
cristy3ed852e2009-09-05 21:47:34 +0000601 for (x=0; x < (long) number_pixels; x++)
602 {
603 q=PopShortPixel(endian,(unsigned short) indexes[x],q);
cristyce70c172010-01-07 17:15:30 +0000604 pixel=ScaleQuantumToShort((Quantum) (QuantumRange-
605 GetOpacityPixelComponent(p)));
cristy3ed852e2009-09-05 21:47:34 +0000606 q=PopShortPixel(endian,pixel,q);
607 p++;
608 q+=quantum_info->pad;
609 }
610 break;
611 }
612 case 32:
613 {
614 register unsigned long
615 pixel;
616
617 if (quantum_info->format == FloatingPointQuantumFormat)
618 {
619 for (x=0; x < (long) number_pixels; x++)
620 {
621 float
622 pixel;
623
624 q=PopFloatPixel(&quantum_state,(float) indexes[x],q);
cristy46f08202010-01-10 04:04:21 +0000625 pixel=(float) (GetAlphaPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +0000626 q=PopFloatPixel(&quantum_state,pixel,q);
627 p++;
628 q+=quantum_info->pad;
629 }
630 break;
631 }
632 for (x=0; x < (long) number_pixels; x++)
633 {
634 q=PopLongPixel(endian,(unsigned long) indexes[x],q);
cristyce70c172010-01-07 17:15:30 +0000635 pixel=ScaleQuantumToLong((Quantum) (QuantumRange-
636 GetOpacityPixelComponent(p)));
cristy3ed852e2009-09-05 21:47:34 +0000637 q=PopLongPixel(endian,pixel,q);
638 p++;
639 q+=quantum_info->pad;
640 }
641 break;
642 }
643 case 64:
644 {
645 if (quantum_info->format == FloatingPointQuantumFormat)
646 {
647 for (x=0; x < (long) number_pixels; x++)
648 {
649 double
650 pixel;
651
652 q=PopDoublePixel(&quantum_state,(double) indexes[x],q);
cristy46f08202010-01-10 04:04:21 +0000653 pixel=(double) (GetAlphaPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +0000654 q=PopDoublePixel(&quantum_state,pixel,q);
655 p++;
656 q+=quantum_info->pad;
657 }
658 break;
659 }
660 }
661 default:
662 {
663 range=GetQuantumRange(image->depth);
664 for (x=0; x < (long) number_pixels; x++)
665 {
666 q=PopQuantumPixel(&quantum_state,image->depth,indexes[x],q);
667 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
cristy46f08202010-01-10 04:04:21 +0000668 (Quantum) (GetAlphaPixelComponent(p)),range),q);
cristy3ed852e2009-09-05 21:47:34 +0000669 p++;
670 q+=quantum_info->pad;
671 }
672 break;
673 }
674 }
675 break;
676 }
677 case GrayQuantum:
678 {
679 switch (quantum_info->depth)
680 {
681 case 1:
682 {
683 register Quantum
684 threshold;
685
686 register unsigned char
687 black,
688 white;
689
690 black=0x00;
691 white=0x01;
692 if (quantum_info->min_is_white != MagickFalse)
693 {
694 black=0x01;
695 white=0x00;
696 }
697 threshold=(Quantum) (QuantumRange/2);
698 for (x=((long) number_pixels-7); x > 0; x-=8)
699 {
700 *q='\0';
701 *q|=(PixelIntensityToQuantum(p) < threshold ? black : white) << 7;
702 p++;
703 *q|=(PixelIntensityToQuantum(p) < threshold ? black : white) << 6;
704 p++;
705 *q|=(PixelIntensityToQuantum(p) < threshold ? black : white) << 5;
706 p++;
707 *q|=(PixelIntensityToQuantum(p) < threshold ? black : white) << 4;
708 p++;
709 *q|=(PixelIntensityToQuantum(p) < threshold ? black : white) << 3;
710 p++;
711 *q|=(PixelIntensityToQuantum(p) < threshold ? black : white) << 2;
712 p++;
713 *q|=(PixelIntensityToQuantum(p) < threshold ? black : white) << 1;
714 p++;
715 *q|=(PixelIntensityToQuantum(p) < threshold ? black : white) << 0;
716 p++;
717 q++;
718 }
719 if ((number_pixels % 8) != 0)
720 {
721 *q='\0';
722 for (bit=7; bit >= (long) (8-(number_pixels % 8)); bit--)
723 {
724 *q|=(PixelIntensityToQuantum(p) < threshold ? black : white) <<
725 bit;
726 p++;
727 }
728 q++;
729 }
730 break;
731 }
732 case 4:
733 {
734 register unsigned char
735 pixel;
736
737 for (x=0; x < (long) (number_pixels-1) ; x+=2)
738 {
739 pixel=ScaleQuantumToChar(PixelIntensityToQuantum(p));
740 *q=(((pixel >> 4) & 0xf) << 4);
741 p++;
742 pixel=ScaleQuantumToChar(PixelIntensityToQuantum(p));
743 *q|=pixel >> 4;
744 p++;
745 q++;
746 }
747 if ((number_pixels % 2) != 0)
748 {
749 pixel=ScaleQuantumToChar(PixelIntensityToQuantum(p));
750 *q=(((pixel >> 4) & 0xf) << 4);
751 p++;
752 q++;
753 }
754 break;
755 }
756 case 8:
757 {
758 register unsigned char
759 pixel;
760
761 for (x=0; x < (long) number_pixels; x++)
762 {
763 pixel=ScaleQuantumToChar(PixelIntensityToQuantum(p));
764 q=PopCharPixel(pixel,q);
765 p++;
766 q+=quantum_info->pad;
767 }
768 break;
769 }
770 case 10:
771 {
cristy3ed852e2009-09-05 21:47:34 +0000772 range=GetQuantumRange(image->depth);
773 if (quantum_info->pack == MagickFalse)
774 {
cristyff024b42010-02-21 22:55:09 +0000775 register unsigned long
776 pixel;
777
cristy69702dd2010-02-22 15:26:39 +0000778 for (x=0; x < (long) (number_pixels-2); x+=3)
cristy3ed852e2009-09-05 21:47:34 +0000779 {
cristyff024b42010-02-21 22:55:09 +0000780 pixel=(unsigned long) (
781 ScaleQuantumToAny(PixelIntensityToQuantum(p+2),range) << 22 |
782 ScaleQuantumToAny(PixelIntensityToQuantum(p+1),range) << 12 |
783 ScaleQuantumToAny(PixelIntensityToQuantum(p+0),range) << 2);
784 q=PopLongPixel(endian,pixel,q);
785 p+=3;
cristy3ed852e2009-09-05 21:47:34 +0000786 q+=quantum_info->pad;
787 }
cristy69702dd2010-02-22 15:26:39 +0000788 pixel=0UL;
cristyff024b42010-02-21 22:55:09 +0000789 if (x++ < (long) (number_pixels-1))
cristy69702dd2010-02-22 15:26:39 +0000790 pixel|=ScaleQuantumToAny(PixelIntensityToQuantum(p+1),
791 range) << 12;
cristyff024b42010-02-21 22:55:09 +0000792 if (x++ < (long) number_pixels)
cristy69702dd2010-02-22 15:26:39 +0000793 pixel|=ScaleQuantumToAny(PixelIntensityToQuantum(p+0),
794 range) << 2;
795 q=PopLongPixel(endian,pixel,q);
cristy3ed852e2009-09-05 21:47:34 +0000796 break;
797 }
798 for (x=0; x < (long) number_pixels; x++)
799 {
800 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
801 PixelIntensityToQuantum(p),range),q);
802 p++;
803 q+=quantum_info->pad;
804 }
805 break;
806 }
807 case 12:
808 {
809 register unsigned short
810 pixel;
811
812 range=GetQuantumRange(image->depth);
813 if (quantum_info->pack == MagickFalse)
814 {
815 for (x=0; x < (long) number_pixels; x++)
816 {
817 pixel=ScaleQuantumToShort(PixelIntensityToQuantum(p));
818 q=PopShortPixel(endian,(unsigned short) (pixel >> 4),q);
819 p++;
820 q+=quantum_info->pad;
821 }
822 break;
823 }
824 for (x=0; x < (long) number_pixels; x++)
825 {
826 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
827 PixelIntensityToQuantum(p),range),q);
828 p++;
829 q+=quantum_info->pad;
830 }
831 break;
832 }
833 case 16:
834 {
835 register unsigned short
836 pixel;
837
cristyc9672a92010-01-06 00:57:45 +0000838 if (quantum_info->format == FloatingPointQuantumFormat)
839 {
840 for (x=0; x < (long) number_pixels; x++)
841 {
cristy2a4d01c2010-01-10 21:14:51 +0000842 pixel=SinglePrecisionToHalf(QuantumScale*
cristy24fb7dc2010-01-10 20:15:51 +0000843 PixelIntensityToQuantum(p));
cristyc9672a92010-01-06 00:57:45 +0000844 q=PopShortPixel(endian,pixel,q);
845 p++;
846 q+=quantum_info->pad;
847 }
848 break;
849 }
cristy3ed852e2009-09-05 21:47:34 +0000850 for (x=0; x < (long) number_pixels; x++)
851 {
852 pixel=ScaleQuantumToShort(PixelIntensityToQuantum(p));
853 q=PopShortPixel(endian,pixel,q);
854 p++;
855 q+=quantum_info->pad;
856 }
857 break;
858 }
859 case 32:
860 {
861 register unsigned long
862 pixel;
863
864 if (quantum_info->format == FloatingPointQuantumFormat)
865 {
866 for (x=0; x < (long) number_pixels; x++)
867 {
868 float
869 pixel;
870
871 pixel=(float) PixelIntensityToQuantum(p);
872 q=PopFloatPixel(&quantum_state,pixel,q);
873 p++;
874 q+=quantum_info->pad;
875 }
876 break;
877 }
878 for (x=0; x < (long) number_pixels; x++)
879 {
880 pixel=ScaleQuantumToLong(PixelIntensityToQuantum(p));
881 q=PopLongPixel(endian,pixel,q);
882 p++;
883 q+=quantum_info->pad;
884 }
885 break;
886 }
887 case 64:
888 {
889 if (quantum_info->format == FloatingPointQuantumFormat)
890 {
891 for (x=0; x < (long) number_pixels; x++)
892 {
893 double
894 pixel;
895
896 pixel=(double) PixelIntensityToQuantum(p);
897 q=PopDoublePixel(&quantum_state,pixel,q);
898 p++;
899 q+=quantum_info->pad;
900 }
901 break;
902 }
903 }
904 default:
905 {
906 range=GetQuantumRange(image->depth);
907 for (x=0; x < (long) number_pixels; x++)
908 {
909 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
910 PixelIntensityToQuantum(p),range),q);
911 p++;
912 q+=quantum_info->pad;
913 }
914 break;
915 }
916 }
917 break;
918 }
919 case GrayAlphaQuantum:
920 {
921 switch (quantum_info->depth)
922 {
923 case 1:
924 {
925 register Quantum
926 threshold;
927
928 register unsigned char
929 black,
930 pixel,
931 white;
932
933 black=0x00;
934 white=0x01;
935 if (quantum_info->min_is_white == MagickFalse)
936 {
937 black=0x01;
938 white=0x00;
939 }
940 threshold=(Quantum) (QuantumRange/2);
941 for (x=((long) number_pixels-3); x > 0; x-=4)
942 {
943 *q='\0';
944 *q|=(PixelIntensityToQuantum(p) < threshold ? black : white) << 7;
945 pixel=(unsigned char) (p->opacity == OpaqueOpacity ? 0x00 : 0x01);
946 *q|=(((int) pixel != 0 ? 0x00 : 0x01) << 6);
947 p++;
948 *q|=(PixelIntensityToQuantum(p) < threshold ? black : white) << 5;
949 pixel=(unsigned char) (p->opacity == OpaqueOpacity ? 0x00 : 0x01);
950 *q|=(((int) pixel != 0 ? 0x00 : 0x01) << 4);
951 p++;
952 *q|=(PixelIntensityToQuantum(p) < threshold ? black : white) << 3;
953 pixel=(unsigned char) (p->opacity == OpaqueOpacity ? 0x00 : 0x01);
954 *q|=(((int) pixel != 0 ? 0x00 : 0x01) << 2);
955 p++;
956 *q|=(PixelIntensityToQuantum(p) < threshold ? black : white) << 1;
957 pixel=(unsigned char) (p->opacity == OpaqueOpacity ? 0x00 : 0x01);
958 *q|=(((int) pixel != 0 ? 0x00 : 0x01) << 0);
959 p++;
960 q++;
961 }
962 if ((number_pixels % 4) != 0)
963 {
964 *q='\0';
965 for (bit=3; bit >= (long) (4-(number_pixels % 4)); bit-=2)
966 {
967 *q|=(PixelIntensityToQuantum(p) < threshold ? black : white) <<
cristyb32b90a2009-09-07 21:45:48 +0000968 (bit+4);
cristy3ed852e2009-09-05 21:47:34 +0000969 pixel=(unsigned char) (p->opacity == OpaqueOpacity ? 0x00 :
970 0x01);
971 *q|=(((int) pixel != 0 ? 0x00 : 0x01) << (unsigned char)
cristyb32b90a2009-09-07 21:45:48 +0000972 (bit+4-1));
cristy3ed852e2009-09-05 21:47:34 +0000973 p++;
974 }
975 q++;
976 }
977 break;
978 }
979 case 4:
980 {
981 register unsigned char
982 pixel;
983
984 for (x=0; x < (long) number_pixels ; x++)
985 {
986 pixel=ScaleQuantumToChar(PixelIntensityToQuantum(p));
987 *q=(((pixel >> 4) & 0xf) << 4);
988 pixel=(unsigned char) (16*QuantumScale*((Quantum) (QuantumRange-
cristyce70c172010-01-07 17:15:30 +0000989 GetOpacityPixelComponent(p)))+0.5);
cristy3ed852e2009-09-05 21:47:34 +0000990 *q|=pixel & 0xf;
991 p++;
992 q++;
993 }
994 break;
995 }
996 case 8:
997 {
998 register unsigned char
999 pixel;
1000
1001 for (x=0; x < (long) number_pixels; x++)
1002 {
1003 pixel=ScaleQuantumToChar(PixelIntensityToQuantum(p));
1004 q=PopCharPixel(pixel,q);
cristyce70c172010-01-07 17:15:30 +00001005 pixel=ScaleQuantumToChar((Quantum) (QuantumRange-
1006 GetOpacityPixelComponent(p)));
cristy3ed852e2009-09-05 21:47:34 +00001007 q=PopCharPixel(pixel,q);
1008 p++;
1009 q+=quantum_info->pad;
1010 }
1011 break;
1012 }
1013 case 16:
1014 {
1015 register unsigned short
1016 pixel;
1017
cristyc9672a92010-01-06 00:57:45 +00001018 if (quantum_info->format == FloatingPointQuantumFormat)
1019 {
1020 for (x=0; x < (long) number_pixels; x++)
1021 {
cristy2a4d01c2010-01-10 21:14:51 +00001022 pixel=SinglePrecisionToHalf(QuantumScale*
cristy24fb7dc2010-01-10 20:15:51 +00001023 PixelIntensityToQuantum(p));
cristyc9672a92010-01-06 00:57:45 +00001024 q=PopShortPixel(endian,pixel,q);
cristy2a4d01c2010-01-10 21:14:51 +00001025 pixel=SinglePrecisionToHalf(QuantumScale*
cristy24fb7dc2010-01-10 20:15:51 +00001026 GetAlphaPixelComponent(p));
cristyc9672a92010-01-06 00:57:45 +00001027 q=PopShortPixel(endian,pixel,q);
1028 p++;
1029 q+=quantum_info->pad;
1030 }
1031 break;
1032 }
cristy3ed852e2009-09-05 21:47:34 +00001033 for (x=0; x < (long) number_pixels; x++)
1034 {
1035 pixel=ScaleQuantumToShort(PixelIntensityToQuantum(p));
1036 q=PopShortPixel(endian,pixel,q);
cristyce70c172010-01-07 17:15:30 +00001037 pixel=ScaleQuantumToShort((Quantum) (QuantumRange-
1038 GetOpacityPixelComponent(p)));
cristy3ed852e2009-09-05 21:47:34 +00001039 q=PopShortPixel(endian,pixel,q);
1040 p++;
1041 q+=quantum_info->pad;
1042 }
1043 break;
1044 }
1045 case 32:
1046 {
1047 register unsigned long
1048 pixel;
1049
1050 if (quantum_info->format == FloatingPointQuantumFormat)
1051 {
1052 for (x=0; x < (long) number_pixels; x++)
1053 {
1054 float
1055 pixel;
1056
1057 pixel=(float) PixelIntensityToQuantum(p);
1058 q=PopFloatPixel(&quantum_state,pixel,q);
cristy46f08202010-01-10 04:04:21 +00001059 pixel=(float) (GetAlphaPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00001060 q=PopFloatPixel(&quantum_state,pixel,q);
1061 p++;
1062 q+=quantum_info->pad;
1063 }
1064 break;
1065 }
1066 for (x=0; x < (long) number_pixels; x++)
1067 {
1068 pixel=ScaleQuantumToLong(PixelIntensityToQuantum(p));
1069 q=PopLongPixel(endian,pixel,q);
cristyce70c172010-01-07 17:15:30 +00001070 pixel=ScaleQuantumToLong((Quantum) (QuantumRange-
1071 GetOpacityPixelComponent(p)));
cristy3ed852e2009-09-05 21:47:34 +00001072 q=PopLongPixel(endian,pixel,q);
1073 p++;
1074 q+=quantum_info->pad;
1075 }
1076 break;
1077 }
1078 case 64:
1079 {
1080 if (quantum_info->format == FloatingPointQuantumFormat)
1081 {
1082 for (x=0; x < (long) number_pixels; x++)
1083 {
1084 double
1085 pixel;
1086
1087 pixel=(double) PixelIntensityToQuantum(p);
1088 q=PopDoublePixel(&quantum_state,pixel,q);
cristy46f08202010-01-10 04:04:21 +00001089 pixel=(double) (GetAlphaPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00001090 q=PopDoublePixel(&quantum_state,pixel,q);
1091 p++;
1092 q+=quantum_info->pad;
1093 }
1094 break;
1095 }
1096 }
1097 default:
1098 {
1099 range=GetQuantumRange(image->depth);
1100 for (x=0; x < (long) number_pixels; x++)
1101 {
1102 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
1103 PixelIntensityToQuantum(p),range),q);
1104 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
cristy46f08202010-01-10 04:04:21 +00001105 (Quantum) (GetAlphaPixelComponent(p)),range),q);
cristy3ed852e2009-09-05 21:47:34 +00001106 p++;
1107 q+=quantum_info->pad;
1108 }
1109 break;
1110 }
1111 }
1112 break;
1113 }
1114 case RedQuantum:
1115 case CyanQuantum:
1116 {
1117 switch (quantum_info->depth)
1118 {
1119 case 8:
1120 {
1121 register unsigned char
1122 pixel;
1123
1124 for (x=0; x < (long) number_pixels; x++)
1125 {
cristyce70c172010-01-07 17:15:30 +00001126 pixel=ScaleQuantumToChar(GetRedPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00001127 q=PopCharPixel(pixel,q);
1128 p++;
1129 q+=quantum_info->pad;
1130 }
1131 break;
1132 }
1133 case 16:
1134 {
1135 register unsigned short
1136 pixel;
1137
cristyc9672a92010-01-06 00:57:45 +00001138 if (quantum_info->format == FloatingPointQuantumFormat)
1139 {
1140 for (x=0; x < (long) number_pixels; x++)
1141 {
cristy2a4d01c2010-01-10 21:14:51 +00001142 pixel=SinglePrecisionToHalf(QuantumScale*
cristy24fb7dc2010-01-10 20:15:51 +00001143 GetRedPixelComponent(p));
cristyc9672a92010-01-06 00:57:45 +00001144 q=PopShortPixel(endian,pixel,q);
1145 p++;
1146 q+=quantum_info->pad;
1147 }
1148 break;
1149 }
cristy3ed852e2009-09-05 21:47:34 +00001150 for (x=0; x < (long) number_pixels; x++)
1151 {
cristyce70c172010-01-07 17:15:30 +00001152 pixel=ScaleQuantumToShort(GetRedPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00001153 q=PopShortPixel(endian,pixel,q);
1154 p++;
1155 q+=quantum_info->pad;
1156 }
1157 break;
1158 }
1159 case 32:
1160 {
1161 register unsigned long
1162 pixel;
1163
1164 if (quantum_info->format == FloatingPointQuantumFormat)
1165 {
1166 for (x=0; x < (long) number_pixels; x++)
1167 {
1168 q=PopFloatPixel(&quantum_state,(float) p->red,q);
1169 p++;
1170 q+=quantum_info->pad;
1171 }
1172 break;
1173 }
1174 for (x=0; x < (long) number_pixels; x++)
1175 {
cristyce70c172010-01-07 17:15:30 +00001176 pixel=ScaleQuantumToLong(GetRedPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00001177 q=PopLongPixel(endian,pixel,q);
1178 p++;
1179 q+=quantum_info->pad;
1180 }
1181 break;
1182 }
1183 case 64:
1184 {
1185 if (quantum_info->format == FloatingPointQuantumFormat)
1186 {
1187 for (x=0; x < (long) number_pixels; x++)
1188 {
1189 q=PopDoublePixel(&quantum_state,(double) p->red,q);
1190 p++;
1191 q+=quantum_info->pad;
1192 }
1193 break;
1194 }
1195 }
1196 default:
1197 {
1198 range=GetQuantumRange(image->depth);
1199 for (x=0; x < (long) number_pixels; x++)
1200 {
1201 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
1202 p->red,range),q);
1203 p++;
1204 q+=quantum_info->pad;
1205 }
1206 break;
1207 }
1208 }
1209 break;
1210 }
1211 case GreenQuantum:
1212 case MagentaQuantum:
1213 {
1214 switch (quantum_info->depth)
1215 {
1216 case 8:
1217 {
1218 register unsigned char
1219 pixel;
1220
1221 for (x=0; x < (long) number_pixels; x++)
1222 {
cristyce70c172010-01-07 17:15:30 +00001223 pixel=ScaleQuantumToChar(GetGreenPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00001224 q=PopCharPixel(pixel,q);
1225 p++;
1226 q+=quantum_info->pad;
1227 }
1228 break;
1229 }
1230 case 16:
1231 {
1232 register unsigned short
1233 pixel;
1234
cristyc9672a92010-01-06 00:57:45 +00001235 if (quantum_info->format == FloatingPointQuantumFormat)
1236 {
1237 for (x=0; x < (long) number_pixels; x++)
1238 {
cristy2a4d01c2010-01-10 21:14:51 +00001239 pixel=SinglePrecisionToHalf(QuantumScale*
cristy24fb7dc2010-01-10 20:15:51 +00001240 GetGreenPixelComponent(p));
cristyc9672a92010-01-06 00:57:45 +00001241 q=PopShortPixel(endian,pixel,q);
1242 p++;
1243 q+=quantum_info->pad;
1244 }
1245 break;
1246 }
cristy3ed852e2009-09-05 21:47:34 +00001247 for (x=0; x < (long) number_pixels; x++)
1248 {
cristyce70c172010-01-07 17:15:30 +00001249 pixel=ScaleQuantumToShort(GetGreenPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00001250 q=PopShortPixel(endian,pixel,q);
1251 p++;
1252 q+=quantum_info->pad;
1253 }
1254 break;
1255 }
1256 case 32:
1257 {
1258 register unsigned long
1259 pixel;
1260
1261 if (quantum_info->format == FloatingPointQuantumFormat)
1262 {
1263 for (x=0; x < (long) number_pixels; x++)
1264 {
1265 q=PopFloatPixel(&quantum_state,(float) p->green,q);
1266 p++;
1267 q+=quantum_info->pad;
1268 }
1269 break;
1270 }
1271 for (x=0; x < (long) number_pixels; x++)
1272 {
cristyce70c172010-01-07 17:15:30 +00001273 pixel=ScaleQuantumToLong(GetGreenPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00001274 q=PopLongPixel(endian,pixel,q);
1275 p++;
1276 q+=quantum_info->pad;
1277 }
1278 break;
1279 }
1280 case 64:
1281 {
1282 if (quantum_info->format == FloatingPointQuantumFormat)
1283 {
1284 for (x=0; x < (long) number_pixels; x++)
1285 {
1286 q=PopDoublePixel(&quantum_state,(double) p->green,q);
1287 p++;
1288 q+=quantum_info->pad;
1289 }
1290 break;
1291 }
1292 }
1293 default:
1294 {
1295 range=GetQuantumRange(image->depth);
1296 for (x=0; x < (long) number_pixels; x++)
1297 {
1298 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
1299 p->green,range),q);
1300 p++;
1301 q+=quantum_info->pad;
1302 }
1303 break;
1304 }
1305 }
1306 break;
1307 }
1308 case BlueQuantum:
1309 case YellowQuantum:
1310 {
1311 switch (quantum_info->depth)
1312 {
1313 case 8:
1314 {
1315 register unsigned char
1316 pixel;
1317
1318 for (x=0; x < (long) number_pixels; x++)
1319 {
cristyce70c172010-01-07 17:15:30 +00001320 pixel=ScaleQuantumToChar(GetBluePixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00001321 q=PopCharPixel(pixel,q);
1322 p++;
1323 q+=quantum_info->pad;
1324 }
1325 break;
1326 }
1327 case 16:
1328 {
1329 register unsigned short
1330 pixel;
1331
cristyc9672a92010-01-06 00:57:45 +00001332 if (quantum_info->format == FloatingPointQuantumFormat)
1333 {
1334 for (x=0; x < (long) number_pixels; x++)
1335 {
cristy2a4d01c2010-01-10 21:14:51 +00001336 pixel=SinglePrecisionToHalf(QuantumScale*
cristy24fb7dc2010-01-10 20:15:51 +00001337 GetBluePixelComponent(p));
cristyc9672a92010-01-06 00:57:45 +00001338 q=PopShortPixel(endian,pixel,q);
1339 p++;
1340 q+=quantum_info->pad;
1341 }
1342 break;
1343 }
cristy3ed852e2009-09-05 21:47:34 +00001344 for (x=0; x < (long) number_pixels; x++)
1345 {
cristyce70c172010-01-07 17:15:30 +00001346 pixel=ScaleQuantumToShort(GetBluePixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00001347 q=PopShortPixel(endian,pixel,q);
1348 p++;
1349 q+=quantum_info->pad;
1350 }
1351 break;
1352 }
1353 case 32:
1354 {
1355 register unsigned long
1356 pixel;
1357
1358 if (quantum_info->format == FloatingPointQuantumFormat)
1359 {
1360 for (x=0; x < (long) number_pixels; x++)
1361 {
1362 q=PopFloatPixel(&quantum_state,(float) p->blue,q);
1363 p++;
1364 q+=quantum_info->pad;
1365 }
1366 break;
1367 }
1368 for (x=0; x < (long) number_pixels; x++)
1369 {
cristyce70c172010-01-07 17:15:30 +00001370 pixel=ScaleQuantumToLong(GetBluePixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00001371 q=PopLongPixel(endian,pixel,q);
1372 p++;
1373 q+=quantum_info->pad;
1374 }
1375 break;
1376 }
1377 case 64:
1378 {
1379 if (quantum_info->format == FloatingPointQuantumFormat)
1380 {
1381 for (x=0; x < (long) number_pixels; x++)
1382 {
1383 q=PopDoublePixel(&quantum_state,(double) p->blue,q);
1384 p++;
1385 q+=quantum_info->pad;
1386 }
1387 break;
1388 }
1389 }
1390 default:
1391 {
1392 range=GetQuantumRange(image->depth);
1393 for (x=0; x < (long) number_pixels; x++)
1394 {
1395 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
1396 p->blue,range),q);
1397 p++;
1398 q+=quantum_info->pad;
1399 }
1400 break;
1401 }
1402 }
1403 break;
1404 }
1405 case AlphaQuantum:
1406 {
1407 switch (quantum_info->depth)
1408 {
1409 case 8:
1410 {
1411 register unsigned char
1412 pixel;
1413
1414 for (x=0; x < (long) number_pixels; x++)
1415 {
cristyce70c172010-01-07 17:15:30 +00001416 pixel=ScaleQuantumToChar((Quantum) (QuantumRange-
1417 GetOpacityPixelComponent(p)));
cristy3ed852e2009-09-05 21:47:34 +00001418 q=PopCharPixel(pixel,q);
1419 p++;
1420 q+=quantum_info->pad;
1421 }
1422 break;
1423 }
1424 case 16:
1425 {
1426 register unsigned short
1427 pixel;
1428
cristyc9672a92010-01-06 00:57:45 +00001429 if (quantum_info->format == FloatingPointQuantumFormat)
1430 {
1431 for (x=0; x < (long) number_pixels; x++)
1432 {
cristy2a4d01c2010-01-10 21:14:51 +00001433 pixel=SinglePrecisionToHalf(QuantumScale*
cristy24fb7dc2010-01-10 20:15:51 +00001434 GetAlphaPixelComponent(p));
cristyc9672a92010-01-06 00:57:45 +00001435 q=PopShortPixel(endian,pixel,q);
1436 p++;
1437 q+=quantum_info->pad;
1438 }
1439 break;
1440 }
cristy3ed852e2009-09-05 21:47:34 +00001441 for (x=0; x < (long) number_pixels; x++)
1442 {
cristyce70c172010-01-07 17:15:30 +00001443 pixel=ScaleQuantumToShort((Quantum) (QuantumRange-
1444 GetOpacityPixelComponent(p)));
cristy3ed852e2009-09-05 21:47:34 +00001445 q=PopShortPixel(endian,pixel,q);
1446 p++;
1447 q+=quantum_info->pad;
1448 }
1449 break;
1450 }
1451 case 32:
1452 {
1453 register unsigned long
1454 pixel;
1455
1456 if (quantum_info->format == FloatingPointQuantumFormat)
1457 {
1458 for (x=0; x < (long) number_pixels; x++)
1459 {
1460 float
1461 pixel;
1462
cristy46f08202010-01-10 04:04:21 +00001463 pixel=(float) (GetAlphaPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00001464 q=PopFloatPixel(&quantum_state,pixel,q);
1465 p++;
1466 q+=quantum_info->pad;
1467 }
1468 break;
1469 }
1470 for (x=0; x < (long) number_pixels; x++)
1471 {
cristyce70c172010-01-07 17:15:30 +00001472 pixel=ScaleQuantumToLong((Quantum) (QuantumRange-
1473 GetOpacityPixelComponent(p)));
cristy3ed852e2009-09-05 21:47:34 +00001474 q=PopLongPixel(endian,pixel,q);
1475 p++;
1476 q+=quantum_info->pad;
1477 }
1478 break;
1479 }
1480 case 64:
1481 {
1482 if (quantum_info->format == FloatingPointQuantumFormat)
1483 {
1484 for (x=0; x < (long) number_pixels; x++)
1485 {
1486 double
1487 pixel;
1488
cristy46f08202010-01-10 04:04:21 +00001489 pixel=(double) (GetAlphaPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00001490 q=PopDoublePixel(&quantum_state,pixel,q);
1491 p++;
1492 q+=quantum_info->pad;
1493 }
1494 break;
1495 }
1496 }
1497 default:
1498 {
1499 range=GetQuantumRange(image->depth);
1500 for (x=0; x < (long) number_pixels; x++)
1501 {
1502 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
cristy46f08202010-01-10 04:04:21 +00001503 (Quantum) (GetAlphaPixelComponent(p)),range),q);
cristy3ed852e2009-09-05 21:47:34 +00001504 p++;
1505 q+=quantum_info->pad;
1506 }
1507 break;
1508 }
1509 }
1510 break;
1511 }
1512 case OpacityQuantum:
1513 {
1514 switch (quantum_info->depth)
1515 {
1516 case 8:
1517 {
1518 register unsigned char
1519 pixel;
1520
1521 for (x=0; x < (long) number_pixels; x++)
1522 {
cristyce70c172010-01-07 17:15:30 +00001523 pixel=ScaleQuantumToChar(GetOpacityPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00001524 q=PopCharPixel(pixel,q);
1525 p++;
1526 q+=quantum_info->pad;
1527 }
1528 break;
1529 }
1530 case 16:
1531 {
1532 register unsigned short
1533 pixel;
1534
cristyc9672a92010-01-06 00:57:45 +00001535 if (quantum_info->format == FloatingPointQuantumFormat)
1536 {
1537 for (x=0; x < (long) number_pixels; x++)
1538 {
cristy2a4d01c2010-01-10 21:14:51 +00001539 pixel=SinglePrecisionToHalf(QuantumScale*
cristy24fb7dc2010-01-10 20:15:51 +00001540 GetOpacityPixelComponent(p));
cristyc9672a92010-01-06 00:57:45 +00001541 q=PopShortPixel(endian,pixel,q);
1542 p++;
1543 q+=quantum_info->pad;
1544 }
1545 break;
1546 }
cristy3ed852e2009-09-05 21:47:34 +00001547 for (x=0; x < (long) number_pixels; x++)
1548 {
cristyce70c172010-01-07 17:15:30 +00001549 pixel=ScaleQuantumToShort(GetOpacityPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00001550 q=PopShortPixel(endian,pixel,q);
1551 p++;
1552 q+=quantum_info->pad;
1553 }
1554 break;
1555 }
1556 case 32:
1557 {
1558 register unsigned long
1559 pixel;
1560
1561 if (quantum_info->format == FloatingPointQuantumFormat)
1562 {
1563 for (x=0; x < (long) number_pixels; x++)
1564 {
1565 q=PopFloatPixel(&quantum_state,(float) p->opacity,q);
1566 p++;
1567 q+=quantum_info->pad;
1568 }
1569 break;
1570 }
1571 for (x=0; x < (long) number_pixels; x++)
1572 {
cristyce70c172010-01-07 17:15:30 +00001573 pixel=ScaleQuantumToLong(GetOpacityPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00001574 q=PopLongPixel(endian,pixel,q);
1575 p++;
1576 q+=quantum_info->pad;
1577 }
1578 break;
1579 }
1580 case 64:
1581 {
1582 if (quantum_info->format == FloatingPointQuantumFormat)
1583 {
1584 for (x=0; x < (long) number_pixels; x++)
1585 {
1586 q=PopDoublePixel(&quantum_state,(double) p->opacity,q);
1587 p++;
1588 q+=quantum_info->pad;
1589 }
1590 break;
1591 }
1592 }
1593 default:
1594 {
1595 range=GetQuantumRange(image->depth);
1596 for (x=0; x < (long) number_pixels; x++)
1597 {
1598 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
1599 p->opacity,range),q);
1600 p++;
1601 q+=quantum_info->pad;
1602 }
1603 break;
1604 }
1605 }
1606 break;
1607 }
1608 case BlackQuantum:
1609 {
1610 if (image->colorspace != CMYKColorspace)
1611 {
1612 (void) ThrowMagickException(exception,GetMagickModule(),ImageError,
1613 "ColorSeparatedImageRequired","`%s'",image->filename);
1614 return(extent);
1615 }
1616 switch (quantum_info->depth)
1617 {
1618 case 8:
1619 {
1620 register unsigned char
1621 pixel;
1622
1623 for (x=0; x < (long) number_pixels; x++)
1624 {
1625 pixel=ScaleQuantumToChar(indexes[x]);
1626 q=PopCharPixel(pixel,q);
1627 p++;
1628 q+=quantum_info->pad;
1629 }
1630 break;
1631 }
1632 case 16:
1633 {
1634 register unsigned short
1635 pixel;
1636
cristyc9672a92010-01-06 00:57:45 +00001637 if (quantum_info->format == FloatingPointQuantumFormat)
1638 {
1639 for (x=0; x < (long) number_pixels; x++)
1640 {
cristy2a4d01c2010-01-10 21:14:51 +00001641 pixel=SinglePrecisionToHalf(QuantumScale*indexes[x]);
cristyc9672a92010-01-06 00:57:45 +00001642 q=PopShortPixel(endian,pixel,q);
1643 p++;
1644 q+=quantum_info->pad;
1645 }
1646 break;
1647 }
cristy3ed852e2009-09-05 21:47:34 +00001648 for (x=0; x < (long) number_pixels; x++)
1649 {
1650 pixel=ScaleQuantumToShort(indexes[x]);
1651 q=PopShortPixel(endian,pixel,q);
1652 p++;
1653 q+=quantum_info->pad;
1654 }
1655 break;
1656 }
1657 case 32:
1658 {
1659 register unsigned long
1660 pixel;
1661
1662 if (quantum_info->format == FloatingPointQuantumFormat)
1663 {
1664 for (x=0; x < (long) number_pixels; x++)
1665 {
1666 q=PopFloatPixel(&quantum_state,(float) indexes[x],q);
1667 p++;
1668 q+=quantum_info->pad;
1669 }
1670 break;
1671 }
1672 for (x=0; x < (long) number_pixels; x++)
1673 {
1674 pixel=ScaleQuantumToLong(indexes[x]);
1675 q=PopLongPixel(endian,pixel,q);
1676 p++;
1677 q+=quantum_info->pad;
1678 }
1679 break;
1680 }
1681 case 64:
1682 {
1683 if (quantum_info->format == FloatingPointQuantumFormat)
1684 {
1685 for (x=0; x < (long) number_pixels; x++)
1686 {
1687 q=PopDoublePixel(&quantum_state,(double) indexes[x],q);
1688 p++;
1689 q+=quantum_info->pad;
1690 }
1691 break;
1692 }
1693 }
1694 default:
1695 {
1696 range=GetQuantumRange(image->depth);
1697 for (x=0; x < (long) number_pixels; x++)
1698 {
1699 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
1700 (Quantum) indexes[x],range),q);
1701 p++;
1702 q+=quantum_info->pad;
1703 }
1704 break;
1705 }
1706 }
1707 break;
1708 }
1709 case RGBQuantum:
1710 case CbYCrQuantum:
1711 {
1712 switch (quantum_info->depth)
1713 {
1714 case 8:
1715 {
1716 for (x=0; x < (long) number_pixels; x++)
1717 {
cristyce70c172010-01-07 17:15:30 +00001718 q=PopCharPixel(ScaleQuantumToChar(GetRedPixelComponent(p)),q);
1719 q=PopCharPixel(ScaleQuantumToChar(GetGreenPixelComponent(p)),q);
1720 q=PopCharPixel(ScaleQuantumToChar(GetBluePixelComponent(p)),q);
cristy3ed852e2009-09-05 21:47:34 +00001721 p++;
1722 q+=quantum_info->pad;
1723 }
1724 break;
1725 }
1726 case 10:
1727 {
1728 register unsigned long
1729 pixel;
1730
1731 range=GetQuantumRange(image->depth);
1732 if (quantum_info->pack == MagickFalse)
1733 {
1734 for (x=0; x < (long) number_pixels; x++)
1735 {
1736 pixel=(unsigned long) (ScaleQuantumToAny(p->red,range) << 22 |
cristyff024b42010-02-21 22:55:09 +00001737 ScaleQuantumToAny(p->green,range) << 12 |
cristy3ed852e2009-09-05 21:47:34 +00001738 ScaleQuantumToAny(p->blue,range) << 2);
1739 q=PopLongPixel(endian,pixel,q);
1740 p++;
1741 q+=quantum_info->pad;
1742 }
1743 break;
1744 }
1745 if (quantum_info->quantum == 32UL)
1746 {
1747 for (x=0; x < (long) number_pixels; x++)
1748 {
1749 pixel=(unsigned long) ScaleQuantumToAny(p->red,range);
1750 q=PopQuantumLongPixel(&quantum_state,image->depth,pixel,q);
1751 pixel=(unsigned long) ScaleQuantumToAny(p->green,range);
1752 q=PopQuantumLongPixel(&quantum_state,image->depth,pixel,q);
1753 pixel=(unsigned long) ScaleQuantumToAny(p->blue,range);
1754 q=PopQuantumLongPixel(&quantum_state,image->depth,pixel,q);
1755 p++;
1756 q+=quantum_info->pad;
1757 }
1758 break;
1759 }
1760 for (x=0; x < (long) number_pixels; x++)
1761 {
1762 pixel=(unsigned long) ScaleQuantumToAny(p->red,range);
1763 q=PopQuantumPixel(&quantum_state,image->depth,pixel,q);
1764 pixel=(unsigned long) ScaleQuantumToAny(p->green,range);
1765 q=PopQuantumPixel(&quantum_state,image->depth,pixel,q);
1766 pixel=(unsigned long) ScaleQuantumToAny(p->blue,range);
1767 q=PopQuantumPixel(&quantum_state,image->depth,pixel,q);
1768 p++;
1769 q+=quantum_info->pad;
1770 }
1771 break;
1772 }
1773 case 12:
1774 {
1775 register unsigned long
1776 pixel;
1777
1778 range=GetQuantumRange(image->depth);
1779 if (quantum_info->pack == MagickFalse)
1780 {
1781 for (x=0; x < (long) (3*number_pixels-1); x+=2)
1782 {
1783 switch (x % 3)
1784 {
1785 default:
1786 case 0:
1787 {
1788 pixel=(unsigned long) ScaleQuantumToAny(p->red,range);
1789 break;
1790 }
1791 case 1:
1792 {
1793 pixel=(unsigned long) ScaleQuantumToAny(p->green,range);
1794 break;
1795 }
1796 case 2:
1797 {
1798 pixel=(unsigned long) ScaleQuantumToAny(p->blue,range);
1799 p++;
1800 break;
1801 }
1802 }
1803 q=PopShortPixel(endian,(unsigned short) (pixel << 4),q);
1804 switch ((x+1) % 3)
1805 {
1806 default:
1807 case 0:
1808 {
1809 pixel=(unsigned long) ScaleQuantumToAny(p->red,range);
1810 break;
1811 }
1812 case 1:
1813 {
1814 pixel=(unsigned long) ScaleQuantumToAny(p->green,range);
1815 break;
1816 }
1817 case 2:
1818 {
1819 pixel=(unsigned long) ScaleQuantumToAny(p->blue,range);
1820 p++;
1821 break;
1822 }
1823 }
1824 q=PopShortPixel(endian,(unsigned short) (pixel << 4),q);
1825 q+=quantum_info->pad;
1826 }
1827 for (bit=0; bit < (long) (3*number_pixels % 2); bit++)
1828 {
1829 switch ((x+bit) % 3)
1830 {
1831 default:
1832 case 0:
1833 {
1834 pixel=(unsigned long) ScaleQuantumToAny(p->red,range);
1835 break;
1836 }
1837 case 1:
1838 {
1839 pixel=(unsigned long) ScaleQuantumToAny(p->green,range);
1840 break;
1841 }
1842 case 2:
1843 {
1844 pixel=(unsigned long) ScaleQuantumToAny(p->blue,range);
1845 p++;
1846 break;
1847 }
1848 }
1849 q=PopShortPixel(endian,(unsigned short) (pixel << 4),q);
1850 q+=quantum_info->pad;
1851 }
1852 if (bit != 0)
1853 p++;
1854 break;
1855 }
1856 if (quantum_info->quantum == 32UL)
1857 {
1858 for (x=0; x < (long) number_pixels; x++)
1859 {
1860 pixel=(unsigned long) ScaleQuantumToAny(p->red,range);
1861 q=PopQuantumLongPixel(&quantum_state,image->depth,pixel,q);
1862 pixel=(unsigned long) ScaleQuantumToAny(p->green,range);
1863 q=PopQuantumLongPixel(&quantum_state,image->depth,pixel,q);
1864 pixel=(unsigned long) ScaleQuantumToAny(p->blue,range);
1865 q=PopQuantumLongPixel(&quantum_state,image->depth,pixel,q);
1866 p++;
1867 q+=quantum_info->pad;
1868 }
1869 break;
1870 }
1871 for (x=0; x < (long) number_pixels; x++)
1872 {
1873 pixel=(unsigned long) ScaleQuantumToAny(p->red,range);
1874 q=PopQuantumPixel(&quantum_state,image->depth,pixel,q);
1875 pixel=(unsigned long) ScaleQuantumToAny(p->green,range);
1876 q=PopQuantumPixel(&quantum_state,image->depth,pixel,q);
1877 pixel=(unsigned long) ScaleQuantumToAny(p->blue,range);
1878 q=PopQuantumPixel(&quantum_state,image->depth,pixel,q);
1879 p++;
1880 q+=quantum_info->pad;
1881 }
1882 break;
1883 }
1884 case 16:
1885 {
1886 register unsigned short
1887 pixel;
1888
cristyc9672a92010-01-06 00:57:45 +00001889 if (quantum_info->format == FloatingPointQuantumFormat)
1890 {
1891 for (x=0; x < (long) number_pixels; x++)
1892 {
cristy2a4d01c2010-01-10 21:14:51 +00001893 pixel=SinglePrecisionToHalf(QuantumScale*
cristy24fb7dc2010-01-10 20:15:51 +00001894 GetRedPixelComponent(p));
cristyc9672a92010-01-06 00:57:45 +00001895 q=PopShortPixel(endian,pixel,q);
cristy2a4d01c2010-01-10 21:14:51 +00001896 pixel=SinglePrecisionToHalf(QuantumScale*
cristy24fb7dc2010-01-10 20:15:51 +00001897 GetGreenPixelComponent(p));
cristyc9672a92010-01-06 00:57:45 +00001898 q=PopShortPixel(endian,pixel,q);
cristy2a4d01c2010-01-10 21:14:51 +00001899 pixel=SinglePrecisionToHalf(QuantumScale*
cristy24fb7dc2010-01-10 20:15:51 +00001900 GetBluePixelComponent(p));
cristyc9672a92010-01-06 00:57:45 +00001901 q=PopShortPixel(endian,pixel,q);
1902 p++;
1903 q+=quantum_info->pad;
1904 }
1905 break;
1906 }
cristy3ed852e2009-09-05 21:47:34 +00001907 for (x=0; x < (long) number_pixels; x++)
1908 {
cristyce70c172010-01-07 17:15:30 +00001909 pixel=ScaleQuantumToShort(GetRedPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00001910 q=PopShortPixel(endian,pixel,q);
cristyce70c172010-01-07 17:15:30 +00001911 pixel=ScaleQuantumToShort(GetGreenPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00001912 q=PopShortPixel(endian,pixel,q);
cristyce70c172010-01-07 17:15:30 +00001913 pixel=ScaleQuantumToShort(GetBluePixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00001914 q=PopShortPixel(endian,pixel,q);
1915 p++;
1916 q+=quantum_info->pad;
1917 }
1918 break;
1919 }
1920 case 32:
1921 {
1922 register unsigned long
1923 pixel;
1924
1925 if (quantum_info->format == FloatingPointQuantumFormat)
1926 {
1927 for (x=0; x < (long) number_pixels; x++)
1928 {
1929 q=PopFloatPixel(&quantum_state,(float) p->red,q);
1930 q=PopFloatPixel(&quantum_state,(float) p->green,q);
1931 q=PopFloatPixel(&quantum_state,(float) p->blue,q);
1932 p++;
1933 q+=quantum_info->pad;
1934 }
1935 break;
1936 }
1937 for (x=0; x < (long) number_pixels; x++)
1938 {
cristyce70c172010-01-07 17:15:30 +00001939 pixel=ScaleQuantumToLong(GetRedPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00001940 q=PopLongPixel(endian,pixel,q);
cristyce70c172010-01-07 17:15:30 +00001941 pixel=ScaleQuantumToLong(GetGreenPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00001942 q=PopLongPixel(endian,pixel,q);
cristyce70c172010-01-07 17:15:30 +00001943 pixel=ScaleQuantumToLong(GetBluePixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00001944 q=PopLongPixel(endian,pixel,q);
1945 p++;
1946 q+=quantum_info->pad;
1947 }
1948 break;
1949 }
1950 case 64:
1951 {
1952 if (quantum_info->format == FloatingPointQuantumFormat)
1953 {
1954 for (x=0; x < (long) number_pixels; x++)
1955 {
1956 q=PopDoublePixel(&quantum_state,(double) p->red,q);
1957 q=PopDoublePixel(&quantum_state,(double) p->green,q);
1958 q=PopDoublePixel(&quantum_state,(double) p->blue,q);
1959 p++;
1960 q+=quantum_info->pad;
1961 }
1962 break;
1963 }
1964 }
1965 default:
1966 {
1967 range=GetQuantumRange(image->depth);
1968 for (x=0; x < (long) number_pixels; x++)
1969 {
1970 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
1971 p->red,range),q);
1972 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
1973 p->green,range),q);
1974 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
1975 p->blue,range),q);
1976 p++;
1977 q+=quantum_info->pad;
1978 }
1979 break;
1980 }
1981 }
1982 break;
1983 }
1984 case RGBAQuantum:
1985 case RGBOQuantum:
1986 case CbYCrAQuantum:
1987 {
1988 switch (quantum_info->depth)
1989 {
1990 case 8:
1991 {
1992 register unsigned char
1993 pixel;
1994
1995 for (x=0; x < (long) number_pixels; x++)
1996 {
cristyce70c172010-01-07 17:15:30 +00001997 pixel=ScaleQuantumToChar(GetRedPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00001998 q=PopCharPixel(pixel,q);
cristyce70c172010-01-07 17:15:30 +00001999 pixel=ScaleQuantumToChar(GetGreenPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00002000 q=PopCharPixel(pixel,q);
cristyce70c172010-01-07 17:15:30 +00002001 pixel=ScaleQuantumToChar(GetBluePixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00002002 q=PopCharPixel(pixel,q);
cristyeec18db2010-03-03 21:15:45 +00002003 pixel=ScaleQuantumToChar(GetAlphaPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00002004 q=PopCharPixel(pixel,q);
2005 p++;
2006 q+=quantum_info->pad;
2007 }
2008 break;
2009 }
cristy891dc792010-03-04 01:47:16 +00002010 case 10:
2011 {
2012 register unsigned long
2013 pixel;
2014
2015 range=GetQuantumRange(image->depth);
2016 if (quantum_info->pack == MagickFalse)
2017 {
2018 long
2019 n;
2020
2021 register long
2022 i;
2023
2024 unsigned long
2025 quantum;
2026
2027 n=0;
2028 quantum=0;
2029 pixel=0;
2030 for (x=0; x < (long) number_pixels; x++)
2031 {
2032 for (i=0; i < 4; i++)
2033 {
2034 switch (i)
2035 {
2036 case 0: quantum=p->red; break;
2037 case 1: quantum=p->green; break;
2038 case 2: quantum=p->blue; break;
2039 case 3: quantum=QuantumRange-p->opacity; break;
2040 }
2041 switch (n % 3)
2042 {
2043 case 0:
2044 {
2045 pixel|=(unsigned long) (ScaleQuantumToAny(quantum,
2046 range) << 22);
2047 break;
2048 }
2049 case 1:
2050 {
2051 pixel|=(unsigned long) (ScaleQuantumToAny(quantum,
2052 range) << 12);
2053 break;
2054 }
2055 case 2:
2056 {
2057 pixel|=(unsigned long) (ScaleQuantumToAny(quantum,
2058 range) << 2);
2059 q=PopLongPixel(endian,pixel,q);
2060 pixel=0;
2061 break;
2062 }
2063 }
2064 n++;
2065 }
2066 p++;
2067 q+=quantum_info->pad;
2068 }
2069 break;
2070 }
2071 if (quantum_info->quantum == 32UL)
2072 {
2073 for (x=0; x < (long) number_pixels; x++)
2074 {
2075 pixel=(unsigned long) ScaleQuantumToAny(p->red,range);
2076 q=PopQuantumLongPixel(&quantum_state,image->depth,pixel,q);
2077 pixel=(unsigned long) ScaleQuantumToAny(p->green,range);
2078 q=PopQuantumLongPixel(&quantum_state,image->depth,pixel,q);
2079 pixel=(unsigned long) ScaleQuantumToAny(p->blue,range);
2080 q=PopQuantumLongPixel(&quantum_state,image->depth,pixel,q);
2081 pixel=(unsigned long) ScaleQuantumToAny(QuantumRange-p->opacity,
2082 range);
2083 q=PopQuantumLongPixel(&quantum_state,image->depth,pixel,q);
2084 p++;
2085 q+=quantum_info->pad;
2086 }
2087 break;
2088 }
2089 for (x=0; x < (long) number_pixels; x++)
2090 {
2091 pixel=(unsigned long) ScaleQuantumToAny(p->red,range);
2092 q=PopQuantumPixel(&quantum_state,image->depth,pixel,q);
2093 pixel=(unsigned long) ScaleQuantumToAny(p->green,range);
2094 q=PopQuantumPixel(&quantum_state,image->depth,pixel,q);
2095 pixel=(unsigned long) ScaleQuantumToAny(p->blue,range);
2096 q=PopQuantumPixel(&quantum_state,image->depth,pixel,q);
2097 pixel=(unsigned long) ScaleQuantumToAny(QuantumRange-
2098 p->opacity,range);
2099 q=PopQuantumPixel(&quantum_state,image->depth,pixel,q);
2100 p++;
2101 q+=quantum_info->pad;
2102 }
2103 break;
2104 }
cristy3ed852e2009-09-05 21:47:34 +00002105 case 16:
2106 {
2107 register unsigned short
2108 pixel;
2109
cristyc9672a92010-01-06 00:57:45 +00002110 if (quantum_info->format == FloatingPointQuantumFormat)
2111 {
2112 for (x=0; x < (long) number_pixels; x++)
2113 {
cristy2a4d01c2010-01-10 21:14:51 +00002114 pixel=SinglePrecisionToHalf(QuantumScale*
cristy24fb7dc2010-01-10 20:15:51 +00002115 GetRedPixelComponent(p));
cristyc9672a92010-01-06 00:57:45 +00002116 q=PopShortPixel(endian,pixel,q);
cristy2a4d01c2010-01-10 21:14:51 +00002117 pixel=SinglePrecisionToHalf(QuantumScale*
cristy24fb7dc2010-01-10 20:15:51 +00002118 GetGreenPixelComponent(p));
cristyc9672a92010-01-06 00:57:45 +00002119 q=PopShortPixel(endian,pixel,q);
cristy2a4d01c2010-01-10 21:14:51 +00002120 pixel=SinglePrecisionToHalf(QuantumScale*
cristy24fb7dc2010-01-10 20:15:51 +00002121 GetBluePixelComponent(p));
cristyc9672a92010-01-06 00:57:45 +00002122 q=PopShortPixel(endian,pixel,q);
cristy2a4d01c2010-01-10 21:14:51 +00002123 pixel=SinglePrecisionToHalf(QuantumScale*
cristy24fb7dc2010-01-10 20:15:51 +00002124 GetAlphaPixelComponent(p));
cristyc9672a92010-01-06 00:57:45 +00002125 q=PopShortPixel(endian,pixel,q);
2126 p++;
2127 q+=quantum_info->pad;
2128 }
2129 break;
2130 }
cristy3ed852e2009-09-05 21:47:34 +00002131 for (x=0; x < (long) number_pixels; x++)
2132 {
cristyce70c172010-01-07 17:15:30 +00002133 pixel=ScaleQuantumToShort(GetRedPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00002134 q=PopShortPixel(endian,pixel,q);
cristyce70c172010-01-07 17:15:30 +00002135 pixel=ScaleQuantumToShort(GetGreenPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00002136 q=PopShortPixel(endian,pixel,q);
cristyce70c172010-01-07 17:15:30 +00002137 pixel=ScaleQuantumToShort(GetBluePixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00002138 q=PopShortPixel(endian,pixel,q);
cristyeec18db2010-03-03 21:15:45 +00002139 pixel=ScaleQuantumToShort(GetAlphaPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00002140 q=PopShortPixel(endian,pixel,q);
2141 p++;
2142 q+=quantum_info->pad;
2143 }
2144 break;
2145 }
2146 case 32:
2147 {
2148 register unsigned long
2149 pixel;
2150
2151 if (quantum_info->format == FloatingPointQuantumFormat)
2152 {
2153 for (x=0; x < (long) number_pixels; x++)
2154 {
2155 float
2156 pixel;
2157
2158 q=PopFloatPixel(&quantum_state,(float) p->red,q);
2159 q=PopFloatPixel(&quantum_state,(float) p->green,q);
2160 q=PopFloatPixel(&quantum_state,(float) p->blue,q);
cristyeec18db2010-03-03 21:15:45 +00002161 pixel=GetAlphaPixelComponent(p);
cristy3ed852e2009-09-05 21:47:34 +00002162 q=PopFloatPixel(&quantum_state,pixel,q);
2163 p++;
2164 q+=quantum_info->pad;
2165 }
2166 break;
2167 }
2168 for (x=0; x < (long) number_pixels; x++)
2169 {
cristyce70c172010-01-07 17:15:30 +00002170 pixel=ScaleQuantumToLong(GetRedPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00002171 q=PopLongPixel(endian,pixel,q);
cristyce70c172010-01-07 17:15:30 +00002172 pixel=ScaleQuantumToLong(GetGreenPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00002173 q=PopLongPixel(endian,pixel,q);
cristyce70c172010-01-07 17:15:30 +00002174 pixel=ScaleQuantumToLong(GetBluePixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00002175 q=PopLongPixel(endian,pixel,q);
cristyeec18db2010-03-03 21:15:45 +00002176 pixel=ScaleQuantumToLong(GetAlphaPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00002177 q=PopLongPixel(endian,pixel,q);
2178 p++;
2179 q+=quantum_info->pad;
2180 }
2181 break;
2182 }
2183 case 64:
2184 {
2185 if (quantum_info->format == FloatingPointQuantumFormat)
2186 {
2187 double
2188 pixel;
2189
2190 for (x=0; x < (long) number_pixels; x++)
2191 {
2192 q=PopDoublePixel(&quantum_state,(double) p->red,q);
2193 q=PopDoublePixel(&quantum_state,(double) p->green,q);
2194 q=PopDoublePixel(&quantum_state,(double) p->blue,q);
cristyeec18db2010-03-03 21:15:45 +00002195 pixel=(double) GetAlphaPixelComponent(p);
cristy3ed852e2009-09-05 21:47:34 +00002196 q=PopDoublePixel(&quantum_state,pixel,q);
2197 p++;
2198 q+=quantum_info->pad;
2199 }
2200 break;
2201 }
2202 }
2203 default:
2204 {
2205 range=GetQuantumRange(image->depth);
2206 for (x=0; x < (long) number_pixels; x++)
2207 {
2208 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
cristyeec18db2010-03-03 21:15:45 +00002209 GetRedPixelComponent(p),range),q);
cristy3ed852e2009-09-05 21:47:34 +00002210 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
cristyeec18db2010-03-03 21:15:45 +00002211 GetGreenPixelComponent(p),range),q);
cristy3ed852e2009-09-05 21:47:34 +00002212 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
cristyeec18db2010-03-03 21:15:45 +00002213 GetBluePixelComponent(p),range),q);
cristy3ed852e2009-09-05 21:47:34 +00002214 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
cristyeec18db2010-03-03 21:15:45 +00002215 GetAlphaPixelComponent(p),range),q);
cristy3ed852e2009-09-05 21:47:34 +00002216 p++;
2217 q+=quantum_info->pad;
2218 }
2219 break;
2220 }
2221 }
2222 break;
2223 }
2224 case CMYKQuantum:
2225 {
2226 if (image->colorspace != CMYKColorspace)
2227 {
2228 (void) ThrowMagickException(exception,GetMagickModule(),ImageError,
2229 "ColorSeparatedImageRequired","`%s'",image->filename);
2230 return(extent);
2231 }
2232 switch (quantum_info->depth)
2233 {
2234 case 8:
2235 {
2236 register unsigned char
2237 pixel;
2238
2239 for (x=0; x < (long) number_pixels; x++)
2240 {
cristyce70c172010-01-07 17:15:30 +00002241 pixel=ScaleQuantumToChar(GetRedPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00002242 q=PopCharPixel(pixel,q);
cristyce70c172010-01-07 17:15:30 +00002243 pixel=ScaleQuantumToChar(GetGreenPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00002244 q=PopCharPixel(pixel,q);
cristyce70c172010-01-07 17:15:30 +00002245 pixel=ScaleQuantumToChar(GetBluePixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00002246 q=PopCharPixel(pixel,q);
2247 pixel=ScaleQuantumToChar(indexes[x]);
2248 q=PopCharPixel(pixel,q);
2249 p++;
2250 q+=quantum_info->pad;
2251 }
2252 break;
2253 }
2254 case 16:
2255 {
2256 register unsigned short
2257 pixel;
2258
cristyc9672a92010-01-06 00:57:45 +00002259 if (quantum_info->format == FloatingPointQuantumFormat)
2260 {
2261 for (x=0; x < (long) number_pixels; x++)
2262 {
cristy2a4d01c2010-01-10 21:14:51 +00002263 pixel=SinglePrecisionToHalf(QuantumScale*
cristy24fb7dc2010-01-10 20:15:51 +00002264 GetRedPixelComponent(p));
cristyc9672a92010-01-06 00:57:45 +00002265 q=PopShortPixel(endian,pixel,q);
cristy2a4d01c2010-01-10 21:14:51 +00002266 pixel=SinglePrecisionToHalf(QuantumScale*
cristy24fb7dc2010-01-10 20:15:51 +00002267 GetGreenPixelComponent(p));
cristyc9672a92010-01-06 00:57:45 +00002268 q=PopShortPixel(endian,pixel,q);
cristy2a4d01c2010-01-10 21:14:51 +00002269 pixel=SinglePrecisionToHalf(QuantumScale*
cristy24fb7dc2010-01-10 20:15:51 +00002270 GetBluePixelComponent(p));
cristyc9672a92010-01-06 00:57:45 +00002271 q=PopShortPixel(endian,pixel,q);
cristy2a4d01c2010-01-10 21:14:51 +00002272 pixel=SinglePrecisionToHalf(QuantumScale*indexes[x]);
cristyc9672a92010-01-06 00:57:45 +00002273 q=PopShortPixel(endian,pixel,q);
2274 p++;
2275 q+=quantum_info->pad;
2276 }
2277 break;
2278 }
cristy3ed852e2009-09-05 21:47:34 +00002279 for (x=0; x < (long) number_pixels; x++)
2280 {
cristyce70c172010-01-07 17:15:30 +00002281 pixel=ScaleQuantumToShort(GetRedPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00002282 q=PopShortPixel(endian,pixel,q);
cristyce70c172010-01-07 17:15:30 +00002283 pixel=ScaleQuantumToShort(GetGreenPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00002284 q=PopShortPixel(endian,pixel,q);
cristyce70c172010-01-07 17:15:30 +00002285 pixel=ScaleQuantumToShort(GetBluePixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00002286 q=PopShortPixel(endian,pixel,q);
2287 pixel=ScaleQuantumToShort(indexes[x]);
2288 q=PopShortPixel(endian,pixel,q);
2289 p++;
2290 q+=quantum_info->pad;
2291 }
2292 break;
2293 }
2294 case 32:
2295 {
2296 register unsigned long
2297 pixel;
2298
2299 if (quantum_info->format == FloatingPointQuantumFormat)
2300 {
2301 for (x=0; x < (long) number_pixels; x++)
2302 {
2303 q=PopFloatPixel(&quantum_state,(float) p->red,q);
2304 q=PopFloatPixel(&quantum_state,(float) p->green,q);
2305 q=PopFloatPixel(&quantum_state,(float) p->blue,q);
2306 q=PopFloatPixel(&quantum_state,(float) indexes[x],q);
2307 p++;
2308 q+=quantum_info->pad;
2309 }
2310 break;
2311 }
2312 for (x=0; x < (long) number_pixels; x++)
2313 {
cristyce70c172010-01-07 17:15:30 +00002314 pixel=ScaleQuantumToLong(GetRedPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00002315 q=PopLongPixel(endian,pixel,q);
cristyce70c172010-01-07 17:15:30 +00002316 pixel=ScaleQuantumToLong(GetGreenPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00002317 q=PopLongPixel(endian,pixel,q);
cristyce70c172010-01-07 17:15:30 +00002318 pixel=ScaleQuantumToLong(GetBluePixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00002319 q=PopLongPixel(endian,pixel,q);
2320 pixel=ScaleQuantumToLong(indexes[x]);
2321 q=PopLongPixel(endian,pixel,q);
2322 p++;
2323 q+=quantum_info->pad;
2324 }
2325 break;
2326 }
2327 case 64:
2328 {
2329 if (quantum_info->format == FloatingPointQuantumFormat)
2330 {
2331 for (x=0; x < (long) number_pixels; x++)
2332 {
2333 q=PopDoublePixel(&quantum_state,(double) p->red,q);
2334 q=PopDoublePixel(&quantum_state,(double) p->green,q);
2335 q=PopDoublePixel(&quantum_state,(double) p->blue,q);
2336 q=PopDoublePixel(&quantum_state,(double) indexes[x],q);
2337 p++;
2338 q+=quantum_info->pad;
2339 }
2340 break;
2341 }
2342 }
2343 default:
2344 {
2345 range=GetQuantumRange(image->depth);
2346 for (x=0; x < (long) number_pixels; x++)
2347 {
2348 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
2349 p->red,range),q);
2350 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
2351 p->green,range),q);
2352 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
2353 p->blue,range),q);
2354 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
2355 indexes[x],range),q);
2356 p++;
2357 q+=quantum_info->pad;
2358 }
2359 break;
2360 }
2361 }
2362 break;
2363 }
2364 case CMYKAQuantum:
2365 case CMYKOQuantum:
2366 {
2367 if (image->colorspace != CMYKColorspace)
2368 {
2369 (void) ThrowMagickException(exception,GetMagickModule(),ImageError,
2370 "ColorSeparatedImageRequired","`%s'",image->filename);
2371 return(extent);
2372 }
2373 switch (quantum_info->depth)
2374 {
2375 case 8:
2376 {
2377 register unsigned char
2378 pixel;
2379
2380 for (x=0; x < (long) number_pixels; x++)
2381 {
cristyce70c172010-01-07 17:15:30 +00002382 pixel=ScaleQuantumToChar(GetRedPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00002383 q=PopCharPixel(pixel,q);
cristyce70c172010-01-07 17:15:30 +00002384 pixel=ScaleQuantumToChar(GetGreenPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00002385 q=PopCharPixel(pixel,q);
cristyce70c172010-01-07 17:15:30 +00002386 pixel=ScaleQuantumToChar(GetBluePixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00002387 q=PopCharPixel(pixel,q);
2388 pixel=ScaleQuantumToChar(indexes[x]);
2389 q=PopCharPixel(pixel,q);
cristyce70c172010-01-07 17:15:30 +00002390 pixel=ScaleQuantumToChar((Quantum) (QuantumRange-
2391 GetOpacityPixelComponent(p)));
cristy3ed852e2009-09-05 21:47:34 +00002392 q=PopCharPixel(pixel,q);
2393 p++;
2394 q+=quantum_info->pad;
2395 }
2396 break;
2397 }
2398 case 16:
2399 {
2400 register unsigned short
2401 pixel;
2402
cristyc9672a92010-01-06 00:57:45 +00002403 if (quantum_info->format == FloatingPointQuantumFormat)
2404 {
2405 for (x=0; x < (long) number_pixels; x++)
2406 {
cristy2a4d01c2010-01-10 21:14:51 +00002407 pixel=SinglePrecisionToHalf(QuantumScale*
cristy24fb7dc2010-01-10 20:15:51 +00002408 GetRedPixelComponent(p));
cristyc9672a92010-01-06 00:57:45 +00002409 q=PopShortPixel(endian,pixel,q);
cristy2a4d01c2010-01-10 21:14:51 +00002410 pixel=SinglePrecisionToHalf(QuantumScale*
cristy24fb7dc2010-01-10 20:15:51 +00002411 GetGreenPixelComponent(p));
cristyc9672a92010-01-06 00:57:45 +00002412 q=PopShortPixel(endian,pixel,q);
cristy2a4d01c2010-01-10 21:14:51 +00002413 pixel=SinglePrecisionToHalf(QuantumScale*
cristy24fb7dc2010-01-10 20:15:51 +00002414 GetBluePixelComponent(p));
cristyc9672a92010-01-06 00:57:45 +00002415 q=PopShortPixel(endian,pixel,q);
cristy2a4d01c2010-01-10 21:14:51 +00002416 pixel=SinglePrecisionToHalf(QuantumScale*indexes[x]);
cristyc9672a92010-01-06 00:57:45 +00002417 q=PopShortPixel(endian,pixel,q);
cristy2a4d01c2010-01-10 21:14:51 +00002418 pixel=SinglePrecisionToHalf(QuantumScale*
cristy24fb7dc2010-01-10 20:15:51 +00002419 GetAlphaPixelComponent(p));
cristyc9672a92010-01-06 00:57:45 +00002420 q=PopShortPixel(endian,pixel,q);
2421 p++;
2422 q+=quantum_info->pad;
2423 }
2424 break;
2425 }
cristy3ed852e2009-09-05 21:47:34 +00002426 for (x=0; x < (long) number_pixels; x++)
2427 {
cristyce70c172010-01-07 17:15:30 +00002428 pixel=ScaleQuantumToShort(GetRedPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00002429 q=PopShortPixel(endian,pixel,q);
cristyce70c172010-01-07 17:15:30 +00002430 pixel=ScaleQuantumToShort(GetGreenPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00002431 q=PopShortPixel(endian,pixel,q);
cristyce70c172010-01-07 17:15:30 +00002432 pixel=ScaleQuantumToShort(GetBluePixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00002433 q=PopShortPixel(endian,pixel,q);
2434 pixel=ScaleQuantumToShort(indexes[x]);
2435 q=PopShortPixel(endian,pixel,q);
cristyce70c172010-01-07 17:15:30 +00002436 pixel=ScaleQuantumToShort((Quantum) (QuantumRange-
2437 GetOpacityPixelComponent(p)));
cristy3ed852e2009-09-05 21:47:34 +00002438 q=PopShortPixel(endian,pixel,q);
2439 p++;
2440 q+=quantum_info->pad;
2441 }
2442 break;
2443 }
2444 case 32:
2445 {
2446 register unsigned long
2447 pixel;
2448
2449 if (quantum_info->format == FloatingPointQuantumFormat)
2450 {
2451 for (x=0; x < (long) number_pixels; x++)
2452 {
2453 float
2454 pixel;
2455
2456 q=PopFloatPixel(&quantum_state,(float) p->red,q);
2457 q=PopFloatPixel(&quantum_state,(float) p->green,q);
2458 q=PopFloatPixel(&quantum_state,(float) p->blue,q);
2459 q=PopFloatPixel(&quantum_state,(float) indexes[x],q);
cristy46f08202010-01-10 04:04:21 +00002460 pixel=(float) (GetAlphaPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00002461 q=PopFloatPixel(&quantum_state,pixel,q);
2462 p++;
2463 q+=quantum_info->pad;
2464 }
2465 break;
2466 }
2467 for (x=0; x < (long) number_pixels; x++)
2468 {
cristyce70c172010-01-07 17:15:30 +00002469 pixel=ScaleQuantumToLong(GetRedPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00002470 q=PopLongPixel(endian,pixel,q);
cristyce70c172010-01-07 17:15:30 +00002471 pixel=ScaleQuantumToLong(GetGreenPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00002472 q=PopLongPixel(endian,pixel,q);
cristyce70c172010-01-07 17:15:30 +00002473 pixel=ScaleQuantumToLong(GetBluePixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00002474 q=PopLongPixel(endian,pixel,q);
2475 pixel=ScaleQuantumToLong(indexes[x]);
2476 q=PopLongPixel(endian,pixel,q);
cristyce70c172010-01-07 17:15:30 +00002477 pixel=ScaleQuantumToLong((Quantum) (QuantumRange-
2478 GetOpacityPixelComponent(p)));
cristy3ed852e2009-09-05 21:47:34 +00002479 q=PopLongPixel(endian,pixel,q);
2480 p++;
2481 q+=quantum_info->pad;
2482 }
2483 break;
2484 }
2485 case 64:
2486 {
2487 if (quantum_info->format == FloatingPointQuantumFormat)
2488 {
2489 double
2490 pixel;
2491
2492 for (x=0; x < (long) number_pixels; x++)
2493 {
2494 q=PopDoublePixel(&quantum_state,(double) p->red,q);
2495 q=PopDoublePixel(&quantum_state,(double) p->green,q);
2496 q=PopDoublePixel(&quantum_state,(double) p->blue,q);
2497 q=PopDoublePixel(&quantum_state,(double) indexes[x],q);
cristy46f08202010-01-10 04:04:21 +00002498 pixel=(double) (GetAlphaPixelComponent(p));
cristy3ed852e2009-09-05 21:47:34 +00002499 q=PopDoublePixel(&quantum_state,pixel,q);
2500 p++;
2501 q+=quantum_info->pad;
2502 }
2503 break;
2504 }
2505 }
2506 default:
2507 {
2508 range=GetQuantumRange(image->depth);
2509 for (x=0; x < (long) number_pixels; x++)
2510 {
2511 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
2512 p->red,range),q);
2513 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
2514 p->green,range),q);
2515 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
2516 p->blue,range),q);
2517 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
2518 indexes[x],range),q);
2519 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
2520 p->opacity,range),q);
2521 p++;
2522 q+=quantum_info->pad;
2523 }
2524 break;
2525 }
2526 }
2527 break;
2528 }
2529 case CbYCrYQuantum:
2530 {
2531 long
2532 n;
2533
2534 Quantum
2535 cbcr[4];
2536
2537 register long
2538 i;
2539
2540 register unsigned long
2541 pixel;
2542
2543 unsigned long
2544 quantum;
2545
2546 n=0;
2547 quantum=0;
2548 range=GetQuantumRange(image->depth);
2549 switch (quantum_info->depth)
2550 {
2551 case 10:
2552 {
2553 if (quantum_info->pack == MagickFalse)
2554 {
2555 for (x=0; x < (long) number_pixels; x+=2)
2556 {
2557 for (i=0; i < 4; i++)
2558 {
2559 switch (n % 3)
2560 {
2561 case 0:
2562 {
cristyce70c172010-01-07 17:15:30 +00002563 quantum=GetRedPixelComponent(p);
cristy3ed852e2009-09-05 21:47:34 +00002564 break;
2565 }
2566 case 1:
2567 {
cristyce70c172010-01-07 17:15:30 +00002568 quantum=GetGreenPixelComponent(p);
cristy3ed852e2009-09-05 21:47:34 +00002569 break;
2570 }
2571 case 2:
2572 {
cristyce70c172010-01-07 17:15:30 +00002573 quantum=GetBluePixelComponent(p);
cristy3ed852e2009-09-05 21:47:34 +00002574 break;
2575 }
2576 }
2577 cbcr[i]=(Quantum) quantum;
2578 n++;
2579 }
2580 pixel=(unsigned long) ((unsigned long) (cbcr[1]) << 22 |
cristyff024b42010-02-21 22:55:09 +00002581 (unsigned long) (cbcr[0]) << 12 |
cristy3ed852e2009-09-05 21:47:34 +00002582 (unsigned long) (cbcr[2]) << 2);
2583 q=PopLongPixel(endian,pixel,q);
2584 p++;
2585 pixel=(unsigned long) ((unsigned long) (cbcr[3]) << 22 |
cristyff024b42010-02-21 22:55:09 +00002586 (unsigned long) (cbcr[0]) << 12 |
cristy3ed852e2009-09-05 21:47:34 +00002587 (unsigned long) (cbcr[2]) << 2);
2588 q=PopLongPixel(endian,pixel,q);
2589 p++;
2590 q+=quantum_info->pad;
2591 }
2592 break;
2593 }
2594 break;
2595 }
2596 default:
2597 {
2598 for (x=0; x < (long) number_pixels; x+=2)
2599 {
2600 for (i=0; i < 4; i++)
2601 {
2602 switch (n % 3)
2603 {
2604 case 0:
2605 {
cristyce70c172010-01-07 17:15:30 +00002606 quantum=GetRedPixelComponent(p);
cristy3ed852e2009-09-05 21:47:34 +00002607 break;
2608 }
2609 case 1:
2610 {
cristyce70c172010-01-07 17:15:30 +00002611 quantum=GetGreenPixelComponent(p);
cristy3ed852e2009-09-05 21:47:34 +00002612 break;
2613 }
2614 case 2:
2615 {
cristyce70c172010-01-07 17:15:30 +00002616 quantum=GetBluePixelComponent(p);
cristy3ed852e2009-09-05 21:47:34 +00002617 break;
2618 }
2619 }
2620 cbcr[i]=(Quantum) quantum;
2621 n++;
2622 }
2623 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
2624 cbcr[1],range),q);
2625 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
2626 cbcr[0],range),q);
2627 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
2628 cbcr[2],range),q);
2629 p++;
2630 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
2631 cbcr[3],range),q);
2632 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
2633 cbcr[0],range),q);
2634 q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
2635 cbcr[2],range),q);
2636 p++;
2637 q+=quantum_info->pad;
2638 }
2639 break;
2640 }
2641 }
2642 break;
2643 }
2644 default:
2645 break;
2646 }
2647 if ((quantum_type == CbYCrQuantum) || (quantum_type == CbYCrAQuantum))
2648 {
2649 Quantum
2650 quantum;
2651
2652 register PixelPacket
cristyc47d1f82009-11-26 01:44:43 +00002653 *restrict q;
cristy3ed852e2009-09-05 21:47:34 +00002654
2655 q=GetAuthenticPixelQueue(image);
2656 if (image_view != (CacheView *) NULL)
2657 q=(PixelPacket *) GetCacheViewVirtualPixelQueue(image_view);
2658 for (x=0; x < (long) number_pixels; x++)
2659 {
2660 quantum=q->red;
2661 q->red=q->green;
2662 q->green=quantum;
2663 q++;
2664 }
2665 }
2666 if ((quantum_type == RGBOQuantum) || (quantum_type == CMYKOQuantum))
2667 {
2668 register PixelPacket
cristyc47d1f82009-11-26 01:44:43 +00002669 *restrict q;
cristy3ed852e2009-09-05 21:47:34 +00002670
2671 q=GetAuthenticPixelQueue(image);
2672 if (image_view != (CacheView *) NULL)
2673 q=(PixelPacket *) GetCacheViewVirtualPixelQueue(image_view);
2674 for (x=0; x < (long) number_pixels; x++)
2675 {
cristy46f08202010-01-10 04:04:21 +00002676 q->opacity=(Quantum) GetAlphaPixelComponent(q);
cristy3ed852e2009-09-05 21:47:34 +00002677 q++;
2678 }
2679 }
2680 return(extent);
2681}