00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include <callbacks_js.h>
00026 #include <jsparser_data.h>
00027 #include <filter.h>
00028
00029
00030 DECLARE_CLASS("Filter",filter_class,filter_constructor);
00031
00032 JSFunctionSpec filter_methods[] = {
00033 {"set_parameter", filter_set_parameter, 4},
00034 {"activate", filter_activate, 1},
00035 ENTRY_METHODS ,
00036 {0}
00037 };
00038
00039 JSPropertySpec filter_properties[] = {
00040
00041 { "parameters", 0, JSPROP_ENUMERATE | JSPROP_PERMANENT | JSPROP_READONLY, filter_list_parameters, NULL },
00042 { "description", 0, JSPROP_ENUMERATE | JSPROP_PERMANENT | JSPROP_READONLY, filter_get_description, NULL },
00043 { "author", 0, JSPROP_ENUMERATE | JSPROP_PERMANENT | JSPROP_READONLY, filter_get_author, NULL },
00044 {0}
00045 };
00046
00047 JS(filter_constructor) {
00048 func("%u:%s:%s",__LINE__,__FILE__,__FUNCTION__);
00049
00050 int idx;
00051 char *name;
00052
00053 if(argc < 1)
00054 JS_ERROR("missing argument");
00055
00056
00057 JS_BeginRequest(cx);
00058 name = js_get_string(argv[0]);
00059
00060 FilterDuo *duo = new FilterDuo();
00061
00062 duo->proto = (Filter*) global_environment->filters.search(name, &idx);
00063
00064 if(!duo->proto) {
00065 error("filter not found: %s",name);
00066 delete duo;
00067 *rval = JSVAL_FALSE;
00068 return JS_TRUE;
00069 } else
00070 duo->proto->jsclass = &filter_class;
00071
00072 if(!JS_SetPrivate(cx, obj, (void*)duo))
00073 JS_ERROR("internal error setting private value");
00074 else
00075 duo->proto->jsobj = obj;
00076
00077 *rval = OBJECT_TO_JSVAL(obj);
00078 JS_EndRequest(cx);
00079
00080 return JS_TRUE;
00081 }
00082
00083 JS(filter_activate) {
00084 func("%u:%s:%s",__LINE__,__FILE__,__FUNCTION__);
00085
00086
00087 JS_BeginRequest(cx);
00088 FilterDuo *duo = (FilterDuo *) JS_GetPrivate(cx, obj);
00089 if(!duo) {
00090 error("%u:%s:%s :: Filter core data is NULL",
00091 __LINE__,__FILE__,__FUNCTION__);
00092 JS_EndRequest(cx);
00093
00094 return JS_FALSE;
00095 }
00096 *rval = BOOLEAN_TO_JSVAL(duo->instance->active);
00097 if (argc == 1) {
00098 jsint var = js_get_int(argv[0]);
00099 duo->instance->active = (bool)var;
00100 }
00101 JS_EndRequest(cx);
00102
00103 return JS_TRUE;
00104 }
00105
00106
00107 JS(filter_set_parameter) {
00108 func("%u:%s:%s",__LINE__,__FILE__,__FUNCTION__);
00109 int idx;
00110 char *name;
00111 Parameter *param;
00112 jsdouble val[3];
00113
00114
00115 JS_BeginRequest(cx);
00116
00117 if(argc < 2)
00118 JS_ERROR("missing arguments: name, values");
00119
00120
00121 FilterDuo *duo = (FilterDuo*)JS_GetPrivate(cx, obj);
00122 if(!duo) {
00123 error("%u:%s:%s :: Filter core data is NULL",
00124 __LINE__,__FILE__,__FUNCTION__);
00125 return JS_FALSE;
00126 }
00127
00128 if(JSVAL_IS_DOUBLE(argv[0])) {
00129
00130 double *argidx = JSVAL_TO_DOUBLE(argv[0]);
00131 param = (Parameter*) duo->proto->parameters.pick((int)*argidx);
00132
00133 } else {
00134
00135 name = js_get_string(argv[0]);
00136 param = (Parameter*) duo->proto->parameters.search(name, &idx);
00137
00138 }
00139
00140 if(!param) {
00141 JS_EndRequest(cx);
00142
00143 error("parameter %s not found in filter %s", name, duo->proto->name);
00144 return JS_TRUE;
00145 }
00146
00147 switch(param->type) {
00148
00149 case Parameter::BOOL:
00150 case Parameter::NUMBER:
00151 {
00152 if(!JS_ValueToNumber(cx, argv[1], &val[0])) {
00153 error("set parameter called with an invalid value for filter %s",
00154 duo->proto->name);
00155 break;
00156 }
00157 func("javascript %s->%s to [%.5f]",
00158 duo->proto->name, param->name, val[0]);
00159
00160
00161 param->set(&val);
00162 duo->instance->set_parameter(idx);
00163 break;
00164 }
00165 case Parameter::POSITION:
00166 if(!JS_ValueToNumber(cx, argv[1], &val[0])) {
00167 error("set parameter called with an invalid value for filter %s",
00168 duo->proto->name);
00169 break;
00170 }
00171 if(!JS_ValueToNumber(cx, argv[2], &val[1])) {
00172 error("set parameter called with an invalid value for filter %s",
00173 duo->proto->name);
00174 break;
00175 }
00176 func("javascript %s->%s to x[%.1f] y[%.1f]",
00177 duo->proto->name, param->name, val[0], val[1]);
00178
00179
00180 param->set(&val[0]);
00181 duo->instance->set_parameter(idx);
00182 break;
00183
00184 default:
00185 error("parameter of unknown type: %s->%s", duo->proto->name, param->name);
00186 break;
00187 }
00188 JS_EndRequest(cx);
00189
00190 return JS_TRUE;
00191
00192 }
00193
00194 JSP(filter_list_parameters) {
00195 func("%u:%s:%s",__LINE__,__FILE__,__FUNCTION__);
00196 JSObject *arr, *otmp;
00197 JSString *str;
00198 jsval val;
00199
00200
00201 JS_BeginRequest(cx);
00202 arr = JS_NewArrayObject(cx, 0, NULL);
00203 if(!arr) {
00204 JS_EndRequest(cx);
00205
00206 return JS_FALSE;
00207 }
00208
00209 FilterDuo *duo = (FilterDuo*)JS_GetPrivate(cx, obj);
00210 if(!duo) {
00211 error("%u:%s:%s :: Filter core data is NULL",
00212 __LINE__,__FILE__,__FUNCTION__);
00213 JS_EndRequest(cx);
00214
00215 return JS_FALSE;
00216 }
00217
00218
00219 Parameter *parm = (Parameter*)duo->proto->parameters.begin();
00220 int c = 0;
00221 while(parm) {
00222 otmp = JS_NewObject(cx, ¶meter_class, NULL, obj);
00223 JS_SetPrivate(cx,otmp, (void*)parm);
00224 parm->jsclass = ¶meter_class;
00225 parm->jsobj = otmp;
00226 val = OBJECT_TO_JSVAL(otmp);
00227 JS_SetElement(cx, arr, c, &val);
00228 c++;
00229 parm = (Parameter*)parm->next;
00230 }
00231
00232 *vp = OBJECT_TO_JSVAL( arr );
00233 JS_EndRequest(cx);
00234
00235 return JS_TRUE;
00236 }
00237
00238 JSP(filter_get_description) {
00239 func("%u:%s:%s",__LINE__,__FILE__,__FUNCTION__);
00240
00241 JSString *str;
00242
00243 JS_BeginRequest(cx);
00244
00245 FilterDuo *duo = (FilterDuo*)JS_GetPrivate(cx, obj);
00246 if(!duo) { error("%u:%s:%s :: Filter core data is NULL",
00247 __LINE__,__FILE__,__FUNCTION__);
00248 JS_EndRequest(cx);
00249
00250 return JS_FALSE;
00251 }
00252
00253 str = JS_NewStringCopyZ(cx, duo->proto->description());
00254 *vp = STRING_TO_JSVAL(str);
00255
00256 JS_EndRequest(cx);
00257 return JS_TRUE;
00258 }
00259
00260 JSP(filter_get_author) {
00261 func("%u:%s:%s",__LINE__,__FILE__,__FUNCTION__);
00262
00263 JSString *str;
00264
00265 JS_BeginRequest(cx);
00266
00267 FilterDuo *duo = (FilterDuo*)JS_GetPrivate(cx, obj);
00268 if(!duo) { error("%u:%s:%s :: Filter core data is NULL",
00269 __LINE__,__FILE__,__FUNCTION__);
00270 JS_EndRequest(cx);
00271
00272 return JS_FALSE;
00273 }
00274
00275 str = JS_NewStringCopyZ(cx, duo->proto->author());
00276 *vp = STRING_TO_JSVAL(str);
00277
00278 JS_EndRequest(cx);
00279 return JS_TRUE;
00280 }
00281
00284
00285
00286
00287
00288
00289