(rt #127575) link to Imager::Install from Imager::Files
[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++) {
85ac7c04 66 if (!maps[ch]) continue;
40eba1ea 67 vals[x].channel[ch] = maps[ch][vals[x].channel[ch]];
2df3535a
AMH
68 }
69 }
70 i_plin(im, 0, im->xsize, y, vals);
71 }
2df3535a
AMH
72 myfree(vals);
73}
74
75/*
76=back
77
78=head1 SEE ALSO
79
80Imager(3)
81
82=head1 AUTHOR
83
84Arnar M. Hrafnkelsson <addi@umich.edu>
85
86=cut
87*/