diff options
Diffstat (limited to 'funtools/filter/evfilter.py')
-rw-r--r-- | funtools/filter/evfilter.py | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/funtools/filter/evfilter.py b/funtools/filter/evfilter.py new file mode 100644 index 0000000..70e617c --- /dev/null +++ b/funtools/filter/evfilter.py @@ -0,0 +1,156 @@ +# load the funtools routines +_libname = './libfuntools.so.1.0' +libfuntools=cdll.LoadLibrary(_libname) +libc=cdll.LoadLibrary(None) + +# region definitions +imannulusi=libfuntools.imannulusi +imboxi=libfuntools.imboxi +imcirclei=libfuntools.imcirclei +imellipsei=libfuntools.imellipsei +imfieldi=libfuntools.imfieldi +imlinei=libfuntools.imlinei +impiei=libfuntools.impiei +imqtpiei=libfuntools.imqtpiei +impointi=libfuntools.impointi +impandai=libfuntools.impandai +imnannulusi=libfuntools.imnannulusi +imnboxi=libfuntools.imnboxi +imnellipsei=libfuntools.imnellipsei +imnpiei=libfuntools.imnpiei +impolygoni=libfuntools.impolygoni +imvannulusi=libfuntools.imvannulusi +imvboxi=libfuntools.imvboxi +imvellipsei=libfuntools.imvellipsei +imvpiei=libfuntools.imvpiei +imvpointi=libfuntools.imvpointi +imannulus=libfuntools.imannulus +imbox=libfuntools.imbox +imcircle=libfuntools.imcircle +imellipse=libfuntools.imellipse +imfield=libfuntools.imfield +imline=libfuntools.imline +impie=libfuntools.impie +imqtpie=libfuntools.imqtpie +impoint=libfuntools.impoint +impanda=libfuntools.impanda +imnannulus=libfuntools.imnannulus +imnbox=libfuntools.imnbox +imnellipse=libfuntools.imnellipse +imnpie=libfuntools.imnpie +impolygon=libfuntools.impolygon +imvannulus=libfuntools.imvannulus +imvbox=libfuntools.imvbox +imvellipse=libfuntools.imvellipse +imvpie=libfuntools.imvpie +imvpoint=libfuntools.imvpoint + +evannulus=libfuntools.evannulus +evbox=libfuntools.evbox +evcircle=libfuntools.evcircle +evellipse=libfuntools.evellipse +evfield=libfuntools.evfield +evline=libfuntools.evline +evpie=libfuntools.evpie +evqtpie=libfuntools.evqtpie +evpoint=libfuntools.evpoint +evnannulus=libfuntools.evnannulus +evnbox=libfuntools.evnbox +evnellipse=libfuntools.evnellipse +evnpie=libfuntools.evnpie +evpanda=libfuntools.evpanda +evpolygon=libfuntools.evpolygon +evvannulus=libfuntools.evvannulus +evvbox=libfuntools.evvbox +evvellipse=libfuntools.evvellipse +evvpie=libfuntools.evvpie +evvpoint=libfuntools.evvpoint + +evvcircle=libfuntools.evvannulus +evncircle=libfuntools.evnannulus +evcpanda=libfuntools.evpanda + +imvcirclei=libfuntools.imvannulusi +imncirclei=libfuntools.imnannulusi +imvcircle=libfuntools.imvannulus +imncircle=libfuntools.imnannulus +imcpandai=libfuntools.impandai +imcpanda=libfuntools.impanda + +# from regions.h -- no idea what it is ... +xsno=3 + +# ... but its important! +maxshapes=(nshape*(xsno+1))+1 + +# ctypes struct definitions (taken from filter.h) +class filtmask(Structure): + _fields_ = [('region', c_int), ('y', c_int), ('xstart', c_int), ('xstop', c_int)] + +class scanrec(Structure): + pass + +# this is how you add a forward pointer +scanrec._fields_ = [ ('next', POINTER(scanrec)), ('x', c_int) ] + +class shaperec(Structure): + _fields_ = [ ('init', c_int), ('ystart', c_double), ('ystop', c_double), ('scanlist', c_void_p), ('nv', c_int), ('xv', c_void_p), ('r1sq', c_double), ('r2sq', c_double), ('angl', c_double), ('sinangl', c_double), ('cosangl', c_double), ('cossq', c_double), ('sinsq', c_double), ('xradsq', c_double), ('yradsq', c_double), ('a', c_double), ('npt', c_int), ('pts', c_void_p), ('xonly', c_int), ('x1', c_double), ('x2', c_double), ('y1', c_double), ('invslope', c_double)] + +class gfiltrec(Structure): + _fields_ = [('nshapes', c_int), ('maxshapes', c_int), ('shapes', POINTER(shaperec * maxshapes)), ('rid', c_int), ('usebinsiz', c_int), ('evsect', c_char_p), ('tlminx', c_double), ('tlminy', c_double), ('binsizx', c_double), ('binsizy', c_double), ('tloff', c_double), ('xmin', c_int), ('xmax', c_int), ('ymin', c_int), ('ymax', c_int), ('block', c_int), ('x0', c_int), ('x1', c_int), ('y0', c_int), ('y1', c_int), ('ybuf', POINTER(c_int)), ('x0s', POINTER(c_int)), ('x1s', POINTER(c_int)), ('nmask', c_int), ('maskdim', c_int), ('masks', POINTER(filtmask))] + +# taken from the code in evfilter.c that initializes the g struct +# allocate shape record +shapearr = (shaperec * maxshapes)() +# allocate g record +grec = gfiltrec() +# fill in g record +grec.nshapes = nshape +grec.maxshapes = maxshapes +grec.shapes = pointer(shapearr) +# pointer to g record +g=pointer(grec) + +# # processing loop +# while True: +# rvals = '' +# buf = sys.stdin.read(4) +# if not buf: break +# vals = struct.unpack('=i', buf) +# nev = vals[0]/evsize +# for i in range(nev): +# evbuf = sys.stdin.read(evsize) +# rvals += struct.pack('=i', xfilter(evdef, evbuf)) +# sys.stdout.write(struct.pack('=i', nev*4)) +# sys.stdout.write(rvals) +# sys.stdout.flush() + +# processing loop +obytes = 0 +while True: + # get byte count + nval = c_int(0) + if libc.read(0, byref(nval), 4) != 4: break + bytes = nval.value + nev = bytes / evsize + + # create a new data buffer, if necessary + if obytes != bytes: + evbuf = create_string_buffer(bytes) + pevbuf = addressof(evbuf) + rvals = (c_int * nev)() + obytes = bytes + + # read data + if libc.read(0, evbuf, bytes) != bytes: break + + # process data + ioff = 0 + for i in range(nev): + rvals[i] = xfilter(evdef, evbuf[ioff:ioff+evsize]) + ioff += evsize + + # write result byte count and result data + nval = c_int(nev*4) + libc.write(1, byref(nval), 4) + libc.write(1, rvals, nval) |