diff --git a/src/modules/Image/colors.c b/src/modules/Image/colors.c index 38f557f5e0478022d36aee23c2b0e8117f31b70d..e88bfd3a16e45190cfe0c5a28a29c2a203800b83 100644 --- a/src/modules/Image/colors.c +++ b/src/modules/Image/colors.c @@ -1,7 +1,7 @@ /* **! module Image **! note -**! $Id: colors.c,v 1.17 1999/05/23 17:46:38 mirar Exp $ +**! $Id: colors.c,v 1.18 1999/05/24 12:09:35 mirar Exp $ **! submodule Color **! **! This module keeps names and easy handling @@ -97,7 +97,7 @@ #include "global.h" #include <config.h> -RCSID("$Id: colors.c,v 1.17 1999/05/23 17:46:38 mirar Exp $"); +RCSID("$Id: colors.c,v 1.18 1999/05/24 12:09:35 mirar Exp $"); #include "config.h" @@ -946,7 +946,7 @@ int image_color_svalue(struct svalue *v,rgb_group *rgb) if (sp[-1].type==T_OBJECT) { struct color_struct *cs=(struct color_struct*) - get_storage(v->u.object,image_color_program); + get_storage(sp[-1].u.object,image_color_program); *rgb=cs->rgb; pop_stack(); return 1; @@ -995,116 +995,118 @@ static void image_get_color(INT32 args) if (!colors) make_colors(); - mapping_index_no_free(&s,colors,sp-1); - if (s.type==T_INT) + if (sp[-1].type==T_STRING) { - object_index_no_free2(&s,THISOBJ,sp-1); - if (s.type!=T_INT) + mapping_index_no_free(&s,colors,sp-1); + if (s.type==T_OBJECT) { pop_stack(); *(sp++)=s; return; } + else + free_svalue(&s); + } - if (sp[-1].type==T_STRING && - sp[-1].u.string->size_shift==0) + if (sp[-1].type==T_STRING && + sp[-1].u.string->size_shift==0) + { + if (sp[-1].u.string->len>=4 && + sp[-1].u.string->str[0]=='#') { - if (sp[-1].u.string->len>=4 && - sp[-1].u.string->str[0]=='#') - { - /* #rgb, #rrggbb, #rrrgggbbb, etc */ + /* #rgb, #rrggbb, #rrrgggbbb, etc */ - unsigned long i=sp[-1].u.string->len-1,j,k,rgb[3]; - unsigned char *src=sp[-1].u.string->str+1; - if (!(i%3)) + unsigned long i=sp[-1].u.string->len-1,j,k,rgb[3]; + unsigned char *src=sp[-1].u.string->str+1; + if (!(i%3)) + { + i/=3; + for (j=0; j<3; j++) { - i/=3; - for (j=0; j<3; j++) + unsigned INT32 z=0; + for (k=0; k<i; k++) { - unsigned INT32 z=0; - for (k=0; k<i; k++) - { - if (HEXTONUM(*src)==-1) - { - pop_stack(); - push_int(0); - sp[-1].subtype=NUMBER_UNDEFINED; - return; - } - z=z*16+HEXTONUM(*src),src++; - } - switch (i) + if (HEXTONUM(*src)==-1) { - case 1: z=(z*0x11111111)>>(32-COLORLBITS); break; - case 2: z=(z*0x01010101)>>(32-COLORLBITS); break; - case 3: z=(z*0x00100100+(z>>8))>>(32-COLORLBITS); break; - - case 4: - case 5: - case 6: - case 7: - case 8: - if (i*4<COLORLBITS) - z=(z<<(COLORLBITS-i*4))+(z>>(i*8-COLORLBITS)); - else - z=z>>(i*4-COLORLBITS); - break; + pop_stack(); + push_int(0); + sp[-1].subtype=NUMBER_UNDEFINED; + return; } - rgb[j]=z; + z=z*16+HEXTONUM(*src),src++; + } + switch (i) + { + case 1: z=(z*0x11111111)>>(32-COLORLBITS); break; + case 2: z=(z*0x01010101)>>(32-COLORLBITS); break; + case 3: z=(z*0x00100100+(z>>8))>>(32-COLORLBITS); break; + + case 4: + case 5: + case 6: + case 7: + case 8: + if (i*4<COLORLBITS) + z=(z<<(COLORLBITS-i*4))+(z>>(i*8-COLORLBITS)); + else + z=z>>(i*4-COLORLBITS); + break; } - pop_n_elems(args); - _image_make_rgbl_color((INT32)rgb[0], - (INT32)rgb[1], - (INT32)rgb[2]); - return; + rgb[j]=z; } + pop_n_elems(args); + _image_make_rgbl_color((INT32)rgb[0], + (INT32)rgb[1], + (INT32)rgb[2]); + return; } - if (sp[-1].u.string->len>=4 && - sp[-1].u.string->str[0]=='@') + } + if (sp[-1].u.string->len>=4 && + sp[-1].u.string->str[0]=='@') + { + /* @h,s,v; h=0..359, s,v=0..100 */ + stack_dup(); + push_text("@%f,%f,%f\n"); + f_sscanf(2); + if (sp[-1].type==T_ARRAY && + sp[-1].u.array->size==3) { - /* @h,s,v; h=0..359, s,v=0..100 */ - stack_dup(); - push_text("@%f,%f,%f\n"); - f_sscanf(2); - if (sp[-1].type==T_ARRAY && - sp[-1].u.array->size==3) - { - float h,s,v; - stack_swap(); - pop_stack(); - sp--; - push_array_items(sp->u.array); - get_all_args("Image.Color()",3,"%f%f%f",&h,&s,&v); - pop_n_elems(3); - push_int((INT32)(h/360.0*256.0)); - push_int((INT32)(s/100.0*255.4)); - push_int((INT32)(v/100.0*255.4)); - image_make_hsv_color(3); - return; - } + float h,s,v; + stack_swap(); pop_stack(); + sp--; + push_array_items(sp->u.array); + get_all_args("Image.Color()",3,"%f%f%f",&h,&s,&v); + pop_n_elems(3); + push_int((INT32)(h/360.0*256.0)); + push_int((INT32)(s/100.0*255.4)); + push_int((INT32)(v/100.0*255.4)); + image_make_hsv_color(3); + return; } - if (sp[-1].u.string->len>=4 && - sp[-1].u.string->str[0]=='%') + pop_stack(); + } + if (sp[-1].u.string->len>=4 && + sp[-1].u.string->str[0]=='%') + { + /* @c,m,y,k; 0..100 */ + stack_dup(); + push_text("%%%f,%f,%f,%f\n"); + f_sscanf(2); + if (sp[-1].type==T_ARRAY && + sp[-1].u.array->size==4) { - /* @c,m,y,k; 0..100 */ - stack_dup(); - push_text("%%%f,%f,%f,%f\n"); - f_sscanf(2); - if (sp[-1].type==T_ARRAY && - sp[-1].u.array->size==4) - { - stack_swap(); - pop_stack(); - sp--; - push_array_items(sp->u.array); - image_make_cmyk_color(4); - return; - } + stack_swap(); pop_stack(); + sp--; + push_array_items(sp->u.array); + image_make_cmyk_color(4); + return; } - for (n=0; (size_t)n<sizeof(callables)/sizeof(callables[0]); n++) - if (sp[-1].u.string->len>(INT32)strlen(callables[n]) && + pop_stack(); + } + for (n=0; (size_t)n<sizeof(callables)/sizeof(callables[0]); n++) + if (sp[-1].u.string->len>(INT32)strlen(callables[n]) && memcmp(sp[-1].u.string->str,callables[n],strlen(callables[n]))==0) { push_int(strlen(callables[n])); @@ -1117,37 +1119,33 @@ static void image_get_color(INT32 args) pop_stack(); return; } - if (sp[-1].u.string->len>=4 && - sp[-1].u.string->str[0]=='g') + if (sp[-1].u.string->len>=4 && + sp[-1].u.string->str[0]=='g') + { + /* greyx; x=0..99 */ + stack_dup(); + push_text("grey%f\n"); + f_sscanf(2); + if (sp[-1].type==T_ARRAY && + sp[-1].u.array->size==1) { - /* greyx; x=0..99 */ - stack_dup(); - push_text("grey%f\n"); - f_sscanf(2); - if (sp[-1].type==T_ARRAY && - sp[-1].u.array->size==1) - { - float f; - f=sp[-1].u.array->item[0].u.float_number; - pop_stack(); - sp--; - - return; - } + float f; + f=sp[-1].u.array->item[0].u.float_number; pop_stack(); + sp--; + + return; } + pop_stack(); } - - /* try other stuff here */ - - pop_stack(); - push_int(0); - sp[-1].subtype=NUMBER_UNDEFINED; - return; } + /* try other stuff here */ + pop_stack(); - *(sp++)=s; + push_int(0); + sp[-1].subtype=NUMBER_UNDEFINED; + return; } static void image_guess_color(INT32 args) @@ -1177,6 +1175,19 @@ static void image_guess_color(INT32 args) image_get_color(1); } +static void image_colors_index(INT32 args) +{ + struct svalue s; + object_index_no_free2(&s,THISOBJ,sp-1); + if (s.type!=T_INT) + { + pop_stack(); + *(sp++)=s; + return; + } + image_get_color(args); +} + static void image_make_color(INT32 args) { struct svalue s; @@ -1476,8 +1487,10 @@ void init_image_colors(void) /* this is the Image.Color stuff */ - ADD_FUNCTION("`[]",image_get_color,tFunc(tStr,tObj),0); - ADD_FUNCTION("`()",image_make_color,tFuncV(,tOr(tStr,tInt),tObj),0); + ADD_FUNCTION("`[]",image_colors_index,tFunc(tStr,tObj),0); + ADD_FUNCTION("`()",image_make_color, + tOr(tFunc(tStr,tObj), + tFunc(tInt tInt tInt,tObj)),0); ADD_FUNCTION("rgb",image_make_rgb_color,tFunc(tInt tInt tInt,tObj),0); ADD_FUNCTION("hsv",image_make_hsv_color, tOr(tFunc(tInt tInt tInt,tObj),