refer to the right test
[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
20#include "image.h"
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;
41 int mapno, i, ch;
2df3535a
AMH
42 int minset = -1, maxset;
43
85ac7c04 44 mm_log((1,"i_map(im %p, maps %p, chmask %ud)\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 }
2df3535a
AMH
53
54 vals = mymalloc(sizeof(i_color) * im->xsize);
55 for (y = 0; y < im->ysize; ++y) {
56 i_glin(im, 0, im->xsize, y, vals);
57 for (x = 0; x < im->xsize; ++x) {
58 int lidx = x * im->channels;
59 for(ch = minset; ch<=maxset; ch++) {
85ac7c04
AMH
60 if (!maps[ch]) continue;
61 vals[lidx].channel[ch] = maps[ch][vals[lidx].channel[ch]];
2df3535a
AMH
62 }
63 }
64 i_plin(im, 0, im->xsize, y, vals);
65 }
2df3535a
AMH
66 myfree(vals);
67}
68
69/*
70=back
71
72=head1 SEE ALSO
73
74Imager(3)
75
76=head1 AUTHOR
77
78Arnar M. Hrafnkelsson <addi@umich.edu>
79
80=cut
81*/