From 2df3535aa8d03b36a0cd6c04ae7c611e721e7c03 Mon Sep 17 00:00:00 2001 From: Arnar Mar Hrafnkelsson Date: Wed, 16 May 2001 08:43:33 +0000 Subject: [PATCH] Added map.c which implements mapping images through tables. --- MANIFEST | 1 + Makefile.PL | 3 +- design/represent.txt | 5 ++- map.c | 94 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 101 insertions(+), 2 deletions(-) create mode 100644 map.c diff --git a/MANIFEST b/MANIFEST index f55468d0..93fda1cf 100644 --- a/MANIFEST +++ b/MANIFEST @@ -8,6 +8,7 @@ draw.c draw.h conv.c convert.c +map.c error.c gaussian.c ppport.h diff --git a/Makefile.PL b/Makefile.PL index 855c8af4..27ac85a7 100644 --- a/Makefile.PL +++ b/Makefile.PL @@ -61,7 +61,8 @@ if (defined $Config{'d_dlsymun'}) { $OSDEF .= ' -DDLSYMUN'; } @objs = qw(Imager.o draw.o image.o io.o iolayer.o log.o gaussian.o conv.o pnm.o raw.o feat.o font.o filters.o dynaload.o stackmach.o datatypes.o - regmach.o trans2.o quant.o error.o convert.o); + regmach.o trans2.o quant.o error.o convert.o + map.o); %opts=( 'NAME' => 'Imager', diff --git a/design/represent.txt b/design/represent.txt index f2610d31..28370d51 100644 --- a/design/represent.txt +++ b/design/represent.txt @@ -152,7 +152,10 @@ hence we need to support use of integer algorithms where appropriate. By preferring access via the functions we can reduce the possibility of incorrect access to the image data. -If an image interface function pointer isn't implemented, it should be set to NULL rather than being left uninitialized. This is so that use of the ununsed pointer results in an immediate crash rather than possibly calling the wrong function and crashing at some later point. +If an image interface function pointer isn't implemented, it should be +set to NULL rather than being left uninitialized. This is so that use +of the ununsed pointer results in an immediate crash rather than +possibly calling the wrong function and crashing at some later point. In a debug build of Imager the image interface functions should check that the correct type of image pointer is being passed in. This means diff --git a/map.c b/map.c new file mode 100644 index 00000000..0f9bd192 --- /dev/null +++ b/map.c @@ -0,0 +1,94 @@ +/* +=head1 NAME + + map.c - inplace image mapping and related functionality + +=head1 SYNOPSIS + + i_map(srcimage, coeffs, outchans, inchans) + +=head1 DESCRIPTION + +Converts images from one format to another, typically in this case for +converting from RGBA to greyscale and back. + +=over + +=cut +*/ + +#include "image.h" + + +/* +=item i_map(im, mapcount, maps, chmasks) + +maps im inplace into another image. + + Each map is a unsigned char array of 256 entries, its corresponding + channel mask is the same numbered entry in the chmasks array. + If two maps apply to the same channel then the second one is used. + If no map applies to a channel then that channel is not altered. + mapcount is the number of maps. + +=cut +*/ + +void +i_map(i_img *im, int mapcount, unsigned char (*maps)[256], unsigned int *chmasks) { + i_color *vals; + int x, y; + int mapno, i, ch; + unsigned int mask = 0; + unsigned char (**cmaps)[256]; + int minset = -1, maxset; + + mm_log((1,"i_map(im %p, mapcount %d, maps %p, chmasks %p)\n", im, mapcount, maps, chmasks)); + + + for(mapno=0; mapnochannels; i++) + if (mask & (1<channels); + memset(cmaps, 0, sizeof(unsigned char (*)[256])*im->channels); + for(mapno=0; mapnochannels; ch++) + if (chmasks[i] & (1<xsize); + for (y = 0; y < im->ysize; ++y) { + i_glin(im, 0, im->xsize, y, vals); + for (x = 0; x < im->xsize; ++x) { + int lidx = x * im->channels; + for(ch = minset; ch<=maxset; ch++) { + if (!cmaps[ch]) continue; + vals[lidx].channel[ch] = (*cmaps[ch])[vals[lidx].channel[ch]]; + } + } + i_plin(im, 0, im->xsize, y, vals); + } + myfree(cmaps); + myfree(vals); +} + +/* +=back + +=head1 SEE ALSO + +Imager(3) + +=head1 AUTHOR + +Arnar M. Hrafnkelsson + +=cut +*/ -- 2.39.5