#include "php.h"
#include "php_imlib.h"
#define php_filter_init php_colormod_LTX_php_filter_init
#define php_filter_deinit php_colormod_LTX_php_filter_deinit
#define php_filter_exec php_colormod_LTX_php_filter_exec
#define php_filter_getfiltercount php_colormod_LTX_php_filter_getfiltercount
#define php_filter_getfilternames php_colormod_LTX_php_filter_getfilternames
#define php_filter_getextinfo php_colormod_LTX_php_filter_getextinfo
#define php_filter_getparams php_colormod_LTX_php_filter_getparams
static char* _php_colormod_stradd(char* str1,char* str2)
{
char* retval;
if ((str1)&&(str2))
{
retval=emalloc((strlen(str1)+strlen(str2)+1)*sizeof(char));
if (retval)
{
strcpy(retval,str1);
strcat(retval,str2);
efree(str1);
return retval;
}
}
return str1;
}
static int
_php_colormod_exec(HashTable* params)
{
char *paramnames[]={"x","y","w","h","brightness","contrast","gamma","brightness_r","contrast_r","gamma_r","brightness_g","contrast_g","gamma_g","brightness_b","contrast_b","gamma_b","brightness_a","contrast_a","gamma_a","tint","tint_r","tint_g","tint_b","tint_a",0};
int paramtypes[]= {'i','i','i','i','d', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd' };
char *script;
HashPosition pos;
script=estrdup("colormod(");
zend_hash_internal_pointer_reset_ex(params,&pos);
while (pos)
{
char *str_index;
ulong num_index;
int retval;
retval=zend_hash_get_current_key_ex(params,&str_index,NULL,&num_index,0,&pos);
if (retval==HASH_KEY_IS_STRING)
{
int match=0;
int index=0;
while (paramnames[index])
{
if (strcmp(str_index,paramnames[index])==0)
{
char val[32];
zval **data;
zend_hash_get_current_data_ex(params,(void**)&data,&pos);
switch(paramtypes[index])
{
case 'i':
convert_to_long_ex(data);
sprintf(val,"%d",(int)Z_LVAL_PP(data));
script=_php_colormod_stradd(script,str_index);
script=_php_colormod_stradd(script,"=");
script=_php_colormod_stradd(script,val);
break;
case 'd':
convert_to_double_ex(data);
sprintf(val,"%f",(double)Z_DVAL_PP(data));
script=_php_colormod_stradd(script,str_index);
script=_php_colormod_stradd(script,"=");
script=_php_colormod_stradd(script,val);
break;
}
script=_php_colormod_stradd(script,",");
match=1;
break;
}
index++;
}
if (!match)
{
php_error(E_NOTICE,"Unknown argument %s ignored",str_index);
}
}
zend_hash_move_forward_ex(params,&pos);
}
if (script[strlen(script)-1]==',') script[strlen(script)-1]='\0';
script=_php_colormod_stradd(script,");");
if (!script) return FAILURE;
/* zend_printf("Script: %s<br>",script); */
imlib_apply_filter(script);
efree(script);
return SUCCESS;
}
int
php_filter_init()
{
return SUCCESS;
}
void
php_filter_deinit()
{
return;
}
int
php_filter_exec(Imlib_Image im, char *filter, HashTable *params)
{
if (!strcmp(filter, "colormod"))
{
imlib_context_set_image(im);
return _php_colormod_exec(params);
}
return FAILURE;
}
int
php_filter_getfiltercount()
{
return 1;
}
void
php_filter_getfilternames(char** filternames)
{
filternames[0]="colormod";
}
void
php_filter_getextinfo(char** info)
{
info[0]="Tinting";
info[1]="Provides PHP interface to Willem Monsuwe's color modification filters.";
info[2]="Piotr Pawlow (pp@siedziba.pl)";
}
char*
php_filter_getparams(char* filter)
{
if (!strcmp(filter, "colormod")) return "int x=0, int y=0, int w=image_width, int h=image_height, double brightness[_r|_g|_b|_a]=0, double contrast[_r|_g|_b|_a]=1, double gamma[_r|_g|_b|_a]=1, double tint[_r|_g|_b|_a]=1";
return NULL;
}