123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309 |
- #include "rpn_if_default.h"
-
-
- int rpn_if_argf_default(rpn_if_t *rif, size_t pos, rpn_value_t *args)
- {
- size_t cur_arg, i, rgb_imax;
- rpn_if_default_data_t *data;
- rpn_value_t *values;
-
- data = (rpn_if_default_data_t*)rif->params->data;
-
- switch(data->pos_flag)
- {
- case RPN_IF_POSITION_LINEAR:
- rpn_if_argf_linear(rif, pos, args);
- cur_arg = 1;
- break;
- case RPN_IF_POSITION_XY:
- rpn_if_argf_xy(rif, pos, args);
- cur_arg = 2;
- break;
- case RPN_IF_POSITION_XDIM:
- rpn_if_argf_xdim(rif, pos, args);
- cur_arg = *(data->size_lim);
- break;
- }
- if(cur_arg > rif->params->rpn_argc)
- {
- /* Too many arguments for given rif !! */
- return -1;
- }
- rgb_imax = 4; /* rgba */
- values = rpn_if_getitem(rif, pos);
- switch(data->res_flag)
- {
- case RPN_IF_RES_BOOL:
- args[cur_arg] = values[0]?1:0;
- break;
- case RPN_IF_RES_CONST:
- case RPN_IF_RES_COUNT:
- args[cur_arg] = *values;
- break;
- case RPN_IF_RES_RGB:
- rgb_imax = 3;
- case RPN_IF_RES_CONST_RGBA:
- case RPN_IF_RES_RGBA:
- for(i=0; i<rgb_imax; i++)
- {
- args[cur_arg+i] = values[i];
- }
- break;
- case RPN_IF_RES_XFUN:
- for(i=0; i < rif->params->rpn_sz - cur_arg; i++)
- {
- args[cur_arg+i] = values[i];
- }
- break;
- default:
- /* LOG ERROR */
- return -1;
- }
- return -1;
- }
-
- int rpn_if_resf_default(rpn_if_t *rif, size_t *pos, rpn_value_t *res)
- {
- rpn_if_default_data_t *data;
- size_t cur_arg, i, rgb_imax;
- rpn_value_t *values;
-
- data = (rpn_if_default_data_t*)rif->params->data;
-
- switch(data->pos_flag)
- {
- case RPN_IF_POSITION_LINEAR:
- rpn_if_resf_linear(rif, pos, res);
- cur_arg = 1;
- break;
- case RPN_IF_POSITION_XY:
- rpn_if_resf_xy(rif, pos, res);
- cur_arg = 2;
- break;
- case RPN_IF_POSITION_XDIM:
- rpn_if_resf_xdim(rif, pos, res);
- cur_arg = *(data->size_lim);
- break;
- }
- if(cur_arg > rif->params->rpn_argc)
- {
- /** LOG ERROR ! should never append... */
- return -1;
- }
- rgb_imax = 3; /* rgba */
- values = rpn_if_getitem(rif, *pos);
- /**@todo if(res) set the values in res too ! */
- switch(data->res_flag)
- {
- case RPN_IF_RES_BOOL:
- *values = 1;
- break;
-
- case RPN_IF_RES_CONST:
- *values = *(data->const_val);
- break;
-
- case RPN_IF_RES_COUNT:
- (*values)++;
- break;
-
- case RPN_IF_RES_CONST_RGBA:
- rgb_imax = 4;
- //case RPN_IF_RES_CONST_RGB:
- for(i=0;i<rgb_imax;i++)
- {
- values[i] = data->const_val[i];
- }
- break;
-
- case RPN_IF_RES_RGBA:
- rgb_imax = 4;
- case RPN_IF_RES_RGB:
- for(i=0;i<rgb_imax;i++)
- {
- values[i] = rif->rpn_res[cur_arg+i];
- }
- break;
-
- case RPN_IF_RES_XFUN:
- for(i=0; i<rif->params->rpn_sz - cur_arg; i++)
- {
- values[i] = rif->rpn_res[cur_arg+i];
- }
- break;
-
- default:
- /* LOG ERROR */
- return -1;
- }
- return 0;
- }
-
- int rpn_if_argf_linear(rpn_if_t *rif, size_t pos, rpn_value_t *args)
- {
- rpn_if_default_data_t *data;
- data = (rpn_if_default_data_t*)rif->params->data;
- if(data->size_lim && pos >= *data->size_lim)
- {
- if(data->pos_flag & RPN_IF_POSITION_OF_ERR)
- {
- return -1;
- }
- pos %= *(data->size_lim);
- }
- args[0] = pos;
- return 0;
- }
-
- int rpn_if_resf_linear(rpn_if_t *rif, size_t *pos, rpn_value_t *_data)
- {
- rpn_if_default_data_t *data;
- size_t res;
- data = (rpn_if_default_data_t*)rif->params->data;
- res = rif->rpn_res[0];
- if(data->size_lim && res >= *data->size_lim)
- {
- if(data->pos_flag & RPN_IF_POSITION_OF_ERR)
- {
- return -1;
- }
- res %= *(data->size_lim);
- }
- *pos = res;
- return 0;
- }
-
- int rpn_if_argf_xy(rpn_if_t *rif, size_t pos, rpn_value_t *args)
- {
- rpn_if_default_data_t *data;
-
- data = (rpn_if_default_data_t*)rif->params->data;
- if(!data->size_lim)
- {
- return -1;
- }
- args[0] = pos % data->size_lim[0];
- args[1] = pos / data->size_lim[0];
- if(args[1] > data->size_lim[1])
- {
- if(data->pos_flag & RPN_IF_POSITION_OF_ERR)
- {
- return -1;
- }
- args[1] %= data->size_lim[1];
- }
- return 0;
- }
-
- int rpn_if_resf_xy(rpn_if_t *rif, size_t *pos, rpn_value_t *_data)
- {
- rpn_if_default_data_t *data;
- size_t xy[2];
-
- data = (rpn_if_default_data_t*)rif->params->data;
-
- xy[0] = rif->rpn_res[0];
- xy[1] = rif->rpn_res[1];
-
- if(!data->size_lim)
- {
- return -1;
- }
-
- if(xy[0] >= data->size_lim[0] || xy[1] >= data->size_lim[1])
- {
- if(data->pos_flag & RPN_IF_POSITION_OF_ERR)
- {
- return -1;
- }
- xy[0] %= data->size_lim[0];
- xy[1] %= data->size_lim[1];
- }
- *pos = xy[0]+(xy[1]*data->size_lim[0]);
- return 0;
- }
-
- int rpn_if_argf_xdim(rpn_if_t *rif, size_t pos, rpn_value_t *args)
- {
- rpn_if_default_data_t *data;
- size_t i, curdim_sz, curpos;
-
- data = (rpn_if_default_data_t*)rif->params->data;
-
- if(!data->size_lim)
- {
- return -1;
- }
- if(*(data->size_lim) < 1)
- {
- return -1;
- }
- /**@todo check if *(data->size_lim) overflow rif->params->rpn_argc */
-
- curdim_sz = 1;
- curpos = pos;
- for(i=0; i<*(data->size_lim)-1; i++)
- {
- curdim_sz *= data->size_lim[i+1];
- args[i] = curpos % curdim_sz;
- curpos /= curdim_sz;
- }
- args[i] = curpos;
- if(args[i] >= curdim_sz)
- {
- if(data->pos_flag && RPN_IF_POSITION_OF_ERR)
- {
- return -1;
- }
- args[i] %= curdim_sz;
- }
- return 0;
- }
-
- int rpn_if_resf_xdim(rpn_if_t *rif, size_t *pos, rpn_value_t *_data)
- {
- rpn_if_default_data_t *data;
- size_t i, res, cur, curlim, prevlim;
-
- data = (rpn_if_default_data_t*)rif->params->data;
- res = 0;
-
- if(!data->size_lim)
- {
- return -1;
- }
- if(*(data->size_lim) < 1)
- {
- return -1;
- }
- /**@todo check if *(data->size_lim) overflow rif->params->rpn_argc */
-
- res = rif->rpn_res[0];
- if(res >= data->size_lim[1])
- {
- if(data->pos_flag & RPN_IF_POSITION_OF_ERR)
- {
- return -1;
- }
- res %= data->size_lim[1];
- }
-
- for(i=1; i < *(data->size_lim); i++)
- {
- cur = rif->rpn_res[i];
- prevlim = data->size_lim[i];
- curlim = data->size_lim[i+1];
- if(cur >= curlim)
- {
- if(data->pos_flag & RPN_IF_POSITION_OF_ERR)
- {
- return -1;
- }
- cur %= curlim;
- }
- res += cur * prevlim;
- }
- *pos = res;
- return 0;
- }
|