forked from tTh/FloatImg
		
	
		
			
				
	
	
		
			146 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			146 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  *		OPERATORS
 | |
|  *
 | |
|  *
 | |
|  */
 | |
| 
 | |
| #include  <stdio.h>
 | |
| #include  <stdlib.h>
 | |
| #include  <unistd.h>
 | |
| #include  <string.h>
 | |
| #include  <math.h>
 | |
| 
 | |
| #include  "../floatimg.h"
 | |
| 
 | |
| extern int verbosity;		/* must be declared around main() */
 | |
| 
 | |
| /* ---------------------------------------------------------------- */
 | |
| int fimg_add(FloatImg *a, FloatImg *b, FloatImg *d)
 | |
| {
 | |
| int		idx, nbiter;
 | |
| 
 | |
| #if DEBUG_LEVEL
 | |
| fprintf(stderr, ">>> %s ( %p %p %p )\n", __func__, a, b, d);
 | |
| #endif
 | |
| 
 | |
| if (3 != a->type || 3 != b->type || 3 != d->type) {
 | |
| 	fprintf(stderr, "%s : got a bad type fimg\n", __func__);
 | |
| 	return -8;
 | |
| 	} 
 | |
| 
 | |
| nbiter = a->width * a->height;
 | |
| 
 | |
| for (idx=0; idx<nbiter; idx++) {
 | |
| 	d->R[idx] = a->R[idx] + b->R[idx];
 | |
| 	d->G[idx] = a->G[idx] + b->G[idx];
 | |
| 	d->B[idx] = a->B[idx] + b->B[idx];
 | |
| 	}
 | |
| 
 | |
| return 0;
 | |
| }
 | |
| /* ---------------------------------------------------------------- */
 | |
| /*
 | |
|  *		A - B -> D
 | |
|  */
 | |
| int fimg_sub(FloatImg *a, FloatImg *b, FloatImg *d)
 | |
| {
 | |
| int		idx, nbiter;
 | |
| 
 | |
| #if DEBUG_LEVEL
 | |
| fprintf(stderr, ">>> %s ( %p %p %p )\n", __func__, a, b, d);
 | |
| #endif
 | |
| 
 | |
| if (3 != a->type || 3 != b->type || 3 != d->type) {
 | |
| 	fprintf(stderr, "%s : got a bad type fimg\n", __func__);
 | |
| 	return -8;
 | |
| 	} 
 | |
| 
 | |
| nbiter = a->width * a->height;
 | |
| 
 | |
| for (idx=0; idx<nbiter; idx++) {
 | |
| 	d->R[idx] = fabs(a->R[idx] - b->R[idx]);
 | |
| 	d->G[idx] = fabs(a->G[idx] - b->G[idx]);
 | |
| 	d->B[idx] = fabs(a->B[idx] - b->B[idx]);
 | |
| 	}
 | |
| 
 | |
| return 0;
 | |
| }
 | |
| /* ---------------------------------------------------------------- */
 | |
| /*
 | |
|  *		A * B -> D
 | |
|  */
 | |
| int fimg_mul(FloatImg *a, FloatImg *b, FloatImg *d)
 | |
| {
 | |
| int		idx, nbiter;
 | |
| 
 | |
| #if DEBUG_LEVEL
 | |
| fprintf(stderr, ">>> %s ( %p %p %p )\n", __func__, a, b, d);
 | |
| #endif
 | |
| 
 | |
| if (3 != a->type || 3 != b->type || 3 != d->type) {
 | |
| 	fprintf(stderr, "%s : got a bad type fimg\n", __func__);
 | |
| 	return -8;
 | |
| 	} 
 | |
| 
 | |
| nbiter = a->width * a->height;
 | |
| 
 | |
| for (idx=0; idx<nbiter; idx++) {
 | |
| 	d->R[idx] = a->R[idx] * b->R[idx];
 | |
| 	d->G[idx] = a->G[idx] * b->G[idx];
 | |
| 	d->B[idx] = a->B[idx] * b->B[idx];
 | |
| 	}
 | |
| 
 | |
| return 0;
 | |
| }
 | |
| /* ---------------------------------------------------------------- */
 | |
| int fimg_minimum(FloatImg *a, FloatImg *b, FloatImg *d)
 | |
| {
 | |
| int		idx, nbiter;
 | |
| 
 | |
| #if DEBUG_LEVEL
 | |
| fprintf(stderr, ">>> %s ( %p %p %p )\n", __func__, a, b, d);
 | |
| #endif
 | |
| 
 | |
| if (3 != a->type || 3 != b->type || 3 != d->type) {
 | |
| 	fprintf(stderr, "%s : got a bad type fimg\n", __func__);
 | |
| 	return -8;
 | |
| 	}
 | |
| 
 | |
| nbiter = a->width * a->height * 3;
 | |
| 
 | |
| for (idx=0; idx<nbiter; idx++) {
 | |
| 	if (a->R[idx] > b->R[idx])
 | |
| 			d->R[idx] = a->R[idx];
 | |
| 	else
 | |
| 			d->R[idx] = b->R[idx];
 | |
| 	}
 | |
| 
 | |
| return 0;
 | |
| }
 | |
| /* ---------------------------------------------------------------- */
 | |
| int fimg_maximum(FloatImg *a, FloatImg *b, FloatImg *d)
 | |
| {
 | |
| int		idx, nbiter;
 | |
| 
 | |
| #if DEBUG_LEVEL
 | |
| fprintf(stderr, ">>> %s ( %p %p %p )\n", __func__, a, b, d);
 | |
| #endif
 | |
| 
 | |
| if (3 != a->type || 3 != b->type || 3 != d->type) {
 | |
| 	fprintf(stderr, "%s : got a bad type fimg\n", __func__);
 | |
| 	return -8;
 | |
| 	}
 | |
| 
 | |
| nbiter = a->width * a->height * 3;
 | |
| 
 | |
| for (idx=0; idx<nbiter; idx++) {
 | |
| 	if (a->R[idx] < b->R[idx])
 | |
| 			d->R[idx] = a->R[idx];
 | |
| 	else
 | |
| 			d->R[idx] = b->R[idx];
 | |
| 	}
 | |
| 
 | |
| return 0;
 | |
| }
 | |
| /* ---------------------------------------------------------------- */
 |