1$usage = "Usage: combine.pl { 8 | 16 } < pixman-combine.c.template";
2
3$#ARGV == 0 or die $usage;
4
5# Get the component size.
6$size = int($ARGV[0]);
7$size == 8 or $size == 16 or die $usage;
8
9$pixel_size = $size * 4;
10$half_pixel_size = $size * 2;
11
12sub mask {
13    my $str = shift;
14    my $suffix;
15    $suffix = "ULL" if $size > 8;
16
17    return "0x" . $str . $suffix;
18}
19
20# Generate mask strings.
21$nibbles = $size / 4;
22$mask = "f" x $nibbles;
23$zero_mask = "0" x $nibbles;
24$one_half = "8" . "0" x ($nibbles - 1);
25
26print "/* WARNING: This file is generated by combine.pl from combine.inc.\n";
27print "   Please edit one of those files rather than this one. */\n";
28print "\n";
29
30print "#line 1 \"pixman-combine.c.template\"\n";
31
32$mask_ = mask($mask);
33$one_half_ = mask($one_half);
34$g_mask = mask($mask . $zero_mask);
35$b_mask = mask($mask . $zero_mask x 2);
36$a_mask = mask($mask . $zero_mask x 3);
37$rb_mask = mask($mask . $zero_mask . $mask);
38$ag_mask = mask($mask . $zero_mask . $mask . $zero_mask);
39$rb_one_half = mask($one_half . $zero_mask . $one_half);
40$rb_mask_plus_one = mask("1" . $zero_mask x 2 . "1" .  $zero_mask);
41
42while (<STDIN>) {
43    # Mask and 1/2 value for a single component.
44    s/#define COMPONENT_SIZE\b/$& $size/;
45    s/#define MASK\b/$& $mask_/;
46    s/#define ONE_HALF\b/$& $one_half_/;
47
48    # Shifts and masks for green, blue, and alpha.
49    s/#define G_SHIFT\b/$& $size/;
50    s/#define R_SHIFT\b/$& $size * 2/;
51    s/#define A_SHIFT\b/$& $size * 3/;
52    s/#define G_MASK\b/$& $g_mask/;
53    s/#define R_MASK\b/$& $b_mask/;
54    s/#define A_MASK\b/$& $a_mask/;
55
56    # Special values for dealing with red + blue at the same time.
57    s/#define RB_MASK\b/$& $rb_mask/;
58    s/#define AG_MASK\b/$& $ag_mask/;
59    s/#define RB_ONE_HALF\b/$& $rb_one_half/;
60    s/#define RB_MASK_PLUS_ONE\b/$& $rb_mask_plus_one/;
61
62    # Add 32/64 suffix to combining function types.
63    s/\bCombineFunc\b/CombineFunc$pixel_size/;
64    s/\bFbComposeFunctions\b/FbComposeFunctions$pixel_size/;
65    s/combine_width/combine_$pixel_size/;
66    s/_pixman_setup_combiner_functions_width/_pixman_setup_combiner_functions_$pixel_size/;
67    s/UNc/UN$size/g;
68    s/ALPHA_c/ALPHA_$size/g;
69    s/RED_c/RED_$size/g;
70    s/GREEN_c/GREEN_$size/g;
71    s/BLUE_c/BLUE_$size/g;
72
73    # Convert comp*_t values into the appropriate real types.
74    s/comp1_t/uint${size}_t/g;
75    s/comp2_t/uint${half_pixel_size}_t/g;
76    s/comp4_t/uint${pixel_size}_t/g;
77
78    # Change the function table name for the 64-bit version.
79    s/pixman_composeFunctions/pixman_composeFunctions64/ if $size == 16;
80
81    # Change the header for the 64-bit version
82    s/pixman-combine.h/pixman-combine64.h/ if $size == 16;
83    s/pixman-combine.h/pixman-combine32.h/ if $size == 8;
84
85    print;
86}
87