pike.git
/
src
/
modules
/
Image
/
colors.c
version
»
Context lines:
10
20
40
80
file
none
3
pike.git/src/modules/Image/colors.c:15:
**! A color is here an object, containing color **! information and methods for conversion, see below. **! **! <ref>Image.Color</ref> can be called to make a color object. **! <ref>Image.Color()</ref> takes the following arguments: **! <pre> **! Image.Color(string name) // "red" **! Image.Color(string prefix_string) // "lightblue" **! Image.Color(string hex_name) // "#ff00ff" **! Image.Color(string cmyk_string) // "%17,42,0,19.4"
-
**! Image.Color(string hsv_string) // "
%
@327,90,32"
+
**! Image.Color(string hsv_string) // "@327,90,32"
**! Image.Color(int red, int green, int blue) **! </pre> **! **! The color names available can be listed by using indices **! on Image.Color. The colors are available by name directly **! as <tt>Image.Color.name</tt>, too: **! <pre> **! ...Image.Color.red... **! ...Image.Color.green... **! or, maybe
pike.git/src/modules/Image/colors.c:197:
#include <math.h> #include "stralloc.h" #include "pike_macros.h" #include "object.h" #include "interpret.h" #include "svalue.h" #include "array.h" #include "mapping.h" #include "builtin_functions.h"
-
#include "dmalloc.h"
+
#include "operators.h" #include "module_support.h" #include "sscanf.h" #include "program_id.h"
-
+
#include "pike_types.h"
#include "image.h" #include "colortable.h" #define sp Pike_sp static struct mapping *colors=NULL; static struct object *colortable=NULL; static struct array *colornames=NULL; struct program *image_color_program=NULL; extern struct program *image_colortable_program;
-
static struct pike_string *str_array;
-
static struct pike_string *str_string;
-
static struct pike_string *str_int;
+
static struct pike_string *str_r; static struct pike_string *str_g; static struct pike_string *str_b; static struct pike_string *str_h; static struct pike_string *str_s; static struct pike_string *str_v; static struct pike_string *no_name; /* forward */
pike.git/src/modules/Image/colors.c:277:
for (i=0; (size_t)i<sizeof(html_color)/sizeof(html_color[0]); i++) html_color[i].pname=make_shared_string(html_color[i].name); for (i=0;i<n;i++) { struct color_struct *cs; push_text(c[i].name); copy_shared_string(c[i].pname,sp[-1].u.string); push_object(clone_object(image_color_program,0));
-
cs=
(struct color_struct*)
-
get_storage(sp[-1].u.object,image_color_program);
+
cs=get_storage(sp[-1].u.object,image_color_program);
cs->rgb.r=(COLORTYPE)c[i].r; cs->rgb.g=(COLORTYPE)c[i].g; cs->rgb.b=(COLORTYPE)c[i].b; RGB_TO_RGBL(cs->rgbl,cs->rgb); copy_shared_string(cs->name,c[i].pname); } f_aggregate_mapping(n*2); colors=sp[-1].u.mapping; sp--; dmalloc_touch_svalue(sp);
pike.git/src/modules/Image/colors.c:324:
sp--; dmalloc_touch_svalue(sp); } #ifdef THIS #undef THIS /* Needed for NT */ #endif #define THIS ((struct color_struct*)(Pike_fp->current_storage)) #define THISOBJ (Pike_fp->current_object)
+
#ifdef PIKE_NULL_IS_SPECIAL
static void init_color_struct(struct object *UNUSED(dummy)) {
-
THIS->rgb.r=THIS->rgb.g=THIS->rgb.b=0;
+
THIS->name=NULL; }
-
+
#endif
static void exit_color_struct(struct object *UNUSED(dummy)) { if (THIS->name)
-
{
+
free_string(THIS->name);
-
THIS->name=NULL;
+
}
-
}
+
void _img_nct_map_to_flat_cubicles(rgb_group *s, rgb_group *d, int n, struct neo_colortable *nct, struct nct_dither *dith, int rowlen); static void try_find_name(struct color_struct *this) { rgb_group d; static struct nct_dither dith = { NCTD_NONE,NULL,NULL,NULL,NULL,-1,
-
#ifdef HAVE_UNION_INIT
+
{{NULL,NULL,0.0,0.0,0.0,0.0,0,0}}, /* Only to avoid warnings. */
-
#endif
+
}; if (!colors) make_colors(); if (this->name) Pike_fatal("try_find_name called twice\n"); if (this->rgbl.r!=COLOR_TO_COLORL(this->rgb.r) || this->rgbl.g!=COLOR_TO_COLORL(this->rgb.g) ||
pike.git/src/modules/Image/colors.c:454:
{ INT_TYPE r,g,b; if (args==0) { r=87; g=127; b=41; } else {
-
get_all_args(
"Image.Color.Color->greylevel()"
,args,"%i%i%i",&r,&g,&b);
+
get_all_args(
NULL
,args,"%i%i%i",&r,&g,&b);
} pop_n_elems(args); if (r+g+b==0) r=g=b=1; push_int((r*THIS->rgb.r+g*THIS->rgb.g+b*THIS->rgb.b)/(r+g+b)); } #define MAX3(X,Y,Z) MAXIMUM(MAXIMUM(X,Y),Z) #define MIN3(X,Y,Z) MINIMUM(MINIMUM(X,Y),Z) static void image_color_hsvf(INT32 args)
pike.git/src/modules/Image/colors.c:503:
Pike_error("internal error, max==0.0\n"); delta = max-min; if(r==max) h = (g-b)/delta; else if(g==max) h = 2+(b-r)/delta; else /*if(b==max)*/ h = 4+(r-g)/delta; h *= 60; /* now in degrees. */ if(h<0) h+=360;
-
push_float(
DO_NOT_WARN
(
(
FLOAT_TYPE)h)
)
;
-
push_float(
DO_NOT_WARN
(
(
FLOAT_TYPE)s)
)
;
-
push_float(
DO_NOT_WARN
(
(
FLOAT_TYPE)v)
)
;
+
push_float((FLOAT_TYPE)h);
+
push_float((FLOAT_TYPE)s);
+
push_float((FLOAT_TYPE)v);
f_aggregate(3); }
-
+
#define FLOAT_TO_COLOR(X) ((COLORTYPE)((X)*((float)COLORMAX+0.4)))
+
static void image_color_hsv(INT32 args) { double h,s,v; image_color_hsvf(args); h=sp[-1].u.array->item[0].u.float_number; s=sp[-1].u.array->item[1].u.float_number; v=sp[-1].u.array->item[2].u.float_number; pop_stack(); push_int(FLOAT_TO_COLOR(h/360.0));
pike.git/src/modules/Image/colors.c:540:
r=COLORL_TO_FLOAT(THIS->rgbl.r); g=COLORL_TO_FLOAT(THIS->rgbl.g); b=COLORL_TO_FLOAT(THIS->rgbl.b); k=1.0-MAX3(r,g,b); c=1.0-r-k; m=1.0-g-k; y=1.0-b-k;
-
push_float(
DO_NOT_WARN
(
(
FLOAT_TYPE)(c*100.0))
)
;
-
push_float(
DO_NOT_WARN
(
(
FLOAT_TYPE)(m*100.0))
)
;
-
push_float(
DO_NOT_WARN
(
(
FLOAT_TYPE)(y*100.0))
)
;
-
push_float(
DO_NOT_WARN
(
(
FLOAT_TYPE)(k*100.0))
)
;
+
push_float((FLOAT_TYPE)(c*100.0));
+
push_float((FLOAT_TYPE)(m*100.0));
+
push_float((FLOAT_TYPE)(y*100.0));
+
push_float((FLOAT_TYPE)(k*100.0));
f_aggregate(4); } /* **! method object grey() **! method object grey(int red,int green,int blue) **! Gives a new color, containing a grey color, **! which is calculated by the <ref>greylevel</ref> method. **! returns a new <ref>Image.Color.Color</ref> object **! see also: greylevel
pike.git/src/modules/Image/colors.c:575:
**! method int bits( int rbits, int gbits, int bbits, int rshift, int gshift, int bshift ) **! Returns the color as an integer. The first three parameters state how **! many bits to use for red, green and blue respectively. The last three **! state how many bits each colour should be shifted. For instance, **! <tt>Image.Color("#AABBCC")->bits(8, 8, 8, 16, 8, 0)</tt> returns **! the integer 11189196, that is, 0xAABBCC. */ static void image_color_bits( INT32 args ) { INT_TYPE rb, gb, bb, rs, gs, bs;
-
get_all_args(
"bits"
, args, "%i%i%i%i%i%i", &rb,&gb,&bb, &rs, &gs, &bs );
+
get_all_args(
NULL
, args, "%i%i%i%i%i%i", &rb,&gb,&bb, &rs, &gs, &bs );
pop_n_elems( args ); /* Do it on the stack to support bignums (it's possible to get 2M * bits for each channel this way. Not that that's really useful, * but... */ #define push_int_bits( i, b, s ) \ if( b <= 31 ) \
pike.git/src/modules/Image/colors.c:653:
**! returns a new <ref>Image.Color.Color</ref> object **! see also: rgb, hsv, Image.Color */ static void image_color_hex(INT32 args) { char buf[80]; INT_TYPE i=sizeof(COLORTYPE)*2; if (args)
-
get_all_args(
"Image.Color.Color->hex()"
,args,"%i",&i);
+
get_all_args(
NULL
,args,"%i",&i);
pop_n_elems(args); if (i<1) {
-
push_
constant
_text("#"); /* stupid */
+
push_
static
_text("#"); /* stupid */
return; } else if (i!=sizeof(COLORTYPE)*2) { ptrdiff_t sh; if (i>8) i=8; sh=4*(sizeof(COLORTYPE)*2-i); if (sh>0) sprintf(buf,"#%0*x%0*x%0*x",
pike.git/src/modules/Image/colors.c:752:
**! method array|string cast() **! cast the object to an array, representing red, green **! and blue (equal to <tt>-><ref>rgb</ref>()</tt>), or **! to a string, giving the name (equal to <tt>-><ref>name</ref>()</tt>). **! returns the name as string or rgb as array **! see also: rgb, name */ static void image_color_cast(INT32 args) {
-
if
(args!=1 ||
-
TYPEOF(sp[-1]) != T
_
STRING)
-
bad
_
arg_error
(
"Image.Color.Color->cast"
,
sp-
args,
args,0,
"",
sp-args,
-
"Bad arguments to Image.Color.Color->cast(
)
\n")
;
+
struct
pike_string
*str;
+
get
_
all
_
args
(
NULL
,
args,
"
%n
",
&str
);
-
if (
sp[-1].u.string
==
str
_array)
+
if (
str
==
literal
_array
_string
)
{ image_color_rgb(args); return; }
-
if (
sp[-1].u.string
==
str
_string)
+
if (
str
==
literal
_string
_string
)
{ image_color_name(args); return; }
-
if (
sp[-1].u.string
==
str
_int)
+
if (
str
==
literal
_int
_string
)
{ pop_stack(); push_int( (THIS->rgb.r << 8 | THIS->rgb.g) << 8 | THIS->rgb.b ); return; }
-
Pike
_
error
(
"Image.Color.Color->cast(
)
:
Can't
cast
to that\n"
);
+
pop
_
stack
()
;
+
push_undefined(
);
} static void image_color__sprintf(INT32 args) { int prec,x; if (args<2)
-
SIMPLE_
TOO
_
FEW
_ARGS_ERROR("_sprintf",2);
+
SIMPLE_
WRONG
_
NUM
_ARGS_ERROR("_sprintf",2);
if (TYPEOF(sp[-args]) != T_INT)
-
SIMPLE_
BAD_
ARG_ERROR("_sprintf",0,"
integer
");
+
SIMPLE_ARG_
TYPE_
ERROR("_sprintf",0,"
int
");
if (TYPEOF(sp[1-args]) != T_MAPPING)
-
SIMPLE_
BAD_
ARG_ERROR("_sprintf",1,"mapping");
+
SIMPLE_ARG_
TYPE_
ERROR("_sprintf",1,"mapping");
pop_n_elems(args-2);
-
push_text("precision");
+
push_
static_
text("precision");
f_index(2); if (TYPEOF(sp[-1]) != T_INT)
-
SIMPLE_
BAD_
ARG_ERROR("_sprintf",1,"mapping(\"precision\":int)");
+
SIMPLE_ARG_
TYPE_
ERROR("_sprintf",1,"mapping(\"precision\":int)");
prec=sp[-1].u.integer; x=sp[-2].u.integer; pop_n_elems(2); switch (x) { /* case 'c': */ /* case 'd': */ case 't':
-
push_
constant
_text("Image.Color.Color");
+
push_
static
_text("Image.Color.Color");
return; case 'O': if (!THIS->name) try_find_name(THIS); if (THIS->name==no_name) {
-
push_
constant
_text("Image.Color(\"");
+
push_
static
_text("Image.Color(\"");
if (prec) { push_int(prec); image_color_hex(1); } else image_color_hex(0);
-
push_
constant
_text("\")");
+
push_
static
_text("\")");
f_add(3); return; } else {
-
push_
constant
_text("Image.Color.");
+
push_
static
_text("Image.Color.");
ref_push_string(THIS->name); f_add(2); return; } break; case 's': if (prec) { push_int(prec); image_color_name(1);
pike.git/src/modules/Image/colors.c:947:
*/ static void image_color_equal(INT32 args) { if (args!=1) Pike_error("Image.Color.Color->`==: illegal number of arguments\n"); if (TYPEOF(sp[-1]) == T_OBJECT) { struct color_struct *other;
-
other=
(struct color_struct*)
-
get_storage(sp[-1].u.object,image_color_program);
+
other=get_storage(sp[-1].u.object,image_color_program);
if (other&& other->rgbl.r==THIS->rgbl.r && other->rgbl.g==THIS->rgbl.g && other->rgbl.b==THIS->rgbl.b) { pop_stack(); push_int(1); return; } }
pike.git/src/modules/Image/colors.c:1071:
*/ static void image_color_light(INT32 args) { pop_n_elems(args); image_color_hsvf(0); sp--; dmalloc_touch_svalue(sp); push_array_items(sp->u.array); /* frees */
-
sp[-1].u.float_number +=
DO_NOT_WARN
(
(
FLOAT_TYPE)0.2
)
;
+
sp[-1].u.float_number += (FLOAT_TYPE)0.2;
if (((double)sp[-1].u.float_number) >= 1.0)
-
sp[-2].u.float_number -=
DO_NOT_WARN
(
(
FLOAT_TYPE)(sp[-1].u.float_number -
-
1.0)
)
;
+
sp[-2].u.float_number -= (FLOAT_TYPE)(sp[-1].u.float_number - 1.0);
image_make_hsv_color(3); } static void image_color_dark(INT32 args) { pop_n_elems(args); image_color_hsvf(0); sp--; dmalloc_touch_svalue(sp);
pike.git/src/modules/Image/colors.c:1127:
{ pop_n_elems(args); image_color_hsvf(0); sp--; dmalloc_touch_svalue(sp); push_array_items(sp->u.array); /* frees */ if (sp[-2].u.float_number==0.0) {
-
sp[-1].u.float_number -=
DO_NOT_WARN
(
(
FLOAT_TYPE)0.2
)
;
+
sp[-1].u.float_number -= (FLOAT_TYPE)0.2;
} else {
-
sp[-2].u.float_number -=
DO_NOT_WARN
(
(
FLOAT_TYPE)0.2
)
;
-
sp[-1].u.float_number -=
DO_NOT_WARN
(
(
FLOAT_TYPE)0.2
)
;
+
sp[-2].u.float_number -= (FLOAT_TYPE)0.2;
+
sp[-1].u.float_number -= (FLOAT_TYPE)0.2;
} image_make_hsv_color(3); } static void image_color_bright(INT32 args) { pop_n_elems(args); image_color_hsvf(0); sp--; dmalloc_touch_svalue(sp);
pike.git/src/modules/Image/colors.c:1161:
sp[-2].u.float_number+=0.2; sp[-1].u.float_number+=0.2; } image_make_hsv_color(3); } static void image_color_mult(INT32 args) { FLOAT_TYPE x=0.0;
-
get_all_args(
"Image.Color.Color->`*"
,args,"%f",&x);
+
get_all_args(
NULL
,args,"%f",&x);
pop_n_elems(args);
-
_image_make_rgb_color(
DOUBLE_TO_INT
(THIS->rgb.r*x),
-
DOUBLE_TO_INT
(THIS->rgb.g*x),
-
DOUBLE_TO_INT
(THIS->rgb.b*x));
+
_image_make_rgb_color((
int)(
THIS->rgb.r*x),
+
(
int)(
THIS->rgb.g*x),
+
(
int)(
THIS->rgb.b*x));
} int image_color_svalue(struct svalue *v,rgb_group *rgb) { if (TYPEOF(*v) == T_OBJECT) {
-
struct color_struct *cs=
(struct color_struct*)
-
get_storage(v->u.object,image_color_program);
+
struct color_struct *cs=get_storage(v->u.object,image_color_program);
if (cs) { *rgb=cs->rgb; return 1; } } else if (TYPEOF(*v) == T_ARRAY) { if (v->u.array->size==3 &&
pike.git/src/modules/Image/colors.c:1200:
rgb->b=(COLORTYPE)(v->u.array->item[2].u.integer); return 1; } } else if (TYPEOF(*v) == T_STRING) { push_svalue(v); image_make_color(1); if (TYPEOF(sp[-1]) == T_OBJECT) {
-
struct color_struct *cs=
(struct color_struct*)
-
get_storage(sp[-1].u.object,image_color_program);
+
struct color_struct *cs=get_storage(sp[-1].u.object,image_color_program);
*rgb=cs->rgb; pop_stack(); return 1; } pop_stack(); } return 0; } int image_color_arg(INT32 args,rgb_group *rgb)
pike.git/src/modules/Image/colors.c:1223:
if (args>=0) return 0; return image_color_svalue(sp+args,rgb); } static void image_color_add(INT32 args) { rgb_group rgb; if (!image_color_arg(-args,&rgb))
-
SIMPLE_
BAD_
ARG_ERROR("
Image.Color.Color->
`+",1,"Color");
+
SIMPLE_ARG_
TYPE_
ERROR("`+",1,"
Image.
Color");
pop_n_elems(args); _image_make_rgb_color((int)(THIS->rgb.r+rgb.r), (int)(THIS->rgb.g+rgb.g), (int)(THIS->rgb.b+rgb.b)); } #define HEXTONUM(C) \
pike.git/src/modules/Image/colors.c:1321:
(INT32)rgb[1], (INT32)rgb[2]); return; } } 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");
+
push_
static_
text("@%f,%f,%f\n");
f_sscanf(2); if (TYPEOF(sp[-1]) == T_ARRAY && sp[-1].u.array->size==3) { FLOAT_TYPE h,s,v; stack_swap(); pop_stack(); sp--; dmalloc_touch_svalue(sp); push_array_items(sp->u.array);
-
get_all_args(
"Image.Color()"
,3,"%f%f%f",&h,&s,&v);
+
get_all_args(
NULL
,3,"%f%f%f",&h,&s,&v);
pop_n_elems(3);
-
push_int(
DOUBLE_TO_INT
(h/360.0*256.0));
-
push_int(
DOUBLE_TO_INT
(s/100.0*255.4));
-
push_int(
DOUBLE_TO_INT
(v/100.0*255.4));
+
push_int((
int)(
h/360.0*256.0));
+
push_int((
int)(
s/100.0*255.4));
+
push_int((
int)(
v/100.0*255.4));
image_make_hsv_color(3); return; } 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");
+
push_
static_
text("%%%f,%f,%f,%f\n");
f_sscanf(2); if (TYPEOF(sp[-1]) == T_ARRAY && sp[-1].u.array->size==4) { stack_swap(); pop_stack(); sp--; dmalloc_touch_svalue(sp); push_array_items(sp->u.array); image_make_cmyk_color(4); return; } pop_stack(); } for (n=0; (size_t)n<sizeof(callables)/sizeof(callables[0]); n++) if (sp[-1].u.string->len>(ptrdiff_t)strlen(callables[n]) && memcmp(sp[-1].u.string->str,callables[n],strlen(callables[n]))==0) {
-
push_int(
DO_NOT_WARN
(
(
INT32)strlen(callables[n]))
)
;
+
push_int((INT32)strlen(callables[n]));
push_int(1000000); f_index(3); image_get_color(1); if (TYPEOF(sp[-1]) != T_OBJECT) return; /* no way */ safe_apply(sp[-1].u.object,callables[n],0); stack_swap(); pop_stack(); return; } if (sp[-1].u.string->len>=4 && sp[-1].u.string->str[0]=='g') { /* greyx; x=0..99 */ stack_dup();
-
push_text("gr%*[ea]y%f\n");
+
push_
static_
text("gr%*[ea]y%f\n");
f_sscanf(2); if (TYPEOF(sp[-1]) == T_ARRAY && sp[-1].u.array->size==1) { double f; f = sp[-1].u.array->item[0].u.float_number; pop_stack(); pop_stack();
-
push_int(
DO_NOT_WARN
(
(
int)(255*f/100)
)
);
+
push_int( (int)(255*f/100) );
/* grey100 is white, grey0 is black */ stack_dup(); stack_dup(); image_make_rgb_color(3); return; } pop_stack(); } } /* try other stuff here */ pop_stack(); push_undefined(); return; } static void image_guess_color(INT32 args) {
-
if (
args
!=1 && TYPEOF
(
sp[-
args
])
!= T
_STRING
)
-
bad_arg_error("Image.Color->guess"
,
sp-args,args,0,"",sp-args,
-
"Bad arguments to Image.Color->guess(
)
\n")
;
+
check_all_args
(
NULL,
args
,
BIT
_STRING
,
0);
f_lower_case(1);
-
push_
constant
_text(" ");
+
push_
static
_text(" ");
o_subtract(); stack_dup(); image_get_color(1); if (TYPEOF(sp[-1]) == T_OBJECT) { stack_swap(); pop_stack(); return; } pop_stack();
-
push_
constant
_text("#");
+
push_
static
_text("#");
stack_swap(); f_add(2); image_get_color(1); } static void image_colors_index(INT32 args) { struct svalue s; object_index_no_free2(&s, THISOBJ, 0, sp-1);
pike.git/src/modules/Image/colors.c:1498:
static void _image_make_rgbl_color(INT32 r,INT32 g,INT32 b) { struct color_struct *cs; if (r<0) r=0; else if (r>COLORLMAX) r=COLORLMAX; /* >=2^31? no way... */ if (g<0) g=0; else if (g>COLORLMAX) g=COLORLMAX; if (b<0) b=0; else if (b>COLORLMAX) b=COLORLMAX; push_object(clone_object(image_color_program,0));
-
cs=
(struct color_struct*)
-
get_storage(sp[-1].u.object,image_color_program);
+
cs=get_storage(sp[-1].u.object,image_color_program);
cs->rgbl.r=(INT32)r; cs->rgbl.g=(INT32)g; cs->rgbl.b=(INT32)b; RGBL_TO_RGB(cs->rgb,cs->rgbl); } static void image_color__encode( INT32 UNUSED(args) ) { push_int( THIS->rgbl.r );
pike.git/src/modules/Image/colors.c:1545:
void _image_make_rgb_color(INT32 r,INT32 g,INT32 b) { struct color_struct *cs; if (r<0) r=0; else if (r>COLORMAX) r=COLORMAX; if (g<0) g=0; else if (g>COLORMAX) g=COLORMAX; if (b<0) b=0; else if (b>COLORMAX) b=COLORMAX; push_object(clone_object(image_color_program,0));
-
cs=
(struct color_struct*)
-
get_storage(sp[-1].u.object,image_color_program);
+
cs=get_storage(sp[-1].u.object,image_color_program);
cs->rgb.r=(COLORTYPE)r; cs->rgb.g=(COLORTYPE)g; cs->rgb.b=(COLORTYPE)b; RGB_TO_RGBL(cs->rgbl,cs->rgb); } static void image_make_rgb_color(INT32 args) { INT_TYPE r=0,g=0,b=0;
pike.git/src/modules/Image/colors.c:1568:
if( args==1 && TYPEOF(sp[-1]) == T_INT ) { r = sp[-1].u.integer; b = r & 0xff; r >>= 8; g = r & 0xff; r >>= 8; r &= 0xff; } else
-
get_all_args(
"Image.Color.rgb()"
,args,"%i%i%i",&r,&g,&b);
+
get_all_args(
NULL
,args,"%i%i%i",&r,&g,&b);
_image_make_rgb_color(r,g,b); } static void image_make_hsv_color(INT32 args) { FLOAT_TYPE h,s,v; FLOAT_TYPE r=0,g=0,b=0; /* to avoid warning */ if (args && TYPEOF(sp[-args]) == T_INT) { INT_TYPE hi,si,vi;
-
get_all_args(
"Image.Color.hsv()"
,args,"%i%i%i",
-
&hi,&si,&vi);
+
get_all_args(
NULL
,args,"%i%i%i",&hi,&si,&vi);
pop_n_elems(args); if (hi<0) hi=(hi%COLORMAX)+COLORMAX; else if (hi>COLORMAX) hi%=COLORMAX; /* repeating */ if (si<0) si=0; else if (si>COLORMAX) si=COLORMAX; if (vi<0) vi=0; else if (vi>COLORMAX) vi=COLORMAX; h = (hi/((double)COLORMAX))*(360.0/60.0); s = si/((double)COLORMAX); v = vi/((double)COLORMAX); } else {
-
get_all_args(
"Image.Color.hsv()"
,args,"%f%f%f",
-
&h,&s,&v);
+
get_all_args(
NULL
,args,"%f%f%f",&h,&s,&v);
pop_n_elems(args);
-
if (h<0) h = 360 + h - ((
DOUBLE_TO_INT
(
h
)/360)*360);
-
if (h>360.0) h -= ((
DOUBLE_TO_INT
(
h
)/360)*360);
+
if (h<0) h = 360 + h - (((
int)
h/360)*360);
+
if (h>360.0) h -= (((
int)
h/360)*360);
h/=60; } if(s==0.0) { r = g = b = v; } else { #define i floor(h) #define f (h-i) #define p ((FLOAT_TYPE)(v * (1 - s))) #define q ((FLOAT_TYPE)(v * (1 - (s * f)))) #define t ((FLOAT_TYPE)(v * (1 - (s * (1 -f)))))
-
switch(
DOUBLE_TO_INT
(i)
)
+
switch((
int)
i)
{ case 6: /* 360 degrees. Same as 0.. */ case 0: r = v; g = t; b = p; break; case 1: r = q; g = v; b = p; break; case 2: r = p; g = v; b = t; break; case 3: r = p; g = q; b = v; break; case 4: r = t; g = p; b = v; break; case 5: r = v; g = p; b = q; break; default: Pike_error("internal error (hue=%d <= hsv[%"PRINTPIKEFLOAT"f," "%"PRINTPIKEFLOAT"f,%"PRINTPIKEFLOAT"f])\n",
-
DOUBLE_TO_INT
(
i
), h, s, v);
+
(
int)
i, h, s, v);
} } #undef i #undef f #undef p #undef q #undef t _image_make_rgbf_color(r,g,b); } static void image_make_cmyk_color(INT32 args) { FLOAT_TYPE c,m,y,k,r,g,b;
-
get_all_args(
"Image.Color.cmyk()"
,args,"%F%F%F%F",&c,&m,&y,&k);
+
get_all_args(
NULL
,args,"%F%F%F%F",&c,&m,&y,&k);
pop_n_elems(args); r=100-(c+k); g=100-(m+k); b=100-(y+k); _image_make_rgbf_color(r*0.01,g*0.01,b*0.01); } static void image_make_greylevel_color(INT32 args) { INT_TYPE i;
-
get_all_args(
"Image.Color.greylevel()"
,args,"%i",&i);
+
get_all_args(
NULL
,args,"%i",&i);
pop_n_elems(args); _image_make_rgb_color(i,i,i); } static void image_make_html_color(INT32 args) { int i;
-
+
check_all_args(NULL, args, BIT_STRING, 0);
-
if (args!=1 ||
-
TYPEOF(sp[-1]) != T_STRING)
-
{
-
bad_arg_error("Image.Color.html",sp-args,args,0,"",sp-args,
-
"Bad arguments to Image.Color.html()\n");
-
return;
-
}
-
+
f_lower_case(1); for (i=0; (size_t)i<sizeof(html_color)/sizeof(html_color[0]); i++) if (html_color[i].pname==sp[-1].u.string) { _image_make_rgb_color(html_color[i].r, html_color[i].g, html_color[i].b); return; } if (sp[-1].u.string->len>0 && sp[-1].u.string->str[0]=='#') image_get_color(1); else {
-
push_
constant
_text("#");
+
push_
static
_text("#");
stack_swap(); f_add(2); image_get_color(1); } } /* **! method array(string) _indices() **! method array(object) _values() **! (ie as <tt>indices(Image.Color)</tt> or <tt>values(Image.Color)</tt>)
pike.git/src/modules/Image/colors.c:1720:
static void image_colors_values(INT32 args) { pop_n_elems(args); if (!colors) make_colors(); ref_push_mapping(colors); f_values(1); } void init_image_colors(void) {
-
str_array=make_shared_string("array");
-
str_string=make_shared_string("string");
-
str_int=make_shared_string("int");
+
str_r=make_shared_string("r"); str_g=make_shared_string("g"); str_b=make_shared_string("b"); str_h=make_shared_string("h"); str_s=make_shared_string("s"); str_v=make_shared_string("v"); no_name=make_shared_string(""); /* make color object program */ start_new_program(); ADD_STORAGE(struct color_struct);
-
+
#ifdef PIKE_NULL_IS_SPECIAL
set_init_callback(init_color_struct);
-
+
#endif
set_exit_callback(exit_color_struct); /* color info methods */
-
ADD_FUNCTION("cast",image_color_cast,tFunc(tStr,tOr(tArray,tStr)),
0
);
+
ADD_FUNCTION("cast",image_color_cast,tFunc(tStr,tOr(tArray,tStr)),
ID_PROTECTED
);
ADD_FUNCTION("_sprintf",image_color__sprintf, tFunc(tInt tMap(tStr,tMix),tStr),0); ADD_FUNCTION("`[]",image_color_index,tFunc(tOr(tStr,tInt),tOr(tInt,tFunction)),0); ADD_FUNCTION("`->",image_color_index,tFunc(tOr(tStr,tInt),tOr(tInt,tFunction)),0); ADD_FUNCTION("`==",image_color_equal,tFunc(tOr(tObjImpl_IMAGE_COLOR_COLOR,tInt), tInt),0); ADD_FUNCTION("__hash",image_color___hash,tFunc(tNone,tInt),0); ADD_FUNCTION("_encode", image_color__encode,tFunc(tNone,tArr(tInt)),0); ADD_FUNCTION("_decode", image_color__decode,tFunc(tInt,tVoid),0);
pike.git/src/modules/Image/colors.c:1842:
free_object(colortable); free_array(colornames); colors=NULL; colortable=NULL; colornames=NULL; for (i=0; (size_t)i<sizeof(html_color)/sizeof(html_color[0]); i++) free_string(html_color[i].pname); }
-
free_string(str_array);
-
free_string(str_string);
-
free_string(str_int);
+
free_string(str_r); free_string(str_g); free_string(str_b); free_string(str_h); free_string(str_s); free_string(str_v); free_string(no_name); }