diff --git a/src/modules/Image/layers.c b/src/modules/Image/layers.c index 30a8af0ad4d917a26a5102470aea790be6901aed..d6cd3d601baa99d6bf6a269e06f8ef009afec189 100644 --- a/src/modules/Image/layers.c +++ b/src/modules/Image/layers.c @@ -1,14 +1,14 @@ /* **! module Image **! note -**! $Id: layers.c,v 1.2 1999/04/18 22:04:20 mirar Exp $ +**! $Id: layers.c,v 1.3 1999/04/19 16:50:47 mirar Exp $ **! class Layer */ #include "global.h" #include <config.h> -RCSID("$Id: layers.c,v 1.2 1999/04/18 22:04:20 mirar Exp $"); +RCSID("$Id: layers.c,v 1.3 1999/04/19 16:50:47 mirar Exp $"); #include "config.h" @@ -154,7 +154,7 @@ struct layer_mode_desc /* {"screen", lm_screen, 1, NULL }, */ /* {"overlay", lm_overlay, 1, NULL }, */ /* {"difference", lm_difference, 1, NULL }, */ -/* {"addition", lm_addition, 1, NULL }, */ +/* {"add", lm_addition, 1, NULL }, */ /* {"subtract", lm_subtract, 1, NULL }, */ /* {"darken", lm_darken, 1, NULL }, */ /* {"lighten", lm_lighten, 1, NULL }, */ @@ -169,6 +169,49 @@ struct layer_mode_desc #define LAYER_MODES ((int)NELEM(layer_mode)) +/* + +Px=pixel, Ax=alpha [0-1], Rx,Gx,Bx, Hx,Sx,Vx = kanaler +Xs=k�llbild +Xl=aktuellt lager +Xd=m�lbild + +normal Pd=(Pl*Al+Ps*(1-Al)*As)/(Al+(1-Al)*As) + Ad=(Al+(1-Al)*As) + +add Pd=Pl*Al+Ps*As + Ad=(Al+(1-Al)*As) + +subtract Pd=Ps-Pl*Al + Ad=(Al+(1-Al)*As) + +multiply Pd=Ps*Pl + Ad=(Al+(1-Al)*As) + +divide Pd=Ps/Pl + Ad=As + +dissolve i=round(random(Al)) typ + Pd=Al*i+As*(1-i) + Ad=i+As + +behind +screen +overlay +difference +darken +lighten +hue +saturation +color +value +erase +replace + +*/ + + + /*** layer helpers ****************************************/ static INLINE void smear_color(rgb_group *d,rgb_group s,int len) @@ -305,6 +348,7 @@ static void image_layer_image(INT32 args) push_int(0); } + static void image_layer_alpha(INT32 args) { pop_n_elems(args); @@ -811,7 +855,7 @@ static void image_layer_cast(INT32 args) /*** layer helpers ************************************/ -#define ALPHA_METHOD_INT +#define ALPHA_METHOD_FLOAT #ifdef ALPHA_METHOD_INT @@ -834,26 +878,27 @@ static void image_layer_cast(INT32 args) #ifdef ALPHA_METHOD_FLOAT #define qMAX (1.0/COLORMAX) -#define C2F(Z) (qMAX*Z) +#define C2F(Z) (qMAX*(Z)) #define CCUT(Z) ((COLORTYPE)(qMAX*Z)) #define COMBINE_ALPHA(S,L,aS,aL) \ - ( (COLORTYPE)( ( (S)*(1.0-C2F(aL)*C2F(aS)) + (L)*C2F(aL) ) / - ( C2F(aL)+(1-C2F(aL))*C2F(aS)) ) ) + ( (COLORTYPE)( ( (S)*(1.0-C2F(aL))*C2F(aS) + (L)*C2F(aL) ) / \ + ( (C2F(aL)+(1-C2F(aL))*C2F(aS))) ) ) #define COMBINE_ALPHA_V(S,L,aS,aL,V) \ COMBINE_ALPHA(S,(L)*(V),aS,aL) #define COMBINE_ALPHA_SUM(aS,aL) \ - ((COLORTYPE)(COLORMAX*(C2F(aL)+(1.0-C2F(aL))*aS)) + ((COLORTYPE)(COLORMAX*(C2F(aL)+(1.0-C2F(aL))*C2F(aS)))) #define COMBINE_ALPHA_SUM_V(aS,aL,V) \ COMBINE_ALPHA_SUM(aS,(aL)*(V)) #else /* unknown ALPHA_METHOD */ #error unknown ALPHA_METHOD -#endif ALPHA_METHOD_FLOAT +#endif /* ALPHA_METHOD_FLOAT */ + +#endif -#endif ALPHA_INT_IS_FASTER /*** layer mode definitions ***************************/ @@ -966,6 +1011,12 @@ static void lm_normal(rgb_group *s,rgb_group *l,rgb_group *d, } +static void lm_add(rgb_group *s,rgb_group *l,rgb_group *d, + rgb_group *sa,rgb_group *la,rgb_group *da, + int len,float alpha) + { + } + /*** the add-layer function ***************************/ static void INLINE img_lay_first_line(struct layer *l,