2 * Copyright © 2000 Keith Packard, member of The XFree86 Project, Inc.
3 * 2005 Lars Knoll & Zack Rusin, Trolltech
5 * Permission to use, copy, modify, distribute, and sell this software and its
6 * documentation for any purpose is hereby granted without fee, provided that
7 * the above copyright notice appear in all copies and that both that
8 * copyright notice and this permission notice appear in supporting
9 * documentation, and that the name of Keith Packard not be used in
10 * advertising or publicity pertaining to distribution of the software without
11 * specific, written prior permission. Keith Packard makes no
12 * representations about the suitability of this software for any purpose. It
13 * is provided "as is" without express or implied warranty.
15 * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
16 * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17 * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
18 * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
20 * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
21 * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
31 #include "pixman-private.h"
32 #include "pixman-combine32.h"
34 /* component alpha helper functions */
37 combine_mask_ca (uint32_t *src
, uint32_t *mask
)
61 UN8x4_MUL_UN8x4 (x
, a
);
64 UN8x4_MUL_UN8 (a
, xa
);
69 combine_mask_value_ca (uint32_t *src
, const uint32_t *mask
)
84 UN8x4_MUL_UN8x4 (x
, a
);
89 combine_mask_alpha_ca (const uint32_t *src
, uint32_t *mask
)
97 x
= *(src
) >> A_SHIFT
;
109 UN8x4_MUL_UN8 (a
, x
);
114 * There are two ways of handling alpha -- either as a single unified value or
115 * a separate value for each component, hence each macro must have two
116 * versions. The unified alpha version has a 'u' at the end of the name,
117 * the component version has a 'ca'. Similarly, functions which deal with
118 * this difference will have two versions using the same convention.
121 static force_inline
uint32_t
122 combine_mask (const uint32_t *src
, const uint32_t *mask
, int i
)
128 m
= *(mask
+ i
) >> A_SHIFT
;
137 UN8x4_MUL_UN8 (s
, m
);
143 combine_clear (pixman_implementation_t
*imp
,
146 const uint32_t * src
,
147 const uint32_t * mask
,
150 memset (dest
, 0, width
* sizeof (uint32_t));
154 combine_dst (pixman_implementation_t
*imp
,
157 const uint32_t * src
,
158 const uint32_t * mask
,
165 combine_src_u (pixman_implementation_t
*imp
,
168 const uint32_t * src
,
169 const uint32_t * mask
,
176 memcpy (dest
, src
, width
* sizeof (uint32_t));
180 for (i
= 0; i
< width
; ++i
)
182 uint32_t s
= combine_mask (src
, mask
, i
);
190 combine_over_u (pixman_implementation_t
*imp
,
193 const uint32_t * src
,
194 const uint32_t * mask
,
201 for (i
= 0; i
< width
; ++i
)
203 uint32_t s
= *(src
+ i
);
204 uint32_t a
= ALPHA_8 (s
);
211 uint32_t d
= *(dest
+ i
);
212 uint32_t ia
= a
^ 0xFF;
213 UN8x4_MUL_UN8_ADD_UN8x4 (d
, ia
, s
);
220 for (i
= 0; i
< width
; ++i
)
222 uint32_t m
= ALPHA_8 (*(mask
+ i
));
225 uint32_t s
= *(src
+ i
);
226 uint32_t a
= ALPHA_8 (s
);
233 uint32_t d
= *(dest
+ i
);
234 uint32_t ia
= a
^ 0xFF;
235 UN8x4_MUL_UN8_ADD_UN8x4 (d
, ia
, s
);
241 uint32_t s
= *(src
+ i
);
244 uint32_t d
= *(dest
+ i
);
245 UN8x4_MUL_UN8 (s
, m
);
246 UN8x4_MUL_UN8_ADD_UN8x4 (d
, ALPHA_8 (~s
), s
);
255 combine_over_reverse_u (pixman_implementation_t
*imp
,
258 const uint32_t * src
,
259 const uint32_t * mask
,
264 for (i
= 0; i
< width
; ++i
)
266 uint32_t s
= combine_mask (src
, mask
, i
);
267 uint32_t d
= *(dest
+ i
);
268 uint32_t ia
= ALPHA_8 (~*(dest
+ i
));
269 UN8x4_MUL_UN8_ADD_UN8x4 (s
, ia
, d
);
275 combine_in_u (pixman_implementation_t
*imp
,
278 const uint32_t * src
,
279 const uint32_t * mask
,
284 for (i
= 0; i
< width
; ++i
)
286 uint32_t s
= combine_mask (src
, mask
, i
);
287 uint32_t a
= ALPHA_8 (*(dest
+ i
));
288 UN8x4_MUL_UN8 (s
, a
);
294 combine_in_reverse_u (pixman_implementation_t
*imp
,
297 const uint32_t * src
,
298 const uint32_t * mask
,
303 for (i
= 0; i
< width
; ++i
)
305 uint32_t s
= combine_mask (src
, mask
, i
);
306 uint32_t d
= *(dest
+ i
);
307 uint32_t a
= ALPHA_8 (s
);
308 UN8x4_MUL_UN8 (d
, a
);
314 combine_out_u (pixman_implementation_t
*imp
,
317 const uint32_t * src
,
318 const uint32_t * mask
,
323 for (i
= 0; i
< width
; ++i
)
325 uint32_t s
= combine_mask (src
, mask
, i
);
326 uint32_t a
= ALPHA_8 (~*(dest
+ i
));
327 UN8x4_MUL_UN8 (s
, a
);
333 combine_out_reverse_u (pixman_implementation_t
*imp
,
336 const uint32_t * src
,
337 const uint32_t * mask
,
342 for (i
= 0; i
< width
; ++i
)
344 uint32_t s
= combine_mask (src
, mask
, i
);
345 uint32_t d
= *(dest
+ i
);
346 uint32_t a
= ALPHA_8 (~s
);
347 UN8x4_MUL_UN8 (d
, a
);
353 combine_atop_u (pixman_implementation_t
*imp
,
356 const uint32_t * src
,
357 const uint32_t * mask
,
362 for (i
= 0; i
< width
; ++i
)
364 uint32_t s
= combine_mask (src
, mask
, i
);
365 uint32_t d
= *(dest
+ i
);
366 uint32_t dest_a
= ALPHA_8 (d
);
367 uint32_t src_ia
= ALPHA_8 (~s
);
369 UN8x4_MUL_UN8_ADD_UN8x4_MUL_UN8 (s
, dest_a
, d
, src_ia
);
375 combine_atop_reverse_u (pixman_implementation_t
*imp
,
378 const uint32_t * src
,
379 const uint32_t * mask
,
384 for (i
= 0; i
< width
; ++i
)
386 uint32_t s
= combine_mask (src
, mask
, i
);
387 uint32_t d
= *(dest
+ i
);
388 uint32_t src_a
= ALPHA_8 (s
);
389 uint32_t dest_ia
= ALPHA_8 (~d
);
391 UN8x4_MUL_UN8_ADD_UN8x4_MUL_UN8 (s
, dest_ia
, d
, src_a
);
397 combine_xor_u (pixman_implementation_t
*imp
,
400 const uint32_t * src
,
401 const uint32_t * mask
,
406 for (i
= 0; i
< width
; ++i
)
408 uint32_t s
= combine_mask (src
, mask
, i
);
409 uint32_t d
= *(dest
+ i
);
410 uint32_t src_ia
= ALPHA_8 (~s
);
411 uint32_t dest_ia
= ALPHA_8 (~d
);
413 UN8x4_MUL_UN8_ADD_UN8x4_MUL_UN8 (s
, dest_ia
, d
, src_ia
);
419 combine_add_u (pixman_implementation_t
*imp
,
422 const uint32_t * src
,
423 const uint32_t * mask
,
428 for (i
= 0; i
< width
; ++i
)
430 uint32_t s
= combine_mask (src
, mask
, i
);
431 uint32_t d
= *(dest
+ i
);
432 UN8x4_ADD_UN8x4 (d
, s
);
440 * The following blend modes have been taken from the PDF ISO 32000
441 * specification, which at this point in time is available from
443 * http://www.adobe.com/devnet/pdf/pdf_reference.html
445 * The specific documents of interest are the PDF spec itself:
447 * http://wwwimages.adobe.com/www.adobe.com/content/dam/Adobe/en/devnet/pdf/pdfs/PDF32000_2008.pdf
449 * chapters 11.3.5 and 11.3.6 and a later supplement for Adobe Acrobat
450 * 9.1 and Reader 9.1:
452 * http://wwwimages.adobe.com/www.adobe.com/content/dam/Adobe/en/devnet/pdf/pdfs/adobe_supplement_iso32000_1.pdf
454 * that clarifies the specifications for blend modes ColorDodge and
457 * The formula for computing the final pixel color given in 11.3.6 is:
459 * αr × Cr = (1 – αs) × αb × Cb + (1 – αb) × αs × Cs + αb × αs × B(Cb, Cs)
461 * with B() is the blend function. When B(Cb, Cs) = Cs, this formula
462 * reduces to the regular OVER operator.
464 * Cs and Cb are not premultiplied, so in our implementation we instead
467 * cr = (1 – αs) × cb + (1 – αb) × cs + αb × αs × B (cb/αb, cs/αs)
469 * where cr, cs, and cb are premultiplied colors, and where the
471 * αb × αs × B(cb/αb, cs/αs)
473 * part is first arithmetically simplified under the assumption that αb
474 * and αs are not 0, and then updated to produce a meaningful result when
477 * For all the blend mode operators, the alpha channel is given by
479 * αr = αs + αb + αb × αs
485 * ad * as * B(d / ad, s / as)
486 * = ad * as * d/ad * s/as
491 combine_multiply_u (pixman_implementation_t
*imp
,
494 const uint32_t * src
,
495 const uint32_t * mask
,
500 for (i
= 0; i
< width
; ++i
)
502 uint32_t s
= combine_mask (src
, mask
, i
);
503 uint32_t d
= *(dest
+ i
);
505 uint32_t src_ia
= ALPHA_8 (~s
);
506 uint32_t dest_ia
= ALPHA_8 (~d
);
508 UN8x4_MUL_UN8_ADD_UN8x4_MUL_UN8 (ss
, dest_ia
, d
, src_ia
);
509 UN8x4_MUL_UN8x4 (d
, s
);
510 UN8x4_ADD_UN8x4 (d
, ss
);
517 combine_multiply_ca (pixman_implementation_t
*imp
,
520 const uint32_t * src
,
521 const uint32_t * mask
,
526 for (i
= 0; i
< width
; ++i
)
528 uint32_t m
= *(mask
+ i
);
529 uint32_t s
= *(src
+ i
);
530 uint32_t d
= *(dest
+ i
);
532 uint32_t dest_ia
= ALPHA_8 (~d
);
534 combine_mask_ca (&s
, &m
);
536 UN8x4_MUL_UN8x4_ADD_UN8x4_MUL_UN8 (r
, ~m
, s
, dest_ia
);
537 UN8x4_MUL_UN8x4 (d
, s
);
538 UN8x4_ADD_UN8x4 (r
, d
);
544 #define CLAMP(v, low, high) \
553 #define PDF_SEPARABLE_BLEND_MODE(name) \
555 combine_ ## name ## _u (pixman_implementation_t *imp, \
558 const uint32_t * src, \
559 const uint32_t * mask, \
563 for (i = 0; i < width; ++i) \
565 uint32_t s = combine_mask (src, mask, i); \
566 uint32_t d = *(dest + i); \
567 uint8_t sa = ALPHA_8 (s); \
569 uint8_t da = ALPHA_8 (d); \
571 int32_t ra, rr, rg, rb; \
573 ra = da * 0xff + sa * 0xff - sa * da; \
574 rr = isa * RED_8 (d) + ida * RED_8 (s); \
575 rg = isa * GREEN_8 (d) + ida * GREEN_8 (s); \
576 rb = isa * BLUE_8 (d) + ida * BLUE_8 (s); \
578 rr += blend_ ## name (RED_8 (d), da, RED_8 (s), sa); \
579 rg += blend_ ## name (GREEN_8 (d), da, GREEN_8 (s), sa); \
580 rb += blend_ ## name (BLUE_8 (d), da, BLUE_8 (s), sa); \
582 CLAMP (ra, 0, 255 * 255); \
583 CLAMP (rr, 0, 255 * 255); \
584 CLAMP (rg, 0, 255 * 255); \
585 CLAMP (rb, 0, 255 * 255); \
587 ra = DIV_ONE_UN8 (ra); \
588 rr = DIV_ONE_UN8 (rr); \
589 rg = DIV_ONE_UN8 (rg); \
590 rb = DIV_ONE_UN8 (rb); \
592 *(dest + i) = ra << 24 | rr << 16 | rg << 8 | rb; \
597 combine_ ## name ## _ca (pixman_implementation_t *imp, \
600 const uint32_t * src, \
601 const uint32_t * mask, \
605 for (i = 0; i < width; ++i) \
607 uint32_t m = *(mask + i); \
608 uint32_t s = *(src + i); \
609 uint32_t d = *(dest + i); \
610 uint8_t da = ALPHA_8 (d); \
612 int32_t ra, rr, rg, rb; \
613 uint8_t ira, iga, iba; \
615 combine_mask_ca (&s, &m); \
618 iga = ~GREEN_8 (m); \
621 ra = da * 0xff + ALPHA_8 (s) * 0xff - ALPHA_8 (s) * da; \
622 rr = ira * RED_8 (d) + ida * RED_8 (s); \
623 rg = iga * GREEN_8 (d) + ida * GREEN_8 (s); \
624 rb = iba * BLUE_8 (d) + ida * BLUE_8 (s); \
626 rr += blend_ ## name (RED_8 (d), da, RED_8 (s), RED_8 (m)); \
627 rg += blend_ ## name (GREEN_8 (d), da, GREEN_8 (s), GREEN_8 (m)); \
628 rb += blend_ ## name (BLUE_8 (d), da, BLUE_8 (s), BLUE_8 (m)); \
630 CLAMP (ra, 0, 255 * 255); \
631 CLAMP (rr, 0, 255 * 255); \
632 CLAMP (rg, 0, 255 * 255); \
633 CLAMP (rb, 0, 255 * 255); \
635 ra = DIV_ONE_UN8 (ra); \
636 rr = DIV_ONE_UN8 (rr); \
637 rg = DIV_ONE_UN8 (rg); \
638 rb = DIV_ONE_UN8 (rb); \
640 *(dest + i) = ra << 24 | rr << 16 | rg << 8 | rb; \
647 * ad * as * B(d/ad, s/as)
648 * = ad * as * (d/ad + s/as - s/as * d/ad)
649 * = ad * s + as * d - s * d
651 static inline int32_t
652 blend_screen (int32_t d
, int32_t ad
, int32_t s
, int32_t as
)
654 return s
* ad
+ d
* as
- s
* d
;
657 PDF_SEPARABLE_BLEND_MODE (screen
)
662 * ad * as * B(d/ad, s/as)
663 * = ad * as * Hardlight (s, d)
664 * = if (d / ad < 0.5)
665 * as * ad * Multiply (s/as, 2 * d/ad)
667 * as * ad * Screen (s/as, 2 * d / ad - 1)
668 * = if (d < 0.5 * ad)
669 * as * ad * s/as * 2 * d /ad
671 * as * ad * (s/as + 2 * d / ad - 1 - s / as * (2 * d / ad - 1))
675 * ad * s + 2 * as * d - as * ad - ad * s * (2 * d / ad - 1)
679 * as * ad - 2 * (ad - d) * (as - s)
681 static inline int32_t
682 blend_overlay (int32_t d
, int32_t ad
, int32_t s
, int32_t as
)
689 r
= as
* ad
- 2 * (ad
- d
) * (as
- s
);
694 PDF_SEPARABLE_BLEND_MODE (overlay
)
699 * ad * as * B(d/ad, s/as)
700 * = ad * as * MIN(d/ad, s/as)
701 * = MIN (as * d, ad * s)
703 static inline int32_t
704 blend_darken (int32_t d
, int32_t ad
, int32_t s
, int32_t as
)
709 return s
> d
? d
: s
;
712 PDF_SEPARABLE_BLEND_MODE (darken
)
717 * ad * as * B(d/ad, s/as)
718 * = ad * as * MAX(d/ad, s/as)
719 * = MAX (as * d, ad * s)
721 static inline int32_t
722 blend_lighten (int32_t d
, int32_t ad
, int32_t s
, int32_t as
)
727 return s
> d
? s
: d
;
730 PDF_SEPARABLE_BLEND_MODE (lighten
)
735 * ad * as * B(d/ad, s/as)
737 * ad * as * Multiply (d/ad, 2 * s/as)
739 * ad * as * Screen (d/ad, 2 * s/as - 1)
741 * ad * as * d/ad * 2 * s / as
743 * ad * as * (d/ad + (2 * s/as - 1) + d/ad * (2 * s/as - 1))
747 * as * ad - 2 * (ad - d) * (as - s)
749 static inline int32_t
750 blend_hard_light (int32_t d
, int32_t ad
, int32_t s
, int32_t as
)
755 return as
* ad
- 2 * (ad
- d
) * (as
- s
);
758 PDF_SEPARABLE_BLEND_MODE (hard_light
)
763 * ad * as * B(s/as, d/ad)
764 * = ad * as * abs (s/as - d/ad)
765 * = if (s/as <= d/ad)
766 * ad * as * (d/ad - s/as)
768 * ad * as * (s/as - d/ad)
769 * = if (ad * s <= as * d)
774 static inline int32_t
775 blend_difference (int32_t d
, int32_t ad
, int32_t s
, int32_t as
)
777 int32_t das
= d
* as
;
778 int32_t sad
= s
* ad
;
786 PDF_SEPARABLE_BLEND_MODE (difference
)
791 * ad * as * B(s/as, d/ad)
792 * = ad * as * (d/ad + s/as - 2 * d/ad * s/as)
793 * = as * d + ad * s - 2 * s * d
796 /* This can be made faster by writing it directly and not using
797 * PDF_SEPARABLE_BLEND_MODE, but that's a performance optimization */
799 static inline int32_t
800 blend_exclusion (int32_t d
, int32_t ad
, int32_t s
, int32_t as
)
802 return s
* ad
+ d
* as
- 2 * d
* s
;
805 PDF_SEPARABLE_BLEND_MODE (exclusion
)
807 #undef PDF_SEPARABLE_BLEND_MODE
809 /* Component alpha combiners */
812 combine_clear_ca (pixman_implementation_t
*imp
,
815 const uint32_t * src
,
816 const uint32_t * mask
,
819 memset (dest
, 0, width
* sizeof(uint32_t));
823 combine_src_ca (pixman_implementation_t
*imp
,
826 const uint32_t * src
,
827 const uint32_t * mask
,
832 for (i
= 0; i
< width
; ++i
)
834 uint32_t s
= *(src
+ i
);
835 uint32_t m
= *(mask
+ i
);
837 combine_mask_value_ca (&s
, &m
);
844 combine_over_ca (pixman_implementation_t
*imp
,
847 const uint32_t * src
,
848 const uint32_t * mask
,
853 for (i
= 0; i
< width
; ++i
)
855 uint32_t s
= *(src
+ i
);
856 uint32_t m
= *(mask
+ i
);
859 combine_mask_ca (&s
, &m
);
864 uint32_t d
= *(dest
+ i
);
865 UN8x4_MUL_UN8x4_ADD_UN8x4 (d
, a
, s
);
874 combine_over_reverse_ca (pixman_implementation_t
*imp
,
877 const uint32_t * src
,
878 const uint32_t * mask
,
883 for (i
= 0; i
< width
; ++i
)
885 uint32_t d
= *(dest
+ i
);
886 uint32_t a
= ~d
>> A_SHIFT
;
890 uint32_t s
= *(src
+ i
);
891 uint32_t m
= *(mask
+ i
);
893 UN8x4_MUL_UN8x4 (s
, m
);
894 UN8x4_MUL_UN8_ADD_UN8x4 (s
, a
, d
);
902 combine_in_ca (pixman_implementation_t
*imp
,
905 const uint32_t * src
,
906 const uint32_t * mask
,
911 for (i
= 0; i
< width
; ++i
)
913 uint32_t d
= *(dest
+ i
);
914 uint16_t a
= d
>> A_SHIFT
;
919 uint32_t m
= *(mask
+ i
);
922 combine_mask_value_ca (&s
, &m
);
925 UN8x4_MUL_UN8 (s
, a
);
933 combine_in_reverse_ca (pixman_implementation_t
*imp
,
936 const uint32_t * src
,
937 const uint32_t * mask
,
942 for (i
= 0; i
< width
; ++i
)
944 uint32_t s
= *(src
+ i
);
945 uint32_t m
= *(mask
+ i
);
948 combine_mask_alpha_ca (&s
, &m
);
958 UN8x4_MUL_UN8x4 (d
, a
);
967 combine_out_ca (pixman_implementation_t
*imp
,
970 const uint32_t * src
,
971 const uint32_t * mask
,
976 for (i
= 0; i
< width
; ++i
)
978 uint32_t d
= *(dest
+ i
);
979 uint16_t a
= ~d
>> A_SHIFT
;
984 uint32_t m
= *(mask
+ i
);
987 combine_mask_value_ca (&s
, &m
);
990 UN8x4_MUL_UN8 (s
, a
);
998 combine_out_reverse_ca (pixman_implementation_t
*imp
,
1001 const uint32_t * src
,
1002 const uint32_t * mask
,
1007 for (i
= 0; i
< width
; ++i
)
1009 uint32_t s
= *(src
+ i
);
1010 uint32_t m
= *(mask
+ i
);
1013 combine_mask_alpha_ca (&s
, &m
);
1023 UN8x4_MUL_UN8x4 (d
, a
);
1032 combine_atop_ca (pixman_implementation_t
*imp
,
1035 const uint32_t * src
,
1036 const uint32_t * mask
,
1041 for (i
= 0; i
< width
; ++i
)
1043 uint32_t d
= *(dest
+ i
);
1044 uint32_t s
= *(src
+ i
);
1045 uint32_t m
= *(mask
+ i
);
1047 uint16_t as
= d
>> A_SHIFT
;
1049 combine_mask_ca (&s
, &m
);
1053 UN8x4_MUL_UN8x4_ADD_UN8x4_MUL_UN8 (d
, ad
, s
, as
);
1060 combine_atop_reverse_ca (pixman_implementation_t
*imp
,
1063 const uint32_t * src
,
1064 const uint32_t * mask
,
1069 for (i
= 0; i
< width
; ++i
)
1071 uint32_t d
= *(dest
+ i
);
1072 uint32_t s
= *(src
+ i
);
1073 uint32_t m
= *(mask
+ i
);
1075 uint16_t as
= ~d
>> A_SHIFT
;
1077 combine_mask_ca (&s
, &m
);
1081 UN8x4_MUL_UN8x4_ADD_UN8x4_MUL_UN8 (d
, ad
, s
, as
);
1088 combine_xor_ca (pixman_implementation_t
*imp
,
1091 const uint32_t * src
,
1092 const uint32_t * mask
,
1097 for (i
= 0; i
< width
; ++i
)
1099 uint32_t d
= *(dest
+ i
);
1100 uint32_t s
= *(src
+ i
);
1101 uint32_t m
= *(mask
+ i
);
1103 uint16_t as
= ~d
>> A_SHIFT
;
1105 combine_mask_ca (&s
, &m
);
1109 UN8x4_MUL_UN8x4_ADD_UN8x4_MUL_UN8 (d
, ad
, s
, as
);
1116 combine_add_ca (pixman_implementation_t
*imp
,
1119 const uint32_t * src
,
1120 const uint32_t * mask
,
1125 for (i
= 0; i
< width
; ++i
)
1127 uint32_t s
= *(src
+ i
);
1128 uint32_t m
= *(mask
+ i
);
1129 uint32_t d
= *(dest
+ i
);
1131 combine_mask_value_ca (&s
, &m
);
1133 UN8x4_ADD_UN8x4 (d
, s
);
1140 _pixman_setup_combiner_functions_32 (pixman_implementation_t
*imp
)
1143 imp
->combine_32
[PIXMAN_OP_CLEAR
] = combine_clear
;
1144 imp
->combine_32
[PIXMAN_OP_SRC
] = combine_src_u
;
1145 imp
->combine_32
[PIXMAN_OP_DST
] = combine_dst
;
1146 imp
->combine_32
[PIXMAN_OP_OVER
] = combine_over_u
;
1147 imp
->combine_32
[PIXMAN_OP_OVER_REVERSE
] = combine_over_reverse_u
;
1148 imp
->combine_32
[PIXMAN_OP_IN
] = combine_in_u
;
1149 imp
->combine_32
[PIXMAN_OP_IN_REVERSE
] = combine_in_reverse_u
;
1150 imp
->combine_32
[PIXMAN_OP_OUT
] = combine_out_u
;
1151 imp
->combine_32
[PIXMAN_OP_OUT_REVERSE
] = combine_out_reverse_u
;
1152 imp
->combine_32
[PIXMAN_OP_ATOP
] = combine_atop_u
;
1153 imp
->combine_32
[PIXMAN_OP_ATOP_REVERSE
] = combine_atop_reverse_u
;
1154 imp
->combine_32
[PIXMAN_OP_XOR
] = combine_xor_u
;
1155 imp
->combine_32
[PIXMAN_OP_ADD
] = combine_add_u
;
1157 imp
->combine_32
[PIXMAN_OP_MULTIPLY
] = combine_multiply_u
;
1158 imp
->combine_32
[PIXMAN_OP_SCREEN
] = combine_screen_u
;
1159 imp
->combine_32
[PIXMAN_OP_OVERLAY
] = combine_overlay_u
;
1160 imp
->combine_32
[PIXMAN_OP_DARKEN
] = combine_darken_u
;
1161 imp
->combine_32
[PIXMAN_OP_LIGHTEN
] = combine_lighten_u
;
1162 imp
->combine_32
[PIXMAN_OP_HARD_LIGHT
] = combine_hard_light_u
;
1163 imp
->combine_32
[PIXMAN_OP_DIFFERENCE
] = combine_difference_u
;
1164 imp
->combine_32
[PIXMAN_OP_EXCLUSION
] = combine_exclusion_u
;
1166 /* Component alpha combiners */
1167 imp
->combine_32_ca
[PIXMAN_OP_CLEAR
] = combine_clear_ca
;
1168 imp
->combine_32_ca
[PIXMAN_OP_SRC
] = combine_src_ca
;
1170 imp
->combine_32_ca
[PIXMAN_OP_OVER
] = combine_over_ca
;
1171 imp
->combine_32_ca
[PIXMAN_OP_OVER_REVERSE
] = combine_over_reverse_ca
;
1172 imp
->combine_32_ca
[PIXMAN_OP_IN
] = combine_in_ca
;
1173 imp
->combine_32_ca
[PIXMAN_OP_IN_REVERSE
] = combine_in_reverse_ca
;
1174 imp
->combine_32_ca
[PIXMAN_OP_OUT
] = combine_out_ca
;
1175 imp
->combine_32_ca
[PIXMAN_OP_OUT_REVERSE
] = combine_out_reverse_ca
;
1176 imp
->combine_32_ca
[PIXMAN_OP_ATOP
] = combine_atop_ca
;
1177 imp
->combine_32_ca
[PIXMAN_OP_ATOP_REVERSE
] = combine_atop_reverse_ca
;
1178 imp
->combine_32_ca
[PIXMAN_OP_XOR
] = combine_xor_ca
;
1179 imp
->combine_32_ca
[PIXMAN_OP_ADD
] = combine_add_ca
;
1181 imp
->combine_32_ca
[PIXMAN_OP_MULTIPLY
] = combine_multiply_ca
;
1182 imp
->combine_32_ca
[PIXMAN_OP_SCREEN
] = combine_screen_ca
;
1183 imp
->combine_32_ca
[PIXMAN_OP_OVERLAY
] = combine_overlay_ca
;
1184 imp
->combine_32_ca
[PIXMAN_OP_DARKEN
] = combine_darken_ca
;
1185 imp
->combine_32_ca
[PIXMAN_OP_LIGHTEN
] = combine_lighten_ca
;
1186 imp
->combine_32_ca
[PIXMAN_OP_HARD_LIGHT
] = combine_hard_light_ca
;
1187 imp
->combine_32_ca
[PIXMAN_OP_DIFFERENCE
] = combine_difference_ca
;
1188 imp
->combine_32_ca
[PIXMAN_OP_EXCLUSION
] = combine_exclusion_ca
;