#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; ulong num_index; zend_string *str_index; zval *data; script=estrdup("colormod("); ZEND_HASH_FOREACH_KEY_VAL(params, num_index, str_index, data) { if (str_index) { int match=0; int index=0; while (paramnames[index]) { if (strcmp(str_index->val,paramnames[index])==0) { char val[32]; switch(paramtypes[index]) { case 'i': convert_to_long_ex(data); sprintf(val,"%d",(int)Z_LVAL_P(data)); script=_php_colormod_stradd(script,str_index->val); 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_P(data)); script=_php_colormod_stradd(script,str_index->val); 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_FOREACH_END(); 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; }