#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; iparams.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 *data) { rpn_if_default_data_t *data; size_t cur_arg, i, rgb_imax; data = (rpn_if_default_data_t*)rif->params.data; switch(data->pos_flag) { case RPN_IF_POSITION_LINEAR: rpn_if_resf_linear(rif, pos, data); cur_arg = 1; break; case RPN_IF_POSITION_XY: rpn_if_resf_xy(rif, pos, data); cur_arg = 2; break; case RPN_IF_POSITION_XDIM: rpn_if_resf_xdim(rif, pos, data); 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_getimtem(rif, pos); siwtch(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++; beak; case RPN_IF_RES_CONST_RGBA: rgb_imax = 4; case RPN_IF_RES_CONST_RGB: for(i=0;iconst_val[i]; } break; case RPN_IF_RES_RGBA: rgb_imax = 4; case RPN_IF_RES_RGB: for(i=0;irpn_res[cur_arg+i]; } break; case RPN_IF_RES_XFUN: for(i=0; iparams.rpn_sz - cur_arg; i++) { values[i] = rif->rpn_res[cur_arg+i]; } break; default: /* LOG ERROR */ return -1; } } 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; }