diff --git a/src/modules/Image/layer_oper.h b/src/modules/Image/layer_oper.h index b1dafc705cb71c596b491925a1a7366ace493db6..f99e211004e56f288d06cc7bc4919b059c01c3df 100644 --- a/src/modules/Image/layer_oper.h +++ b/src/modules/Image/layer_oper.h @@ -1,5 +1,94 @@ /* template for operator layer row function */ +static void LM_FUNC(rgb_group *s,rgb_group *l,rgb_group *d, + rgb_group *sa,rgb_group *la,rgb_group *da, + int len,double alpha) +{ + if (alpha==0.0) + { + MEMCPY(d,s,sizeof(rgb_group)*len); + MEMCPY(da,sa,sizeof(rgb_group)*len); + return; + } + else if (alpha==1.0) + { + if (!la) /* no layer alpha => full opaque */ + while (len--) + { + d->r=L_TRUNC(L_OPER(s->r,l->r)); + d->g=L_TRUNC(L_OPER(s->g,l->g)); + d->b=L_TRUNC(L_OPER(s->b,l->b)); + *da=white; + l++; s++; sa++; da++; d++; + } + else + while (len--) + { + if (la->r==COLORMAX && la->g==COLORMAX && la->b==COLORMAX) + { + d->r=L_TRUNC(L_OPER(s->r,l->r)); + d->g=L_TRUNC(L_OPER(s->g,l->g)); + d->b=L_TRUNC(L_OPER(s->b,l->b)); + *da=white; +#ifdef L_USE_SA + *da=*sa; +#endif + } + else if (la->r==0 && la->g==0 && la->b==0) + { + *d=*s; + *da=*sa; + } + else + { + d->r=L_TRUNC(L_OPER(s->r,l->r)); + ALPHA_ADD(s,d,d,sa,la,da,r); + d->g=L_TRUNC(L_OPER(s->g,l->g)); + ALPHA_ADD(s,d,d,sa,la,da,g); + d->b=L_TRUNC(L_OPER(s->b,l->b)); + ALPHA_ADD(s,d,d,sa,la,da,b); +#ifdef L_USE_SA + *da=*sa; +#endif + } + l++; s++; la++; sa++; da++; d++; + } + } + else + { + if (!la) /* no layer alpha => full opaque */ + while (len--) + { + d->r=L_TRUNC(L_OPER(s->r,l->r)); + ALPHA_ADD_V_NOLA(s,d,d,sa,da,alpha,r); + d->g=L_TRUNC(L_OPER(s->g,l->g)); + ALPHA_ADD_V_NOLA(s,d,d,sa,da,alpha,g); + d->b=L_TRUNC(L_OPER(s->b,l->b)); + ALPHA_ADD_V_NOLA(s,d,d,sa,da,alpha,b); +#ifdef L_USE_SA + *da=*sa; +#endif + l++; s++; sa++; da++; d++; + } + else + while (len--) + { + d->r=L_TRUNC(L_OPER(s->r,l->r)); + ALPHA_ADD_V(s,d,d,sa,la,da,alpha,r); + d->g=L_TRUNC(L_OPER(s->g,l->g)); + ALPHA_ADD_V(s,d,d,sa,la,da,alpha,g); + d->b=L_TRUNC(L_OPER(s->b,l->b)); + ALPHA_ADD_V(s,d,d,sa,la,da,alpha,b); +#ifdef L_USE_SA + *da=*sa; +#endif + l++; s++; la++; sa++; da++; d++; + } + } +} +/* old code */ +#if 0 + static void LM_FUNC(rgb_group *s,rgb_group *l,rgb_group *d, rgb_group *sa,rgb_group *la,rgb_group *da, int len,double alpha) @@ -62,3 +151,5 @@ static void LM_FUNC(rgb_group *s,rgb_group *l,rgb_group *d, } } } + +#endif diff --git a/src/modules/Image/layers.c b/src/modules/Image/layers.c index 337ce1a05778da1def432206be08f440bac53ab8..6abfe4c4b152120c775832b1496527bf8260dadb 100644 --- a/src/modules/Image/layers.c +++ b/src/modules/Image/layers.c @@ -1,7 +1,7 @@ /* **! module Image **! note -**! $Id: layers.c,v 1.9 1999/04/23 15:50:41 mirar Exp $ +**! $Id: layers.c,v 1.10 1999/04/23 23:45:27 mirar Exp $ **! class Layer */ @@ -10,7 +10,7 @@ #include <math.h> /* floor */ -RCSID("$Id: layers.c,v 1.9 1999/04/23 15:50:41 mirar Exp $"); +RCSID("$Id: layers.c,v 1.10 1999/04/23 23:45:27 mirar Exp $"); #include "config.h" @@ -190,9 +190,11 @@ subtract Pd=Ps-Pl multiply Pd=Ps*Pl divide Pd=Ps/Pl invmodulo Pd=Ps%Pl (measured in color values) -invsubtract Pd=Pl*Al-Ps -invdivide Pd=Pl/Ps -invmodulo Pd=Pl%Ps (measured in color values) + +invsubtract Pd=Pl-Ps | keeps alpha +invdivide Pd=Pl/Ps | from below +invmodulo Pd=Pl%Ps (measured in color values) | + difference Pd=abs(Ps-Pl) min Pd=min(Ps,Pl) max Pd=max(Ps,Pl) @@ -1160,14 +1162,6 @@ static void lm_normal(rgb_group *s,rgb_group *l,rgb_group *d, #undef L_TRUNC #undef L_OPER -#define LM_FUNC lm_invsubtract -#define L_TRUNC(X) MAXIMUM(0,(X)) -#define L_OPER(A,B) ((B)-(int)(A)) -#include "layer_oper.h" -#undef LM_FUNC -#undef L_TRUNC -#undef L_OPER - #define LM_FUNC lm_multiply #define L_TRUNC(X) (X) #define L_OPER(A,B) CCUT((A)*(int)(B)) @@ -1192,6 +1186,16 @@ static void lm_normal(rgb_group *s,rgb_group *l,rgb_group *d, #undef L_TRUNC #undef L_OPER +#define L_USE_SA + +#define LM_FUNC lm_invsubtract +#define L_TRUNC(X) MAXIMUM(0,(X)) +#define L_OPER(A,B) ((B)-(int)(A)) +#include "layer_oper.h" +#undef LM_FUNC +#undef L_TRUNC +#undef L_OPER + #define LM_FUNC lm_invdivide #define L_TRUNC(X) MINIMUM(255,(X)) #define L_OPER(A,B) ((B)/C2F(1+(int)(A))) @@ -1202,12 +1206,14 @@ static void lm_normal(rgb_group *s,rgb_group *l,rgb_group *d, #define LM_FUNC lm_invmodulo #define L_TRUNC(X) ((COLORTYPE)(X)) -#define L_OPER(A,B) ((B)%(A)) +#define L_OPER(A,B) ((B)%((A)?(A):1)) #include "layer_oper.h" #undef LM_FUNC #undef L_TRUNC #undef L_OPER +#undef L_USE_SA + #define LM_FUNC lm_difference #define L_TRUNC(X) ((COLORTYPE)(X)) #define L_OPER(A,B) abs((A)-(B))