… | |
… | |
236 | } |
236 | } |
237 | } |
237 | } |
238 | OUTPUT: |
238 | OUTPUT: |
239 | RETVAL |
239 | RETVAL |
240 | |
240 | |
|
|
241 | SV * |
|
|
242 | make_histogram (SV *ar) |
|
|
243 | CODE: |
|
|
244 | { |
|
|
245 | int i; |
|
|
246 | AV *av, *result; |
|
|
247 | |
|
|
248 | if (!SvROK (ar) || SvTYPE (SvRV (ar)) != SVt_PVAV) |
|
|
249 | croak ("Not an array ref as first argument to make_histogram"); |
|
|
250 | |
|
|
251 | av = (AV *) SvRV (ar); |
|
|
252 | result = newAV (); |
|
|
253 | |
|
|
254 | for (i = 0; i <= av_len (av); ++i) |
|
|
255 | { |
|
|
256 | const int HISTSIZE = 64; |
|
|
257 | |
|
|
258 | int j; |
|
|
259 | SV *sv = *av_fetch (av, i, 1); |
|
|
260 | STRLEN len; |
|
|
261 | char *buf = SvPVbyte (sv, len); |
|
|
262 | |
|
|
263 | int tmphist[HISTSIZE]; |
|
|
264 | float *hist; |
|
|
265 | |
|
|
266 | SV *histsv = newSV (HISTSIZE * sizeof (float) + 1); |
|
|
267 | SvPOK_on (histsv); |
|
|
268 | SvCUR_set (histsv, HISTSIZE * sizeof (float)); |
|
|
269 | hist = (float *)SvPVX (histsv); |
|
|
270 | |
|
|
271 | Zero (tmphist, sizeof (tmphist), char); |
|
|
272 | |
|
|
273 | for (j = len; j--; ) |
|
|
274 | { |
|
|
275 | unsigned int idx |
|
|
276 | = ((*buf & 0xc0) >> 2) |
|
|
277 | | ((*buf & 0x18) >> 1) |
|
|
278 | | (*buf & 0x03); |
|
|
279 | |
|
|
280 | ++tmphist[idx]; |
|
|
281 | ++buf; |
|
|
282 | } |
|
|
283 | |
|
|
284 | for (j = 0; j < HISTSIZE; ++j) |
|
|
285 | hist[j] = (float)tmphist[j] / (len + 1e-30); |
|
|
286 | |
|
|
287 | av_push (result, histsv); |
|
|
288 | } |
|
|
289 | |
|
|
290 | RETVAL = newRV_noinc ((SV *)result); |
|
|
291 | } |
|
|
292 | OUTPUT: |
|
|
293 | RETVAL |
|
|
294 | |
|
|
295 | |
|
|
296 | |
241 | ############################################################################# |
297 | ############################################################################# |
242 | |
298 | |
243 | MODULE = Gtk2::CV PACKAGE = Gtk2::CV::PostScript |
299 | MODULE = Gtk2::CV PACKAGE = Gtk2::CV::PostScript |
244 | |
300 | |
245 | void |
301 | void |