diff --git a/src/modules/Image/image.c b/src/modules/Image/image.c index 2ce9f46e328f4337ca732646a73a8f95ce9a839e..d52cb130c93041685f847c2584915214e4ad23a7 100644 --- a/src/modules/Image/image.c +++ b/src/modules/Image/image.c @@ -1,9 +1,9 @@ -/* $Id: image.c,v 1.132 1999/04/21 16:44:57 mirar Exp $ */ +/* $Id: image.c,v 1.133 1999/04/21 23:33:31 mirar Exp $ */ /* **! module Image **! note -**! $Id: image.c,v 1.132 1999/04/21 16:44:57 mirar Exp $ +**! $Id: image.c,v 1.133 1999/04/21 23:33:31 mirar Exp $ **! class Image **! **! The main object of the <ref>Image</ref> module, this object @@ -97,7 +97,7 @@ #include "stralloc.h" #include "global.h" -RCSID("$Id: image.c,v 1.132 1999/04/21 16:44:57 mirar Exp $"); +RCSID("$Id: image.c,v 1.133 1999/04/21 23:33:31 mirar Exp $"); #include "pike_macros.h" #include "object.h" #include "constants.h" @@ -3884,6 +3884,8 @@ void pike_module_init(void) tFunc(tOr3(tObj,tArr(tInt),tInt),tObj),0); ADD_FUNCTION("`/",image_operator_divide, tFunc(tOr3(tObj,tArr(tInt),tInt),tObj),0); + ADD_FUNCTION("`%",image_operator_rest, + tFunc(tOr3(tObj,tArr(tInt),tInt),tObj),0); ADD_FUNCTION("`&",image_operator_minimum, tFunc(tOr3(tObj,tArr(tInt),tInt),tObj),0); ADD_FUNCTION("`|",image_operator_maximum, diff --git a/src/modules/Image/image.h b/src/modules/Image/image.h index d34d8e102346d24ee69fa0ab14af1dea8667779f..0f4910b37753acda39394a966d5476156e8c0b31 100644 --- a/src/modules/Image/image.h +++ b/src/modules/Image/image.h @@ -1,7 +1,7 @@ /* **! module Image **! note -**! $Id: image.h,v 1.28 1999/04/21 16:45:00 mirar Exp $ +**! $Id: image.h,v 1.29 1999/04/21 23:33:34 mirar Exp $ */ #ifdef PIKE_IMAGE_IMAGE_H @@ -154,6 +154,7 @@ void image_operator_minus(INT32 args); void image_operator_plus(INT32 args); void image_operator_multiply(INT32 args); void image_operator_divide(INT32 args); +void image_operator_rest(INT32 args); void image_operator_maximum(INT32 args); void image_operator_minimum(INT32 args); diff --git a/src/modules/Image/operator.c b/src/modules/Image/operator.c index db8b8e3ce642bff1cd3987cc8975d8339e8876c9..cd6ce27135c4becda7895026af50120553469b78 100644 --- a/src/modules/Image/operator.c +++ b/src/modules/Image/operator.c @@ -1,9 +1,9 @@ -/* $Id: operator.c,v 1.21 1999/04/21 16:45:02 mirar Exp $ */ +/* $Id: operator.c,v 1.22 1999/04/21 23:33:29 mirar Exp $ */ /* **! module Image **! note -**! $Id: operator.c,v 1.21 1999/04/21 16:45:02 mirar Exp $ +**! $Id: operator.c,v 1.22 1999/04/21 23:33:29 mirar Exp $ **! class Image */ @@ -42,6 +42,7 @@ extern struct program *image_program; struct image *img,*oper=NULL; \ rgb_group *s1,*s2,*d; \ rgbl_group rgb; \ + rgb_group trgb; \ INT32 i; \ \ if (!THIS->img) error("no image\n"); \ @@ -63,8 +64,9 @@ extern struct program *image_program; else if (args && (sp[-args].type==T_ARRAY || \ sp[-args].type==T_OBJECT || \ sp[-args].type==T_STRING) && \ - image_color_arg(-args,&rgb)) \ + image_color_arg(-args,&trgb)) \ { \ + rgb.r=trgb.r; rgb.g=trgb.g; rgb.b=trgb.b; \ oper=NULL; \ } \ else \ @@ -227,37 +229,62 @@ STANDARD_OPERATOR_HEADER("`*") /* **! method object `/(object operand) -**! method object `/(array(int) color) +**! method object `/(Color color) **! method object `/(int value) -**! Multiplies pixel values and creates a new image. +**! method object `%(object operand) +**! method object `%(Color color) +**! method object `%(int value) +**! Divides pixel values and creates a new image from the result or +**! the rest. **! returns the new image object **! -**! This can be useful to lower the values of an image, -**! making it greyer, for instance: -**! -**! <pre>image=image/128+64;</pre> -**! **! arg object operand -**! the other image to multiply with; +**! the other image to divide with; **! the images must have the same size. -**! arg array(int) color -**! an array in format ({r,g,b}), this is equal -**! to using an uniform-colored image. +**! arg Color color **! arg int value -**! equal to ({value,value,value}). +**! if specified as color or value, it will act as a whole +**! image of that color (or value). **! -**! see also: `-, `+, `|, `&, add_layers +**! see also: `-, `+, `|, `&, `*, add_layers +**! +**! note: Divide is really not a/b but a/((b+1)/255). +**! It isn't possible to do a modulo 256 either. (why?) */ +void image_operator_rest(INT32 args) +{ + double q=1/255.0; +STANDARD_OPERATOR_HEADER("`%") + while (i--) + { + d->r=s1->r%(s2->r?s2->r:1); + d->g=s1->g%(s2->g?s2->g:1); + d->b=s1->b%(s2->b?s2->b:1); + s1++; s2++; d++; + } + else + while (i--) + { + d->r=s1->r%(rgb.r?rgb.r:1); + d->g=s1->g%(rgb.g?rgb.g:1); + d->b=s1->b%(rgb.b?rgb.b:1); + s1++; d++; + } + THREADS_DISALLOW(); + pop_n_elems(args); + push_object(o); +} + void image_operator_divide(INT32 args) { double q=1/255.0; -STANDARD_OPERATOR_HEADER("`*") +STANDARD_OPERATOR_HEADER("`/") while (i--) { - d->r=floor(s1->r/(q*(s2->r+1))+0.5); - d->g=floor(s1->g/(q*(s2->g+1))+0.5); - d->b=floor(s1->b/(q*(s2->b+1))+0.5); + d->r=testrange(floor(s1->r/(q*(s2->r+1))+0.5)); + d->g=testrange(floor(s1->g/(q*(s2->g+1))+0.5)); + d->b=testrange(floor(s1->b/(q*(s2->b+1))+0.5)); s1++; s2++; d++; } else @@ -273,6 +300,7 @@ STANDARD_OPERATOR_HEADER("`*") push_object(o); } + /* **! method object `|(object operand) **! method object `|(array(int) color)