- start of external Imager API access:
[imager.git] / map.c
CommitLineData
2df3535a
AMH
1/*
2=head1 NAME
3
4 map.c - inplace image mapping and related functionality
5
6=head1 SYNOPSIS
7
8 i_map(srcimage, coeffs, outchans, inchans)
9
10=head1 DESCRIPTION
11
12Converts images from one format to another, typically in this case for
13converting from RGBA to greyscale and back.
14
15=over
16
17=cut
18*/
19
92bda632 20#include "imager.h"
2df3535a
AMH
21
22
23/*
24=item i_map(im, mapcount, maps, chmasks)
25
26maps im inplace into another image.
27
28 Each map is a unsigned char array of 256 entries, its corresponding
29 channel mask is the same numbered entry in the chmasks array.
30 If two maps apply to the same channel then the second one is used.
31 If no map applies to a channel then that channel is not altered.
32 mapcount is the number of maps.
33
34=cut
35*/
36
37void
85ac7c04 38i_map(i_img *im, unsigned char (*maps)[256], unsigned int mask) {
2df3535a
AMH
39 i_color *vals;
40 int x, y;
a659442a 41 int i, ch;
2df3535a
AMH
42 int minset = -1, maxset;
43
40eba1ea 44 mm_log((1,"i_map(im %p, maps %p, chmask %u)\n", im, maps, mask));
2df3535a 45
2df3535a
AMH
46 if (!mask) return; /* nothing to do here */
47
2df3535a
AMH
48 for(i=0; i<im->channels; i++)
49 if (mask & (1<<i)) {
50 if (minset == -1) minset = i;
51 maxset = i;
52 }
40eba1ea
AMH
53
54 mm_log((1, "minset=%d maxset=%d\n", minset, maxset));
55
2df3535a 56 vals = mymalloc(sizeof(i_color) * im->xsize);
40eba1ea 57
2df3535a
AMH
58 for (y = 0; y < im->ysize; ++y) {
59 i_glin(im, 0, im->xsize, y, vals);
60 for (x = 0; x < im->xsize; ++x) {
2df3535a 61 for(ch = minset; ch<=maxset; ch++) {
85ac7c04 62 if (!maps[ch]) continue;
40eba1ea 63 vals[x].channel[ch] = maps[ch][vals[x].channel[ch]];
2df3535a
AMH
64 }
65 }
66 i_plin(im, 0, im->xsize, y, vals);
67 }
2df3535a
AMH
68 myfree(vals);
69}
70
71/*
72=back
73
74=head1 SEE ALSO
75
76Imager(3)
77
78=head1 AUTHOR
79
80Arnar M. Hrafnkelsson <addi@umich.edu>
81
82=cut
83*/