implement a flood_fill that stops at a given color rather than filling
[imager.git] / imext.c
1 #include "imexttypes.h"
2 #include "imager.h"
3
4 /*
5  DON'T ADD CASTS TO THESE
6 */
7 im_ext_funcs imager_function_table =
8   {
9     IMAGER_API_VERSION,
10     IMAGER_API_LEVEL,
11
12     mymalloc,
13     myfree,
14     myrealloc,
15
16     mymalloc_file_line,
17     myfree_file_line,
18     myrealloc_file_line,
19
20     i_img_8_new,
21     i_img_16_new,
22     i_img_double_new,
23     i_img_pal_new,
24     i_img_destroy,
25     i_sametype,
26     i_sametype_chans,
27     i_img_info,
28
29     i_ppix,
30     i_gpix,
31     i_ppixf,
32     i_gpixf,
33     i_plin,
34     i_glin,
35     i_plinf,
36     i_glinf,
37     i_gsamp,
38     i_gsampf,
39     i_gpal,
40     i_ppal,
41     i_addcolors,
42     i_getcolors,
43     i_colorcount,
44     i_maxcolors,
45     i_findcolor,
46     i_setcolors,
47
48     i_new_fill_solid,
49     i_new_fill_solidf,
50     i_new_fill_hatch,
51     i_new_fill_hatchf,
52     i_new_fill_image,
53     i_new_fill_fount,
54     i_fill_destroy,
55
56     i_quant_makemap,
57     i_quant_translate,
58     i_quant_transparent,
59
60     i_clear_error,
61     i_push_error,
62     i_push_errorf,
63     i_push_errorvf,
64
65     i_tags_new,
66     i_tags_set,
67     i_tags_setn,
68     i_tags_destroy,
69     i_tags_find,
70     i_tags_findn,
71     i_tags_delete,
72     i_tags_delbyname,
73     i_tags_delbycode,
74     i_tags_get_float,
75     i_tags_set_float,
76     i_tags_set_float2,
77     i_tags_get_int,
78     i_tags_get_string,
79     i_tags_get_color,
80     i_tags_set_color,
81
82     i_box,
83     i_box_filled,
84     i_box_cfill,
85     i_line,
86     i_line_aa,
87     i_arc,
88     i_arc_aa,
89     i_arc_cfill,
90     i_arc_aa_cfill,
91     i_circle_aa,
92     i_flood_fill,
93     i_flood_cfill,
94
95     i_copyto,
96     i_copyto_trans,
97     i_copy,
98     i_rubthru,
99
100     /* IMAGER_API_LEVEL 2 functions */
101     i_set_image_file_limits,
102     i_get_image_file_limits,
103     i_int_check_image_file_limits,
104
105     i_flood_fill_border,
106     i_flood_cfill_border,
107   };
108
109 /* in general these functions aren't called by Imager internally, but
110    only via the pointers above, since faster macros that call the
111    image vtable pointers are used.
112
113    () are used around the function names to prevent macro replacement
114    on the function names.
115 */
116
117 /*
118 =item i_ppix(im, x, y, color)
119
120 =category Drawing
121
122 Sets the pixel at (x,y) to I<color>.
123
124 Returns 0 if the pixel was drawn, or -1 if not.
125
126 Does no alpha blending, just copies the channels from the supplied
127 color to the image.
128
129 =cut
130 */
131
132 int 
133 (i_ppix)(i_img *im, int x, int y, const i_color *val) {
134   return i_ppix(im, x, y, val);
135 }
136
137 /*
138 =item i_gpix(im, x, y, color)
139
140 =category Drawing
141
142 Retrieves the I<color> of the pixel (x,y).
143
144 Returns 0 if the pixel was retrieved, or -1 if not.
145
146 =cut
147 */
148
149 int
150 (i_gpix)(i_img *im,int x,int y,i_color *val) {
151   return i_gpix(im, x, y, val);
152 }
153
154 /*
155 =item i_ppixf(im, x, y, fcolor)
156
157 =category Drawing
158
159 Sets the pixel at (x,y) to the floating point color I<fcolor>.
160
161 Returns 0 if the pixel was drawn, or -1 if not.
162
163 Does no alpha blending, just copies the channels from the supplied
164 color to the image.
165
166 =cut
167 */
168 int
169 (i_ppixf)(i_img *im, int x, int y, const i_fcolor *val) {
170   return i_ppixf(im, x, y, val);
171 }
172
173 /*
174 =item i_gpixf(im, x, y, fcolor)
175
176 =category Drawing
177
178 Retrieves the color of the pixel (x,y) as a floating point color into
179 I<fcolor>.
180
181 Returns 0 if the pixel was retrieved, or -1 if not.
182
183 =cut
184 */
185
186 int
187 (i_gpixf)(i_img *im,int x,int y,i_fcolor *val) {
188   return i_gpixf(im, x, y, val);
189 }
190
191 /*
192 =item i_plin(im, l, r, y, colors)
193
194 =category Drawing
195
196 Sets (r-l) pixels starting from (l,y) using (r-l) values from
197 I<colors>.
198
199 Returns the number of pixels set.
200
201 =cut
202 */
203
204 int
205 (i_plin)(i_img *im, int l, int r, int y, const i_color *vals) {
206   return i_plin(im, l, r, y, vals);
207 }
208
209 /*
210 =item i_glin(im, l, r, y, colors)
211
212 =category Drawing
213
214 Retrieves (r-l) pixels starting from (l,y) into I<colors>.
215
216 Returns the number of pixels retrieved.
217
218 =cut
219 */
220
221 int
222 (i_glin)(i_img *im, int l, int r, int y, i_color *vals) {
223   return i_glin(im, l, r, y, vals);
224 }
225
226 /*
227 =item i_plinf(im, l, r, fcolors)
228
229 =category Drawing
230
231 Sets (r-l) pixels starting from (l,y) using (r-l) floating point
232 colors from I<colors>.
233
234 Returns the number of pixels set.
235
236 =cut
237 */
238
239 int
240 (i_plinf)(i_img *im, int l, int r, int y, const i_fcolor *vals) {
241   return i_plinf(im, l, r, y, vals);
242 }
243
244 /*
245 =item i_glinf(im, l, r, y, colors)
246
247 =category Drawing
248
249 Retrieves (r-l) pixels starting from (l,y) into I<colors> as floating
250 point colors.
251
252 Returns the number of pixels retrieved.
253
254 =cut
255 */
256
257 int
258 (i_glinf)(i_img *im, int l, int r, int y, i_fcolor *vals) {
259   return i_glinf(im, l, r, y, vals);
260 }
261
262 /*
263 =item i_gsamp(im, l, r, y, samp, chans, chan_count)
264
265 =category Drawing
266
267 Reads sample values from im for the horizontal line (l, y) to (r-1,y)
268 for the channels specified by chans, an array of int with chan_count
269 elements.
270
271 If chans is NULL then the first chan_count channels are retrieved for
272 each pixel.
273
274 Returns the number of samples read (which should be (r-l) *
275 chan_count)
276
277 =cut
278 */
279 int
280 (i_gsamp)(i_img *im, int l, int r, int y, i_sample_t *samp, 
281                    const int *chans, int chan_count) {
282   return i_gsamp(im, l, r, y, samp, chans, chan_count);
283 }
284
285 /*
286 =item i_gsampf(im, l, r, y, samp, chans, chan_count)
287
288 =category Drawing
289
290 Reads floating point sample values from im for the horizontal line (l,
291 y) to (r-1,y) for the channels specified by chans, an array of int
292 with chan_count elements.
293
294 If chans is NULL then the first chan_count channels are retrieved for
295 each pixel.
296
297 Returns the number of samples read (which should be (r-l) *
298 chan_count)
299
300 =cut
301 */
302 int
303 (i_gsampf)(i_img *im, int l, int r, int y, i_fsample_t *samp, 
304            const int *chans, int chan_count) {
305   return i_gsampf(im, l, r, y, samp, chans, chan_count);
306 }
307
308 /*
309 =item i_gpal(im, x, r, y, indexes)
310
311 =category Drawing
312
313 Reads palette indexes for the horizontal line (x, y) to (r-1, y) into
314 indexes.
315
316 Returns the number of indexes read.
317
318 Always returns 0 for direct color images.
319
320 =cut
321 */
322 int
323 (i_gpal)(i_img *im, int x, int r, int y, i_palidx *vals) {
324   return i_gpal(im, x, r, y, vals);
325 }
326
327 /*
328 =item i_ppal(im, x, r, y, indexes)
329
330 =category Drawing
331
332 Writes palette indexes for the horizontal line (x, y) to (r-1, y) from
333 indexes.
334
335 Returns the number of indexes written.
336
337 Always returns 0 for direct color images.
338
339 =cut
340 */
341 int
342 (i_ppal)(i_img *im, int x, int r, int y, const i_palidx *vals) {
343   return i_ppal(im, x, r, y, vals);
344 }
345
346 /*
347 =item i_addcolors(im, colors, count)
348
349 =category Paletted images
350
351 Adds colors to the image's palette.
352
353 On success returns the index of the lowest color added.
354
355 On failure returns -1.
356
357 Always fails for direct color images.
358
359 =cut
360 */
361
362 int
363 (i_addcolors)(i_img *im, const i_color *colors, int count) {
364   return i_addcolors(im, colors, count);
365 }
366
367 /*
368 =item i_getcolors(im, index, colors, count)
369
370 =category Paletted images
371
372 Retrieves I<count> colors starting from I<index> in the image's
373 palette.
374
375 On success stores the colors into I<colors> and returns true.
376
377 On failure returns false.
378
379 Always fails for direct color images.
380
381 Fails if there are less than I<index>+I<count> colors in the image's
382 palette.
383
384 =cut
385 */
386
387 int
388 (i_getcolors)(i_img *im, int i, i_color *colors, int count) {
389   return i_getcolors(im, i, colors, count);
390 }
391
392 /*
393 =item i_colorcount(im)
394
395 =category Paletted images
396
397 Returns the number of colors in the image's palette.
398
399 Returns -1 for direct images.
400
401 =cut
402 */
403
404 int
405 (i_colorcount)(i_img *im) {
406   return i_colorcount(im);
407 }
408
409 /*
410 =item i_maxcolors(im)
411
412 =category Paletted images
413
414 Returns the maximum number of colors the palette can hold for the
415 image.
416
417 Returns -1 for direct color images.
418
419 =cut
420 */
421
422 int
423 (i_maxcolors)(i_img *im) {
424   return i_maxcolors(im);
425 }
426
427 /*
428 =item i_findcolor(im, color, &entry)
429
430 =category Paletted images
431
432 Searches the images palette for the given color.
433
434 On success sets *I<entry> to the index of the color, and returns true.
435
436 On failure returns false.
437
438 Always fails on direct color images.
439
440 =cut
441 */
442 int
443 (i_findcolor)(i_img *im, const i_color *color, i_palidx *entry) {
444   return i_findcolor(im, color, entry);
445 }
446
447 /*
448 =item i_setcolors(im, index, colors, count)
449
450 =category Paletted images
451
452 Sets I<count> colors starting from I<index> in the image's palette.
453
454 On sucess returns true.
455
456 On failure returns false.
457
458 The image must have at least I<index>+I<count> colors in it's palette
459 for this to succeed.
460
461 Always fails on direct color images.
462
463 =cut
464 */
465 int
466 (i_setcolors)(i_img *im, int index, const i_color *colors, int count) {
467   return i_setcolors(im, index, colors, count);
468 }
469