From d88313b69ae7cc6ed87c3e016c0234e09a515b53 Mon Sep 17 00:00:00 2001 From: Per Hedbor <ph@opera.com> Date: Mon, 28 Jun 1999 02:43:06 +0200 Subject: [PATCH] Added screen and overlay modes. Fixed set_alpha_value (wrong functionpointer in add_function, and alpha >= 1 instead of > 1 in the actual function) Rev: src/modules/Image/layers.c:1.22 --- src/modules/Image/layers.c | 37 +++++++++++++++++++++++++++++++------ 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/src/modules/Image/layers.c b/src/modules/Image/layers.c index 18f7e2b0b2..d5c022659c 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.21 1999/06/22 19:26:00 mirar Exp $ +**! $Id: layers.c,v 1.22 1999/06/28 00:43:06 per Exp $ **! class Layer **! see also: layers **! @@ -152,7 +152,7 @@ #include <math.h> /* floor */ -RCSID("$Id: layers.c,v 1.21 1999/06/22 19:26:00 mirar Exp $"); +RCSID("$Id: layers.c,v 1.22 1999/06/28 00:43:06 per Exp $"); #include "image_machine.h" @@ -277,6 +277,9 @@ LMFUNC(lm_dissolve); LMFUNC(lm_behind); LMFUNC(lm_erase); +LMFUNC(lm_screen); +LMFUNC(lm_overlay); + struct layer_mode_desc { char *name; @@ -331,8 +334,8 @@ struct layer_mode_desc {"behind", lm_behind, 1, NULL }, {"erase", lm_erase, 1, NULL }, -/* {"screen", lm_screen, 1, NULL }, */ -/* {"overlay", lm_overlay, 1, NULL }, */ + {"screen", lm_screen, 1, NULL }, + {"overlay", lm_overlay, 1, NULL }, } ; #define LAYER_MODES ((int)NELEM(layer_mode)) @@ -727,7 +730,7 @@ static void image_layer_set_alpha_value(INT32 args) { float f; get_all_args("Image.Layer->set_alpha_value",args,"%F",&f); - if (f<0.0 || f>=1.0) + if (f<0.0 || f>1.0) SIMPLE_BAD_ARG_ERROR("Image.Layer->set_alpha_value",1,"float(0..1)"); THIS->alpha_value=f; } @@ -1606,6 +1609,27 @@ static void lm_normal(rgb_group *s,rgb_group *l,rgb_group *d, #undef L_CHANNEL_DO_V #undef LM_FUNC +/* screen: 255 - ((255-A)*(255-B)/255) */ + +#define LM_FUNC lm_screen +#define L_TRUNC(X) (X<0?0:(X>255?255:X)) +#define L_OPER(A,B) 255 - CCUT((255-A)*(int)(255-B)) +#include "layer_oper.h" +#undef LM_FUNC +#undef L_TRUNC +#undef L_OPER + +#define LM_FUNC lm_overlay +#define L_TRUNC(X) (X) +#define INT_MULT(a,b) (((a) * (b) + 0x80)>>8) +#define INT_BLEND(a,b,alpha) (INT_MULT((a)-(b), alpha) + (b)) +#define L_OPER(A,B) INT_BLEND((255-INT_MULT((255-A),(255-B))),INT_MULT(A,B),A) +/* screen mult source */ +#include "layer_oper.h" +#undef LM_FUNC +#undef L_TRUNC +#undef L_OPER + /* darken: min v */ #define LM_FUNC lm_darken @@ -2475,7 +2499,8 @@ void init_image_layers(void) ADD_FUNCTION("set_fill",image_layer_set_fill, tFunc(tOr(tObj,tVoid) tOr(tObj,tVoid),tObj),0); ADD_FUNCTION("set_mode",image_layer_set_mode,tFunc(tStr,tObj),0); - ADD_FUNCTION("set_alpha_value",image_layer_set_mode,tFunc(tFloat,tObj),0); + ADD_FUNCTION("set_alpha_value",image_layer_set_alpha_value, + tFunc(tFloat,tObj),0); ADD_FUNCTION("set_tiled",image_layer_set_tiled,tFunc(tInt,tObj),0); /* query */ -- GitLab