the rubthrough() method now supports destination images with an alpha
[imager.git] / imtoc.perl
1 #!perl -w
2 use strict;
3
4 my $src = shift;
5 my $dest = shift
6   or usage();
7
8 open SRC, "< $src"
9   or die "Cannot open $src: $!\n";
10
11 my $cond;
12 my $cond_line;
13 my $save_code;
14 my @code;
15 my $code_line;
16 my @out;
17 my $failed;
18
19 push @out, "#line 1 \"$src\"\n";
20 while (defined(my $line = <SRC>)) {
21   if ($line =~ /^\#code (.+)$/) {
22     $save_code
23       and do { warn "$src:$code_line:Unclosed #code block\n"; ++$failed; };
24
25     $cond = $1;
26     $cond_line = $.;
27     $code_line = $. + 1;
28     $save_code = 1;
29   }
30   elsif ($line =~ /^\#\/code$/) {
31     $save_code
32       or do { warn "$src:$.:#/code without #code\n"; ++$failed; next; };
33
34     push @out, "#line $cond_line \"$src\"\n";
35     push @out, "  if ($cond) {\n";
36     push @out, "#line $code_line \"$src\"\n";
37     push @out, byte_samples(@code);
38     push @out, "  }\n", "  else {\n";
39     push @out, "#line $code_line \"$src\"\n";
40     push @out, double_samples(@code);
41     push @out, "  }\n";
42     push @out, "#line $. \"$src\"\n";
43     @code = ();
44     $save_code = 0;
45   }
46   elsif ($save_code) {
47     push @code, $line;
48   }
49   else {
50     push @out, $line;
51   }
52 }
53
54 if ($save_code) {
55   warn "$src:$code_line:#code block not closed by EOF\n";
56   ++$failed;
57 }
58
59 close SRC;
60
61 $failed 
62   and die "Errors during parsing, aborting\n";
63
64 open DEST, "> $dest"
65   or die "Cannot open $dest: $!\n";
66 print DEST @out;
67 close DEST;
68
69 sub byte_samples {
70   # important we make a copy
71   my @lines = @_;
72
73   for (@lines) {
74     s/\bIM_GPIX\b/i_gpix/g;
75     s/\bIM_GLIN\b/i_glin/g;
76     s/\bIM_PPIX\b/i_ppix/g;
77     s/\bIM_PLIN\b/i_plin/g;
78     s/\bIM_GSAMP\b/i_gsamp/g;
79     s/\bIM_SAMPLE_MAX\b/255/g;
80     s/\bIM_SAMPLE_T/i_sample_t/g;
81     s/\bIM_COLOR\b/i_color/g;
82     s/\bIM_WORK_T\b/int/g;
83     s/\bIM_Sf\b/"%d"/g;
84     s/\bIM_Wf\b/"%d"/g;
85   }
86
87   @lines;
88 }
89
90 sub double_samples {
91   # important we make a copy
92   my @lines = @_;
93
94   for (@lines) {
95     s/\bIM_GPIX\b/i_gpixf/g;
96     s/\bIM_GLIN\b/i_glinf/g;
97     s/\bIM_PPIX\b/i_ppixf/g;
98     s/\bIM_PLIN\b/i_plinf/g;
99     s/\bIM_GSAMP\b/i_gsampf/g;
100     s/\bIM_SAMPLE_MAX\b/1.0/g;
101     s/\bIM_SAMPLE_T/i_fsample_t/g;
102     s/\bIM_COLOR\b/i_fcolor/g;
103     s/\bIM_WORK_T\b/double/g;
104     s/\bIM_Sf\b/"%f"/g;
105     s/\bIM_Wf\b/"%f"/g;
106   }
107
108   @lines;
109 }
110
111 =head1 NAME
112
113 imtoc.perl - simple preprocessor for handling multiple sample sizes
114
115 =head1 SYNOPSIS
116
117   /* in the source: */
118   #code condition true to work with 8-bit samples
119   ... code using preprocessor types/values ...
120   #/code
121
122   perl imtoc.perl foo.im foo.c
123
124 =head1 DESCRIPTION
125
126 This is a simple preprocessor that aims to reduce duplication of
127 source code when implementing an algorithm both for 8-bit samples and
128 double samples in Imager.
129
130 Imager's Makefile.PL currently scans the MANIFEST for .im files and
131 adds Makefile files to convert these to .c files.
132
133 The beginning of a sample-independent section of code is preceded by:
134
135   #code expression
136
137 where I<expression> should return true if processing should be done at
138 8-bits/sample.
139
140 The end of a sample-independent section of code is terminated by:
141
142   #/code
143
144 #code sections cannot be nested.
145
146 #/code without a starting #code is an error.
147
148 The following types and values are defined in a #code section:
149
150 =over
151
152 =item *
153
154 IM_GPIX(im, x, y, &col)
155
156 =item *
157
158 IM_GLIN(im, l, r, y, colors)
159
160 =item *
161
162 IM_PPIX(im, x, y, &col)
163
164 =item *
165
166 IM_PLIN(im, x, y, colors)
167
168 =item *
169
170 IM_GSAMP(im, l, r, y, samples, chans, chan_count)
171
172 These correspond to the appropriate image function, eg. IM_GPIX()
173 becomes i_gpix() or i_gpixf() as appropriate.
174
175 =item *
176
177 IM_SAMPLE_MAX - maximum value for a sample
178
179 =item *
180
181 IM_SAMPLE_T - type of a sample (i_sample_t or i_fsample_t)
182
183 =item *
184
185 IM_COLOR - color type, either i_color or i_fcolor.
186
187 =item *
188
189 IM_WORK_T - working sample type, either int or double.
190
191 =item *
192
193 IM_Sf - format string for the sample type, C<"%d"> or C<"%f">.
194
195 =item *
196
197 IM_Wf - format string for the work type, C<"%d"> or C<"%f">.
198
199 =back
200
201 Other types, functions and values may be added in the future.
202
203 =head1 AUTHOR
204
205 Tony Cook <tony@imager.perl.org>
206
207 =cut