]> git.imager.perl.org - imager.git/blame - map.c
add new comparison method rgb_difference that resembles arithmetical difference per...
[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 39 i_color *vals;
8d14daab 40 i_img_dim x, y;
a659442a 41 int i, ch;
b07bc64b 42 int minset = -1, maxset = 0;
2df3535a 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
785364c1 48 for(i=0; i<im->channels; i++) {
2df3535a
AMH
49 if (mask & (1<<i)) {
50 if (minset == -1) minset = i;
51 maxset = i;
52 }
785364c1 53 }
40eba1ea
AMH
54
55 mm_log((1, "minset=%d maxset=%d\n", minset, maxset));
56
785364c1
TC
57 if (minset == -1)
58 return;
59
2df3535a 60 vals = mymalloc(sizeof(i_color) * im->xsize);
40eba1ea 61
2df3535a
AMH
62 for (y = 0; y < im->ysize; ++y) {
63 i_glin(im, 0, im->xsize, y, vals);
64 for (x = 0; x < im->xsize; ++x) {
2df3535a 65 for(ch = minset; ch<=maxset; ch++) {
35ec3a87
TC
66 if (!(mask & (1 << ch)))
67 continue;
40eba1ea 68 vals[x].channel[ch] = maps[ch][vals[x].channel[ch]];
2df3535a
AMH
69 }
70 }
71 i_plin(im, 0, im->xsize, y, vals);
72 }
2df3535a
AMH
73 myfree(vals);
74}
75
76/*
77=back
78
79=head1 SEE ALSO
80
81Imager(3)
82
83=head1 AUTHOR
84
85Arnar M. Hrafnkelsson <addi@umich.edu>
86
87=cut
88*/