/** $objcall : o:any -> f:int -> args:array -> any <doc>Call the field [f] of [o] with [args] and return the value or [null] is [o] is not an object</doc> **/ static value builtin_objcall( value o, value f, value args ) { if( !val_is_object(o) ) return val_null; // keep dot-access semantics val_check(f,int); val_check(args,array); return val_ocallN(o,val_int(f),val_array_ptr(args),val_array_size(args)); }
void importGlyphPoints( FT_Vector *points, int n, value callbacks, field lineTo, field curveTo, bool cubic ) { value arg[4]; int i; if( n==0 ) { val_ocall2( callbacks, lineTo, alloc_int( points[0].x ), alloc_int( points[0].y ) ); } else if( n==1 ) { arg[0] = alloc_int( points[0].x ); arg[1] = alloc_int( points[0].y ); arg[2] = alloc_int( points[1].x ); arg[3] = alloc_int( points[1].y ); val_ocallN( callbacks, curveTo, arg, 4 ); } else if( n>=2 ) { if( cubic ) { // printf(stderr,"ERROR: cubic beziers in fonts are not yet implemented.\n"); } else { int x1, y1, x2, y2, midx, midy; for( i=0; i<n-1; i++ ) { x1 = points[i].x; y1 = points[i].y; x2 = points[i+1].x; y2 = points[i+1].y; midx = x1 + ((x2-x1)/2); midy = y1 + ((y2-y1)/2); arg[0] = alloc_int( x1 ); arg[1] = alloc_int( y1 ); arg[2] = alloc_int( midx ); arg[3] = alloc_int( midy ); val_ocallN( callbacks, curveTo, arg, 4 ); } arg[0] = alloc_int( x2 ); arg[1] = alloc_int( y2 ); arg[2] = alloc_int( points[n].x ); arg[3] = alloc_int( points[n].y ); val_ocallN( callbacks, curveTo, arg, 4 ); } } else { } }
EXTERN value val_ocall2( value o, field f, value arg1, value arg2 ) { value args[2] = { arg1, arg2 }; return val_ocallN(o,f,args,2); }
EXTERN value val_ocall1( value o, field f, value arg ) { return val_ocallN(o,f,&arg,1); }
EXTERN value val_ocall0( value o, field f ) { return val_ocallN(o,f,NULL,0); }
value api_val_ocallN(value obj,int fid,value *arg3,int inN) { return val_ocallN(obj,fid,arg3,inN); }