summaryrefslogtreecommitdiffstats
path: root/funtools/filter/evfilter.py
blob: 70e617c21a22a6ce2dfc671d1e11ed7d8460f7ce (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
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)